diff --git a/.buildkite/pipeline-resource-definitions/kibana-console-definitions-sync.yml b/.buildkite/pipeline-resource-definitions/kibana-console-definitions-sync.yml new file mode 100644 index 0000000000000..a228823202c01 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/kibana-console-definitions-sync.yml @@ -0,0 +1,54 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-console-definitions-sync + description: Opens a PR if anything changes in the console definitions in elasticsearch-definitions + links: + - url: 'https://buildkite.com/elastic/kibana-console-definitions-sync' + title: Pipeline link +spec: + type: buildkite-pipeline + owner: 'group:kibana-management' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / Console definitions sync + description: Opens a PR if anything changes in the console definitions in elasticsearch-definitions + spec: + env: + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-management' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/console_definitions_sync.yml + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + trigger_mode: none + build_tags: false + prefix_pull_request_fork_branch_names: false + skip_pull_request_builds_for_existing_commits: true + teams: + kibana-management: + access_level: MANAGE_BUILD_AND_READ + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ + schedules: + Weekly build: + cronline: 0 0 * * 1 America/New_York + message: Weekly build + branch: main + tags: + - kibana diff --git a/.buildkite/pipelines/console_definitions_sync.yml b/.buildkite/pipelines/console_definitions_sync.yml new file mode 100644 index 0000000000000..22d91eacbdbdb --- /dev/null +++ b/.buildkite/pipelines/console_definitions_sync.yml @@ -0,0 +1,10 @@ +steps: + - command: .buildkite/scripts/steps/console_definitions_sync.sh + label: Console Definitions Sync + timeout_in_minutes: 10 + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 + preemptible: true diff --git a/.buildkite/scripts/steps/console_definitions_sync.sh b/.buildkite/scripts/steps/console_definitions_sync.sh new file mode 100755 index 0000000000000..55719292959e8 --- /dev/null +++ b/.buildkite/scripts/steps/console_definitions_sync.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +set -euo pipefail + +report_main_step () { + echo "--- $1" +} + +main () { + cd "$PARENT_DIR" + + report_main_step "Cloning repositories" + + rm -rf elasticsearch-specification + if ! git clone https://github.com/elastic/elasticsearch-specification --depth 1; then + echo "Error: Failed to clone the elasticsearch-specification repository." + exit 1 + fi + + cd "$KIBANA_DIR" + + report_main_step "Generating console definitions" + node scripts/generate_console_definitions.js --source "$PARENT_DIR/elasticsearch-specification" --emptyDest + + # Check if there are any differences + set +e + git diff --exit-code --quiet "$destination_file" + if [ $? -eq 0 ]; then + echo "No differences found. Exiting.." + exit + fi + set -e + + report_main_step "Differences found. Checking for an existing pull request." + + KIBANA_MACHINE_USERNAME="kibanamachine" + git config --global user.name "$KIBANA_MACHINE_USERNAME" + git config --global user.email '42973632+kibanamachine@users.noreply.github.com' + + PR_TITLE='[Console] Update console definitions' + PR_BODY='This PR updates the console definitions to match the latest ones from the @elastic/elasticsearch-specification repo.' + + # Check if a PR already exists + pr_search_result=$(gh pr list --search "$PR_TITLE" --state open --author "$KIBANA_MACHINE_USERNAME" --limit 1 --json title -q ".[].title") + + if [ "$pr_search_result" == "$PR_TITLE" ]; then + echo "PR already exists. Exiting.." + exit + fi + + echo "No existing PR found. Proceeding.." + + # Commit diff + BRANCH_NAME="console_definitions_sync_$(date +%s)" + + git checkout -b "$BRANCH_NAME" + + git add src/plugins/console/server/lib/spec_definitions/json/generated/* + git commit -m "Update console definitions" + + report_main_step "Changes committed. Creating pull request." + + git push origin "$BRANCH_NAME" + + # Create PR + gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base main --head "${BRANCH_NAME}" --label 'release_note:skip' --label 'Feature:Console' --label 'Team:Kibana Management' +} + +main diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5b27bc63d3647..aabd44dd6f15f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -143,6 +143,7 @@ packages/core/http/core-http-router-server-mocks @elastic/kibana-core packages/core/http/core-http-server @elastic/kibana-core packages/core/http/core-http-server-internal @elastic/kibana-core packages/core/http/core-http-server-mocks @elastic/kibana-core +packages/core/http/core-http-server-utils @elastic/kibana-core packages/core/i18n/core-i18n-browser @elastic/kibana-core packages/core/i18n/core-i18n-browser-internal @elastic/kibana-core packages/core/i18n/core-i18n-browser-mocks @elastic/kibana-core @@ -960,6 +961,7 @@ x-pack/plugins/search_indices @elastic/search-kibana x-pack/plugins/search_inference_endpoints @elastic/search-kibana x-pack/plugins/search_notebooks @elastic/search-kibana x-pack/plugins/search_playground @elastic/search-kibana +x-pack/plugins/search_solution/search_navigation @elastic/search-kibana x-pack/plugins/searchprofiler @elastic/kibana-management x-pack/plugins/security @elastic/kibana-security x-pack/plugins/security_solution @elastic/security-solution @@ -1183,7 +1185,7 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql /x-pack/test/saved_object_tagging/ @elastic/appex-sharedux ### Kibana React (to be deprecated) -/src/plugins/kibana_react/public/@elastic/appex-sharedux @elastic/kibana-presentation +/src/plugins/kibana_react/public/ @elastic/appex-sharedux @elastic/kibana-presentation ### Home Plugin and Packages /src/plugins/home/public @elastic/appex-sharedux diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 2220617a3ec38..c46307e899555 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index e299e5bf513e5..3c758b28e1621 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-11-21 +date: 2024-11-22 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 5d9d1d1ef0734..1f9bbdc82eafe 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-11-21 +date: 2024-11-22 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 b2d2007176ee0..1b86116b3a61c 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 1e6315872aa5d..824a897b7edbb 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 99bac4223f94a..3fd196f6a3ea1 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.devdocs.json b/api_docs/apm_data_access.devdocs.json index be97ce96ca40e..6d0f3b4532dc4 100644 --- a/api_docs/apm_data_access.devdocs.json +++ b/api_docs/apm_data_access.devdocs.json @@ -441,78 +441,6 @@ ], "functions": [], "interfaces": [ - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPrivilegesCheck", - "type": "Interface", - "tags": [], - "label": "ApmDataAccessPrivilegesCheck", - "description": [], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPrivilegesCheck.request", - "type": "Object", - "tags": [], - "label": "request", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-http-server", - "scope": "server", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-server.KibanaRequest", - "text": "KibanaRequest" - }, - "" - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPrivilegesCheck.security", - "type": "Object", - "tags": [], - "label": "security", - "description": [], - "signature": [ - { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.SecurityPluginStart", - "text": "SecurityPluginStart" - }, - " | undefined" - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPrivilegesCheck.getApmIndices", - "type": "Function", - "tags": [], - "label": "getApmIndices", - "description": [], - "signature": [ - "() => Promise>" - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/lib/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "apmDataAccess", "id": "def-server.ApmDataAccessServicesParams", @@ -2365,42 +2293,12 @@ "label": "getApmIndices", "description": [], "signature": [ - "(soClient: ", - { - "pluginId": "@kbn/core-saved-objects-api-server", - "scope": "server", - "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", - "section": "def-server.SavedObjectsClientContract", - "text": "SavedObjectsClientContract" - }, - ") => Promise>" + "() => Promise>" ], "path": "x-pack/plugins/observability_solution/apm_data_access/server/types.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPluginSetup.getApmIndices.$1", - "type": "Object", - "tags": [], - "label": "soClient", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-api-server", - "scope": "server", - "docId": "kibKbnCoreSavedObjectsApiServerPluginApi", - "section": "def-server.SavedObjectsClientContract", - "text": "SavedObjectsClientContract" - } - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], + "children": [], "returnComment": [] }, { @@ -2504,56 +2402,7 @@ "path": "x-pack/plugins/observability_solution/apm_data_access/server/types.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPluginStart.hasPrivileges", - "type": "Function", - "tags": [], - "label": "hasPrivileges", - "description": [], - "signature": [ - "(params: Pick<", - { - "pluginId": "apmDataAccess", - "scope": "server", - "docId": "kibApmDataAccessPluginApi", - "section": "def-server.ApmDataAccessPrivilegesCheck", - "text": "ApmDataAccessPrivilegesCheck" - }, - ", \"request\">) => Promise" - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "apmDataAccess", - "id": "def-server.ApmDataAccessPluginStart.hasPrivileges.$1", - "type": "Object", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "Pick<", - { - "pluginId": "apmDataAccess", - "scope": "server", - "docId": "kibApmDataAccessPluginApi", - "section": "def-server.ApmDataAccessPrivilegesCheck", - "text": "ApmDataAccessPrivilegesCheck" - }, - ", \"request\">" - ], - "path": "x-pack/plugins/observability_solution/apm_data_access/server/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], + "children": [], "lifecycle": "start", "initialIsOpen": true } diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 2fa76a793cba7..70d67751d9f52 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 93 | 0 | 93 | 3 | +| 86 | 0 | 86 | 3 | ## Server diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index b78a5d5c451e2..c4f3b9492fcd2 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-11-21 +date: 2024-11-22 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 13f2e3f9ea1f8..5354ef0b591ba 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-11-21 +date: 2024-11-22 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 99e362aa8c45a..a012f754c98f6 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-11-21 +date: 2024-11-22 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 195e5e9e06dfe..279f5f92bc770 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-11-21 +date: 2024-11-22 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 ae166771b391b..4fdf943a868f4 100644 --- a/api_docs/charts.devdocs.json +++ b/api_docs/charts.devdocs.json @@ -2219,22 +2219,6 @@ "deprecated": false, "trackAdoption": false, "children": [ - { - "parentPluginId": "charts", - "id": "def-public.ChartsPluginSetup.legacyColors", - "type": "Object", - "tags": [], - "label": "legacyColors", - "description": [], - "signature": [ - "{ readonly seedColors: string[]; readonly mappedColors: ", - "MappedColors", - "; createColorLookupFunction: (arrayOfStringsOrNumbers?: (string | number)[] | undefined, colorMapping?: Partial>) => (value: string | number) => any; }" - ], - "path": "src/plugins/charts/public/plugin.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "charts", "id": "def-public.ChartsPluginSetup.theme", diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 13412e5c0f8ce..c45e0a8dead2c 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.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 | |-------------------|-----------|------------------------|-----------------| -| 268 | 2 | 253 | 10 | +| 267 | 2 | 252 | 9 | ## Client diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 1569ebf0422f4..32379e22a8fbd 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-11-21 +date: 2024-11-22 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 f3120771b11d6..000e9143be76f 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-11-21 +date: 2024-11-22 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 6c14aaa2f71e4..54adbbaddee54 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 1b0ab744e1f80..82a7ab678f338 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-11-21 +date: 2024-11-22 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 1237f703ccc1e..ca5595652c622 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-11-21 +date: 2024-11-22 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 d4525449445fb..baec4a847cbee 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-11-21 +date: 2024-11-22 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 a34692f145a57..ed65a57c45b84 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-11-21 +date: 2024-11-22 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 a9959856a65be..168097f888727 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-11-21 +date: 2024-11-22 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 c836aa3572a40..896f30264a98d 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-11-21 +date: 2024-11-22 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 9245ad0d947d6..39ff8a3aed26d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index d19c18837cd09..06c3e8522b3bd 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 1514252041696..041afddaca06d 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 45a7cec042012..ba24c3db6c879 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index cd800a03712c0..52bf12c0a388b 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 2a13775442420..3e2caf4ea20f7 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index d5dfcd256900e..eda90bd90b1ae 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-11-21 +date: 2024-11-22 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 f40054b03b42d..a40a06de84f75 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-11-21 +date: 2024-11-22 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 1406364224921..d611d8e1d6c48 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-11-21 +date: 2024-11-22 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 1a8d015414474..17af467c336c4 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -14050,10 +14050,6 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, - { - "plugin": "logsShared", - "path": "x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index c0cb56f241752..e3b18891387da 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4fc37f1fbea74..10b17f6cb009b 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 6fd15abcb08bc..8b5a77fa9f8ba 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-11-21 +date: 2024-11-22 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 b849470e8f934..93404d07f9595 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,12 +17,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, controls, lens, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | ml, securitySolution | - | | | actions, savedObjectsTagging, ml, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core, embeddable, savedObjects, visualizations, canvas, graph, ml | - | -| | @kbn/core-saved-objects-base-server-internal, @kbn/core-saved-objects-migration-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-ui-settings-server-internal, @kbn/core-usage-data-server-internal, taskManager, dataViews, spaces, share, actions, data, alerting, dashboard, @kbn/core-saved-objects-migration-server-mocks, lens, cases, savedSearch, canvas, fleet, cloudSecurityPosture, ml, logsShared, graph, lists, maps, infra, visualizations, apmDataAccess, securitySolution, apm, slo, synthetics, uptime, eventAnnotation, links, savedObjectsManagement, @kbn/core-test-helpers-so-type-serializer, @kbn/core-saved-objects-api-server-internal | - | +| | @kbn/core-saved-objects-base-server-internal, @kbn/core-saved-objects-migration-server-internal, @kbn/core-saved-objects-server-internal, @kbn/core-ui-settings-server-internal, @kbn/core-usage-data-server-internal, taskManager, dataViews, spaces, share, actions, data, alerting, dashboard, @kbn/core-saved-objects-migration-server-mocks, lens, cases, savedSearch, canvas, fleet, cloudSecurityPosture, ml, graph, lists, maps, infra, visualizations, apmDataAccess, securitySolution, apm, slo, synthetics, uptime, eventAnnotation, links, savedObjectsManagement, @kbn/core-test-helpers-so-type-serializer, @kbn/core-saved-objects-api-server-internal | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | graph, stackAlerts, inputControlVis, securitySolution | - | | | dataVisualizer, stackAlerts, expressionPartitionVis | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 1a945320752fb..0afb9d9eeaefa 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1061,15 +1061,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## logsShared - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [resolved_log_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/logs_shared/common/log_views/resolved_log_view.ts#:~:text=title) | - | -| | [log_view_saved_object.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts#:~:text=migrations) | - | - - - ## logstash | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 491d92ded6b66..f6fb16069c438 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index f2d8fe46d51aa..014e3b9577291 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-11-21 +date: 2024-11-22 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 235836c647e7d..e51f0efbca904 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-11-21 +date: 2024-11-22 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 3bb8d0f4eb5f4..8f33990a5cb6a 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-11-21 +date: 2024-11-22 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 162b8cc5bbd7f..5625ea4ce73a1 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-11-21 +date: 2024-11-22 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 0ebae55d5e329..a89da9995ee88 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-11-21 +date: 2024-11-22 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 7b3168e0d3b8f..67ebc7fedb139 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index bae2f28e6eb87..cb4b3c4bad40d 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-11-21 +date: 2024-11-22 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 4e570fabcd39d..e7c8c82ff0292 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-11-21 +date: 2024-11-22 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 2f3b7b193a85f..acb4cefaddec0 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-11-21 +date: 2024-11-22 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 ed5a7c678b458..e7a15f22d30a5 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 9921e22e8f9f0..d3dc9b4f8bf3f 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 752bdf4a2aeac..d6856ee270d27 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index fb1a1a53d1f24..71ea62f1d0886 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index f2a267ba2ab10..73a8cec2d5d22 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 7ce5d8e613e6f..e976b72ccbc3c 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 7b08a1921c476..6a5e39f98e57e 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-11-21 +date: 2024-11-22 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 05ab5523be5b7..b68acc6aae107 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-11-21 +date: 2024-11-22 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 942dda6e349b9..86306851253b0 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.devdocs.json b/api_docs/exploratory_view.devdocs.json index 5738ed0fdc2af..1e5af66252fb0 100644 --- a/api_docs/exploratory_view.devdocs.json +++ b/api_docs/exploratory_view.devdocs.json @@ -802,6 +802,21 @@ "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "exploratoryView", + "id": "def-public.ExploratoryEmbeddableProps.dslFilters", + "type": "Array", + "tags": [], + "label": "dslFilters", + "description": [], + "signature": [ + "QueryDslQueryContainer", + "[] | undefined" + ], + "path": "x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 512096cde33f3..54dee6f42f36d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.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 | |-------------------|-----------|------------------------|-----------------| -| 126 | 0 | 126 | 12 | +| 127 | 0 | 127 | 12 | ## Client diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 47947b3175cac..57e3252c5b9fd 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 0c6cf2d2ac901..b6b78728afb0b 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 8ae22034d42f1..834736852c129 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-11-21 +date: 2024-11-22 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 f2ada2b68de5d..289e994db73cc 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-11-21 +date: 2024-11-22 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 ebec6f1a110e2..a58694530b8c6 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-11-21 +date: 2024-11-22 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 d3efbdc5592fc..a1a500a4e34bb 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 7d905dfd58f46..8c65e20d9a7b5 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-11-21 +date: 2024-11-22 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 455994f5020ac..5e6c0d8d9a0b7 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-11-21 +date: 2024-11-22 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 2d08a7e56693e..89ae0a046fd6b 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-11-21 +date: 2024-11-22 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 af37cd3d61a18..6ff7ee1ef4874 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-11-21 +date: 2024-11-22 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 147f2a4d95a23..961c00ac133ed 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-11-21 +date: 2024-11-22 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 69388215ac8c6..3b49f274c7d35 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index bcd0c044979b5..8f51158e4b64e 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-11-21 +date: 2024-11-22 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 e50bbe3dbb9b9..190d68318871f 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-11-21 +date: 2024-11-22 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 7fcf12e869f32..74e11e54e571c 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-11-21 +date: 2024-11-22 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 1363566eec4b6..2016174d824ba 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 897af0987a77d..ae6c21e33e75f 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 84d2ad5ade54f..81fa1a1bec2ba 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-11-21 +date: 2024-11-22 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 056251e8671d0..535a33443751b 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-11-21 +date: 2024-11-22 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 00e1845910b57..30b87f6f2144b 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index a2ff0c9e17514..4b15fbe5e9605 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 0a3f583b9ab56..93b2911bb9dac 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-11-21 +date: 2024-11-22 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 c7cbe48b1cb6d..6bdbe7638cc50 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-11-21 +date: 2024-11-22 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 5176f9087bf90..aaecc50110ff9 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-11-21 +date: 2024-11-22 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 94f1e5af744cf..cfdd524b8c4b9 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-11-21 +date: 2024-11-22 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 b31b634dda0c4..4989a78d7a72f 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-11-21 +date: 2024-11-22 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 7740b25acbea5..354ee844c309f 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 693737a92933a..93db807612e58 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 434a5cda36754..54a886e8d430d 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-11-21 +date: 2024-11-22 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 4677ef9c33bc4..a6864f177fb9f 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-11-21 +date: 2024-11-22 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 14ad9f019094e..695ec48139c30 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index a0a3b3b3bf57c..7d6cae5abf1bc 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a1cfe5c9e0faa..05468989ddaab 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index f44348c55d9ec..aa17f23939619 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 43320995e8b82..3520f542e229b 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index fadf5af285d77..b4d0a80508452 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index e88606afab2fb..3f9fee6b535c3 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index 4b57cb6114d34..254f5dd2b38e4 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index 8b82b97c84f29..3b95d229a5960 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index c1209374d09a7..2fc68aaca35ce 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-11-21 +date: 2024-11-22 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 bae3ae5f9e975..a6815681ce673 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-11-21 +date: 2024-11-22 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 3830141b97b41..d3adfe40323ef 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-11-21 +date: 2024-11-22 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 a5ab701dffcef..ec363b57d1618 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-11-21 +date: 2024-11-22 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 0fe53b4186330..df6278d741128 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-11-21 +date: 2024-11-22 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 a13b45aea607f..9e142b96ba8ca 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-11-21 +date: 2024-11-22 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 da59f95b0ac34..3899a44b8a457 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-11-21 +date: 2024-11-22 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 d0c972b819dc5..2c43f24595afb 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-11-21 +date: 2024-11-22 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 39ca11c0b92e2..c88ae5ad61830 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index c25444ab821a8..5f15133af906d 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-11-21 +date: 2024-11-22 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 3c4886bacd512..54eb2a99f9ffe 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index d30b66f8bf74f..b938716b85051 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 068d5cde12152..45c6d171b9d5d 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-11-21 +date: 2024-11-22 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 09205a4c94e47..945ef3fe2aa4e 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-11-21 +date: 2024-11-22 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 fff4ace4cd87c..5ef2fdf98029a 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-11-21 +date: 2024-11-22 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 44a306942353f..313228821e9cf 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-11-21 +date: 2024-11-22 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_types.mdx b/api_docs/kbn_apm_types.mdx index a0971e5833930..c63d8466e3e56 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index a7274999244e0..a05d2191c0882 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 53f1e4eb02427..d5be6cc3f8020 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 9c42ea97b6127..d6441c0935d13 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-11-21 +date: 2024-11-22 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 9e92cbb9c1248..6bac3c36f2e32 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-11-21 +date: 2024-11-22 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 a9a384a8d0f16..378767a0a261d 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-11-21 +date: 2024-11-22 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 ba4cdb2a073dd..5e5de0c61abd3 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-11-21 +date: 2024-11-22 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 9d74090ff1722..537ffa21830b3 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 6f5cefeb79a2e..6c60239b17d16 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 93e3ce21f1846..25c7ed965d45b 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-11-21 +date: 2024-11-22 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 fad7b833508e8..bdc7fc4420281 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-11-21 +date: 2024-11-22 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 6561cc9d361b8..5ced1454b662b 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-11-21 +date: 2024-11-22 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 c3fe33cf22c96..009d09a0a930d 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-11-21 +date: 2024-11-22 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 83f7d6bf77fa5..403fcf05888c9 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-11-21 +date: 2024-11-22 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 ed8f0931ce4a2..6d1b326868d92 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-11-21 +date: 2024-11-22 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 19cca02617cc2..7f3afbd008686 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 6814bc0874a47..040ddbb32d130 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 8445a51a410eb..8a25054cc686f 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_graph.mdx b/api_docs/kbn_cloud_security_posture_graph.mdx index 1eaf4119c1b55..877ed9e162eff 100644 --- a/api_docs/kbn_cloud_security_posture_graph.mdx +++ b/api_docs/kbn_cloud_security_posture_graph.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-graph title: "@kbn/cloud-security-posture-graph" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-graph plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-graph'] --- import kbnCloudSecurityPostureGraphObj from './kbn_cloud_security_posture_graph.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 58cecb251925d..3e40426381ea6 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-11-21 +date: 2024-11-22 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 6ca0bf8dbbbc1..09d5418473f94 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-11-21 +date: 2024-11-22 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 42d340f6cd3f9..286833fc3fa61 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-11-21 +date: 2024-11-22 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 711eacfab67ab..dc24d179f72cd 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-11-21 +date: 2024-11-22 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 8f3df3f7462f0..e5408cb5acde9 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-11-21 +date: 2024-11-22 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 59d1c6da34859..e3dadc72f923b 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-11-21 +date: 2024-11-22 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 f2fa523fa3a0c..40b415251d9ce 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-11-21 +date: 2024-11-22 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 814ff801c7c24..0e9d4232ecee6 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-11-21 +date: 2024-11-22 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index f3c9f4ecac5aa..c44b78488217e 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 1c66fb38c2e80..0fb1a295d1563 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_common.mdx b/api_docs/kbn_content_management_favorites_common.mdx index a5276f6c00f85..9b902ca158480 100644 --- a/api_docs/kbn_content_management_favorites_common.mdx +++ b/api_docs/kbn_content_management_favorites_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-common title: "@kbn/content-management-favorites-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-common'] --- import kbnContentManagementFavoritesCommonObj from './kbn_content_management_favorites_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 767cc034eab3c..7eb75aa665044 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index d5b91e064f197..5c172cd208365 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.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 a2d2ac40bb15a..2ed330e108390 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-11-21 +date: 2024-11-22 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 b7839f368adc3..eef9d63222bbd 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-11-21 +date: 2024-11-22 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 e2ad4db192870..e29d9a67be0ef 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-11-21 +date: 2024-11-22 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 c800c52efe003..0c275a5216b3f 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-11-21 +date: 2024-11-22 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index cecb596118f11..5c7d6109f24bd 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 3a27c89cb84df..6300345f4913d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 33dbf26243e81..8066df24b148f 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-11-21 +date: 2024-11-22 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 4e0df08f4a552..c4ab538354e0d 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-11-21 +date: 2024-11-22 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 00ab6e68fb3a4..787f96a0c690d 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-11-21 +date: 2024-11-22 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 e5c1e7dce6d69..64f8a813599e3 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-11-21 +date: 2024-11-22 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 a636655d5fd58..8fd61324c6386 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-11-21 +date: 2024-11-22 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 7b9f807df8b07..4e81c9fe41047 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-11-21 +date: 2024-11-22 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 18d3a66e68d7b..8bdf56b2ba972 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-11-21 +date: 2024-11-22 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 b06e0766f09e4..6391b315d4e06 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-11-21 +date: 2024-11-22 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 734d25fcc09c5..a96be3b8182ba 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-11-21 +date: 2024-11-22 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 c4d027dcb7476..8b333782ee6bb 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-11-21 +date: 2024-11-22 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 792c6159ebfec..4b2145272c5a4 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-11-21 +date: 2024-11-22 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 a019633e989bb..f18dc0bf8820e 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-11-21 +date: 2024-11-22 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 38ce361d9a1a3..20d7fb801dfb7 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-11-21 +date: 2024-11-22 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 a216578761253..38a1558816956 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-11-21 +date: 2024-11-22 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 ed9717297365d..7e595442d34a1 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-11-21 +date: 2024-11-22 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 ae41686a880ca..1b016542fa810 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-11-21 +date: 2024-11-22 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 48f5caf967c3f..9445c455a8ef9 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-11-21 +date: 2024-11-22 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 be1ad6aac074e..dca19153744f4 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-11-21 +date: 2024-11-22 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 893b338bb862a..f4c0f99be42c2 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-11-21 +date: 2024-11-22 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 3915a7ab2ec12..581e17975192b 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-11-21 +date: 2024-11-22 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 09cea0c1bfce0..6a1da1b91387d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 77d0746ba7e31..60c336387a833 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-11-21 +date: 2024-11-22 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 d0f967e19697f..64bfefe8200fc 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-11-21 +date: 2024-11-22 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 75a8c1df24362..797ced21bcbbf 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-11-21 +date: 2024-11-22 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 5a6223efc41ab..12a629a41e836 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-11-21 +date: 2024-11-22 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 5b63bb76a31a9..906b5decbe13b 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-11-21 +date: 2024-11-22 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 c1fcf5e3150bf..4eb19bfa07056 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-11-21 +date: 2024-11-22 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 e2afd29b2ffc7..b09d7943d5e5c 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-11-21 +date: 2024-11-22 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 749b00fee24bd..65eb63f52cbdb 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-11-21 +date: 2024-11-22 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 e20ba27035de4..8778fa1bc6bf1 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-11-21 +date: 2024-11-22 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 9178bf4fcb1fa..ef7dfa5b8775e 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-11-21 +date: 2024-11-22 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 c52c194bc59ad..735de0b33963c 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-11-21 +date: 2024-11-22 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 79a83a3ee0e8c..18ffa846a324a 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-11-21 +date: 2024-11-22 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 1f7ba3de3d091..625b11d576d13 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-11-21 +date: 2024-11-22 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 3d3df0ed16a2c..7b9ab629c8fbc 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-11-21 +date: 2024-11-22 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 86baf1509f00a..1ab77326a814f 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-11-21 +date: 2024-11-22 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 1211aa19cf3ca..c912fe5b5d624 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-11-21 +date: 2024-11-22 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 5443a1d98ba12..751a323909db6 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-11-21 +date: 2024-11-22 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 f1898b8cb94dc..6a57d0519db6c 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-11-21 +date: 2024-11-22 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 4befedb7a3bdf..34b77855ba912 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-11-21 +date: 2024-11-22 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 edd46788484fc..0fdc6f9719ea8 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-11-21 +date: 2024-11-22 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 d23ee93ecce71..0855223176737 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-11-21 +date: 2024-11-22 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 245d90b0a05e0..c4714af61deb6 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-11-21 +date: 2024-11-22 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 8b6a9f5eb56eb..d766c3daecf7e 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-11-21 +date: 2024-11-22 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 419baaacd3250..27fcdd39a6bed 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-11-21 +date: 2024-11-22 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 ab0e8c7e1b2d6..023dac9acf341 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-11-21 +date: 2024-11-22 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 e23b3af43dc27..004e1275a4fc8 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-11-21 +date: 2024-11-22 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 9c89941edc1ec..199363dcfdb9a 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-11-21 +date: 2024-11-22 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 8bde8cb7a86a3..a62a424f303a9 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-11-21 +date: 2024-11-22 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 5fc0c0638dcaf..fc14dc5b6143a 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-11-21 +date: 2024-11-22 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 e8572966eb662..167d120d06f7d 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-11-21 +date: 2024-11-22 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 cabd0b5fdb350..0057708b10e62 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-11-21 +date: 2024-11-22 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 30b5d9685d0de..585737e1770e1 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-11-21 +date: 2024-11-22 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 2ef585460980f..60205be760d12 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-11-21 +date: 2024-11-22 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 40251fcfcf457..1b069ef1c955f 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-11-21 +date: 2024-11-22 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 61da134286225..309c1a3e11dc8 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-11-21 +date: 2024-11-22 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 0ebfe9701455f..2c1089adcc9e1 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-11-21 +date: 2024-11-22 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 b55004d07f7ff..9c0a53358e054 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-11-21 +date: 2024-11-22 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index b938721888d72..7368b89dd8298 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 83d01dbe00fbc..7c97ea63d7a35 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 35f8b5a27e3cf..a5ff3696e75be 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 8cc2571be7785..9df543abcaaff 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 9549a883a2182..03a42bc8e1e14 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 4714c7ab736af..11b0f6da49b29 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 8b6a87f26e3c8..845dc7df523a7 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-11-21 +date: 2024-11-22 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 a8822a273e38b..89710d3c51799 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-11-21 +date: 2024-11-22 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 5ec7591293d86..2c8ce91d1a9e3 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-11-21 +date: 2024-11-22 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 ac74ca5410c5e..2008264f1fd5f 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-11-21 +date: 2024-11-22 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 2472ceb404d49..37646c5adb934 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-11-21 +date: 2024-11-22 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 6679574695d87..53b0a7d481720 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-11-21 +date: 2024-11-22 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 8f842b5153db2..e050f814b530a 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-11-21 +date: 2024-11-22 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 9bf1bd85b68a7..cf072f090712b 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-11-21 +date: 2024-11-22 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 0055a5b096174..bbf8c3602a573 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-11-21 +date: 2024-11-22 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 564e2f4858ab1..78a39b33d84fd 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-11-21 +date: 2024-11-22 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 97a043092f2f3..2d72bb71c1b30 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-11-21 +date: 2024-11-22 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.mdx b/api_docs/kbn_core_http_server.mdx index b6911eb416b22..55a02fb53929a 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-11-21 +date: 2024-11-22 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 84343b0fba157..5923b686ebff2 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-11-21 +date: 2024-11-22 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 bbd40661b1bae..ee74529869530 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-11-21 +date: 2024-11-22 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 8501dd937afdf..dbc324bbe189c 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-11-21 +date: 2024-11-22 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 6956740b17bd1..f89489a201acd 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-11-21 +date: 2024-11-22 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 031eb6224fcab..9d28299f569b0 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-11-21 +date: 2024-11-22 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 40d46f06ce72f..7cde6c4bbe2a7 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-11-21 +date: 2024-11-22 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 a0fe8525acb20..567361809f5fb 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-11-21 +date: 2024-11-22 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 fe86a037b9e6c..b0a5c82a6566f 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-11-21 +date: 2024-11-22 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 16e55b81417db..3753b5e3f2a30 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-11-21 +date: 2024-11-22 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 6757f8a435eda..1310da82e234c 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-11-21 +date: 2024-11-22 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 17336f531dd65..9238d56eca725 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-11-21 +date: 2024-11-22 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 b3438db8e9f33..3a740d0f20469 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-11-21 +date: 2024-11-22 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 d7b35bee7e9ac..dd50f8a26b1fc 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-11-21 +date: 2024-11-22 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 78f093e8d34e1..762ef3237137b 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-11-21 +date: 2024-11-22 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 70689c354e86c..06e3c60cc5550 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-11-21 +date: 2024-11-22 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 66054de8718ed..489343ba64efc 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-11-21 +date: 2024-11-22 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 ea343857484a2..295626f7fe85e 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-11-21 +date: 2024-11-22 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 59b4191c6703b..7d353d5470da3 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-11-21 +date: 2024-11-22 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 b3ce5bdf99e87..968515173c251 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-11-21 +date: 2024-11-22 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 5cef01f3a5215..0c861fac84ae1 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-11-21 +date: 2024-11-22 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 37bc841819f8a..a72eb5aaa90aa 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-11-21 +date: 2024-11-22 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 64d0ed4e76e7b..a2800ad4b1eb0 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-11-21 +date: 2024-11-22 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 7955524bcd81b..c46d6130dd925 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-11-21 +date: 2024-11-22 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 d5d93f0f68565..7dece8d9fbc34 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-11-21 +date: 2024-11-22 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 79e07da77353d..788278bd5ebc2 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-11-21 +date: 2024-11-22 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 d56e42f9731d1..a3e0ddba64e2b 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-11-21 +date: 2024-11-22 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 c83e906e74a06..4f8ded8e32bd2 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-11-21 +date: 2024-11-22 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 b7457037dcb7a..b8fc3e4bff22b 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-11-21 +date: 2024-11-22 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 62bd66c0dfdfc..a2c46f685f5e7 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-11-21 +date: 2024-11-22 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 5f1290d46531b..d90dcde8d4a99 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-11-21 +date: 2024-11-22 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 e96f53f683c8e..591ebec8dad8b 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-11-21 +date: 2024-11-22 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 f07f6ef4af5b6..6c5ec3b332e57 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-11-21 +date: 2024-11-22 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 74cb87e1f4708..ddfe408b0bc0d 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-11-21 +date: 2024-11-22 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 9b4faa1b1bde5..a981f3eadbfaf 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-11-21 +date: 2024-11-22 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 3b1deaf2d232d..676135236e924 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-11-21 +date: 2024-11-22 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 80d17b1a8e5cd..aed3d739273f4 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-11-21 +date: 2024-11-22 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 691a5b16a7e7d..8a3a4b3e4bb53 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-11-21 +date: 2024-11-22 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 a17f3a235aec3..020659f3e6754 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-11-21 +date: 2024-11-22 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 cd794bf378339..a39ab5801b0db 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-11-21 +date: 2024-11-22 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 ab4a672f64d8b..2c566d0093013 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-11-21 +date: 2024-11-22 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 70e81e43e282d..680b0f497153a 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-11-21 +date: 2024-11-22 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 b9bff7d6cbefb..64cd252ea3c6f 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-11-21 +date: 2024-11-22 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.mdx b/api_docs/kbn_core_rendering_browser.mdx index 8caf430ec9a81..a6ecbed43a4a0 100644 --- a/api_docs/kbn_core_rendering_browser.mdx +++ b/api_docs/kbn_core_rendering_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser title: "@kbn/core-rendering-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser'] --- import kbnCoreRenderingBrowserObj from './kbn_core_rendering_browser.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index ca4429b258734..a4b8405f0a0b2 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-11-21 +date: 2024-11-22 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 e1c615603ab52..a549d050f2b22 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-11-21 +date: 2024-11-22 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 50e5daefa0c40..42204498ed59d 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-11-21 +date: 2024-11-22 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 4b4919ee3ee93..8be54d8773456 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 8d5d29dd892b7..5f6b42c52fd81 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index c08852ddcb733..ee4927c9ac6a7 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index ca000f7b5a281..e4d8d1c21f94a 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-11-21 +date: 2024-11-22 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 69de2ec0a0e1b..f55accdd3da1e 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-11-21 +date: 2024-11-22 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 ca867b3ac33b2..99e8fff16012a 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-11-21 +date: 2024-11-22 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 eaa9266d245b1..318a991738322 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-11-21 +date: 2024-11-22 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 e677e9ed28a73..d76859769d881 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-11-21 +date: 2024-11-22 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 537e840488e83..733f73af32a87 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 98fdf691571fe..f96ce7559d8fa 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-11-21 +date: 2024-11-22 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 212b678b0b904..bfece77773645 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-11-21 +date: 2024-11-22 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 629fca1802abe..79142154da820 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-11-21 +date: 2024-11-22 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 918b4a870f907..2873a2347baaf 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-11-21 +date: 2024-11-22 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 da1974d54ea97..4b2d2d94fbb69 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-11-21 +date: 2024-11-22 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 8bf437c26eadb..b64f85ca1c4e5 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -10747,10 +10747,6 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/saved_objects/saved_objects.ts" }, - { - "plugin": "logsShared", - "path": "x-pack/plugins/observability_solution/logs_shared/server/saved_objects/log_view/log_view_saved_object.ts" - }, { "plugin": "graph", "path": "x-pack/plugins/graph/server/saved_objects/graph_workspace.ts" diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index b2facf379bd1a..92591e0511855 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index a13c5cb56682d..810ae8217ea1c 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-11-21 +date: 2024-11-22 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 443925713277d..30e04a0e456aa 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-11-21 +date: 2024-11-22 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 430f4aff4b0ce..4f8766de1d807 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-11-21 +date: 2024-11-22 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 202cfa1dcefad..0d22011dabbae 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-11-21 +date: 2024-11-22 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 ab1673604e7f1..e5352aebc03c4 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-11-21 +date: 2024-11-22 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 85277110a1d86..f8e9a2bbb9e5b 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-11-21 +date: 2024-11-22 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 265849d601e61..c02feef9f4172 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-11-21 +date: 2024-11-22 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 52a48cb9c1ab0..4271b39139b08 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-11-21 +date: 2024-11-22 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 067dce23af60b..399342f82e6ea 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-11-21 +date: 2024-11-22 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 dd3a32801f675..2f4ed482a6b6b 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-11-21 +date: 2024-11-22 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 1e8704f97c9af..8ad680899b133 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-11-21 +date: 2024-11-22 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_server.mdx b/api_docs/kbn_core_status_server.mdx index 93f682b536a30..4f64deccda686 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-11-21 +date: 2024-11-22 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 6ac064c1b2280..57628ec13400b 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-11-21 +date: 2024-11-22 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 8a91fa37f60c5..7d3fe8ff0d57d 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-11-21 +date: 2024-11-22 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 1d5ccec0ca130..d6ac39218d2a7 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-11-21 +date: 2024-11-22 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 68b1ac53623de..b2ff8153abec6 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-11-21 +date: 2024-11-22 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 3061bd5eb1de0..a120e6dae99f8 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-11-21 +date: 2024-11-22 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 b0fd535727e41..30c2ada98beb2 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-11-21 +date: 2024-11-22 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 42d1c703b4ed5..c54812e7aa714 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-11-21 +date: 2024-11-22 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 16919bfde35bd..86af71bd50574 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-11-21 +date: 2024-11-22 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 5b1abc56b7138..cbb2a3c6fc8e6 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-11-21 +date: 2024-11-22 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 59e6097cbac61..8e3974864c788 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-11-21 +date: 2024-11-22 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 0b300cb2498bf..064141c14e38d 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-11-21 +date: 2024-11-22 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 5b6cfb7966701..b251038a20467 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-11-21 +date: 2024-11-22 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 082fde2ba5c2d..acddb2e6c8898 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-11-21 +date: 2024-11-22 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 a21ecc8ae4f4c..017f50bd2f574 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-11-21 +date: 2024-11-22 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 a5acd794c0e83..3a54b1f77ae61 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-11-21 +date: 2024-11-22 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 ec1c4c7ce0014..a555684343093 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-11-21 +date: 2024-11-22 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 7d05f2067550b..e4315a19ad0c9 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-11-21 +date: 2024-11-22 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 2a51f0d726a77..d9722b63339e9 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-11-21 +date: 2024-11-22 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 0821f72eacf78..47123344da9b7 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-11-21 +date: 2024-11-22 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 08dfdbdfb053a..4acc4b467c44b 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-11-21 +date: 2024-11-22 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 5c4b3251ca760..d48ca72c29788 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-11-21 +date: 2024-11-22 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 59eb0f991cfba..3e27e905eeec9 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-11-21 +date: 2024-11-22 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 e29c351102dfa..fc2644c1c23d9 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-11-21 +date: 2024-11-22 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 5b3ca6c5d07dc..03d21ce748b29 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-11-21 +date: 2024-11-22 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 a107b7e5e0f4c..d143883994524 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-11-21 +date: 2024-11-22 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 0183eac713b86..d8b4ef2cf9083 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-11-21 +date: 2024-11-22 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 655b94d61cf73..944bc788bc82b 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-11-21 +date: 2024-11-22 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 23b74612c4fac..785269e9c6d00 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-11-21 +date: 2024-11-22 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 b6567c6ddc414..ca638a3d00c88 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-11-21 +date: 2024-11-22 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 4b396dbf873ce..20628c7a5eeac 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-11-21 +date: 2024-11-22 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 fdd7f650a3c95..f262bdbd51f10 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-11-21 +date: 2024-11-22 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 f6251d4e83abd..3a0d466045b28 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-11-21 +date: 2024-11-22 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 e708acd376a26..ff0bd8f808072 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-11-21 +date: 2024-11-22 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 3de801a91cb83..4a44abf43323d 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-11-21 +date: 2024-11-22 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 92dce2fcba973..eba4a2cd58dcf 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-11-21 +date: 2024-11-22 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 3fbe60ca6ec4b..43a8ba3b45066 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-11-21 +date: 2024-11-22 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 2b3b912ce43ed..29ccb7af11441 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-11-21 +date: 2024-11-22 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 8cff157633d4b..739e5c9bb82db 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-11-21 +date: 2024-11-22 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 424e2950558cf..0cc3704e3fe32 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-11-21 +date: 2024-11-22 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 2b741853d1f89..6b637b5f6c630 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-11-21 +date: 2024-11-22 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 7a5784f637af3..97257aca63efe 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-11-21 +date: 2024-11-22 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 db2db572a3e94..69468a10bd86e 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index b7620feb08325..c6ef07bcbc119 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-11-21 +date: 2024-11-22 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 8c2c3e2becd98..4ca9584912c02 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 89ba7309fb8fa..cfd4e59277615 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index f546d2581b3ae..0cbb4e082e5eb 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 7a54ce4541cc4..186f67fc41c36 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-11-21 +date: 2024-11-22 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 6ca2a59154a78..aaa60421f2a1a 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-11-21 +date: 2024-11-22 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 848607ba7f201..6e3921a576d3e 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-11-21 +date: 2024-11-22 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 3c923b576c3c7..347d472e70cc8 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-11-21 +date: 2024-11-22 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 cf4d19a539f2f..d9873efe0b268 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-11-21 +date: 2024-11-22 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 48e817d1241f7..70356eee17d34 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-11-21 +date: 2024-11-22 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 2ede4ab5841bf..2f09ec4348e30 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-11-21 +date: 2024-11-22 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 03a0fac60154e..d3df9f01700cd 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-11-21 +date: 2024-11-22 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 a3c683c74ac15..551cf08b808b4 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-11-21 +date: 2024-11-22 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 7d82809b67ba9..0df00d2d4382d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx index afe0da2abfc59..1d210a0def93f 100644 --- a/api_docs/kbn_discover_contextual_components.mdx +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-contextual-components title: "@kbn/discover-contextual-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-contextual-components plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] --- import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 19e5cecb19319..4d58bcac8bb80 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-11-21 +date: 2024-11-22 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 ac10ce3fbf68f..578be64ac2265 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-11-21 +date: 2024-11-22 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 745a275f08563..12e75295de4c7 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-11-21 +date: 2024-11-22 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 54398f78c1fe7..524192690ae95 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-11-21 +date: 2024-11-22 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 6ea50719d6ccd..f9b929d16e76b 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-11-21 +date: 2024-11-22 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 36f88465cb20a..dc55efcd87a55 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-11-21 +date: 2024-11-22 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 096a503eea7ed..d174998b5ae7f 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-11-21 +date: 2024-11-22 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 bba93d768f08e..958429e48df24 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-11-21 +date: 2024-11-22 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 e54aa2aed59a9..714f47255cb53 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-11-21 +date: 2024-11-22 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 21863e3fbdad3..faee25a2ad6a3 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-11-21 +date: 2024-11-22 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 428ae051c999e..63753f340e139 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-11-21 +date: 2024-11-22 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 26920afd57cd2..0cb542fa8fe55 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-11-21 +date: 2024-11-22 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 d9e7dba22f2ff..819e0cde2caf4 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-11-21 +date: 2024-11-22 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 bbad835c8af4e..e009afd71d46f 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index a636172e3c6de..a8438442ffc2d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 62a042e1c2eb0..fe1f4988f9787 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-11-21 +date: 2024-11-22 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 480bce3dcb81f..56f6ff9c8c9b3 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index e5e268bc2a4a0..7a06bb880eaaa 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 615db65785e48..497bc1fece29b 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 07b05bda29849..61e10af73c31c 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-11-21 +date: 2024-11-22 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 3579f9116d9b5..981fbeb59012f 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-11-21 +date: 2024-11-22 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 1e2557d1c7773..485def755f1f8 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-11-21 +date: 2024-11-22 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 c23769ac87a59..219871bfd9ba0 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-11-21 +date: 2024-11-22 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 1a216d7e602d3..5336e32353432 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-11-21 +date: 2024-11-22 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 3a30a732e3b2b..530f30ed9f5fb 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-11-21 +date: 2024-11-22 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 92b5688546ae8..593fbac108a82 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-11-21 +date: 2024-11-22 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 760de78ed15b1..b7ff845156903 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-11-21 +date: 2024-11-22 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 403976ff613b8..319123ca29b67 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-11-21 +date: 2024-11-22 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 2b32b9a4fd6cd..26b6daa03c537 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-11-21 +date: 2024-11-22 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 ef47a15a44147..d5a36e95d2fc3 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-11-21 +date: 2024-11-22 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 fda3a0f63a5e4..5a31d92444519 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-11-21 +date: 2024-11-22 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 6a2cbb6d34707..bde383f9f1b62 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.devdocs.json b/api_docs/kbn_grid_layout.devdocs.json index a0f579f199d47..acd664c6cac81 100644 --- a/api_docs/kbn_grid_layout.devdocs.json +++ b/api_docs/kbn_grid_layout.devdocs.json @@ -11,36 +11,29 @@ "label": "GridLayout", "description": [], "signature": [ - "React.ForwardRefExoticComponent>" + "({ layout, gridSettings, renderPanelContents, onLayoutChange, }: GridLayoutProps) => React.JSX.Element" ], "path": "packages/kbn-grid-layout/grid/grid_layout.tsx", "deprecated": false, "trackAdoption": false, - "returnComment": [], "children": [ { "parentPluginId": "@kbn/grid-layout", "id": "def-public.GridLayout.$1", - "type": "Uncategorized", + "type": "Object", "tags": [], - "label": "props", + "label": "{\n layout,\n gridSettings,\n renderPanelContents,\n onLayoutChange,\n}", "description": [], "signature": [ - "P" + "GridLayoutProps" ], - "path": "node_modules/@types/react/ts5.0/index.d.ts", + "path": "packages/kbn-grid-layout/grid/grid_layout.tsx", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "isRequired": true } ], + "returnComment": [], "initialIsOpen": false }, { @@ -121,197 +114,6 @@ } ], "interfaces": [ - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi", - "type": "Interface", - "tags": [], - "label": "GridLayoutApi", - "description": [ - "\nThe external API provided through the GridLayout component" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.addPanel", - "type": "Function", - "tags": [], - "label": "addPanel", - "description": [], - "signature": [ - "(panelId: string, placementSettings: ", - "PanelPlacementSettings", - ") => void" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.addPanel.$1", - "type": "string", - "tags": [], - "label": "panelId", - "description": [], - "signature": [ - "string" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.addPanel.$2", - "type": "Object", - "tags": [], - "label": "placementSettings", - "description": [], - "signature": [ - "PanelPlacementSettings" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.removePanel", - "type": "Function", - "tags": [], - "label": "removePanel", - "description": [], - "signature": [ - "(panelId: string) => void" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.removePanel.$1", - "type": "string", - "tags": [], - "label": "panelId", - "description": [], - "signature": [ - "string" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.replacePanel", - "type": "Function", - "tags": [], - "label": "replacePanel", - "description": [], - "signature": [ - "(oldPanelId: string, newPanelId: string) => void" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.replacePanel.$1", - "type": "string", - "tags": [], - "label": "oldPanelId", - "description": [], - "signature": [ - "string" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.replacePanel.$2", - "type": "string", - "tags": [], - "label": "newPanelId", - "description": [], - "signature": [ - "string" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.getPanelCount", - "type": "Function", - "tags": [], - "label": "getPanelCount", - "description": [], - "signature": [ - "() => number" - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/grid-layout", - "id": "def-public.GridLayoutApi.serializeState", - "type": "Function", - "tags": [], - "label": "serializeState", - "description": [], - "signature": [ - "() => ", - { - "pluginId": "@kbn/grid-layout", - "scope": "public", - "docId": "kibKbnGridLayoutPluginApi", - "section": "def-public.GridLayoutData", - "text": "GridLayoutData" - }, - " & ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - } - ], - "path": "packages/kbn-grid-layout/grid/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/grid-layout", "id": "def-public.GridPanelData", diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 7d83ffe837d15..89cee389aa55b 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 27 | 0 | 25 | 2 | +| 16 | 0 | 16 | 1 | ## Client diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 8615df90c789e..203be187cdc77 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-11-21 +date: 2024-11-22 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 79ff6cc4c0b70..0e26b3e0f20c2 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-11-21 +date: 2024-11-22 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 10f5568826075..5dd459ddcaa1e 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-11-21 +date: 2024-11-22 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 35c787ef66149..0d19292e6abde 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-11-21 +date: 2024-11-22 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 0da28a1d0c546..d72e55d814dfa 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-11-21 +date: 2024-11-22 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 d5953c819f52b..ca0dd9585e71a 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-11-21 +date: 2024-11-22 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 bafdee0be5f89..4b4f9e2d6f07d 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-11-21 +date: 2024-11-22 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 c55c9407466b6..079a606760cfa 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-11-21 +date: 2024-11-22 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 d4fa91b284d98..8a34d541608ee 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-11-21 +date: 2024-11-22 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 56d78034cf53c..50d97c0830c62 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_adapter.mdx b/api_docs/kbn_index_adapter.mdx index 14c580f8f4209..b252220048a9a 100644 --- a/api_docs/kbn_index_adapter.mdx +++ b/api_docs/kbn_index_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-adapter title: "@kbn/index-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-adapter plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-adapter'] --- import kbnIndexAdapterObj from './kbn_index_adapter.devdocs.json'; diff --git a/api_docs/kbn_index_lifecycle_management_common_shared.mdx b/api_docs/kbn_index_lifecycle_management_common_shared.mdx index ec86e99d29500..94cca4ab54ef2 100644 --- a/api_docs/kbn_index_lifecycle_management_common_shared.mdx +++ b/api_docs/kbn_index_lifecycle_management_common_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-lifecycle-management-common-shared title: "@kbn/index-lifecycle-management-common-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-lifecycle-management-common-shared plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-lifecycle-management-common-shared'] --- import kbnIndexLifecycleManagementCommonSharedObj from './kbn_index_lifecycle_management_common_shared.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 523c807b8160f..9203de44ee156 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_common.mdx b/api_docs/kbn_inference_common.mdx index fecaa91691853..0009101e3db70 100644 --- a/api_docs/kbn_inference_common.mdx +++ b/api_docs/kbn_inference_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference-common title: "@kbn/inference-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference-common'] --- import kbnInferenceCommonObj from './kbn_inference_common.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index d04f8999c319f..120d84215ca4e 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-11-21 +date: 2024-11-22 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 7ff11d928a5a0..6dcaf322f9898 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-11-21 +date: 2024-11-22 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 2c9ec23e43597..90913295ff20e 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 56d33ae279608..93a542e6beffd 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 47b92944910d4..66647e17f605f 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-11-21 +date: 2024-11-22 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 65405b333c77f..917ee150d86af 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index c1ac75b7d5248..e7273e3ee1963 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 00e9362bb48db..aa0e2db75dcb8 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-11-21 +date: 2024-11-22 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 6e3c9605d1183..69534c60761bb 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-11-21 +date: 2024-11-22 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 4a365ca7db4c7..061f972ff92fe 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 817f08012a182..13e9452daedca 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 4142177d70b34..9ce785871fda2 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-11-21 +date: 2024-11-22 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.mdx b/api_docs/kbn_language_documentation.mdx index fe979ad8f24c0..2f811942bd934 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 4193296e70c45..f7b95eaf89eed 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-11-21 +date: 2024-11-22 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 3e16958f8e745..2bf3769f80140 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-11-21 +date: 2024-11-22 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 5c30a12e52e35..309660590d5cb 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-11-21 +date: 2024-11-22 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 1e1b932392dc6..f109ef3c783b8 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-11-21 +date: 2024-11-22 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 8d36628cb0ee3..9e093cfc91a27 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-11-21 +date: 2024-11-22 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 3b1a48183b448..96286947758ac 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-11-21 +date: 2024-11-22 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 c3c5ee776eba3..2f0644094b26e 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-11-21 +date: 2024-11-22 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 60d8f1f7be110..e73b051b1f28d 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-11-21 +date: 2024-11-22 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 a7dbb075ecbf9..15dee22ab50a3 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-11-21 +date: 2024-11-22 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 b7088887fa9ba..7c3d514f794d5 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-11-21 +date: 2024-11-22 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 ae637e29ebb19..a76fa0e04720d 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-11-21 +date: 2024-11-22 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 641f84d5d8710..aa88fda990f96 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-11-21 +date: 2024-11-22 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 badf4a47fa2f2..2da954b6c544e 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-11-21 +date: 2024-11-22 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 2cae7456e145d..4a96d23c42cac 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-11-21 +date: 2024-11-22 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 915502e9c2a8d..d1d7a20a5813d 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-11-21 +date: 2024-11-22 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 6e49814a9c919..ff19cb8ad3922 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-11-21 +date: 2024-11-22 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 4221195b419a9..06cad3ba4f045 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-11-21 +date: 2024-11-22 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 27a85fea6bb4b..734d38e182b34 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index d8ca63d02c6d1..f21e3a9c18255 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 24277ed63ea8e..04d70b1064a64 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-11-21 +date: 2024-11-22 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 d204c7c2bdcc1..aed1ee5096639 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-11-21 +date: 2024-11-22 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 64e4c3399c413..06f5c42e15a22 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-11-21 +date: 2024-11-22 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 b39de81ffe89d..e33da401d2b22 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-11-21 +date: 2024-11-22 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 7f7db49345bdc..7316e0f631157 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-11-21 +date: 2024-11-22 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 5a8ea941cb543..cb4f89e67e3ba 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-11-21 +date: 2024-11-22 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 4c0e97e55d50e..ce63110538ba0 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-11-21 +date: 2024-11-22 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 3ed94df682099..107fa77d19dce 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-11-21 +date: 2024-11-22 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 602e0a0de8e99..1c6d824deb927 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-11-21 +date: 2024-11-22 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 dc0f55229dbb9..21a8a50f5fe46 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-11-21 +date: 2024-11-22 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 9e3e00d044bbc..23c2f2bffa090 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-11-21 +date: 2024-11-22 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 0dcb62e65f33e..1ca2e4d1d5566 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-11-21 +date: 2024-11-22 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_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 35d4efca2d36b..e71bcc3dd5971 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 61b3f117d3d29..8b54b3c3bd30a 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-11-21 +date: 2024-11-22 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 0bade866bd90f..a3ca6622d64b1 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-11-21 +date: 2024-11-22 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 a0eaa2f8f23d3..6be5e86f221a5 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-11-21 +date: 2024-11-22 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 037683c362f53..d47e358375ee5 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-11-21 +date: 2024-11-22 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 0fdd4eb8b2fbe..4df32753933d9 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-11-21 +date: 2024-11-22 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 cc3e4ccdae3c5..00ab3e7e96d04 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-11-21 +date: 2024-11-22 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 e3555302b5c0a..f44c4c4f7181b 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-11-21 +date: 2024-11-22 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_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index b6a95ccff39d9..17cb1ddb12d14 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index f63d8269cb2ba..7c59b5dcc8315 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-11-21 +date: 2024-11-22 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 63506fa4d0d5a..339163fc8f9b9 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-11-21 +date: 2024-11-22 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 01cb4d046aa8f..b03b8628b44cc 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-11-21 +date: 2024-11-22 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 fc61254b63d7b..2ef7d97f23677 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-11-21 +date: 2024-11-22 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 3b71ca06e0628..2bc0d1e76e66f 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-11-21 +date: 2024-11-22 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 c662840b8de56..6ca7ecacee780 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-11-21 +date: 2024-11-22 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 45f84d226aed4..8ebe6d0839fef 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-11-21 +date: 2024-11-22 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 adb1152679db1..0b5b9ed5aa077 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-11-21 +date: 2024-11-22 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 d7880b352efa5..6f66f080a991f 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index efa77b18492c0..3f30b4cff22b8 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index b2c5023bc5211..c655fda7bcdc4 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-11-21 +date: 2024-11-22 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 29007587cb7bd..a76652b31f692 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-11-21 +date: 2024-11-22 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 1a116dddf27dc..bcafa0c2f87f8 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index aba8a0824bd68..35496ac7dec18 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 62f34f2b8d1b1..b353f50d61067 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-11-21 +date: 2024-11-22 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_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 05d05bfcb9e8f..110738d4530e3 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index b54576abfa1c3..7b73cf03def52 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-11-21 +date: 2024-11-22 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 8558b1e4af835..29c7ff9bc360a 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-11-21 +date: 2024-11-22 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_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index be42734555ba5..716254b67130c 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 574bd62f71889..00c804f5a59be 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index a9c9177b6e61f..a3b31041f8d5e 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-11-21 +date: 2024-11-22 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 df0284d38667e..bfbee2a394d5b 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-11-21 +date: 2024-11-22 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 c8da7d5e17df1..a7642e2dbb0a7 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-11-21 +date: 2024-11-22 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 bb221e30da99a..ae2d900614b15 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-11-21 +date: 2024-11-22 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 79f3fe2eb3557..9e34f64c111c2 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-11-21 +date: 2024-11-22 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 2304068ffd75f..68dfa1d652ba8 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-11-21 +date: 2024-11-22 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 637b61f5efe72..4d531e84c0a4e 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-11-21 +date: 2024-11-22 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 157aa7501e233..ce6ca411a31f2 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-11-21 +date: 2024-11-22 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 20c3b78bc326e..f491d9819e1ed 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-11-21 +date: 2024-11-22 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 3f4f3c5660522..31c4fdab59b25 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-11-21 +date: 2024-11-22 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 476d4ce89579a..76f53faf4ddee 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index a21c48d8885da..a98c656953afe 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index ccee3d90265e7..4e062192a7409 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_product_doc_common.mdx b/api_docs/kbn_product_doc_common.mdx index 59ebe236b18e2..87420cf0ec647 100644 --- a/api_docs/kbn_product_doc_common.mdx +++ b/api_docs/kbn_product_doc_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-common title: "@kbn/product-doc-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-common'] --- import kbnProductDocCommonObj from './kbn_product_doc_common.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index d993c50b76d6d..86bbfdebcf800 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-11-21 +date: 2024-11-22 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 ff7e5932dfae3..5e78dfdfe2b34 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-11-21 +date: 2024-11-22 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 908596c6df7df..2f04de9d94755 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-11-21 +date: 2024-11-22 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 4e637c4f9ee20..20730bfcd0c09 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-11-21 +date: 2024-11-22 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 4eec32d476c6a..6cd0690a0226a 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-11-21 +date: 2024-11-22 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 1216737900365..4b5ee413441aa 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-11-21 +date: 2024-11-22 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 ab4003cd378b5..754855fb36a55 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-11-21 +date: 2024-11-22 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 a623a898af80a..c6c54a1d5b1d3 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-11-21 +date: 2024-11-22 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 e42af9ac33061..e44baaccadf56 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-11-21 +date: 2024-11-22 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 5d27902d79740..51f325742ccd4 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 5e7bf7ab1d52b..4a846cc75a52f 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 17c469e5da034..974d732be038d 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-11-21 +date: 2024-11-22 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 4ec926131b6d9..30aa9b8910a50 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-11-21 +date: 2024-11-22 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 7e8bdddb96acd..4cdfaae3a8f60 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-11-21 +date: 2024-11-22 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 1c95ba49a9427..e058f3289b521 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-11-21 +date: 2024-11-22 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 22aff9da3c4a1..7df0a1957e2eb 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-11-21 +date: 2024-11-22 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 39d746ae0ec03..e55c53489e813 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-11-21 +date: 2024-11-22 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 27f8aa773175b..304dfce60f471 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-11-21 +date: 2024-11-22 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 849154e169c71..ac431b442f31e 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-11-21 +date: 2024-11-22 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 4344f71b28a67..2fb6e8f28c6e6 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-11-21 +date: 2024-11-22 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 166ed726f35fe..94093ebe7b974 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-11-21 +date: 2024-11-22 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 4fac66d95b692..d0fe624eec46d 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-11-21 +date: 2024-11-22 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 faa9390ae816f..e24ecc2174886 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-11-21 +date: 2024-11-22 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 a75b3a1947d29..7800bc83c9d28 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-11-21 +date: 2024-11-22 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 304e2e10aa84c..b2c81f42f8b48 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-11-21 +date: 2024-11-22 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 02c11cf2964ec..4e74a76505d62 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-11-21 +date: 2024-11-22 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 fc7ca043cf5eb..002eab56e8277 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 1f4a84085b17f..d777149cd330e 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index 9672a3d8186dd..f0e59e494c8b5 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 58e2388ff6c07..af96ca9b3820e 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index cecdf738e3977..17dc5651ef5a5 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 359fe44cd54b8..870d1ef869b59 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-11-21 +date: 2024-11-22 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 48eff4b394b2d..9580140373345 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-11-21 +date: 2024-11-22 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 af7c1ace16831..9e2cea991b593 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-11-21 +date: 2024-11-22 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 ce1937fc00b1a..f7d51280be1aa 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-11-21 +date: 2024-11-22 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 9e1e4548f4af0..09a29804d2def 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index b1f38a58ff642..3bfec87796410 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index 35ae55dbad73c..a6048f1d32374 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index 805bb7a91c04d..553ec485329a3 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 22b88be7b204a..104d624a4d2ac 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-11-21 +date: 2024-11-22 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 868f7b7cf3f42..7924fda854d7f 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-11-21 +date: 2024-11-22 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 6aadff94423a7..dc45d6dea21f8 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-11-21 +date: 2024-11-22 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 076564ea46dcf..83b39f59a7ba0 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-11-21 +date: 2024-11-22 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 d5e3a065bb411..7a8efa3f35550 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-11-21 +date: 2024-11-22 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_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index 1d471a24ed814..9b4aed1b3dbcc 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 2d5fa98e2c931..178df97d36042 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 4bce0257f9691..55b3058aba268 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 1d312218c338a..1d17f2d087be2 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 4c672c043e930..bff499fa9345a 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index ca17d40f0544b..78f402c754e02 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index c1f2fd0b5ccde..5fdea6e063689 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-11-21 +date: 2024-11-22 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 16ea109e9b7dd..7e87f9068bb7e 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-11-21 +date: 2024-11-22 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 4a24b52b13e17..50fe01f23aeb9 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-11-21 +date: 2024-11-22 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 042f1bf631164..f27bffd19872e 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-11-21 +date: 2024-11-22 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_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 62d8ad2257ea4..7e0dda8f661b3 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 26c5cc329e3a3..99d8879d9858d 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index ef93de6b7ea17..4dc2e1497ec13 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-11-21 +date: 2024-11-22 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 daec63a5e4136..29b2e83f6ca2b 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-11-21 +date: 2024-11-22 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 270c2d5e793f4..cfe0f246f27b5 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-11-21 +date: 2024-11-22 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 344aa870b361d..9b1d2c09bbd1f 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-11-21 +date: 2024-11-22 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_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 2d2dc2412a017..6ae7a98a47739 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 43de76b593313..47d9a5051ce68 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-11-21 +date: 2024-11-22 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 ba3bd450b707a..c1afd0809f45c 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-11-21 +date: 2024-11-22 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 6ccdcb49ee593..3aabc7cd739f5 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-11-21 +date: 2024-11-22 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 a52cff0a76c3f..58fed3c2bc90a 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 551a83972750d..2932db77d5b76 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-11-21 +date: 2024-11-22 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 7f73729283d75..6d347fbdfffff 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-11-21 +date: 2024-11-22 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 d688c7cf2c6f8..523fa351e2754 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-11-21 +date: 2024-11-22 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 8b67f7a4b26cb..8f29dc09e7cf2 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-11-21 +date: 2024-11-22 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 fd9ddcadc6e28..bc746058c2d1b 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-11-21 +date: 2024-11-22 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 95c47fb3dc03a..150d70f74d87b 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-11-21 +date: 2024-11-22 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 274d8116bfff5..69e1df6de9c37 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-11-21 +date: 2024-11-22 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 0cd774fdbfbd8..8d97bf4002205 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-11-21 +date: 2024-11-22 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 30adbd63daafa..ac34362ddd911 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-11-21 +date: 2024-11-22 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 03565a17044a2..4dd48414d4e7e 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-11-21 +date: 2024-11-22 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 cbcecb0bf37e2..a4966c61a76fc 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-11-21 +date: 2024-11-22 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 b76a357d484f8..2a87cc0882f05 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-11-21 +date: 2024-11-22 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 01ada51de564b..1d682e7bdd98c 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-11-21 +date: 2024-11-22 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 4bb4ec9f0ac2c..cba4987e0efda 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 09e98c1d1db49..64b4eec298419 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 4b5f9b3efce1a..9da960e4f48ba 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index f7aaec3f41000..a317cddd3bd1a 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 27079ba2e0122..d24313c36c3ea 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-11-21 +date: 2024-11-22 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 ae6e0b24f79e8..e6d76ca16d65e 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-11-21 +date: 2024-11-22 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 b067d28daa13a..7ee47b57b9259 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-11-21 +date: 2024-11-22 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 4871a1059737b..5e6673894abd2 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-11-21 +date: 2024-11-22 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 5f0651eaa3563..955805f53c14f 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-11-21 +date: 2024-11-22 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 1f04b23f7f295..b3e2b555841ac 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-11-21 +date: 2024-11-22 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 1f9b026693310..d2d1cbaa29395 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-11-21 +date: 2024-11-22 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 2256f0d29be62..21587a72b8258 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-11-21 +date: 2024-11-22 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 9f61f9688b9de..706f666054126 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-11-21 +date: 2024-11-22 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 741318151f8cc..3e2fca4714ce8 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-11-21 +date: 2024-11-22 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 5112e0c7b2203..fd0d1d4c1baf3 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-11-21 +date: 2024-11-22 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 d5509a2cded34..94517cadd7095 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-11-21 +date: 2024-11-22 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 194258558f8c8..7534b9bfe0a8f 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-11-21 +date: 2024-11-22 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 34bdbcca0fe3c..e826fee642c04 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-11-21 +date: 2024-11-22 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 4d26ed432df08..26936e7338f72 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-11-21 +date: 2024-11-22 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 68a9363d6709a..bf5f2668e9e1b 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-11-21 +date: 2024-11-22 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 de47f3f5b7197..629569e223d11 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-11-21 +date: 2024-11-22 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 115b4567293b9..b56d10878ac8f 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-11-21 +date: 2024-11-22 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 722babc144aaf..f976ab6f99767 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-11-21 +date: 2024-11-22 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 098ed4da98145..7f3d5139535f8 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-11-21 +date: 2024-11-22 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 2b7b197d10848..4c8b98f26dc29 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-11-21 +date: 2024-11-22 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 77b81ae12b086..5cbcd0da10669 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-11-21 +date: 2024-11-22 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 98006cdbc3919..957184bb209a5 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-11-21 +date: 2024-11-22 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 fee05603b179a..51e107d20ac8f 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-11-21 +date: 2024-11-22 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 af4de6cb7f840..cc8fd32c04b33 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-11-21 +date: 2024-11-22 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 2798aa82e82e3..629b6a7e9fa36 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-11-21 +date: 2024-11-22 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 be3a6214d2bfa..f0e7f5a8ed5b0 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-11-21 +date: 2024-11-22 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 b318c7d6bcdd4..eee4deff4dfa9 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-11-21 +date: 2024-11-22 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 6173e7150dbc0..fb41c34b0a7d3 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-11-21 +date: 2024-11-22 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 4ea37ab8473e7..925dd54b7b219 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-11-21 +date: 2024-11-22 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 b6add920c4b43..16bce72a18e5b 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-11-21 +date: 2024-11-22 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 ca710143f8d3b..f4c97a8ec7c5b 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-11-21 +date: 2024-11-22 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 f9d15a0014b41..0a913ddaf832e 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-11-21 +date: 2024-11-22 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 f763d69361ab7..3f892eb2a327c 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-11-21 +date: 2024-11-22 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 17272302f4d7d..e80b3adf798fe 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-11-21 +date: 2024-11-22 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 71caa40b24ee7..5be22a01245a3 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-11-21 +date: 2024-11-22 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 ae968f944210f..7657297435707 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-11-21 +date: 2024-11-22 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 e8cc1d353c99b..9b847c50bb6b1 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-11-21 +date: 2024-11-22 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 e79a540f135ee..11302955a772b 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-11-21 +date: 2024-11-22 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 53128b11e88da..268aa66431489 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-11-21 +date: 2024-11-22 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 d9a39cbcc84d2..7676f40f2caf3 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-11-21 +date: 2024-11-22 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 2ce14191dc717..b05834eb29d94 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-11-21 +date: 2024-11-22 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 9affdd932e5a6..2ed058123211a 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-11-21 +date: 2024-11-22 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 7c822cda82e95..1ba1e92db0a47 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-11-21 +date: 2024-11-22 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 2329279b3c31b..81fe8f76a7652 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-11-21 +date: 2024-11-22 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_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 926f858c52bb4..05e63c3c0a348 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 1191ab5a7e495..599ae12c50cc9 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-11-21 +date: 2024-11-22 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 e0a0bada66982..82694decc22aa 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-11-21 +date: 2024-11-22 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 62ddb5933dcc6..fc741cd9e0549 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-11-21 +date: 2024-11-22 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 e714651f18c4e..e717a22e863e6 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index d5e1cd8cf4ce8..4782f0f189260 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 20d96ec0077ac..c761b9f95e07c 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index a0258aa6bda62..7e962c561ce61 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 75892d2a79407..f79d228215f39 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-11-21 +date: 2024-11-22 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 078a0a219523e..1e1acd7379504 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-11-21 +date: 2024-11-22 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 907362dad0c5b..c8fae60176556 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 91ea0cc4af824..d56371762c6c9 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index decec16cad572..ac3c669df109c 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 9b0f85be9c682..d2a8bebfbfa02 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-11-21 +date: 2024-11-22 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 68613d16ec423..4540645d39103 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-11-21 +date: 2024-11-22 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 e79253c601729..47d42a7b41456 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-11-21 +date: 2024-11-22 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 2d9bc10bba9f0..110eb95c420ff 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-11-21 +date: 2024-11-22 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 71b0f6da111b9..0bf193f4157ca 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index a2a696aa7daae..e6e3019fe75a5 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-11-21 +date: 2024-11-22 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 7c04b4ac52eae..cc46129af142a 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx index 3d0043d6c8b2a..d29dc282dc1db 100644 --- a/api_docs/kbn_transpose_utils.mdx +++ b/api_docs/kbn_transpose_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-transpose-utils title: "@kbn/transpose-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/transpose-utils plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] --- import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 17cab8367cf35..93da565cf4d8e 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-11-21 +date: 2024-11-22 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 292514d316309..1733473c9cf70 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-11-21 +date: 2024-11-22 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 e84f1a2e0b4ae..34fc4a73aa965 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-11-21 +date: 2024-11-22 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 bb39af52216ac..f9ca394a7d8d7 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-11-21 +date: 2024-11-22 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 70b2b5887a308..55621afbc3ba4 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-11-21 +date: 2024-11-22 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 4c5a108267c8c..8183be2c396bc 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-11-21 +date: 2024-11-22 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 7f8dce491f339..7d9158b319934 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-11-21 +date: 2024-11-22 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 a0105cf4335ef..f64d39ea763d5 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-11-21 +date: 2024-11-22 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 8f016b1b426c2..a0dff14745b50 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-11-21 +date: 2024-11-22 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 ec1f9eab9b5cc..27798da4853c2 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-11-21 +date: 2024-11-22 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 f0682a3576797..bd5fc698832cb 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index a4ef48f8bd72a..3d7f1d13ac424 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 4be5b4e8e7218..595677944190d 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-11-21 +date: 2024-11-22 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 214a6e0891802..e47bdddd5c2d1 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-11-21 +date: 2024-11-22 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 afac65072e3d6..40fe2128fb541 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-11-21 +date: 2024-11-22 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 e66e0200d8f42..a06e735b99af1 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-11-21 +date: 2024-11-22 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 1d6a170a37a93..a25ca1af3e9a6 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-11-21 +date: 2024-11-22 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 57b1c5e34ba5b..0a0219896da7d 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-11-21 +date: 2024-11-22 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 c4464a3c18466..940e0a88cd7ec 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-11-21 +date: 2024-11-22 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 58c5c776ed7c7..df3dff9fb6c90 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-11-21 +date: 2024-11-22 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 a93f8f30179f0..2837099abf79d 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-11-21 +date: 2024-11-22 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.mdx b/api_docs/kbn_zod.mdx index 4a69c28e05a1e..c41764cb16c3c 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 066fa4ceb849a..80f634d7b5556 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-11-21 +date: 2024-11-22 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 f1c1b3c76a574..988b049574fc7 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-11-21 +date: 2024-11-22 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 f74aab026fe94..133ca02a6cbc1 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-11-21 +date: 2024-11-22 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 5dc7829a3eb36..4c68a44bbbb3f 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-11-21 +date: 2024-11-22 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 cee4bdd78e02e..b7e342898acbb 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index b0eb9b67d6a01..f383c13e0c1c9 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 8a2d0ac7e6ba0..469c1f399b3ad 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 389d94a01d448..5879ddb4b9818 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 84f2a4b3fbc2a..da1f9abca6102 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 5eb042cf54473..9a09412f4ec36 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 5102bee3fc1df..780e650de1669 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/llm_tasks.mdx b/api_docs/llm_tasks.mdx index 56ef0d197cff0..29e2038811265 100644 --- a/api_docs/llm_tasks.mdx +++ b/api_docs/llm_tasks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/llmTasks title: "llmTasks" image: https://source.unsplash.com/400x175/?github description: API docs for the llmTasks plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'llmTasks'] --- import llmTasksObj from './llm_tasks.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 14223d95ab138..329560fefeeb9 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 21e796a93792a..72054cd0a16a0 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 8f930c9ed031b..34a08a7a8a62b 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 95bb39e62a21d..17ab011cd0c20 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 86606b256483f..f58e7a92e557e 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 80633263acd5a..d715644222a06 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 6d874c2cc560f..efcc57e6a8439 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 6832946f87db3..758784316b32e 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 1bf96889378f4..5b30e3fd06ffa 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index c35d40a8df5e0..56b0c4de6567d 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index d0bb1e9401f42..244e38b15e56a 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index a37c83a3cf90c..1f41705561075 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index d39208b14056b..f2dba3b503802 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 1617974265fff..b6a06908fff43 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 7512916ce9b63..5b78cd03a1349 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 1ea3ce96b8b32..e13a0cdeffff6 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a0dbc9da88b8a..c583cc169e75a 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-11-21 +date: 2024-11-22 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 ab2fff2e24a51..11da1cf5a2c56 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-11-21 +date: 2024-11-22 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 e2f06fcb63ff8..8ab2193dec672 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 5f803916afb3d..01d2931bc5a82 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index fa1e551dd424d..9f205d47a6380 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-11-21 +date: 2024-11-22 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 e221d5a371f97..878e058030c2c 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-11-21 +date: 2024-11-22 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 aa424d1adefa8..64e5de0e2b420 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-11-21 +date: 2024-11-22 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 4e7c6ea097ecd..3b7ec39b0ea81 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-11-21 +date: 2024-11-22 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 95450e2f2c024..bacd3236a5a31 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 54482 | 247 | 40923 | 2017 | +| 54464 | 247 | 40907 | 2015 | ## Plugin Directory @@ -33,12 +33,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 72 | 0 | 8 | 2 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 880 | 1 | 848 | 50 | | | [@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 | 119 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 93 | 0 | 93 | 3 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 60 | 1 | 59 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 126 | 0 | 106 | 28 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 268 | 2 | 253 | 10 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 267 | 2 | 252 | 9 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 83 | 0 | 20 | 1 | | cloudChat | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Chat available on Elastic Cloud deployments for quicker assistance. | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud | 8 | 0 | 8 | 1 | @@ -82,7 +82,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 201 | 0 | 201 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The listing page for event annotations. | 15 | 0 | 15 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 116 | 0 | 116 | 11 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 126 | 0 | 126 | 12 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 127 | 0 | 127 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'error' renderer to expressions | 17 | 0 | 15 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 59 | 0 | 58 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart. | 112 | 0 | 108 | 2 | @@ -540,7 +540,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 26 | 0 | 26 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 27 | 0 | 25 | 2 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 16 | 0 | 16 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 17 | 0 | 12 | 11 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 47 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 33 | 3 | 24 | 6 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 665069d662f81..7b01ef460a9ca 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-11-21 +date: 2024-11-22 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 4626a728109cd..370b3a29ab49c 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/product_doc_base.mdx b/api_docs/product_doc_base.mdx index 0ea4e5a08aec0..6f37accb23278 100644 --- a/api_docs/product_doc_base.mdx +++ b/api_docs/product_doc_base.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/productDocBase title: "productDocBase" image: https://source.unsplash.com/400x175/?github description: API docs for the productDocBase plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'productDocBase'] --- import productDocBaseObj from './product_doc_base.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 35cb99c2e0f58..84148793290ba 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-11-21 +date: 2024-11-22 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 d5c042cf4145d..a126eee9f1305 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-11-21 +date: 2024-11-22 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 21b14d908e920..ffb7dafceff4f 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-11-21 +date: 2024-11-22 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 024619d7709ec..77ab774652a23 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-11-21 +date: 2024-11-22 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 e8c682d169833..5c6de0ea3fea0 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-11-21 +date: 2024-11-22 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 16ed7cc70c215..0d285a2b751dd 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-11-21 +date: 2024-11-22 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 befdc463c64b2..05ec2fb29f0ff 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 9002722e62888..d3a810154ffa1 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index f9b1b25650028..7ef035785acd4 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-11-21 +date: 2024-11-22 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 c8fc1d33b75cb..607032b173e1a 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-11-21 +date: 2024-11-22 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 d73a0d968a5ea..38664c94a97b4 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-11-21 +date: 2024-11-22 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 f444631d9fe6f..6b9877691d615 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-11-21 +date: 2024-11-22 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 63135706ee86d..a57d40cdae1fb 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-11-21 +date: 2024-11-22 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 a52873bb72c92..0409c2b38ef80 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-11-21 +date: 2024-11-22 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 d091f2a7a4024..ab0e270d9f0cd 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index ea42113c9880c..f67cffe88f106 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index af36c43ddc61b..b46fb0f713d3f 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 2b86f4d0a05f4..80b0b327debff 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index bfb1be750ed27..0ce9640fe7623 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 2c5f9be6d516e..eafd7f17bb87f 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 17b4ebc5d7c38..49b4a6ced27b5 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-11-21 +date: 2024-11-22 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 0f9569ece6c47..a2f9128eeb984 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-11-21 +date: 2024-11-22 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 98e74151d2c5c..beced7ef042f4 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index ef3ed24aa5650..fe996ca8192c7 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-11-21 +date: 2024-11-22 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 7453a707f7ead..d3702f31a2a09 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-11-21 +date: 2024-11-22 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 fd04e2723620c..da76bda855ad2 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-11-21 +date: 2024-11-22 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 4e0e4747a7d12..9ed3edf484f4e 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-11-21 +date: 2024-11-22 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 c59f3944e647d..ca029505d397b 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-11-21 +date: 2024-11-22 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 cabc797d4ecf3..c69eda54adde7 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-11-21 +date: 2024-11-22 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 d790fe5f0b367..621edaab4fed3 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-11-21 +date: 2024-11-22 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 71d617e50d2a6..18739a7c29ae1 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-11-21 +date: 2024-11-22 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 f9afcc4d75e9a..0e3f28446c7f8 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-11-21 +date: 2024-11-22 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 2b3ae1dd8efa1..9aaee9101af97 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-11-21 +date: 2024-11-22 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 8fff51a834507..82fef50bf0bdd 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-11-21 +date: 2024-11-22 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 11e8fd244aa69..93ec820314269 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-11-21 +date: 2024-11-22 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 2e22fde60dc60..cf41a04195d6d 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/streams.mdx b/api_docs/streams.mdx index f46c3dc108559..61dc95c44fddc 100644 --- a/api_docs/streams.mdx +++ b/api_docs/streams.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/streams title: "streams" image: https://source.unsplash.com/400x175/?github description: API docs for the streams plugin -date: 2024-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'streams'] --- import streamsObj from './streams.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 3592eb3d99768..eb637b28265b9 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-11-21 +date: 2024-11-22 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 9dda7db62fce7..f9df55ffe063e 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-11-21 +date: 2024-11-22 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 8e2ed2e37ab17..312c866bf5237 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index de520e776a0d6..92f25b5d73054 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index b9504112c4082..60e8abc571190 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-11-21 +date: 2024-11-22 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 bfc668f544402..6ae93884c4c23 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-11-21 +date: 2024-11-22 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 1e3e5067625d5..d374a68bd97ea 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-11-21 +date: 2024-11-22 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 27bb87dcc1619..1b7bc8b02715a 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-11-21 +date: 2024-11-22 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 fa21f3c784200..7527fb3a69882 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-11-21 +date: 2024-11-22 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 e60be97daf17f..0d133d56b7a35 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-11-21 +date: 2024-11-22 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 d0153f7ab1a20..17e877e7461d0 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-11-21 +date: 2024-11-22 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 d20afbd886578..be8dd17292a2c 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-11-21 +date: 2024-11-22 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 b40b57b653542..8cfad5be3f003 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-11-21 +date: 2024-11-22 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 31d331031e745..2d63214a6f4bc 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-11-21 +date: 2024-11-22 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 cd769820dffd1..0c45c37bb221c 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-11-21 +date: 2024-11-22 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 c5bbdd7a08a75..f83cd5d6ae9ae 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-11-21 +date: 2024-11-22 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 84f59a769f77d..7a63eeb0e4a73 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-11-21 +date: 2024-11-22 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 0b81b1e37ee3b..df78cd34de7aa 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-11-21 +date: 2024-11-22 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 6473fc5b33b3c..26941d1ddf058 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-11-21 +date: 2024-11-22 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 e24404aafee1e..25a5834dede7d 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-11-21 +date: 2024-11-22 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 32f18b5f3a039..5adb18dc78c46 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-11-21 +date: 2024-11-22 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 ad2abc11bc255..d93490fb31ac7 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-11-21 +date: 2024-11-22 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 a6be2f123dcc1..1041603461f1c 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-11-21 +date: 2024-11-22 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 6b491ece98cd6..9d8810c19098e 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-11-21 +date: 2024-11-22 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 ed3b3063b0f81..11d22d4009301 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-11-21 +date: 2024-11-22 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 d13a56fcbe286..d093b71336e6c 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-11-21 +date: 2024-11-22 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 7e3e9cc4ea265..63f32e78862a7 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-11-21 +date: 2024-11-22 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 7d1d44be5c6db..7304a38526b4c 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 3fb0e3cb7105a..74138f0c8889f 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-11-21 +date: 2024-11-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/dev_docs/tutorials/advanced_settings.mdx b/dev_docs/tutorials/advanced_settings.mdx index d14da92edc93c..6789e9d6af7ad 100644 --- a/dev_docs/tutorials/advanced_settings.mdx +++ b/dev_docs/tutorials/advanced_settings.mdx @@ -53,26 +53,23 @@ On the client, the `uiSettings` service is accessible directly from `core` and t The following is a basic example for using the `uiSettings` service: **src/plugins/charts/public/plugin.ts** + ```ts import { Plugin, CoreSetup } from '@kbn/core/public'; -import { ExpressionsSetup } from '../../expressions/public'; +import { ExpressionsSetup } from '@kbn/expressions-plugin/public'; import { palette, systemPalette } from '../common'; -import { ThemeService, LegacyColorsService } from './services'; +import { ThemeService } from './services'; import { PaletteService } from './services/palettes/service'; import { ActiveCursor } from './services/active_cursor'; -export type Theme = Omit; -export type Color = Omit; - interface SetupDependencies { expressions: ExpressionsSetup; } /** @public */ export interface ChartsPluginSetup { - legacyColors: Color; - theme: Theme; + theme: Omit; palettes: ReturnType; } @@ -84,7 +81,6 @@ export type ChartsPluginStart = ChartsPluginSetup & { /** @public */ export class ChartsPlugin implements Plugin { private readonly themeService = new ThemeService(); - private readonly legacyColorsService = new LegacyColorsService(); private readonly paletteService = new PaletteService(); private readonly activeCursor = new ActiveCursor(); @@ -93,14 +89,12 @@ export class ChartsPlugin implements Plugin - Refer to [the server-side uiSettings service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.iuisettingsclient.md) + Refer to [the server-side uiSettings service API + docs](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.iuisettingsclient.md) -**src/plugins/charts/server/plugin.ts** +**src/plugins/dev_tools/server/plugin.ts** ```ts -import { i18n } from '@kbn/i18n'; -import { schema } from '@kbn/config-schema'; -import { CoreSetup, Plugin } from '@kbn/core/server'; -import { COLOR_MAPPING_SETTING, LEGACY_TIME_AXIS, palette, systemPalette } from '../common'; -import { ExpressionsServerSetup } from '../../expressions/server'; +import { PluginInitializerContext, Plugin, CoreSetup } from '@kbn/core/server'; -interface SetupDependencies { - expressions: ExpressionsServerSetup; -} +import { uiSettings } from './ui_settings'; +export class DevToolsServerPlugin implements Plugin { + constructor(initializerContext: PluginInitializerContext) {} -export class ChartsServerPlugin implements Plugin { - public setup(core: CoreSetup, dependencies: SetupDependencies) { - dependencies.expressions.registerFunction(palette); - dependencies.expressions.registerFunction(systemPalette); + public setup(core: CoreSetup) { + /** + * Register Dev Tools UI Settings + */ core.uiSettings.register({ - [COLOR_MAPPING_SETTING]: { - name: i18n.translate('charts.advancedSettings.visualization.colorMappingTitle', { - defaultMessage: 'Color mapping', - }), - value: JSON.stringify({ - Count: '#00A69B', - }), - type: 'json', - description: i18n.translate('charts.advancedSettings.visualization.colorMappingText', { + [ENABLE_PERSISTENT_CONSOLE_UI_SETTING_ID]: { + category: [DEV_TOOLS_FEATURE_ID], + description: i18n.translate('devTools.uiSettings.persistentConsole.description', { defaultMessage: - 'Maps values to specific colors in charts using the Compatibility palette.', + 'Enables a persistent console in the Kibana UI. This setting does not affect the standard Console in Dev Tools.', }), - deprecation: { - message: i18n.translate( - 'charts.advancedSettings.visualization.colorMappingTextDeprecation', - { - defaultMessage: - 'This setting is deprecated and will not be supported in a future version.', - } - ), - docLinksKey: 'visualizationSettings', - }, - category: ['visualization'], - schema: schema.string(), + name: i18n.translate('devTools.uiSettings.persistentConsole.name', { + defaultMessage: 'Persistent Console', + }), + requiresPageReload: true, + schema: schema.boolean(), + value: true, }, - ... }); - return {}; } - + public start() { return {}; } public stop() {} -} +} ``` -For optimal Kibana performance, `uiSettings` are cached. Any changes that require a cache refresh should use the `requiresPageReload` parameter on registration. + +For optimal Kibana performance, `uiSettings` are cached. Any changes that require a cache refresh should use the `requiresPageReload` parameter on registration. For example, changing the time filter refresh interval triggers a prompt in the UI that the page needs to be refreshed to save the new value: diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index ea55777b595fc..848042e475fee 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -8,9028 +8,91 @@ :issue: https://github.com/elastic/kibana/issues/ :pull: https://github.com/elastic/kibana/pull/ -Review important information about the {kib} 8.x releases. +Review important information about the {kib} 9.x releases. -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> +* <> -- include::upgrade-notes.asciidoc[] +[[release-notes-9.0.0]] +== {kib} 9.0.0 -[[release-notes-8.16.1]] -== {kib} 8.16.1 +For information about the {kib} 9.0.0 release, review the following information. -The 8.16.1 release includes the following bug fixes. [float] -[[fixes-v8.16.1]] -=== Bug fixes -Dashboards & Visualizations:: -* Fixes an issue preventing a custom panel title from being saved correctly ({kibana-pull}200548[#200548]). -Elastic Observability solution:: -* Changes the order of the errors shown on Infrastructure applications to be more relevant ({kibana-pull}200531[#200531]). -* Fixes the summary calculation for a calendar-aligned and occurrences-based SLO ({kibana-pull}199873[#199873]). -* Fixes the `kustomize` command ({kibana-pull}199758[#199758]). -Elastic Security solution:: -For the Elastic Security 8.16.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Platform:: -* Fixes an issue with duplicate references to objects when copying saved objects to other spaces ({kibana-pull}200053[#200053]). -* Fixes button colors in the "Share data view to spaces" flyout ({kibana-pull}196004[#196004]). - - -[[release-notes-8.16.0]] -== {kib} 8.16.0 - -For information about the {kib} 8.16.0 release, review the following information. - -The 8.16.0 release includes the following known issues. - -[float] -[[known-issues-8.16.0]] -=== Known issues - -[discrete] -[[known-199902]] -.Stack Monitoring shows "Unable to load page" error -[%collapsible] -==== -*Details* + -The Overview, Nodes, and Logs pages in Stack Monitoring show an "Unable to load page" error. The Stack trace mentions `TypeError: Cannot read properties of undefined (reading 'logsLocator')`. - -*Workaround* + -Disabling the `Set feature visibility > Logs` feature at the Kibana Space settings level will prevent the error from occurring. Please note the `Logs` feature will not be available on those spaces. - -It's also possible to set the `Observability > Logs` feature privilege to `None` at the role level. This will hide the `Logs` feature from individual users and prevent the error for these users as well. - -For more information, refer to {kibana-issue}199902[#199902]. -==== - -[discrete] -[[known-199891-199892]] -.Onboarding, tutorial of APM and OpenTelemetry and some "Beats Only" integrations shows "Unable to load page" error -[%collapsible] -==== -*Details* + -Tutorials linked from the {kib} home page show an "Unable to load page" error. The Stack trace mentions `The above error occurred in tutorial_TutorialUi`. - -*Workaround* + -The APM / OpenTelemetry tutorials represented a shortcut to quickly add important parameters to the configuration files. -It is still possible to obtain the same parameters following the tutorials in the APM documentation. - -More information can be found in the {observability-guide}/apm-collect-application-data.html[APM documentation] and the {observability-guide}/get-started-with-fleet-apm-server.html[Fleet documentation]. - -For information about how to create APM API keys, please check the {observability-guide}/apm-api-key.html#apm-create-an-api-key[API key documentation]. - -For more information, refer to {kibana-issue}199891[#199891] and {kibana-issue}199892[#199892]. -==== - -[float] -[[deprecations-8.16.0]] -=== Deprecations - -The following functionality is deprecated in 8.16.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.16.0. - -[discrete] -.The Logs Stream is now hidden by default in favor of the Logs Explorer app. -[%collapsible] -==== -*Details* + -You can find the Logs Explorer app in the navigation menu under Logs > Explorer, or as a separate tab in Discover. For more information, refer to ({kibana-pull}194519[#194519]). - -*Impact* + -You can still show the Logs Stream app again by navigating to Stack Management > Advanced Settings and by enabling the `observability:enableLogsStream` setting. -==== - -[discrete] -.Deprecates the Observability AI Assistant specific advanced setting `observability:aiAssistantLogsIndexPattern`. -[%collapsible] -==== -*Details* + -The Observability AI Assistant specific advanced setting for Logs index patterns `observability:aiAssistantLogsIndexPattern` is deprecated and no longer used. The AI Assistant will now use the existing **Log sources** setting `observability:logSources` instead. For more information, refer to ({kibana-pull}192003[#192003]). - -//*Impact* + -//!!TODO!! -==== - -[float] -[[breaking-changes-8.16.0]] +[[breaking-changes-9.0.0]] === Breaking changes -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.16.0, review the breaking changes, then mitigate the impact to your application. - [discrete] -.Updated request processing during shutdown. +.Removed all security v1 endpoints (9.0.0) [%collapsible] ==== *Details* + -During shutdown, {kib} now waits for all the ongoing requests to complete according to the `server.shutdownTimeout` setting. During that period, the incoming socket is closed and any new incoming requests are rejected. Before this update, new incoming requests received a response with the status code 503 and body `{"message": "Kibana is shutting down and not accepting new incoming requests"}`. For more information, refer to {kibana-pull}180986[#180986]. -==== - -[float] -[[features-8.16.0]] -=== Features -{kib} 8.16.0 adds the following new and notable features. - -AGPL license:: -* Adds AGPL 3.0 license ({kibana-pull}192025[#192025]). -Alerting:: -* Adds TheHive connector ({kibana-pull}180138[#180138]). -* Adds flapping settings per rule ({kibana-pull}189341[#189341]). -* Efficiency improvements in the Kibana task manager and alerting frameworks ({kibana-issue}188194[#188194]) -Cases:: -* Support TheHive connector in cases ({kibana-pull}180931[#180931]). -Dashboards and visualizations:: -* Adds the ability to star your favorite dashboards and quickly find them ({kibana-pull}189285[#189285]). -* Adds a chart showing usage statistics to the dashboard details ({kibana-pull}187993[#187993]). -* Adds metric styling options in *Lens* ({kibana-pull}186929[#186929]). -* Adds support for coloring table cells by terms with color mappings assignments. This is supported for both Rows and Metric dimensions ({kibana-pull}189895[#189895]). -Data ingestion and Fleet:: -* Support content packages in UI ({kibana-pull}195831[#195831]). -* Advanced agent monitoring options UI for HTTP endpoint and diagnostics ({kibana-pull}193361[#193361]). -* Adds option to have Kafka dynamic topics in outputs ({kibana-pull}192720[#192720]). -* Adds support for GeoIP processor databases in Ingest Pipelines ({kibana-pull}190830[#190830]). -// !!TODO!! The above PR had a lengthy release note description: -// The Ingest Pipelines app now supports adding and managing databases for the GeoIP processor. Additionally, the pipeline creation flow now includes support for the IP Location processor. -* Adds agentless ux creation flow ({kibana-pull}189932[#189932]). -* Enable feature flag for reusable integration policies ({kibana-pull}187153[#187153]). -Discover:: -* When writing ES|QL queries, you now get recommendations to help you get started ({kibana-pull}194418[#194418]). -* Enhances the inline documentation experience in ES|QL mode ({kibana-pull}192156[#192156]). -* Adds the ability to break down the histogram by field for ES|QL queries in Discover ({kibana-pull}193820[#193820]). -* Adds a summary column to the Documents table when exploring log data in Discover ({kibana-pull}192567[#192567]). -* Adds row indicators to the Documents table when exploring log data in Discover ({kibana-pull}190676[#190676]). -* Moves the button to switch between ES|QL and classic modes to the toolbar ({kibana-pull}188898[#188898]). -* Adds density settings to allow further customization of the Documents table layout ({kibana-pull}188495[#188495]). -* Enables the time picker for indices without the @timestamp field when editing ES|QL queries ({kibana-pull}184361[#184361]). -Elastic Observability solution:: -* Adds experimental logs overview to the observability hosts and service overviews ({kibana-pull}195673[#195673]). -* Show alerts for entities ({kibana-pull}195250[#195250]). -* Create sub-feature role to manage APM settings write permissions ({kibana-pull}194419[#194419]). -* Adds related alerts tab to the alert details page ({kibana-pull}193263[#193263]). -* Adds labels field !! ({kibana-pull}193250[#193250]). -* Implement _ignored root cause identification flow ({kibana-pull}192370[#192370]). -* Enable page for synthetics ({kibana-pull}191846[#191846]). -* Settings add config to enable default rules ({kibana-pull}190800[#190800]). -* Added alerts page ({kibana-pull}190751[#190751]). -* Monitor list add bulk delete ({kibana-pull}190674[#190674]). -* Delete monitor API via id param !! ({kibana-pull}190210[#190210]). -* Enable metrics and traces in the Data Set Quality page ({kibana-pull}190043[#190043]). -* Adds alert grouping functionality to the observability alerts page ({kibana-pull}189958[#189958]). -* Adds a new SLO Burn Rate embeddable ({kibana-pull}189429[#189429]). -* The Slack Web API Alert Connector is now supported as a default connector for Synthetics and Uptime rules ({kibana-pull}188437[#188437]). -* Adds option to enable backfill transform ({kibana-pull}188379[#188379]). -* Save the ECS group by fields at the AAD root level ({kibana-pull}188241[#188241]). -* Adds last value aggregation ({kibana-pull}187082[#187082]). -* Improve synthetics alerting ({kibana-pull}186585[#186585]). -* Make overview grid embeddable ({kibana-pull}160597[#160597]). -Elastic Security solution:: -For the Elastic Security 8.16.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Kibana security:: -* Adds an API endpoint `POST security/roles` that can be used to bulk create or update roles ({kibana-pull}189173[#189173]). -* Automatic Import can now create integrations for logs in the CSV format ({kibana-pull}194386[#194386]). -* Adds an error handling framework to Automatic Import that provides error messages with more context to user ({kibana-pull}193577[#193577]). -* When running in FIPS mode, Kibana forbids usage of PKCS12 configuration options ({kibana-pull}192627[#192627]). -Machine Learning:: -* Adds new section for creating daylight saving time calendar events ({kibana-pull}193605[#193605]). -* Anomaly Detection: Adds a page to list supplied job configurations ({kibana-pull}191564[#191564]). -* Redesigns start/update model deployment dialog to support adaptive resources ({kibana-pull}190243[#190243]). -* File upload: Adds support for PDF files ({kibana-pull}186956[#186956]). -* Adds Pattern analysis embeddable for dashboards ({kibana-pull}186539[#186539]). -Management:: -* This release introduces a fresh, modern look for the console, now featuring the Monaco editor. We've added a file import and export functionality, and the console is fully responsive with stackable panels for a smoother experience. New buttons allow for quick clearing of editor values and output. Additionally, the history and config tabs were improved to enhance usability. ({kibana-pull}189748[#189748]). - -For more information about the features introduced in 8.16.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.16.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.16.0 release, review the enhancements and bug fixes. - - -[float] -[[enhancement-v8.16.0]] -=== Enhancements -Alerting:: -* Allow users to select template while adding a case action in the rule ({kibana-pull}190701[#190701]). -* New full-page rule form in the Stack Management app ({kibana-pull}194655[#194655]). -Dashboards and visualizations:: -* Adds compressed style for dashboard controls ({kibana-pull}190636[#190636]). -* Adds the ability to duplicate a managed dashboard from its `managed` badge ({kibana-pull}189404[#189404]). -* Adds the ability to expand the height of various sections in the Edit ES|QL visualization flyout ({kibana-pull}193453[#193453]). -* Improves the query authoring experience when editing an ES|QL visualization ({kibana-pull}186875[#186875]). -* Syncs the cursor for time series charts powered by ES|QL ({kibana-pull}192837[#192837]). -* Gauge and metric Lens visualizations are no longer experimental ({kibana-pull}192359[#192359]). -* Sets gauge default palette to "temperature" in *Lens* ({kibana-pull}191853[#191853]). -* Supports fuzzy search on field pickers and field lists in *Lens* ({kibana-pull}186894[#186894]). -Data ingestion and Fleet:: -* Update max supported package version ({kibana-pull}196551[#196551]). -* Adds additional columns to Agent Logs UI ({kibana-pull}192262[#192262]). -* Show `+build` versions for Elastic Agent upgrades ({kibana-pull}192171[#192171]). -* Added format parameter to `agent_policies` APIs ({kibana-pull}191811[#191811]). -* Adds toggles for `agent.monitoring.http.enabled` and `agent.monitoring.http.buffer.enabled` to agent policy advanced settings ({kibana-pull}190984[#190984]). -* Support integration policies without agent policy references (aka orphaned integration policies) ({kibana-pull}190649[#190649]). -* Changed the UX of the Edit Integration Policy page to update agent policies ({kibana-pull}190583[#190583]). -* Allow `traces` to be added to the `monitoring_enabled` array in Agent policies ({kibana-pull}189908[#189908]). -* Create task that periodically unenrolls inactive agents ({kibana-pull}189861[#189861]). -* Adds setup technology selector to add integration page ({kibana-pull}189612[#189612]). -* Support integration-level outputs ({kibana-pull}189125[#189125]). -Discover:: -* Renames the Documents tab to Results in ES|QL mode ({kibana-pull}197833[#197833]). -* Adds a cluster details tab for CCS data sources when inspecting requests in ES|QL mode ({kibana-pull}195373[#195373]). -* Adds the query time to the list of statistics when inspecting requests in ES|QL mode ({kibana-pull}194806[#194806]). -* Improves display of error messages in ES|QL mode ({kibana-pull}191320[#191320]). -* Adds a help menu to the ES|QL mode ({kibana-pull}190579[#190579]). -* Initializes the ES|QL editor with time named parameters when switching from the classic mode with a data view without @timestamp ({kibana-pull}189367[#189367]). -* Adds the ability to select multiple rows from the Documents table using "Shift + Select" ({kibana-pull}193619[#193619]). -* Adds the ability to filter on field names and values in the expanded document view ({kibana-pull}192299[#192299]). -* Adds filtering for selected fields ({kibana-pull}191930[#191930]). -* Adds a dedicated column to the document viewer flyout for pinning and unpinning rows ({kibana-pull}190344[#190344]). -* Improves absolute column width handling ({kibana-pull}190288[#190288]). -* Allows filtering by field type in the document viewer flyout ({kibana-pull}189981[#189981]). -* Improves the document viewer flyout to remember the last active tab ({kibana-pull}189806[#189806]). -* Adds ability to hide fields with null values from the document viewer ({kibana-pull}189601[#189601]). -* Adds the ability to copy selected rows as text ({kibana-pull}189512[#189512]). -* Adds a log level badge cell renderer to the Discover logs profile ({kibana-pull}188281[#188281]). -* Shows ECS field descriptions in Discover and adds markdown support for field descriptions ({kibana-pull}187160[#187160]). -* Adds support for the Log overview tab to the Discover log profile ({kibana-pull}186680[#186680]). -* Adds default app state extension and log integration data source profiles ({kibana-pull}186347[#186347]). -* Allows to select and deselect all rows in the grid at once ({kibana-pull}184241[#184241]). -* Limits the height of long field values by default ({kibana-pull}183736[#183736]). -ES|QL editor:: -* Changes the auto-focus to be on the ES|QL editor when loading the page ({kibana-pull}193800[#193800]). -* Updates the autocomplete behavior for `SORT` to be in line with other field-list-based experiences like `KEEP` in ES|QL queries ({kibana-pull}193595[#193595]). -* Adds `all (*)` to the list of suggestions for `COUNT` functions in ES|QL queries ({kibana-pull}192205[#192205]). -* Improves ES|QL autocomplete suggestions for `case()` expressions ({kibana-pull}192135[#192135]). -* Opens suggestions automatically for sources lists and `ENRICH` functions when writing ES|QL queries ({kibana-pull}191312[#191312]). -* Improves wrapping and readability for ES|QL queries ({kibana-pull}191269[#191269]). -* Improves suggestions based on previous function arguments and date suggestions for `bucket` functions in ES|QL queries ({kibana-pull}190828[#190828]). -* Show the `LIMIT` information in the ES|QL editor's footer ({kibana-pull}190498[#190498]). -* Opens suggestions automatically for field lists in ES|QL queries ({kibana-pull}190466[#190466]). -* Integrates a time picker for date fields into the ES|QL editor ({kibana-pull}187047[#187047]). -* Improves ES|QL support for Elasticsearch sub-types in AST for both validation and autocomplete ({kibana-pull}189689[#189689]). -* Adds ECS information to the ES|QL editor suggestions and prioritizes fields based on ECS information on the editor ({kibana-pull}187922[#187922]). -* Improves `BY` suggestions in ES|QL queries to include pipe and comma operators ({kibana-pull}189458[#189458]). -* Makes the suggestion menu open automatically in more places in ES|QL queries ({kibana-pull}189585[#189585]). -* Adds hints upon hover for function argument types and time system types ({kibana-pull}191881[#191881]). -Elastic Observability solution:: -* Enable Kubernetes Otel flow ({kibana-pull}196531[#196531]). -* Pass function responses when copying conversation ({kibana-pull}195635[#195635]). -* Turn 'fast filter' on by default and ensure tech preview badge shows when turned on ({kibana-pull}193710[#193710]). -* Custom Service Name Cell ({kibana-pull}192381[#192381]). -* Remove manage_transform and manage_ingest_pipeline privilege requirements ({kibana-pull}190572[#190572]). -* Create new formula for CPU Usage metric ({kibana-pull}189261[#189261]). -* Adds customizable header for quickstart flows ({kibana-pull}188340[#188340]). -* Change Kubernetes guide to link to observability onboarding ({kibana-pull}188322[#188322]). -* Adds KB user instructions ({kibana-pull}187607[#187607]). -* Refactor Synthetics Overview page for increased scalability ({kibana-pull}187092[#187092]). -* Improve synthetics alerting ({kibana-pull}186585[#186585]). -* Annotations Initial phase ({kibana-pull}184325[#184325]). -Elastic Search solution:: -* Adds Alibaba AI Search to Deletion, search and filtering of inference endpoints ({kibana-pull}190783[#190783]). -Elastic Security solution:: -For the Elastic Security 8.16.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Kibana security:: -* Enhances Open API spec generation to include Route Security Authorization if available ({kibana-pull}197001[#197001]). -* Automatic Import now analyzes larger number of samples to generate an integration ({kibana-pull}196233[#196233]). -* Extended `KibanaRouteOptions` to include security configuration at the route definition level ({kibana-pull}191973[#191973]). -* Adds several UX improvements to the management of Spaces in **Stack Management > Spaces**, including the ability to assign Roles to an existing Space. ({kibana-pull}191795[#191795]). -* Displays an "invalid file" error when selecting unsupported file types for the user profile image ({kibana-pull}190077[#190077]). -* Displays a warning to users whenever role mappings with empty `any` or `all` rules are created or updated ({kibana-pull}189340[#189340]). -* Adds support for CHIPS cookies ({kibana-pull}188519[#188519]). -* Adds support for Permissions Policy reporting ({kibana-pull}186892[#186892]). -Machine Learning:: -* File upload: enables check for model allocations ({kibana-pull}197395[#197395]). -* Data visualizer: Adds icons for semantic text, sparse vector, and dense vector ({kibana-pull}196069[#196069]). -* Updates vCPUs ranges for start model deployment ({kibana-pull}195617[#195617]). -* Adds ML tasks to the Kibana audit log ({kibana-pull}195120[#195120]). -* Anomaly Detection: adds ability to delete forecasts from job ({kibana-pull}194896[#194896]). -* Updates for Trained Models table layout and model states ({kibana-pull}194614[#194614]). -* Log rate analysis: ensures ability to sort on Log rate change ({kibana-pull}193501[#193501]). -* Single Metric Viewer: Enables cross-filtering for 'by', 'over', and 'partition' field values ({kibana-pull}193255[#193255]). -* Adds link to anomaly detection configurations from Integration > Assets tab ({kibana-pull}193105[#193105]). -* Anomaly Explorer: Displays markers for scheduled events in distribution-type anomaly charts ({kibana-pull}192377[#192377]). -* Serverless Security: Adds ES|QL visualizer menu item to the nav ({kibana-pull}192314[#192314]). -* Updates icons for Machine Learning embeddable dashboard panel types ({kibana-pull}191718[#191718]). -* AIOps: Uses no minimum time range by default for pattern analysis ({kibana-pull}191192[#191192]). -* Links to ML assets from Integration > Assets tab ({kibana-pull}189767[#189767]). -* Utilizes the `DataViewLazy` in ML plugin ({kibana-pull}189188[#189188]). -* AIOps: Chunks groups of field candidates into single queries for top items and histograms ({kibana-pull}189155[#189155]). -* AIOps: Updates fields filter popover to be able to filter fields from analysis (not just grouping) ({kibana-pull}188913[#188913]). -* Single Metric Viewer embeddable: adds forecasting ({kibana-pull}188791[#188791]). -* Adds new custom rule action to force time shift ({kibana-pull}188710[#188710]). -* AIOps: Chunks groups of field candidates into single queries ({kibana-pull}188137[#188137]). -* AIOps: Adds log rate analysis to alert details page contextual insight ({kibana-pull}187690[#187690]). -* Adds ability to toggle visibility for empty fields when choosing an aggregation or field in Anomaly detection, data frame analytics ({kibana-pull}186670[#186670]). -* Anomaly Detection: Adds popover links menu to anomaly explorer charts ({kibana-pull}186587[#186587]). -Management:: -* Adds an option to show or hide empty fields in dropdown lists in Transform ({kibana-pull}195485[#195485]). -* Adds a confirmation dialog when deleting a transform from a warning banner ({kibana-pull}192080[#192080]). -* Improves the autocomplete to suggest fields for the `dense_vector` type in Console ({kibana-pull}190769[#190769]). -* Adds the ability to view an ILM policy details in read-only mode ({kibana-pull}186955[#186955]). - -[float] -[[fixes-v8.16.0]] -=== Bug fixes -Alerting:: -* Show up to 1k maintenance windows in the UI ({kibana-pull}198504[#198504]) -* Skip scheduling actions for the alerts without scheduledActions ({kibana-pull}195948[#195948]). -* Fixes Stack Alerts feature API access control ({kibana-pull}193948[#193948]). -* Remove unintended internal find routes API with public access ({kibana-pull}193757[#193757]). -* Convert timestamp before passing to validation ({kibana-pull}192379[#192379]). -* Grouped over field is not populated correctly when editing a rule ({kibana-pull}192297[#192297]). -* Mark slack rate-limiting errors as user errors ({kibana-pull}192200[#192200]). -* Fixes maintenance window filtering with wildcards ({kibana-pull}194777[#194777]). -* Fixes search filters in rules, alerts, and maintenance windows ({kibana-pull}193623[#193623]). -Cases:: -* Use absolute time ranges when adding visualizations to a case ({kibana-pull}189168[#189168]). -* Fixes custom fields with long text that could not be edited in the UI ({kibana-pull}190490[#190490]). -Dashboards and visualizations:: -* Correctly show full screen mode when opening a dashboard or panel from a URL that contains the fullScreenMode parameter ({kibana-pull}196275[#196275]) and ({kibana-pull}190086[#190086]). -* Fixes an issue that could cause a the dashboard list to stay in loading state ({kibana-pull}195277[#195277]). -* Correctly use the same field icons as Discover ({kibana-pull}194095[#194095]). -* Fixes an issue where panels could disappear from a dashboard when canceling edit after saving the dashboard ({kibana-pull}193914[#193914]). -* Adds scroll margin to panels ({kibana-pull}193430[#193430]). -* Fixes an issue with the breadcrumb update icon not working when clicked ({kibana-pull}192240[#192240]). -* Fixes an issue where unsaved changes could remain after saving a dashboard ({kibana-pull}190165[#190165]). -* Fixes an issue causing the flyout to close when canceling the Save to library action ({kibana-pull}188995[#188995]). -* Fixes incomplete string escaping and encoding in *TSVB* ({kibana-pull}196248[#196248]). -* Fixes an issue where label truncation in heat map legends was not working properly in *Lens* ({kibana-pull}195928[#195928]). -* Fixes an issue where the color picker and axis side settings were incorrectly available in the breakdown dimension editor for XY charts in *Lens* ({kibana-pull}195845[#195845]). -* Fixes the tooltip position on faceted charts in *Vega* ({kibana-pull}194620[#194620]). -* Fixes the filter out legend action for ES|QL visualizations ({kibana-pull}194374[#194374]). -* Fixes element sizing issues in full screen mode in *Vega* ({kibana-pull}194330[#194330]). -* Fixes the default cell text alignment setting for non-numeric field types in *Lens* ({kibana-pull}193886[#193886]). -* Limits the height of the query bar input for long KQL queries ({kibana-pull}193737[#193737]). -* Makes the title correctly align left after removing an icon in **Lens** metric charts ({kibana-pull}191057[#191057]). -* Fixes a "No data" error caused by the "Collapse by" setting in **Lens** metric charts ({kibana-pull}190966[#190966]). -* Fixes an issue causing the color of a cell to disappear when clicking the "Expand cell" icon in *Lens* ({kibana-pull}190618[#190618]). -* Removes unnecessary index pattern references from Lens charts ({kibana-pull}190296[#190296]). -* Fixes several accessibility issues ({kibana-pull}188624[#188624]). -Data ingestion and Fleet:: -* Revert "Fix client-side validation for agent policy timeout fields" ({kibana-pull}194338[#194338]). -* Adds proxy arguments to install snippets ({kibana-pull}193922[#193922]). -* Rollover if dimension mappings changed in dynamic templates ({kibana-pull}192098[#192098]). -Discover:: -* Fixes an issue with search highlighting ({kibana-pull}197607[#197607]). -* Correctly pass embeddable filters to the Surrounding Documents page ({kibana-pull}197190[#197190]). -* Fixes trailing decimals dropped from client side validation messages ({kibana-pull}196570[#196570]). -* Fixes several validation issues and creates an expression type evaluator for ES|QL queries ({kibana-pull}195989[#195989]). -* Fixes duplicate autocomplete suggestions for `WHERE` clauses and suggestions with no space in between in ES|QL queries ({kibana-pull}195771[#195771]). -* Improves variable and field name handling in ES|QL queries ({kibana-pull}195149[#195149]). -* Fixes an issue where the Unified Field List popover could get cut off ({kibana-pull}195147[#195147]). -* Fixes the width for saved object type columns ({kibana-pull}194388[#194388]). -* Adds tooltips to Discover button icons ({kibana-pull}192963[#192963]). -* Excludes inactive integration data stream suggestions ({kibana-pull}192953[#192953]). -* Fixes new variables being suggested in incorrect places ({kibana-pull}192405[#192405]). -* Only log requests in the Inspector when they completed ({kibana-pull}191232[#191232]). -ES|QL editor:: -* Fixes an issue where the autocomplete suggestions could cause duplicate entries in ES|QL queries ({kibana-pull}190465[#190465]). -* Fixes several styling issues in the ES|QL editor ({kibana-pull}190170[#190170]). -Elastic Observability solution:: -* Change the slice outcome from bad to good whenever there is no data during the slice window ({kibana-pull}196942[#196942]). -* Make agent names generic with otel-native mode ({kibana-pull}195594[#195594]). -* Avoid showing unnecessary error toast ({kibana-pull}195331[#195331]). -* Use `fields` instead of `_source` on APM queries ({kibana-pull}195242[#195242]). -* Fixes ping heatmap payload ({kibana-pull}195107[#195107]). -* Fixes rule modal warnings in the developer console ({kibana-pull}194766[#194766]). -* Avoid AI assistant overlaying AI conversations ({kibana-pull}194722[#194722]). -* Improve loading state for metric items ({kibana-pull}192930[#192930]). -* Fixes issue where heatmap UI crashes on undefined histogram data ({kibana-pull}192508[#192508]). -* Calculate the latest metadata lookback based on the calculated history delay ({kibana-pull}191324[#191324]). -* Remove dedicated language setting ({kibana-pull}190983[#190983]). -* Change latest metric to use @timestamp ({kibana-pull}190417[#190417]). -* Prevent initial error when adding filters ({kibana-pull}190214[#190214]). -* Display error message when failing to enable machine learning anomaly detection in Inventory ({kibana-pull}189627[#189627]). -* Convert route validation to Zod ({kibana-pull}188691[#188691]). -* Fixes functions table height in asset details view profiling tab ({kibana-pull}188650[#188650]). -* Adds four decimal places float validation for transaction_sample_rate ({kibana-pull}188555[#188555]). -* Centralize data fetching and better control of when data can be refreshed ({kibana-pull}187736[#187736]). -* Fixes heatmap on monitor detail/history page for very large doc counts ({kibana-pull}184177[#184177]). -* Adds settings to serverless allowlist ({kibana-pull}190098[#190098]). -* Set missing group to false by default and show checkbox value in disable mode ({kibana-pull}188402[#188402]). -Elastic Search solution:: -* Fixes an issue with the {ref}/es-connectors-network-drive.html[Network Drive connector] where advanced configuration fields were not displayed for CSV file role mappings with `Drive Type: Linux` selected. -Elastic Security solution:: -For the Elastic Security 8.16.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Kibana platform:: -* Fixes an issue causing a wrong date to show in the header of a report when generated from relative date ({kibana-pull}197027[#197027]). -* Fixes an issue where the Created and Updated timestamps for Dashboards were ignoring the default timezone settings in Advanced settings. ({kibana-pull}196977[#196977]). -* Fixes an issue causing searches including a colon `:` character to show inaccurate results ({kibana-pull}190464[#190464]). -Kibana security:: -* Fixes an issue where an LLM was likely to generate invalid processors containing array access in Automatic Import ({kibana-pull}196207[#196207]). -Machine Learning:: -* File upload: fixes PDF character count limit ({kibana-pull}197333[#197333]). -* Data Drift: Updates brush positions on window resize fix ({kibana-pull}196830[#196830]). -* AIOps: Fixes issue where some queries cause filters to not be applied ({kibana-pull}196585[#196585]). -* Transforms: Limits the data grid result window ({kibana-pull}196510[#196510]). -* Fixes Anomaly Swim Lane Embeddable not updating properly on query change ({kibana-pull}195090[#195090]). -* Hides ES|QL based saved searches in ML & Transforms ({kibana-pull}195084[#195084]). -* Fixes query for pattern analysis and change point analysis ({kibana-pull}194742[#194742]). -* Anomaly explorer: Shows data gaps and connect anomalous points on Single Metric Charts ({kibana-pull}194119[#194119]). -* Fixes file upload with no ingest pipeline ({kibana-pull}193744[#193744]). -* Disables field statistics panel in Dashboard if ES|QL is disabled ({kibana-pull}193587[#193587]). -* Fixes display of assignees when attaching ML panels to a new case ({kibana-pull}192163[#192163]). -* Anomaly explorer: Fixes the order of the coordinates displayed on the map tooltip ({kibana-pull}192077[#192077]). -* Fixes links to the Single Metric Viewer from the Annotations and Forecasts tables ({kibana-pull}192000[#192000]). -* Trained models: fixes responsiveness of state column for smaller displays ({kibana-pull}191900[#191900]). -* File upload: increases timeout for upload request ({kibana-pull}191770[#191770]). -* Improves expired license check ({kibana-pull}191503[#191503]). -Management:: -* Fixes the pagination of the source documents data grid in Transforms ({kibana-pull}196119[#196119]). -* Fixes autocomplete suggestions after a comma in Console ({kibana-pull}189656[#189656]). - -[[release-notes-8.15.5]] -== {kib} 8.15.5 - -The 8.15.5 release includes the following bug fixes. - -[float] -[[fixes-v8.15.5]] -=== Bug fixes -Canvas:: -* Fixes an issue with Canvas not rendering maps with queries or filters ({kibana-pull}199339[#199339]). -Discover:: -* Fixes an issue where the `has_es_data` check was causing {kib} to hang ({kibana-pull}200476[#200476]). -Elastic Observability solution:: -* Changes the order of the errors shown on Infrastructure applications to be more relevant ({kibana-pull}200531[#200531]). -* Fixes the summary calculation for a calendar-aligned and occurrences-based SLO ({kibana-pull}199873[#199873]). -Elastic Security solution:: -For the Elastic Security 8.15.5 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Platform:: -* Fixes an issue with duplicate references to objects when copying saved objects to other spaces ({kibana-pull}200053[#200053]). -* Fixes button colors in the "Share data view to spaces" flyout ({kibana-pull}196004[#196004]). +All `v1` Kibana security HTTP endpoints have been removed. -[[release-notes-8.15.4]] -== {kib} 8.15.4 +`GET /api/security/v1/logout` has been replaced by `GET /api/security/logout` +`GET /api/security/v1/oidc/implicit` has been replaced by `GET /api/security/oidc/implicit` +`GET /api/security/v1/oidc` has been replaced by GET `/api/security/oidc/callback` +`POST /api/security/v1/oidc` has been replaced by POST `/api/security/oidc/initiate_login` +`POST /api/security/v1/saml` has been replaced by POST `/api/security/saml/callback` +`GET /api/security/v1/me` has been removed with no replacement. -The 8.15.4 release includes the following bug fixes. +For more information, refer to {kibana-pull}199656[#199656]. -[float] -[[fixes-v8.15.4]] -=== Bug fixes -Dashboards and visualizations:: -* Fixes incomplete string escaping and encoding in *TSVB* ({kibana-pull}196248[#196248]). -* Adds scroll margin to panels ({kibana-pull}193430[#193430]). -* Fixes an issue where label truncation in heat map legends was not working properly in *Lens* ({kibana-pull}195928[#195928]). -Discover:: -* Fixes the width for saved object Type column ({kibana-pull}194388[#194388]). -Elastic Observability solution:: -* Changes the slice outcome from bad to good whenever there is no data during the slice window ({kibana-pull}196942[#196942]). -Elastic Search solution:: -* Fixes a bug with the {ref}/es-connectors-network-drive.html[Network Drive connector] where advanced configuration fields were not displayed for CSV file role mappings with `Drive Type: Linux` selected ({kibana-pull}195567[#195567]). -Elastic Security solution:: -For the Elastic Security 8.15.4 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Kibana platform:: -* Fixes an issue causing the wrong date to show in the header of a report when generated from a relative date ({kibana-pull}197027[#197027]). -* Fixes an issue with the export options for PNG/PDF reports in a dashboard ({kibana-pull}192530[#192530]). -Machine Learning:: -* Fixes an issue preventing Anomaly swim lane panels from updating on query changes ({kibana-pull}195090[#195090]). -Management:: -* Fixes the pagination of the source documents data grid in Transforms ({kibana-pull}196119[#196119]). - -[[release-notes-8.15.3]] -== {kib} 8.15.3 - -The 8.15.3 release includes the following bug fixes. - -[float] -[[fixes-v8.15.3]] -=== Bug fixes -Alerting:: -* Fixes a storage configuration error that could prevent the Stack Management > Alerts page from loading correctly ({kibana-pull}194785[#194785]). -* Fixes a bug preventing certain alerts with Role visibility set to "Stack Rules" from being shown on the Stack Management page ({kibana-pull}194615[#194615]). -* Fixes an issue where rules created from Discover before version 8.11.0 could no longer be accessed after upgrading ({kibana-pull}192321[#192321]). -Dashboards:: -* Fixes an issue where the `embed=true` parameter was missing when sharing a dashboard with the Embed code option ({kibana-pull}194366[#194366]). -Discover:: -* Fixes an issue with the document viewer panel not opening in focus mode ({kibana-pull}191039[#191039]). -Elastic Observability solution:: -* Fixes the OpenTelemetry guided onboarding for MacOS with x86_64 architectures ({kibana-pull}194915[#194915]). -* Fixes a bug where the SLO creation form was allowing multiple values for timestamp fields ({kibana-pull}194311[#194311]). -Elastic Search solution:: -* Fixes a bug with the https://www.elastic.co/guide/en/enterprise-search/8.15/connectors-network-drive.html[Network Drive connector] where advanced configuration fields were not displayed for CSV file role mappings with `Drive Type: Linux` selected ({kibana-pull}195567[#195567]). -Elastic Security solution:: -For the Elastic Security 8.15.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Kibana security:: -* Automatic Import no longer asks the LLM to map fields to reserved ECS fields ({kibana-pull}195168[#195168]). -* Fixes an issue that was causing the Grok processor to return non-ECS compatible fields when processing structured or unstructured syslog samples in Automatic Import ({kibana-pull}194727[#194727]). -* Fixes the integrationName when uploading a new version of an existing integration using a ZIP upload ({kibana-pull}194298[#194298]). -* Fixes a bug that caused the Deploy step of Automatic Import to fail after a pipeline was edited and saved ({kibana-pull}194203[#194203]). -* Fixes an issue in the Kibana Management > Roles page where users could not sort the table by clicking the column headers ({kibana-pull}194196[#194196]). -Lens & Visualizations:: -* Fixes an issue where the legend label truncation setting wasn't working properly for heat maps in Lens ({kibana-pull}195928[#195928]). -Machine Learning:: -* Fixes an issue preventing Anomaly swim lane panels from updating on query changes ({kibana-pull}195090[#195090]). -* Fixes an issue that could cause the "rows per page" option to disappear from the Anomaly timeline view in the Anomaly Explorer ({kibana-pull}194531[#194531]). -* Fixes an issue causing screen flickering on the Results Explorer and Analytics Map pages when no jobs are available ({kibana-pull}193890[#193890]). - - -[[release-notes-8.15.2]] -== {kib} 8.15.2 - -The 8.15.2 release includes the following enhancements and bug fixes. - -[float] -[[enhancement-v8.15.2]] -=== Enhancements -Elastic Security solution:: -For the Elastic Security 8.15.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Bumps maximum supported package spec version to 3.2 ({kibana-pull}193574[#193574]). -Kibana security:: -* Adds a feature to add support for handling `syslogs with unsupported message body` ({kibana-pull}192817[#192817]). -* Automatic Import now performs reproducible sampling from the list of log entries instead of just truncating them ({kibana-pull}191598[#191598]). -* Adds support for Google Gemini, OpenAI, and Azure OpenAI connectors to Automatic Import ({kibana-pull}191577[#191577]). -* Displays better error messages for issues with logs sample file upload in Automatic Import ({kibana-pull}191310[#191310]). - -[float] -[[fixes-v8.15.2]] -=== Bug fixes -Alerting:: -* Fixes error when saving a rule after toggling alerts filter properties on and off ({kibana-pull}192522[#192522]). -Dashboards:: -* Fixes map layers that disappear from map panel when using session storage to continue editing a dashboard ({kibana-pull}193629[#193629]). -Discover:: -* Fixes "View conflicts" button when a data view ID has special characters ({kibana-pull}192374[#192374]). -Elastic Observability solution:: -* Fixes OpenTelemetry agent names ({kibana-pull}193134[#193134]). -* Resolves an issue for multi-step browser journeys where timings for cached resources within the same step were inaccurate within the waterfall chart ({kibana-pull}193089[#193089]). -* Updates parsing to skip replacing missing values in Synthetics monitors ({kibana-pull}192662[#192662]). -Elastic Security solution:: -For the Elastic Security 8.15.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Prevents extra agent_status call with empty policyId ({kibana-pull}192549[#192549]). -* Sets correct title for Restart upgrade agent modal under agent list ({kibana-pull}192536[#192536]). -Kibana security:: -* Stops removing message field for unstructured logs when using Automatic Import ({kibana-pull}193678[#193678]). -* Integrations created using Automatic Import now indicate that they have been developed by the `Community` instead of Elastic ({kibana-pull}193002[#193002]). -* Fixes issues with rendering the package manifest in Automatic Import ({kibana-pull}192316[#192316]). -Machine Learning:: -* Fixes deletion in Check interval input for anomaly detection rule ({kibana-pull}193420[#193420]). -* Fixes unnecessary ML services initialization during plugin setup ({kibana-pull}193153[#193153]). -* Fixes link to anomaly detection wizard from pattern analysis in Discover ({kibana-pull}192375[#192375]). -* Fixes an issue with the `http_endpoint` input config loading incorrectly in an Automatic Import workflow ({kibana-pull}191964[#191964]). - - -[[release-notes-8.15.1]] -== {kib} 8.15.1 - -The 8.15.1 release includes the following bug fixes. +*Impact* + +Any HTTP API calls to the `v1` Kibana security endpoints will fail with a 404 status code starting from version 9.0.0. +Third party OIDC and SAML identity providers configured with `v1` endpoints will no longer work. -// [float] -// [[enhancement-v8.15.1]] -// === Enhancements -// Other:: -// * Automatic Import now supports the 'multiline newline-delimited JSON' log sample format for the Filestream input ({kibana-pull}190588[#190588]). - -[float] -[[fixes-v8.15.1]] -=== Bug fixes -Data Discovery:: -* Fixes time range filter ({kibana-pull}187010[#187010]). -Elastic Security:: -For the Elastic Security 8.15.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Remove duplicative retries from client-side requests to APIs that depend on EPR ({kibana-pull}190722[#190722]). -Lens & Visualizations:: -* Visualization blows up when invalid color is passed in *TSVB* ({kibana-pull}190658[#190658]). -Observability:: -* Enables wildcard search for the Synthetics waterfall chart ({kibana-pull}191132[#191132]). -* Fixes accordion disclosure keyboard focus border ({kibana-pull}190436[#190436]). -* Always pass allowLeadingWildcards as true to the KQL validation in the custom threshold rule API param validation ({kibana-pull}190031[#190031]). -* Prevent excess calls to get agent namespace ({kibana-pull}189995[#189995]). -* Fixes blank storage explorer summary when filter string is active ({kibana-pull}189760[#189760]). -* Observability AI Assistant: Use internal user when fetching connectors ({kibana-pull}190462[#190462]). -* Observability AI Assistant: Fixes bug “Cannot set initialMessages if initialConversationId is set" ({kibana-pull}189885[#189885]). -Platform:: -* Fixes handling of splittable subkeys when processing values ({kibana-pull}190590[#190590]). Fixes a bug when processing YAML configuration keys that contain dotted notation in objects in arrays. This can manifest as a validation error causing Kibana to not start. -Presentation:: -* Fixes by-value map embeddables have broken layers ({kibana-pull}190996[#190996]). -* Fixes text readability on map scale, attribution, and coordinate controls ({kibana-pull}189639[#189639]). -Search:: -* Fixes index error incorrectly showing up ({kibana-pull}189283[#189283]). Fixes a bug where an index error about the `semantic_text` field would be incorrectly displayed when the inference endpoint was configured and available. -Uptime:: -* Fixes broken pagination in Uptime when a filter is applied ({kibana-pull}189831[#189831]). -// Security:: -// * Resolve a bug in ECS missing fields detection ({kibana-pull}191502[#191502]). -// * Improve sample merge functionality ({kibana-pull}190656[#190656]). -// * Try parsing samples as both NDJSON and JSON ({kibana-pull}190046[#190046]). - -[[release-notes-8.15.0]] -== {kib} 8.15.0 - -For information about the {kib} 8.15.0 release, review the following information. - -The 8.15.0 release includes the following known issues. - -[float] -[[known-issues-8.15.0]] -=== Known issues - -[discrete] -[[known-178114]] -.Kibana fails to start when processing YAML configuration keys that contain dotted notation in objects in arrays -[%collapsible] -==== -*Details* + -In 8.15.1, We fixed a bug when processing YAML configuration keys that contain dotted notation in objects in arrays. -This can manifest as a validation error causing Kibana to not start. - -For more information, refer to {kibana-pull}190590[#190590]. +*Action* + +Update any OIDC and SAML identity providers to reference the corresponding replacement endpoint listed above. +Remove references to the `/api/security/v1/me` endpoint from any automations, applications, tooling, and scripts. ==== [discrete] -[[known-187823]] -.Connectors require update due to Microsoft Teams product retirement +.Access to all internal APIs is blocked (9.0.0) [%collapsible] ==== *Details* + -The original method for configuring incoming webhooks in Microsoft Teams is being retired. -Refer to https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/[Retirement of Office 365 connectors within Microsoft Teams] and {kibana-issue}187823[#187823]. +Access to internal Kibana HTTP APIs is restricted from version 9.0.0. This is to ensure +that HTTP API integrations with Kibana avoid unexpected breaking changes. +Refer to {kibana-pull}193792[#193792]. *Impact* + -If you used the *Incoming Webhook* app in Microsoft Teams to generate a webhook URL for a <>, it will stop working in December 2024. - -*Workaround* + -Use the *Workflows* app in Microsoft Teams to create a new webhook URL, as described in <>. -Update your Microsoft Teams connector to use the new URL before the end of December 2024. -==== - -[discrete] -[[known-189283]] -.Incorrect index errors related to inference endpoints -[%collapsible] -==== -*Details* + -In 8.15.1, we fixed a UI bug where an index error about the `semantic_text` field would be incorrectly displayed when the inference endpoint was configured and available. +Any HTTP API calls to internal Kibana endpoints will fail with a 400 status code starting +from version 9.0.0. -You can ignore this error if you've confirmed that the inference endpoint is configured and the model is deployed. +*Action* + +**Do not integrate with internal HTTP APIs**. They may change or be removed without notice, +and lead to unexpected behaviors. If you would like some capability to be exposed over an +HTTP API, https://github.com/elastic/kibana/issues/new/choose[create an issue]. +We would love to discuss your use case. -This bug is fixed in {kibana-pull}189283[#189283]. ==== [float] -[[deprecations-8.15.0]] +[[deprecations-9.0.0]] === Deprecations -The following functionality is deprecated in 8.15.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.15.0. - -[discrete] -[[deprecation-uptime]] -.Uptime is deprecated in 8.15.0 and will be removed in a future version. -[%collapsible] -==== -*Details* + -The Uptime app is already hidden from Kibana when there is no recent Heartbeat data, and will be completely removed in early 2026. You should migrate to Synthetics as an alternative. For more details, refer to the {observability-guide}/uptime-intro.html[Uptime documentation]. -==== - -[discrete] -.<> are deprecated in 8.15.0 and will be removed in a future version. -[%collapsible] -==== -*Details* + -Search sessions are now deprecated and will be removed in a future version. By default, queries that take longer than 10 minutes (the default for the advanced setting `search:timeout`) will be canceled. To allow queries to run longer, consider increasing `search:timeout` or setting it to `0` which will allow queries to continue running as long as a user is waiting on-screen for results. -==== - -[float] -[[breaking-changes-8.15.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.15.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Adds rate limiting to install by upload endpoint. -[%collapsible] -==== -*Details* + -Rate limiting was added to the upload `api/fleet/epm/packages` endpoint. For more information, refer to {kibana-pull}184036[#184036]. - -*Impact* + -If you do two or more requests in less than 10 seconds, the subsequent requests fail with `429 Too Many Requests`. -Wait 10 seconds before uploading again. -This change could potentially break automations for users that rely on frequent package uploads. -==== - [float] -[[features-8.15.0]] +[[features-9.0.0]] === Features -{kib} 8.15.0 adds the following new and notable features. - -Alerting:: -* Allow decimals in the threshold filed for the Failed transaction rate threshold rule ({kibana-pull}184647[#184647]). -Cases:: -* Cases custom fields and the cases webhook are now GA ({kibana-pull}187880[#187880]). -* Allow users to create case using templates ({kibana-pull}187138[#187138]). -Dashboards:: -* Adding a panel to a dashboard now opens a flyout and the list of panels available is now organized more logically ({kibana-pull}183764[#183764]). -Discover:: -* In ES|QL mode, you can now create WHERE clause filters more intuitively by interacting with the table, sidebar and table row viewer, including for ordinal charts ({kibana-pull}181399[#181399]) & ({kibana-pull}184420[#184420]). -* You can now filter an ES|QL chart by brushing a date histogram ({kibana-pull}184012[#184012]). -Elastic Security:: -* For the Elastic Security 8.15.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* UI for the custom integration creation with AI ({kibana-pull}186304[#186304]). -//* Change agent policies in edit package policy page ({kibana-pull}186084[#186084]). -//* Create shared package policy ({kibana-pull}185916[#185916]). -//* Introduce policy_ids in package policy SO ({kibana-pull}184636[#184636]). -* Surface option to delete diagnostics files ({kibana-pull}183690[#183690]). -* Allow to reset log level for agents >= 8.15.0 ({kibana-pull}183434[#183434]). -* Adds warning if need root integrations trying to be used with unprivileged agents ({kibana-pull}183283[#183283]). -* Adds unprivileged vs privileged agent count to Fleet UI ({kibana-pull}183077[#183077]). -Lens & Visualizations:: -* You can now show additional statistics in the legend of your time series charts created with *Lens* ({kibana-pull}182357[#182357]). -Machine Learning:: -* Adds Field statistics to the list of available panels in Dashboards ({kibana-pull}184030[#184030]). -* Adds ES|QL support for field statistics table in Discover ({kibana-pull}180849[#180849]). -* AIOps: Moves Pattern analysis to a tab instead of a flyout in Discover ({kibana-pull}178916[#178916]). -* AIOps: Adds AI Assistant contextual insights to the Log Rate Analysis page in the Machine Learning plugin for Observability serverless projects ({kibana-pull}186509[#186509]). -Management:: -* Adds an advanced `search:timeout` setting and changes the timeout behavior to display partial results instead of just an error ({kibana-pull}179679[#179679]). -Observability:: -* Updates links for integration buttons in Observability solution ({kibana-pull}184477[#184477]). -* Adds SLO status, SLI value, error budget remaining and consumed to the burn rate alert context ({kibana-pull}184471[#184471]). -* Adds an option to prevent initial backfill for SLOs ({kibana-pull}184312[#184312]). -* Updates `Add data` links to use improved deep linking ({kibana-pull}184164[#184164]). -* Changes the navigation behavior for the Observability guide cards to pre-select the correct solution ({kibana-pull}184065[#184065]). -* Updates the Alerts details to now show an history chart for all types of alerts ({kibana-pull}181824[#181824]). -* Adds Docs count, Size, Services, Hosts, and Degraded docs KPIs to the dataset quality flyout ({kibana-pull}179479[#179479]). -Platform:: -* Improves the **Share** menu to let you navigate through a tabbed modal to copy links for Discover, Dashboards, and Lens. ({kibana-pull}180406[#180406]). -* Changes the behavior of the "Endpoints and API keys" button in the header to open the Connection details flyout ({kibana-pull}183236[#183236]). -* Adds a quick way to create an API keys with a 90-days expiration to the Connection details flyout, and clarifies the Elasticsearch endpoint and Cloud ID information ({kibana-pull}180912[#180912]). -* Adds a feedback button to the header in Serverless projects({kibana-pull}180942[#180942]). -For more information about the features introduced in 8.15.0, refer to <>. +For more information about the features introduced in 9.0.0, refer to <>. -[[enhancements-and-bug-fixes-v8.15.0]] +[[enhancements-and-bug-fixes-v9.0.0]] === Enhancements and bug fixes -For detailed information about the 8.15.0 release, review the enhancements and bug fixes. +For detailed information about the 9.0.0 release, review the enhancements and bug fixes. [float] -[[enhancement-v8.15.0]] -=== Enhancements -Alerting:: -* Adds support of additional fields for ServiceNow ITSM and SecOps ({kibana-pull}184023[#184023]). -* Adds support for the additional info field in the ServiceNow ITOM connector ({kibana-pull}183380[#183380]). -Cases:: -* The Cases webhook connector now supports SSL certificate authentication ({kibana-pull}185925[#185925]). -Dashboards:: -* Adds a "Creator" column to the Dashboards list ({kibana-pull}182256[#182256]). -* Adds the ability to filter dashboards by creator for dashboards created on or after version 8.14 ({kibana-pull}180147[#180147]). -* When switching back from maximized to minimized view on a panel, you return to your original position in the dashboard ({kibana-pull}184696[#184696]). -* Improves the dashboard background color to match the current color mode wen margins are turned off ({kibana-pull}181450[#181450]). -* Simplifies the workflow for creating a copy of the dashboard currently open in both view and edit modes ({kibana-pull}180938[#180938]). -Discover:: -* Adds a button to expand the time range on demand when no results are found for a search ({kibana-pull}181723[#181723]). -* Changes the Discover document viewer flyout to push the rest of the UI instead of hiding it with an overlay ({kibana-pull}166406[#166406]). -* CSV reports now include custom field labels when they exist ({kibana-pull}181565[#181565]). -Elastic Security:: -* For the Elastic Security 8.15.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -ES|QL:: -* Improves metadata autocomplete suggestions with comma and pipe ({kibana-pull}188338[#188338]). -* Automatically encapsulate index names with special characters with quotes ({kibana-pull}187899[#187899]). -* Adds support for integrations ({kibana-pull}184716[#184716]). -* Adds the ability to comment out the current line with the keyboard using `CMD + /` ({kibana-pull}184637[#184637]). - -Fleet:: -* Use API key for standalone agent onboarding ({kibana-pull}187133[#187133]). -//* Adds action for upgrading all agents on policy ({kibana-pull}186827[#186827]). -* Makes Fleet & Integrations layouts full width ({kibana-pull}186056[#186056]). -* Adds support for setting `add_fields` processors on all agents under an agent policy ({kibana-pull}184693[#184693]). -* Adds force flag to delete agent_policies API ({kibana-pull}184419[#184419]). -* Adds data tags to agent policy APIs ({kibana-pull}183563[#183563]). -* Adds support for mappings with store: true ({kibana-pull}183390[#183390]). -* Shows all integration assets on detail page ({kibana-pull}182180[#182180]). -* Adds overrides to package policies update endpoint ({kibana-pull}181453[#181453]). -* Enables `agent.monitoring.http` settings on agent policy UI ({kibana-pull}180922[#180922]). -* Removes unnecessary field definitions for custom integrations and adds `logs@mappings` to log streams ({kibana-pull}178083[#178083]). -Lens & Visualizations:: -* Adds wildcard matching to field pickers across {kib} in *Lens* ({kibana-pull}182631[#182631]). -Machine Learning:: -* AIOps: Adds cardinality check to Log Rate Analysis ({kibana-pull}181129[#181129]). -* AIOps: Reduces rerenders when streaming analysis results ({kibana-pull}182793[#182793]). -* AIOps Log Rate Analysis: Improves explanation of log rate spike/dip ({kibana-pull}186342[#186342]). -* AIOps Log Rate Analysis: Merges fetch queue for keyword and text field candidates ({kibana-pull}183649[#183649]). -* AIOps Log Rate Analysis: Adds controls for controlling which columns will be visible ({kibana-pull}184262[#184262]). -* Anomaly Detection: Single Metric Viewer - Adds cases action ({kibana-pull}183423[#183423]). -* Anomaly Detection: Adds 'Add to dashboard' action for Single Metric Viewer ({kibana-pull}182538[#182538]). -* Anomaly swim lane: UX improvements ({kibana-pull}182586[#182586]). -* Single Metric Viewer embeddable: Ensures chart height is responsive on resize ({kibana-pull}185907[#185907]). -* Single Metric Viewer embeddable in dashboards: Moves all config to flyout ({kibana-pull}182756[#182756]). -* Adds progress bar for trained models download ({kibana-pull}184906[#184906]). -* Updates code editors for Transform, Data Frame and Anomaly Detection wizards ({kibana-pull}184518[#184518]). -Management:: -* The SIEM Query rule loads fewer fields on query execution ({kibana-pull}184890[#184890]). -* The ES Query rule loads fewer fields on query execution ({kibana-pull}183694[#183694]). -* Adds the ability to horizontally resize the autocomplete popup in the Dev Tools Console ({kibana-pull}180243[#180243]). -* The Kibana configuration file now supports assigning a default value for environment variables, using the `${VAR_ENV:defaultValue}` syntax. ({kibana-pull}182139[#182139]). -Observability:: -* Adds the ability to clone a monitor in Synthetics ({kibana-pull}184393[#184393]). -* Adds 10 and 30 seconds frequency options to lightweight monitors in Synthetics ({kibana-pull}184380[#184380]). -* Improves the destination of `Add data` links in Observability to make data ingestion more efficient ({kibana-pull}184164[#184164]). -* Adds an option to mark AI Assistant Knowledge Base entries as public ({kibana-pull}184094[#184094]). -* Updates the AI assistant to query all search connectors by default and adds a setting to override this new default ({kibana-pull}183712[#183712]). -* Adds downstream dependency service name to logs and errors to improve alert insights ({kibana-pull}183215[#183215]). -Operations:: -* Adds password support to the Kibana keystore ({kibana-pull}180414[#180414]). -Platform:: -* Adds http2 support to the Kibana server, that can be enabled using the `server.protocol: http2` Kibana setting ({kibana-pull}183465[#183465]). -* Kibana's `rolling-file` appender now supports more advanced retention policies. Refer to the <> for more details ({kibana-pull}182346[#182346]). -Security:: -* Adds an optional role description field to roles ({kibana-pull}183145[#183145]). -* Adds the ability to filter audit logs by username using the `xpack.security.audit.ignore_filters.users` configuration setting ({kibana-pull}183137[#183137]). -* Adds support for `remote_cluster` privileges in ES role definition ({kibana-pull}182377[#182377]). -* Improves the experience for managing a larger number of API keys by adding server side filtering, pagination and querying. ({kibana-pull}168970[#168970]). - -[float] -[[fixes-v8.15.0]] -=== Bug Fixes -Alerting:: -* Fixes kibana.alert.rule.execution.timestamp timezone and format ({kibana-pull}183905[#183905]). -* Fixes undefined error source in alerting log tags ({kibana-pull}182352[#182352]). -* Allow the rule types to throw user errors ({kibana-pull}184213[#184213]). -* Sets validation errors in subaction framework as user errors ({kibana-pull}184317[#184317]). -* Fixes x-axis time zone on alertSummaryWidget full size ({kibana-pull}187468[#187468]). -Dashboards:: -* Prevent jumping control drag handle between view modes ({kibana-pull}184533[#184533]). -* Fixes error on navigation when invalid selections tour step is open ({kibana-pull}189449[#189449]). -* Fixes positioning of dragged link in Links editor ({kibana-pull}189122[#189122]). -* Don't close the flyout when canceling the Save to library action ({kibana-pull}188995[#188995]). -* Fixes error thrown on numeric options list ({kibana-pull}188789[#188789]). -* Adds tooltip support to `PresentationPanel` header badges ({kibana-pull}186102[#186102]). -* Fixes unsaved changes on new dashboards bug ({kibana-pull}184955[#184955]). -* Reset `maximizedPanelId` on Dashboard navigation ({kibana-pull}183060[#183060]). -Discover:: -* Fixes time range filter ({kibana-pull}187010[#187010]). -* Reset selected fields when modifying the ES|QL query ({kibana-pull}185997[#185997]). -* Fixes document comparison mode and the field statistics tab when using Smart Fields ({kibana-pull}184172[#184172]). -* Disables sorting for Document view ({kibana-pull}187553[#187553]). -* Correctly adds the limit to the field statistics queries ({kibana-pull}186967[#186967]). -* Fixes overlapping on error messages ({kibana-pull}181416[#181416]). -Elastic Search:: -* Allow to save mappings with errors ({kibana-pull}188326[#188326]). - -Elastic Security:: -* For the Elastic Security 8.15.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -ES|QL:: -* Suppress empty syntax error ({kibana-pull}184246[#184246]). -* Accept null values for function arguments ({kibana-pull}184254[#184254]). -* Recognize transformational commands with ast parsing ({kibana-pull}184291[#184291]). -* Accept negated index patterns ({kibana-pull}184528[#184528]). -* Fixes the overflow problem of the editor ({kibana-pull}186166[#186166]). -* Removes inaccurate value suggestions ({kibana-pull}189228[#189228]). -* Improves support for `Invoke` completion trigger type ({kibana-pull}188877[#188877]). -Fleet:: -* Fixes navigating back to Agent policy integration list ({kibana-pull}189165[#189165]). -* Fixes copy agent policy, missed bump revision ({kibana-pull}188935[#188935]). -* Force field enabled=false on inputs that have all their streams disabled ({kibana-pull}188919[#188919]). -* Fill in empty values for `constant_keyword` fields from existing mappings ({kibana-pull}188145[#188145]). -* Enrollment token table may show an empty last page ({kibana-pull}188049[#188049]). -* Separated `showInactive` from unenrolled status filter ({kibana-pull}187960[#187960]). -* Fixes missing policy filter in Fleet Server check to enable secrets ({kibana-pull}187935[#187935]). -* Allow preconfigured agent policy only with name and id ({kibana-pull}187542[#187542]). -* Show warning callout in configs tab when an error occurs ({kibana-pull}187487[#187487]). -* Enable rollover in custom integrations install when getting mapper_exception error ({kibana-pull}186991[#186991]). -* Adds concurrency limit to EPM bulk install API + fix duplicate installations ({kibana-pull}185900[#185900]). -* Include inactive agents in agent policy agent count ({kibana-pull}184517[#184517]). -* Fixes KQL filtering ({kibana-pull}183757[#183757]). -* Prevent concurrent runs of Fleet setup ({kibana-pull}183636[#183636]). -Lens & Visualizations:: -* Do not pass incorrect filters to the state in *Lens* ({kibana-pull}189292[#189292]). -* Adds error reason in workspace panel when error happens in *Lens* ({kibana-pull}189161[#189161]). -* Fixes "Unable to load" page error on edit/add ES|QL panel ({kibana-pull}188664[#188664]). -* Improves the performance of the table ES|QL visualization ({kibana-pull}187142[#187142]). -* Fixes sort field error message for last value ({kibana-pull}184883[#184883]). -* Fixes reference line width stale update in *Lens* ({kibana-pull}184414[#184414]). -* Fixes prepend sizing on duration formatter in *Lens* ({kibana-pull}184403[#184403]). -* Fixes data table actions when the first row is empty in *Lens* ({kibana-pull}181344[#181344]). -* Fixes y-axis scale/custom domain issues and help/error text in *Lens* ({kibana-pull}180532[#180532]). -Logs:: -* Fixes log stream flyout when embedded in APM or the Infrastructure UI ({kibana-pull}189763[#189763]). -* Fixes log entry flyout when response is slow ({kibana-pull}187303[#187303]). -* Fixes flyout link to the legacy Uptime app ({kibana-pull}186328[#186328]). -Machine Learning:: -* Fixes display of model state in trained models list with starting and stopping deployments ({kibana-pull}188847[#188847]). -* AIOps: Fixes runtime mappings in pattern analysis ({kibana-pull}188530[#188530]). -* Fixes Field statistics panel displaying multiple errors if associated index is deleted and race condition when refreshes too fast ({kibana-pull}188327[#188327]). -* Hides ML embeddables from the "Add panel" flyout when ML isn't available ({kibana-pull}187639[#187639]). -* Removes info callout mentioning ML nodes for serverless environment ({kibana-pull}187583[#187583]). -* Fixes upgrade warning ({kibana-pull}187387[#187387]). -* Fixes change point menu which can get stuck open ({kibana-pull}186063[#186063]). -* Do not retry model deployment ({kibana-pull}185012[#185012]). -* Refreshes jobs list after import ({kibana-pull}184757[#184757]). -* AIOps Log Rate Analysis: Fixes date picker refresh button ({kibana-pull}183768[#183768]). -* Single Metric Viewer embeddable: Ensures creating job rule from anomaly click actions is successful ({kibana-pull}183554[#183554]). -* Adds bucket span validation to job creation flyouts ({kibana-pull}183510[#183510]). -* Fixes Choropleth map disappears when time range is changed ({kibana-pull}181933[#181933]). -Management:: -* Allows selection of timestamp when some index pattern segments are unmet ({kibana-pull}189336[#189336]). -* Transforms and Anomaly detection: Updates width for icon in messages tab to prevent overlap ({kibana-pull}188374[#188374]). -* Transform: Fixes transform stats API call in the transform health alerting rule ({kibana-pull}187586[#187586]). -* Transforms: Improves data view checks ({kibana-pull}181892[#181892]). -* Fixes human-readable (precise) formatting ({kibana-pull}181391[#181391]). -Observability:: -* Decreases bucket size top_dependencies sends to get_connection_stats query ({kibana-pull}182884[#182884]). -* Fixes SLO history details data ({kibana-pull}183097[#183097]). -* Improves permission check on SLO pages ({kibana-pull}182609[#182609]). -* Fixes contextual insights for APM errors ({kibana-pull}184642[#184642]). -* Fixes Alerts page history navigation ({kibana-pull}186068[#186068]). -* Accept project monitors with `monitor.url` of type `string` that contains commas ({kibana-pull}186112[#186112]). -* Fixes TLS certificate view for > 3 monitors per certificate ({kibana-pull}186204[#186204]). -* Fixes Synthetics/Uptime fields alerts autocomplete for query bar ({kibana-pull}186588[#186588]). -* Hides AI Assistant menu item when in a disabled space ({kibana-pull}188017[#188017]). -* Fixes AI Assistant settings when plugin is disabled ({kibana-pull}188160[#188160]). -* Fixes bug “Cannot set initialMessages if initialConversationId is set" ({kibana-pull}189885[#189885]). -* Respect query:allowLeadingWildcards in optional query filter ({kibana-pull}189488[#189488]). -* Fixes showing the correct log view in the rule creation flyout ({kibana-pull}189205[#189205]). -* Fixes a bug where "Retest on failure" couldn't be turned off when creating a monitor in the Synthetics app. ({kibana-pull}189013[#189013]). -* Fixes incorrect Redis and AWS CPU percentage metrics displayed on the Infrastructure Inventory page ({kibana-pull}188768[#188768]). -* Improves information communicated in case of insufficient privileges in the Dataset Quality UI ({kibana-pull}183947[#183947]). -Platform:: -* Accessibility fixes for user profile input labels ({kibana-pull}186471[#186471]). -* Fixes several internationalization and localization inconsistencies ({kibana-pull}181735[#181735]). -* Fixes case sensitivity in tag search ({kibana-pull}183092[#183092]). -Querying & Filtering:: -* Fixes performance issues with nested sub-queries ({kibana-pull}181208[#181208]). -Security:: -* Fixes `ComboBox` overflow with large chips ({kibana-pull}184722[#184722]). -* Adds `disabledFeatures` back to mappings, so it can be aggregated on ({kibana-pull}184195[#184195]). -* Supports read-only remote index and cluster sections with read_security access ({kibana-pull}183126[#183126]). -* Adds transformation of application wildcard `*` privilege to `all` to correctly filter and display roles as `superuser`. ({kibana-pull}181400[#181400]). -Sharing:: -* Improves error handling ({kibana-pull}185903[#185903]). - - -[[release-notes-8.14.3]] -== {kib} 8.14.3 - -The 8.14.3 release includes the following bug fixes and known issues. - -[float] -[[known-issues-8.14.3]] -=== Known issues - -include::CHANGELOG.asciidoc[tag=known-issue-186969] - -include::CHANGELOG.asciidoc[tag=known-issue-189394] - -[discrete] -[[known-185691]] -.When using the Observability AI Assistant with the OpenAI connector, function calling will result in an error -[%collapsible] -==== -*Details* + -In 8.14.3, if you are using the Observability AI Assistant with the OpenAI connector, function calling will result in an error. -The error message will look similar to this: - -[source] ----- -Error: an error occurred while running the action - Status code: 400. Message: API Error: model_error - Missing required parameter: 'messages[4].function_call.arguments'. ----- - -A fix will be available in 8.15. Users on 8.14.3 can get around this error by turning on synthetic function calling in _AI Assistant Settings_: - -. In {kib}, go to *Stack Management* → *AI Assistant* → *Observability* -. Toggle the _Simulate function calling_ option to *On*. - -For more information, refer to {kibana-pull}185691[#185691]. -==== - -[float] -[[fixes-v8.14.3]] -=== Bug Fixes -Dashboard:: -* Fixes controls getting overwritten on navigation ({kibana-pull}187509[#187509]). -Elastic Security:: -For the Elastic Security 8.14.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[[release-notes-8.14.2]] -== {kib} 8.14.2 - -The 8.14.2 release includes the following bug fixes and known issues. - -[float] -[[known-issues-8.14.2]] -=== Known issues - -include::CHANGELOG.asciidoc[tag=known-issue-186969] - -include::CHANGELOG.asciidoc[tag=known-issue-189394] - -[float] -[[fixes-v8.14.2]] -=== Bug Fixes - -Alerting:: -* Rule runs recovered actions without ever running active actions ({kibana-pull}183646[#183646]). -Fleet:: -* Updates health_check endpoint to accept hosts ids ({kibana-pull}185014[#185014]). -Machine Learning:: -* AIOps Log Rate Analysis: Fixes text field selection ({kibana-pull}186176[#186176]). -Presentation:: -* Fixes PresentationPanelError component throwing when error.message is empty string ({kibana-pull}186098[#186098]). - -[[release-notes-8.14.1]] -== {kib} 8.14.1 - -The 8.14.1 release includes the following bug fixes and known issues. - -[float] -[[known-issues-8.14.1]] -=== Known issues - -include::CHANGELOG.asciidoc[tag=known-issue-186969] - -include::CHANGELOG.asciidoc[tag=known-issue-189394] - -[float] -[[fixes-v8.14.1]] -=== Bug Fixes -Data Discovery:: -* Notify the user about issues with access to the default data view ({kibana-pull}184740[#184740]). -Discover:: -* Fixes resetting of breakdown field in a saved search ({kibana-pull}184668[#184668]). -Elastic Security:: -For the Elastic Security 8.14.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes restart upgrade disabled condition ({kibana-pull}184586[#184586]). -Observability:: -* Fixes editing enabled state for project monitor ({kibana-pull}184775[#184775]). - -[[release-notes-8.14.0]] -== {kib} 8.14.0 - -For information about the {kib} 8.14.0 release, review the following information. - -[float] -[[known-issues-8.14.0]] -=== Known issues - -// tag::known-issue-186969[] -.Creating or editing APM, {observability} and {stack-monitor-app} rules fails -[%collapsible] -==== -*Details* + -When you attempt to create or edit some rule types in **{stack-manage-app}** > **{rules-ui}**, the request will fail with errors similar to `Cannot read properties of undefined (reading 'eui')` or `e.theme.eui is undefined`. -Refer to https://github.com/elastic/kibana/issues/186969[#186969] - -*Impact* + -This known issue impacts only {observability}, {stack-monitor-app}, and APM and {user-experience} rules. - -*Workaround* + -To work around this issue for {observability} and APM and {user-experience} rules, create them from the {observability} *Alerts* page. -Refer to <> and {observability-guide}/create-alerts-rules.html[Create and manage {observability} rules]. - -*Resolved* + -This issue is resolved in 8.15.0. -==== -// end::known-issue-186969[] - -// tag::known-issue-189394[] -.{webhook-cm} connector fails to send HTTP headers -[%collapsible] -==== -*Details* + -If you configured the {webhook-cm} connector to send key-value pairs as headers, that information is not sent unles you have also enabled the basic authentication option for the connector. -Refer to https://github.com/elastic/kibana/issues/189394[#189394]. - -*Impact* + -The impact of this issue will vary depending on the purpose of your headers. -For example, if you added an `ApiKey` authorization header, you might receive a `401` authorization error since it's no longer sent by the connector. - -*Workaround* + -To work around this issue, enable the *Require authentication for this webhook* option, which is the `hasAuth` property in the API. -You must then provide a username and password for authentication. - -*Resolved* + -This issue is resolved in 8.15.0. -==== -// end::known-issue-189394[] - -[float] -[[breaking-changes-8.14.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.14.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Renamed an advanced setting to enable {esql}. -[%collapsible] -==== -*Details* + -The advanced setting which hides {esql} from the UI has been renamed from `discover:enableESQL` to `enableESQL`. It is enabled by default and must be switched off to disable {esql} features from your {kib} applications. For more information, refer to ({kibana-pull}182074[#182074]). -==== - -[discrete] -[[breaking-178879]] -.The unified search filter builder is Generally Available. -[%collapsible] -==== -*Details* + -The unified search filter builder (OR / AND) is out of technical preview. For more information, refer to ({kibana-pull}178879[#178879]). -==== - -[discrete] -[[breaking-178860]] -.{esql} is Generally Available. -[%collapsible] -==== -*Details* + -{esql} comes out of technical preview and is generally available. For more information, refer to ({kibana-pull}178860[#178860]). -==== - -[discrete] -[[breaking-177549]] -.The region map visualization type is Generally Available in Lens. -[%collapsible] -==== -*Details* + -The visualization type, region map, comes out of technical preview and is generally available. For more information, refer to ({kibana-pull}177549[#177549]). -==== - -[discrete] -[[breaking-177089]] -.UI enhancements to managed tags. -[%collapsible] -==== -*Details* + -UI improvements for managed tags. For more information, refer to ({kibana-pull}177089[#177089]). -==== - -[discrete] -[[breaking-178159]] -.Downloading a CSV file from a saved search panel in a dashboard has become deprecated in favor of generating a CSV report. -[%collapsible] -==== -*Details* + -The mechanism of exporting CSV data from a saved search panel in a dashboard has been changed to generate a CSV report, rather than allowing the CSV data to be downloaded -without creating a report. To preserve the original behavior, it is necessary to update `kibana.yml` with the setting of `xpack.reporting.csv.enablePanelActionDownload: -true`. The scope of this breaking change is limited to downloading CSV files from saved search panels only; downloading CSV files from other types of dashboard panels is -unchanged. For more information, refer to {kibana-pull}178159[#178159]. -==== - -[float] -[[features-8.14.0]] -=== Features -{kib} 8.14.0 adds the following new and notable features. - -Alerting:: -* Adds a warning when changing the index pattern while at least one rule relies on the current one ({kibana-pull}180310[#180310]). -* Enrich the alert flyout with a new overview tab ({kibana-pull}178863[#178863]). -* Adds history chart for multiple conditions ({kibana-pull}180578[#180578]). -* Implements a tabbed design for existing alert detail pages ({kibana-pull}179529[#179529]). -* Stops reporting no data alert for missing groups that are untracked ({kibana-pull}179512[#179512]). -* Adds a new modal window that lets users interact with value lists directly ({kibana-pull}179339[#179339]). -* Adds new rule type selection modal ({kibana-pull}179285[#179285]). -* Enables filters for the alert search bar on the Observability Alerts page ({kibana-pull}178886[#178886]). -APM:: -* Adds a new API to support linking APM from the Profiling UI ({kibana-pull}180677[#180677]). -* Enables fast filter on Service inventory ({kibana-pull}179096[#179096]). -Cases:: -* Adds automatically creating cases when an alert is triggered ({kibana-pull}168369[#168369]). -* Adds "Additional Fields" field to the Jira action form UI ({kibana-pull}179262[#179262]). -Dashboards:: -* Adds logic and UI improvements where invalid controls selections are no longer ignored, improving the overall loading speed of a dashboard ({kibana-pull}174201[#174201]). -Discover:: -* Allows storing a configured {esql} visualization ({kibana-pull}175227[#175227]). -* Adds document comparison mode ({kibana-pull}166577[#166577]). -Elastic Security:: -For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -ES|QL:: -* Adds a query history component which displays the 20 most recent queries ({kibana-pull}178302[#178302]). -Fleet:: -* Adds subfeatures privileges for Fleet, for Agents, Agent policies and Settings, this feature is in technical preview ({kibana-pull}179889[#179889]). -* Implements state machine behavior for package install ({kibana-pull}178657[#178657]). -* Lowers the default `total_fields` limit to 1000 from 10k ({kibana-pull}178398[#178398]). -* Avoids subobject and scalar mapping conflicts by setting `subobjects: false` on custom integrations ({kibana-pull}178397[#178397]). -* Adds functionality to `default_fields` field, so a query can run against all fields in the mapping ({kibana-pull}178020[#178020]). -* Relaxes delete restrictions for managed content installed by Fleet ({kibana-pull}179113[#179113]). -Infrastructure:: -* Adds a dashboard tab in the UI to the asset details view ({kibana-pull}178518[#178518]). -Lens & Visualizations:: -* Replaces `expression_gauge` from `Goal` to `Bullet` in *Lens* ({kibana-pull}177766[#177766]). -Machine Learning:: -* Removes the technical preview badge for pattern analysis ({kibana-pull}181020[#181020]). -* Adds query history for the {esql} Data visualizer ({kibana-pull}179098[#179098]). -Management:: -* {kib} now uses Elasticsearch's `_async_search/status/{id}` endpoint (instead of `_async_search/{id}`) when polling on search requests to improve performance.({kibana-pull}178921[#178921]). -Observability:: -* The timeslice SLOs calculation for the SLI value now includes the no data slices as good slices. For existing "Timeslice" SLOs you will need to use the `POST /api/observability/slos/{slo.id}/_reset` endpoint to reset the transforms to take advantage of the new calculation ({kibana-pull}181888[#181888]). -* Adds support for user instructions via Knowledge base or API request ({kibana-pull}180263[#180263]). -* Adds baseline alert detail pages ({kibana-pull}180256[#180256]). -* Adds a new connector that can call the AI assistant ({kibana-pull}179980[#179980]). -* Adds a link to Discover to view good/bad events in the event panel ({kibana-pull}178008[#178008]). -* Adds customization for Virtual Columns in Field List ({kibana-pull}177626[#177626]). -* Adds dependencies for Burn Rate rule suppression ({kibana-pull}177078[#177078]). -* Adds grouping by multiple values when creating SLOs, allowing for dynamic creation of multiple SLOs from a single SLI definition ({kibana-pull}175063[#175063]). -Uptime:: -* Adds Monitor public API ({kibana-pull}169928[#169928]). - -For more information about the features introduced in 8.14.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.14.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.14.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.14.0]] +[[enhancement-v9.0.0]] === Enhancements -Alerting:: -* Adds history chart for multiple conditions ({kibana-pull}180578[#180578]). -* Show Alerting rule JSON for API requests ({kibana-pull}180085[#180085]). -* Implement tabbed design for existing alert detail pages ({kibana-pull}179529[#179529]). -* Adds new rule type selection modal ({kibana-pull}179285[#179285]). -* Moves alerts filter controls to `@kbn/alerts-ui-shared` package ({kibana-pull}179243[#179243]). -* Improves alerts table actions column performance ({kibana-pull}178632[#178632]). -* Adds Insights component to alerts details ({kibana-pull}178330[#178330]). -* Adds support to dhow the number of additional filters that are applied on the alerts table ({kibana-pull}177275[#177275]). -* Adds error boundary to AlertsTable ({kibana-pull}176412[#176412]). -* Improves the performance of `join_by_key` ({kibana-pull}175177[#175177]). -APM:: -* Show Universal Profiling data on transaction details page ({kibana-pull}176922[#176922]). -Connectors:: -* Adds support for the Jira connector API to support the `otherFields` property to pass additional fields to be used when updating or creating issues via the link:https://developer.atlassian.com/cloud/jira/platform/rest/v2/api-group-issues/#api-rest-api-2-issue-post[Jira API] ({kibana-pull}178627[#178627]). -Dashboard:: -* Reorganized panel actions in the actions menu ({kibana-pull}178596[#178596]). -* Adds panel styling improvements ({kibana-pull}178139[#178139]). -* Adds "Apply" button to stop controls selections being automatically applied ({kibana-pull}174714[#174714]). -Discover:: -* Support field stats for {esql} query ({kibana-pull}178433[#178433]). -Elastic Security:: -For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -ES|QL:: -* Implicit casting changes ({kibana-pull}182989[#182989]). -* Adds validation and auto-complete for `date_diff` ({kibana-pull}182513[#182513]). -* Adds more functions to the validator ({kibana-pull}180640[#180640]). -* Adds an enhanced chart switcher to the *Lens* inline editing flyout ({kibana-pull}177790[#177790]). -Fleet:: -* Adds support for dimension mappings in dynamic templates ({kibana-pull}180023[#180023]). -* Adds CPU metrics to request diagnostics ({kibana-pull}179819[#179819]). -* Adds Settings Framework API and UI ({kibana-pull}179795[#179795]). -* Adds an Elastic Defend advanced policy option for pruning capability arrays ({kibana-pull}179766[#179766]). -* Adds Agent activity flyout enhancements ({kibana-pull}179161[#179161]). -* Adds unhealthy reason (input/output/other) to agent metrics ({kibana-pull}178605[#178605]). -* Adds a warning which is displayed when trying to upgrade agent to version > max fleet server version ({kibana-pull}178079[#178079]). -Infrastructure:: -* Adds alerts count to hosts data ({kibana-pull}176034[#176034]). -Lens & Visualizations:: -* combines the chart type selection options into a single, layer-based chart switch ({kibana-pull}178971[#178971]). -Machine Learning:: -* Hides file upload document count chart until data is searchable ({kibana-pull}181460[#181460]). -* Removes technical preview badge for pattern analysis ({kibana-pull}181020[#181020]). -* Adds support for ad-hoc Data Views for testing models in Trained Models UI ({kibana-pull}180795[#180795]). -* Adds open and edit panel actions for the Single Metric Viewer ({kibana-pull}179364[#179364]). -* Improves {esql} data visualizer performance with early limit and remove option to Analyze all ({kibana-pull}179286[#179286]). -* Adds query history for the {esql} Data visualizer ({kibana-pull}179098[#179098]). -* Hides the Filebeat configuration card for Serverless Search file upload ({kibana-pull}178987[#178987]). -* Improves performance of Field stats / Index data visualizer by reducing requests for empty fields, making it convenient to add multi-field ({kibana-pull}178766[#178766]). -* AIOps: Identify spike/dips with change point detection for log rate analysis ({kibana-pull}178338[#178338]). -* Adds ML feature privileges tooltip ({kibana-pull}181595[#181595]). -Management:: -* Transforms: Use basic stats for transform list, call full stats only for expanded rows ({kibana-pull}180271[#180271]). -* Allows adding a custom description for data view fields ({kibana-pull}168577[#168577]). -Observability:: -* Adds an advanced setting to enable simulated function calling ({kibana-pull}180621[#180621]). -* Adds a public API for /chat/complete ({kibana-pull}179618[#179618]). -* Persists settings in {es} instead of local storage ({kibana-pull}179380[#179380]). -* Allows filtering data views by type ({kibana-pull}179069[#179069]). -* Implements contextual actions ({kibana-pull}178405[#178405]). -* Adds the ability to create an SLI based on the availability of your synthetics monitors ({kibana-pull}177842[#177842]). -* Adds setting for user's preferred language for the AI assistant ({kibana-pull}176444[#176444]). -* Adds improvements to the AI assistants handling where a generated {esql} query has syntax errors ({kibana-pull}179919[#179919]). -* Adds grouping by multiple values when creating SLOs, allowing for dynamic creation of multiple SLOs from a single SLI definition({kibana-pull}175063[#175063]). -Platform:: -* Adds a new option, `system`, to the `theme:darkMode` Kibana advanced setting, that can be used to have Kibana's theme follow the system's (light or dark) ({kibana-pull}173044[#173044]). -Reporting:: -* A feature has been deprecated which allowed users to download a CSV file from a saved search panel in a dashboard, without having a report generated. Now, when users need to access saved search data from a dashboard panel as CSV, a normal report will be generated. To access the deprecated functionality, you can add `xpack.reporting.csv.enablePanelActionDownload: true` to kibana.yml, but this ability will be removed in a future version of Kibana ({kibana-pull}178159[#178159]). -Security:: -* Adds `Content-Security-Policy-Report-Only` header support ({kibana-pull}179949[#179949]). -* Renders a user-friendly UI for unhandled login failures ({kibana-pull}173959[#173959]). -* Migrates the Security AI Assistant into a flyout ({kibana-pull}176657[#176657]). -* Adds support for LangChain streaming for the `openai-functions` agent ({kibana-pull}174126[#174126]). -Unified Search:: -* Adds auto-refresh pause when the page is not visible ({kibana-pull}177693[#177693]). -* Adds support for not clearing the value on the filter builder when the operator changes ({kibana-pull}176911[#176911]). - -[float] -[[fixes-v8.14.0]] -=== Bug Fixes -Alerting:: -* Fixes bug with aggregation building for {es} query rule when there are multi-terms and a group by field ({kibana-pull}182865[#182865]). -* Fixes using `recoveredCurrent` and `activeCurrent` to determine how to update old alerts ({kibana-pull}180934[#180934]). -* Fixes logging the errors reported by `addLastRunError` to the console ({kibana-pull}179962[#179962]). -* Preserves relative snooze when adding or removing snooze schedules ({kibana-pull}178344[#178344]). -* Reverts changes to notify when there is a change on connector configuration ({kibana-pull}177054[#177054]). -APM:: -* Fixes the cardinality count for SLOs generated from a single SLI definition was previously incorrect for APM latency and APM availability SLIs ({kibana-pull}183171[#183171]). -* Fixes the telemetry collection of Logstash with metricbeat monitoring ({kibana-pull}182304[#182304]). -* Fixes otel service detection ({kibana-pull}180574[#180574]). -Cases:: -* Displays the link to the Cases page under observability when Cases {kib} privileges are granted regardless of the other application privileges ({kibana-pull}182569[#182569]). -Canvas:: -* Fixes workpad templates using legacy filters function ({kibana-pull}176093[#176093]). -Connectors:: -* Removes secrets from the connectors before validating in `actionsClient` getAll ({kibana-pull}179837[#179837]). -Dashboard:: -* Fixes opening panel title edit flyout only when panel title is clicked ({kibana-pull}180137[#180137]). -* Disallows copy to dashboard from a maximized panel ({kibana-pull}179422[#179422]). -Discover:: -* Fixes issue where an ES query rule could be created with a data view, then the data view is changed but there's still a reference to the previous data view's timestamp field. ({kibana-pull}182883[#182883]). -* Fixes view all matches button for timestamps with numeric date formats ({kibana-pull}181769[#181769]). -* Fixes time range filters for CSV when a relative time filter is specified in UI ({kibana-pull}181067[#181067]). -* Fixes the status list to be static ({kibana-pull}177435[#177435]). -* Fixes a timeout for a "View all matches" request ({kibana-pull}181859[#181859]). -* Fixes tracking total hits for "View all matches" button ({kibana-pull}181811[#181811]). -* Fixes comments bugs in Discover and Data Visualizer ({kibana-pull}181283[#181283]). -* Fixes the problem with Discover and queries without the from command ({kibana-pull}180692[#180692]). -* Fixes displaying "Unsaved changes" badge on time filter changes in case time range is stored along with saved search ({kibana-pull}178659[#178659]). -Elastic Security:: -For the Elastic Security 8.14.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -ES|QL:: -* Fixes validation on string implicit casting for dates and other minor issues ({kibana-pull}181571[#181571]). -* Fixes validation for some specific {esql} types ({kibana-pull}181381[#181381]). -* Fixes retrieving the indices from AST parsing ({kibana-pull}181271[#181271]). -* Fixes max and min accepting date fields ({kibana-pull}180945[#180945]). -* Fixes autocomplete with incompatible arguments ({kibana-pull}180874[#180874]). -* Fixes providing the CCS indices on the autosuggestion ({kibana-pull}180610[#180610]). -* Fixes to `auto_bucket` and constant-only parameters ({kibana-pull}180509[#180509]). -* Fixes persisting columns sorting in saved search ({kibana-pull}180193[#180193]). -* Fixes client-side validation: make `and` and `or` accept `null` ({kibana-pull}179707[#179707]). -* Fixes to the @timestamp column ({kibana-pull}176834[#176834]). -* Fixes validation running on outdated queries when typing ({kibana-pull}180977[#180977]). -Fleet:: -* Adds validation to dataset field in input packages to disallow special characters ({kibana-pull}182925[#182925]). -* Fixes rollback input package install on failure ({kibana-pull}182665[#182665]). -* Fixes cloudflare template error ({kibana-pull}182645[#182645]). -* Fixes displaying `Config` and `API reference` tabs if they are not needed ({kibana-pull}182518[#182518]). -* Fixes allowing fleet-server agent upgrade to newer than fleet-server ({kibana-pull}181575[#181575]). -* Fixes flattened inputs in the configuration tab ({kibana-pull}181155[#181155]). -* Adds callout when editing an output about plain text secrets being re-saved to secret storage ({kibana-pull}180334[#180334]). -* Removes unnecessary field definitions for custom integrations ({kibana-pull}178293[#178293]). -* Fixes secrets UI inputs in forms when secrets storage is disabled server side ({kibana-pull}178045[#178045]). -* Fixes not being able to preview or download files with special characters ({kibana-pull}176822[#176822]). -* Fixes KQL validation being applied in search boxes ({kibana-pull}176806[#176806]). -Lens & Visualizations:: -* Fixes import to other spaces ({kibana-pull}183076[#183076]). -* Fixes clip path cutting mobile view in *Lens* ({kibana-pull}182376[#182376]). -* Fixes error message layer indexing in *Lens* ({kibana-pull}180898[#180898]). -* Fixes markdown table borders being visible in the text panels ({kibana-pull}180454[#180454]). -* Fixes default formatter for gauge charts in *Lens* ({kibana-pull}179473[#179473]). -* Fixes error for non-date histogram charts that contain `showCurrentTimeMarker:true` setting in *Lens* ({kibana-pull}179452[#179452]). -* Fixes overriding title when using the inline *Lens* editor ({kibana-pull}182897[#182897]). -Machine Learning:: -* Single Metric Viewer: Ensures edit to different job works as expected ({kibana-pull}183086[#183086]). -* Single Metric Viewer: Fixes hover functionality in the anomalies table ({kibana-pull}182297[#182297]). -* Single Metric Viewer: Ensures chart displays correctly when opening from a job annotation ({kibana-pull}182176[#182176]). -* Single Metric Viewer: Displays error message when insufficient permissions ({kibana-pull}180858[#180858]). -* Fixes retention of categorization example limits ({kibana-pull}182103[#182103]). -* Fixes responsive layout for Trained Models table ({kibana-pull}181541[#181541]). -* Removes datafeed preview frozen tier message in serverless ({kibana-pull}181440[#181440]). -* ML anomaly swim lane: Ensure dashboard reset works correctly ({kibana-pull}181346[#181346]). -* AIOps: Fixes query string for the change point detection metric charts ({kibana-pull}181314[#181314]). -* AIOps: Fixes missing field caps filters for log rate analysis ({kibana-pull}181109[#181109]). -* AIOps: Fixes not running log rate analysis twice when no spike/dip is detected ({kibana-pull}180980[#180980]). -* Removes all SCSS files in favor of CSS ({kibana-pull}178314[#178314]). -* Fixes polling for blocked anomaly detection jobs ({kibana-pull}178246[#178246]). -* Adds trained model list permission UI tests ({kibana-pull}174045[#174045]). -Management:: -* Fixes transform health rule failure with a long list of continuous transforms ({kibana-pull}183153[#183153]). -* The runtime field creation modal now shows indexed values instead of source values in the preview pane ({kibana-pull}181246[#181246]). -Monitoring:: -* Fixes broken KQL filter for Cluster Health rule ({kibana-pull}183259[#183259]). -Observability:: -* Fixes Triggered column timezone and format ({kibana-pull}182653[#182653]). -* Fixes refetching data views on save ({kibana-pull}181033[#181033]). -* Allows editing of charts when {es} query fails ({kibana-pull}180500[#180500]). -* Fixes Agent ID not being parsed correctly ({kibana-pull}180301[#180301]). -* Changes `Custom KQL` to `Custom Query` ({kibana-pull}179497[#179497]). -* Fixes filtering for a histogram legend value ({kibana-pull}178551[#178551]). -* Fixes an OpenAI Connector default model assignment bug ({kibana-pull}178369[#178369]). -Platform:: -* Update static asset headers to include `public` and `immutable` link:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control[cache control directives] to a large number of assets served by Kibana, which should reduce the number of requests for static assets in browsers that respect these directives. ({kibana-pull}180378[#180378]). -* Omits apiKey from RUM agent ({kibana-pull}178902[#178902]). -Presentation:: -* Fixes clicking "Explore in maps" button not taking users to maps ({kibana-pull}181903[#181903]). -Security:: -* Fixed escaped terminal codes logging in interactive plugin setup ({kibana-pull}180342[#180342]). -* Fixes an issue with Security Assistant send to timeline functionality ({kibana-pull}177771[#177771]). -SharedUX:: -* Fixes multiline query in expanded mode displaying undefined for line number ({kibana-pull}181544[#181544]). -* Removes unused legacy markdown component ({kibana-pull}179272[#179272]). -* Fixes typo in chromium driver factory page event ({kibana-pull}178708[#178708]). -* Fixes not being able to enter the {esql} editor when the column menu is open ({kibana-pull}178622[#178622]). -* Fixes an issue in Reporting with consistently showing the toast message for completed report jobs ({kibana-pull}177537[#177537]). -* Fixes time picker to show allowed formats properly in absolute tabs ({kibana-pull}182152[#182152]). - -[[release-notes-8.13.4]] -== {kib} 8.13.4 - -The 8.13.4 release includes the following bug fixes. - -[float] -[[fixes-v8.13.4]] -=== Bug Fixes -Lens & Visualizations:: -* Fixes table sorting when changing the interval on the time picker in *Lens* ({kibana-pull}182173[#182173]). -Dashboards:: -* Fixes a bug with drilldowns where the control group on a source dashboard could be replaced by the control group from the destination dashboard ({kibana-pull}179485[#179485]). - -[[release-notes-8.13.3]] -== {kib} 8.13.3 - -The 8.13.3 release includes the following bug fixes. - -[float] -[[fixes-v8.13.3]] -=== Bug Fixes - -Alerting:: -* Manage loading fields at initialization ({kibana-pull}180412[#180412]). -Elastic Security:: -For the Elastic Security 8.13.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes managed agent policy preconfiguration update ({kibana-pull}181624[#181624]). -* Use lowercase dataset in template names ({kibana-pull}180887[#180887]). -* Fixes KQL/kuery for getting Fleet Server agent count ({kibana-pull}180650[#180650]). -Index Management:: -* Fixes `allow_auto_create` field in the Index Template form ({kibana-pull}178321[#178321]). -Lens & Visualizations:: -* Fixes controls on fields with custom label ({kibana-pull}180615[#180615]). -Machine Learning:: -* Fixes deep link for Index data visualizer & ES|QL data visualizer ({kibana-pull}180389[#180389]). -Observability:: -* Make anomalyDetectorTypes optional ({kibana-pull}180717[#180717]). -SharedUX:: -* Revert change to shared UX markdown component for dashboard vis ({kibana-pull}180906[#180906]). -Sharing:: -* Default to saved object description when panel description is not provided ({kibana-pull}181177[#181177]). - -[[release-notes-8.13.2]] -== {kib} 8.13.2 - -The 8.13.2 release includes the following bug fixes. - -[float] -[[fixes-v8.13.2]] -=== Bug Fixes -Canvas:: -* Fixes text settings to be honored in Canvas markdown elements ({kibana-pull}179948[#179948]). -* Fixes custom styling for Canvas markdown Workpads ({kibana-pull}180070[#180070]). -Discover:: -* Fixes keyboard navigation for search input on the document viewer flyout ({kibana-pull}180022[#180022]). -Elastic Security:: -For the Elastic Security 8.13.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes having to wait ten minutes after agent upgrade if agent cleared watching state ({kibana-pull}179917[#179917]). -Fixes using the latest available version in K8's manifest instead of the latest compatible version ({kibana-pull}179662[#179662]). -* Fixes a step in add agent instructions where a query to get all agents was unnecessary ({kibana-pull}179603[#179603]). -Lens & Visualizations:: -* Fixes custom styling for TSVB markdown visualizations ({kibana-pull}180053[#180053]). -Machine Learning:: -* Single Metric Viewer embeddable: Ensures the detector index is passed to chart correctly ({kibana-pull}179761[#179761]). -* AIOps: Fixes text field candidate selection for log rate analysis ({kibana-pull}179699[#179699]). -Management:: -* Fixes the Response tab loading time to be faster ({kibana-pull}180035[#180035]). -Maps:: -* Fixes APM data view ID ({kibana-pull}179257[#179257]). -Monitoring:: -* Fixes a runtime error by adding a default value for source and target ({kibana-pull}180043[#180043]). -Operations:: -* Fixes an issue with {kib} looking for a configuration file outside of the {kib} home directory, potentially preventing startup due to insufficient permissions ({kibana-pull}179847[#179847]). - -[[release-notes-8.13.1]] -== {kib} 8.13.1 - -The 8.13.1 release includes the following bug fixes. [float] -[[enhancement-v8.13.1]] -=== Enhancements -Fleet:: -* Remove `index.query.default_field` setting from managed component template settings ({kibana-pull}178020[#178020]). - -[float] -[[fixes-v8.13.1]] -=== Bug Fixes -Alerting:: -* Limit useEffect to calculate view in app URL ({kibana-pull}179197[#179197]). -Data Discovery:: -* Hide "Save"/"Save as" actions from "Unsaved changes" badge for read-only users ({kibana-pull}179132[#179132]). -Elastic Security:: -For the Elastic Security 8.13.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Use index exists check in fleet-metrics-task ({kibana-pull}179404[#179404]). -Lens & Visualizations:: -* Fixes wilcard complex scenarios ({kibana-pull}178938[#178938]). -Machine Learning:: -* AIOps: Fix text field candidate selection for log rate analysis ({kibana-pull}179699[#179699]). -Observability:: -* Fall back to top 5 docs on scoring error ({kibana-pull}179615[#179615]). -* Fixing APM data view id ({kibana-pull}179257[#179257]). - -[[release-notes-8.13.0]] -== {kib} 8.13.0 - -For information about the {kib} 8.13.0 release, review the following information. - -[float] -[[known-issues-8.13.0]] -=== Known issues - -[discrete] -[[known-179457]] -.In Canvas, an empty text element incorrectly triggers a toast notification -[%collapsible] -==== -*Details* + -In Canvas, an empty text element incorrectly triggers a "Markdown content is required in [readOnly] mode" toast notification. For more information, refer to ({kibana-pull}179457[#179457]). -==== - -[discrete] -[[known-177938-8.13]] -.Index templates UI incorrectly sets the `allow_auto_create` field to `false` by default. -[%collapsible] -==== -*Details* + -If you are creating or editing an index template using the Index Templates form under the Index Management page, the `allow_auto_create` field is incorrectly set to `false` by default (the default value should be `undefined`). For more information, refer to ({kibana-issue}177938[#177938]). -==== - -[float] -[[breaking-changes-8.13.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.13.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Removes conditional topics for Kafka outputs -[%collapsible] -==== -*Details* + -The Kafka output no longer supports conditional topics. For more information, refer to ({kibana-pull}176879[#176879]). -==== - -[discrete] -.Most Fleet installed integrations are now read-only and labelled with a *Managed* tag in the Kibana UI -[%collapsible] -==== -*Details* + - -Integration content installed by {fleet} is no longer editable. This content is tagged with *Managed* in the {kib} UI, and is Elastic managed. This content cannot be edited or deleted, however managed visualizations, dashboards, and saved searches can be cloned. The clones can be customized. - -When cloning a dashboard the cloned panels become entirely independent copies that are unlinked from the original configurations and dependencies. - -Managed content relating to specific visualization editors such as Lens, TSVB, and Maps, the clones retain the original reference configurations. The same applies to editing any saved searches in a managed visualization. - -For more information, refer to ({kibana-pull}172393[#172393]). -==== - -[discrete] -.Removes `is_nan`, `is_finite`, and `is_infinite` functions from {esql} -[%collapsible] -==== -*Details* + -These functions have been removed from {esql} queries as they are not supported. Errors would be thrown when trying to use them. For more information, refer to ({kibana-pull}174674[#174674]). -==== - -[float] -[[features-8.13.0]] -=== Features -{kib} 8.13.0 adds the following new and notable features. - -Alerting:: -* The Custom Threshold rule is now out of technical preview and generally available ({kibana-pull}176514[#176514]). -* Adds threshold to the custom threshold alert document ({kibana-pull}176043[#176043]). -* Adds the ability to post Block Kit messages to the Slack Web API action ({kibana-pull}174303[#174303]). -* Adds criticality fields and risk score fields to alert schema ({kibana-pull}174626[#174626]). -* Adds fields table to rule details page alert flyout ({kibana-pull}172830[#172830]). -APM:: -* Show Universal Profiling on Transaction view ({kibana-pull}176302[#176302]). -* Adds a specific metrics dashboard for opentelemetry-node services ({kibana-pull}174700[#174700]). -Dashboards:: -* Adds the creating of {esql} charts from the dashboard ({kibana-pull}171973[#171973]). -Elastic Security:: -For the Elastic Security 8.13.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -{esql}:: -* Adds enhanced {esql} query editing experience with client side validation ({kibana-pull}170071[#170071]). -Fleet:: -* Adds reference to `ecs@mappings` for each index template ({kibana-pull}174855[#174855]). -* Adds support for the `subobjects` setting on the object type mapping ({kibana-pull}171826[#171826]). -Infrastructure:: -* Adds a new Services component to host details UI ({kibana-pull}176539[#176539]). -Integrations:: -* Adds tiles for Notion and Redis connectors ({kibana-pull}177306[#177306]). -Lens & Visualizations:: -* Adds workspace panel dimensions by chart type ({kibana-pull}168651[#168651]). -Machine Learning:: -* Adds the single metric viewer embeddable for dashboards ({kibana-pull}175857[#175857]). -* Adds support for {esql} in Data visualizer ({kibana-pull}174188[#174188]). -Management:: -* Adds a method of excluding data tiers when getting a field list ({kibana-pull}167946[#167946]). -Reporting:: -* Adds support for 'auto' value for CSV scrolling duration ({kibana-pull}175005[#175005]). -* Adds CSV reporting with {esql} in Discover ({kibana-pull}174511[#174511]). -Observability:: -* Adds actions column ({kibana-pull}175872[#175872]). -* Adds resource column with tooltip ({kibana-pull}175287[#175287]). -* Adds support for the Timeslice Metric visualization on the SLO detail page ({kibana-pull}175281[#175281]). -* Refactor alert table registration and change default columns ({kibana-pull}175119[#175119]). -* Adds customization for virtual columns and add the 1st virtual column ({kibana-pull}173732[#173732]). -* Adds a new option, Visualize this query, to the generated {esql} quires in the Elastic Assistant ({kibana-pull}174677[#174677]). - -For more information about the features introduced in 8.13.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.13.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.13.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.13.0]] -=== Enhancements -Alerting:: -* Improve default AlertsTable columns configuration ({kibana-pull}176137[#176137]). -* Evenly distribute bulk-enabled alerting rules ({kibana-pull}172742[#172742]). -* Implement a mechanism to copy source data into the alerts-as-data documents for ES Query rules ({kibana-pull}171129[#171129]). -APM:: -* Adds detectors for anomaly rules creation ({kibana-pull}171901[#171901]). -* Allows Universal Profiling agent to send error frames ({kibana-pull}176537[#176537]). -* Adds Azure settings ({kibana-pull}176386[#176386]). -* Adds table search to services, transactions and errors ({kibana-pull}174490[#174490]). -* Adds memoization to hooks consumed on service inventory page ({kibana-pull}173973[#173973]). -* Adds stack traces Threads embeddable ({kibana-pull}173905[#173905]). -* Enhances the diff topN functions ({kibana-pull}173397[#173397]). -* Updates Indices API to support sourcemap parameters ({kibana-pull}177847[#177847]). -* Fixes sorting instances table results on server-side ({kibana-pull}174164[#174164]). -Cases:: -* Required custom fields now support default values, which will be used to automatically populate the custom fields if they are not defined when creating and updating cases ({kibana-pull}175961[#175961]). -* Persists all filter options of the cases table, including custom fields, in the URL. The filtering is also persisted when navigating back and forth between pages ({kibana-pull}175237[#175237]). -* Enables the alerts table for cases in the Stack Management ({kibana-pull}172217[#172217]). -Dashboard:: -* Adds step setting for range slider control ({kibana-pull}174717[#174717]). -* Adds a deprecation badge in Dashboard on legacy control panels ({kibana-pull}174302[#174302]). -* Adds external link icon to external URL links in the Links panel ({kibana-pull}174407[#174407]). -* Re-adds filtering settings in the Control settings UI ({kibana-pull}172857[#172857]). -* Adds number field support the the Options List control({kibana-pull}172106[#172106]). -Discover:: -* Hides the Empty fields section if there are no fields in it ({kibana-pull}172956[#172956]). -* Adds data table header row height configuration ({kibana-pull}175501[#175501]). -* Adds new fields ingested in the background to the field list with valid mappings ({kibana-pull}172329[#172329]). -* Adds caching to data view field list request with a `stale-while-revalidate` strategy ({kibana-pull}168910[#168910]). -* Distinguish among empty and available fields in Discover {esql} mode ({kibana-pull}174585[#174585]). -Elastic Security:: -For the Elastic Security 8.13.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Elastic Search:: -* Adds `ignore_empty_value` to generated set processor ({kibana-pull}175172[#175172]). -{esql}:: -* Adds clickable badges on compact view for {esql} queries ({kibana-pull}176568[#176568]). -* Adds link on the documentation popover to navigate to our external docs ({kibana-pull}176377[#176377]). -* Adds support for canceling {esql} queries in *Lens* ({kibana-pull}176277[#176277]). -* Adds quick fixes feature to {esql} query validation errors ({kibana-pull}175553[#175553]). -* Adds support for command settings ({kibana-pull}175114[#175114]). -* Allows line breaks on the {esql} editor ({kibana-pull}173596[#173596]). -Fleet:: -* Adds `skipRateLimitCheck` flag to the Upgrade API and Bulk_upgrade API ({kibana-pull}176923[#176923]). -* Adds making datastream rollover lazy ({kibana-pull}176565[#176565]). -* Stops creating the `{type}-{datastet}@custom` component template during package installation ({kibana-pull}175469[#175469]). -* Adds the `xpack.fleet.isAirGapped` flag ({kibana-pull}174214[#174214]). -* Adds a warning when download upgrade is failing ({kibana-pull}173844[#173844]). -* Adds a message explaining why an agent is not upgradeable ({kibana-pull}173253[#173253]). -* Makes logs-* and metrics-* data views available across all spaces ({kibana-pull}172991[#172991]). -* Adds flag for pre-release to templates/inputs endpoint ({kibana-pull}174471[#174471]). -* Adds concurrency control to Fleet data stream API handler ({kibana-pull}174087[#174087]). -* Adds a handlebar helper to percent encode a given string ({kibana-pull}173119[#173119]). -Integrations:: -* Enables minute frequency for incremental syncs ({kibana-pull}176603[#176603]). -Lens & Visualizations:: -* Datatable improvements in *Lens* ({kibana-pull}174994[#174994]). -* Adds IP Prefix Aggregation-based Visualization ({kibana-pull}173474[#173474]). -* Displays the suggestions on the dataview mode charts in *Lens* ({kibana-pull}172924[#172924]). -* Enables treemap in suggestions in *Lens* ({kibana-pull}169095[#169095]). -Machine Learning:: -* AIOps: Adds UI action for Change Point Detection embeddable to open in the ML app ({kibana-pull}176694[#176694]). -* AIOps: Enhances display of results for alias field types in pattern analysis ({kibana-pull}176586[#176586]). -* Enhances support for {esql} Data visualizer ({kibana-pull}176515[#176515]). -* Adds a prompt to delete alerting rules upon the anomaly detection job deletion ({kibana-pull}176049[#176049]). -* Adds grok highlighting to the file data visualizer ({kibana-pull}175913[#175913]). -* Adds a warning if trained model is referenced by the `_inference` API ({kibana-pull}175880[#175880]). -* Adds a feedback button to anomaly explorer and single metric viewer for metrics hosts anomaly detection jobs ({kibana-pull}175613[#175613]). -* Adds actions menu to anomaly markers in Single Metric Viewer chart ({kibana-pull}175556[#175556]). -* AIOps: Adds expanded rows to pattern analysis table ({kibana-pull}175320[#175320]). -* AIOps: Adds link to log rate analysis from anomaly table ({kibana-pull}175289[#175289]). -* AIOps: Improves pattern analysis refresh behavior ({kibana-pull}174516[#174516]). -* Adds option for using table layout in the Change Point Detection embeddable ({kibana-pull}174348[#174348]). -* Adds high count option to the anomaly detection categorization wizard ({kibana-pull}174252[#174252]). -* Improves Data drift time range selection & shows hints for analysis process ({kibana-pull}174049[#174049]). -* Adds link to anomaly detection job creation from the alerting rule form ({kibana-pull}174016[#174016]). -* Adds warning for legacy method for installing pre-configured APM transaction job ({kibana-pull}173375[#173375]). -* Enhances toast notifications to improve error reporting ({kibana-pull}173362[#173362]). -* Adds document count chart for file upload ({kibana-pull}173210[#173210]). -* Trained models: Adds workflow for creating an ingest pipeline for a trained model ({kibana-pull}170902[#170902]). -* Updates alerts-as-data payload for Anomaly detection health and Transform health rules ({kibana-pull}176307[#176307]). -Management:: -* Changes the column "Components" in the index templates table to display number of component templates ({kibana-pull}175823[#175823]). -Maps:: -* Adds support in maps for the {esql} `geo_shape` column type ({kibana-pull}175156[#175156]). -* Adds a {esql} card to the add layer UI in maps ({kibana-pull}173481[#173481]). -* Displays vector tile results in vector tile inspector ({kibana-pull}172627[#172627]). -Observability:: -* Enable burn rate alert by default during creation via UI ({kibana-pull}176317[#176317]). -* Implements Bedrock support for the Claude models ({kibana-pull}176191[#176191]). -* Adds link for AI Assistant in Observability left hand navigation ({kibana-pull}176144[#176144]). -* Handle token limit error message improvement ({kibana-pull}175871[#175871]). -* Corrects common {esql} mistakes ({kibana-pull}175520[#175520]). -* Adds resource column with tooltip ({kibana-pull}175287[#175287]). -* Adds alert fields table to Observability flyout ({kibana-pull}174685[#174685]). -Platform:: -* Adds an option to disable APM user redaction ({kibana-pull}176566[#176566]). -Reporting:: -* Updated CSV export to insert error messages into the contents if the export results in an empty file due to an error ({kibana-pull}175852[#175852]). -* Adds setting to use PIT or Scroll API ({kibana-pull}174980[#174980]). -Security:: -* Default value of `server.securityResponseHeaders.referrerPolicy` changed to `strict-origin-when-cross-origin` ({kibana-pull}177559[#177559]). -* Adds server side validation for uploaded file types ({kibana-pull}173960[#173960]). -Sharing:: -* Show 'View details' UI action to open clusters inspector tab when request fails ({kibana-pull}172971[#172971]). -Unified Search:: -* Adds 'greater than or equals to' and 'less than' options to filter options for date ranges and numbers ({kibana-pull}174283[#174283]). -* Adds a one minute option to the date picker ({kibana-pull}172944[#172944]). -* Adds multiple improvements to saved query management ({kibana-pull}170599[#170599]). - -[float] -[[fixes-v8.13.0]] -=== Bug Fixes -Alerting:: -* Fixes Elasticsearch query rule with KQL evaluation matched document count ({kibana-pull}176620[#176620]). -* Fixes alerts not being visible when number of alerts are more than max alert limit ({kibana-pull}178019[#178019]). -* Fixes `ruleClient.getAlertState` error when a task is no longer available ({kibana-pull}177077[#177077]). -* Fixes AlertsTable sorting with inactive columns and default sort direction ({kibana-pull}176172[#176172]). -APM:: -* Fixes an infinite loop caused by matching child and parent IDs ({kibana-pull}177914[#177914]). -* Fixes inconsistencies on Service Overview page ({kibana-pull}176293[#176293]). -* Fixes occurrences cut off value to be fully visible ({kibana-pull}175307[#175307]). -Cases:: -* Fixes a bug where if there are required custom fields on a case whose values are empty, it is not possible to update any of those fields ({kibana-pull}176574[#176574]). -Dashboard:: -* Fixes hidden add panel popover on smaller viewports ({kibana-pull}178593[#178593]). -* Fixes form validation when saving Links to library ({kibana-pull}176021[#176021]). -Design:: -* Fixes a11y concerns ({kibana-pull}174772[#174772]). -Discover:: -* Update full screen handling to fix z-index issues in {kib} ({kibana-pull}178788[#178788]). -* Fixes "New" link in {esql} mode ({kibana-pull}177038[#177038]). -* Fixes grid column settings on Surrounding Documents page ({kibana-pull}177003[#177003]). -* Fixes time zone for field popover histogram and removes `getTimeZone` duplicates ({kibana-pull}172705[#172705]). -* Fixes including global filters when opening a saved search ({kibana-pull}175814[#175814]). -* Fixes loading a missing data view in the case where it's not provided by the consuming plugin ({kibana-pull}173017[#173017]). -Elastic Security:: -For the Elastic Security 8.13.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Elastic Search:: -* Fixes minor problems with integrations for Enterprise Search ({kibana-pull}177570[#177570]). -Fleet:: -* Fixes a bug where secret values were not deleted on output type change ({kibana-pull}178964[#178964]). -* Fixes formatting for some integrations on the overview page ({kibana-pull}178937[#178937]). -* Fixes the name of {es} output workers configuration key ({kibana-pull}178329[#178329]). -* Fixes clean up of the `.fleet-policies` entries when deleting an agent policy. ({kibana-pull}178276[#178276]). -* Fixes only showing remote {es} output health status if later than last updated time ({kibana-pull}177685[#177685]). -* Fixes status summary when `showUpgradeable` is selected ({kibana-pull}177618[#177618]). -* Fixes issue of agent sometimes not getting inputs using a new agent policy with system integration ({kibana-pull}177594[#177594]). -* Fixes the activity flyout keeping the scroll state on rerender ({kibana-pull}177029[#177029]). -* Fixes inactive popover tour not resetting ({kibana-pull}176929[#176929]). -* Fixes `isPackageVersionOrLaterInstalled` to check for installed package ({kibana-pull}176532[#176532]). -* Removes pre-release exception for Synthetics package ({kibana-pull}176249[#176249]). -* Fixes output validation when creating package policy ({kibana-pull}175985[#175985]). -* Fixes allowing an agent to upgrade to a newer patch version than fleet-server ({kibana-pull}175775[#175775]). -* Fixes asset creation during custom integration installation ({kibana-pull}174869[#174869]). -* Fixes cascading agent policy's namespace to package policies ({kibana-pull}174776[#174776]). -Infrastructure:: -* Fixing derivative aggregation on kubernetes pods ({kibana-pull}177295[#177295]). -Lens & Visualizations:: -* Fixes handling of `doc_count` on time shift scenarios ({kibana-pull}178394[#178394]). -* Fixes the title of a formula based metric visualization defaulting to `Formula` in *Lens* ({kibana-pull}177299[#177299]). -* Fixes sorting on table when using Last value on date field in *Lens* ({kibana-pull}177288[#177288]). -* Align formatters for point and range annotations in *Lens* ({kibana-pull}177199[#177199]). -* Fixes the mapping of {es} fields ({kibana-pull}176665[#176665]). -* Fixes the display of warnings with additional information ({kibana-pull}176660[#176660]). -* Fixes clicking the editor closing the {esql} documentation popover ({kibana-pull}176394[#176394]). -* Fixes creating or removing layers in *Lens* loosing focus ({kibana-pull}175893[#175893]). -* Fixes using the same adhoc data views for queries with the same index pattern ({kibana-pull}174736[#174736]). -* Fixes the markdown editor not expanding to fill vertical space ({kibana-pull}174276[#174276]). -Machine Learning:: -* Preserves field formatters between rule executions ({kibana-pull}178621[#178621]). -* Fixes quick create geo job created by ID ({kibana-pull}177691[#177691]). -* AIOps: Fixes incomplete edge buckets for change point detection ({kibana-pull}177579[#177579]). -* AIOps: Fixes grouping for fields with large arrays ({kibana-pull}177438[#177438]). -* Fixes Single Metric Viewer's zoom settings in URL are not restored if URL specifies a forecast ID ({kibana-pull}176969[#176969]). -* Adds delay to deletion modal to avoid flickering ({kibana-pull}176424[#176424]). -* Fixes Single Metric Viewer not showing chart for metric functions and mismatch function in tooltip ({kibana-pull}176354[#176354]). -* Fixes multi-match query overriding filters in Data Visualizer and Data Drift ({kibana-pull}176347[#176347]). -* Fixes only enabling apply button in anomaly detection datafeed chart if changes have been made ({kibana-pull}174425[#174425]). -Management:: -* Fixes editing a rollup data view ({kibana-pull}177446[#177446]). -* Fixes showing previously selected no time field setting ({kibana-pull}177221[#177221]). -* Fixes package showing 'Needs authorization' warning even after transform assets were authorized successfully ({kibana-pull}176647[#176647]). -* Removes the polling interval to reload indices in the background ({kibana-pull}174681[#174681]). -* Fixes keeping the filters value in the URL for the indices list ({kibana-pull}174515[#174515]). -* Fixes categorizing fields as empty that never had a value in matching indices ({kibana-pull}174063[#174063]). -* Fixes the badge for managed data streams in Index Management ({kibana-pull}173408[#173408]). -* Some input fields are now disabled when editing managed repositories in Snapshot & Restore ({kibana-pull}173137[#173137]). -* Input fields to change snapshot name and repository are now disabled when editing managed SLM policies in Snapshot & Restore ({kibana-pull}172291[#172291]). -Maps:: -* Fixes Request URL Too Long (414) with heatmap layer when data view has larger number of date fields ({kibana-pull}177900[#177900]). -* Fixes the maps application breaking if you open a map with layers or sources that do not exist (#176419). -Observability:: -* SLOs: Does not display group by cardinality when group by is not selected ({kibana-pull}178133[#178133]). -* Fixes bug in inventory rule for Inbound and Outbound traffic threshold (both preview and executor) ({kibana-pull}177997[#177997]). -* Fixes more lenient parsing of suggestion scores ({kibana-pull}177898[#177898]). -* Fixes refreshing the conversations list on conversation update ({kibana-pull}177897[#177897]). -* Fixes SLO details path is broken when `instanceId` contains a forward slash ({kibana-pull}177843[#177843]). -* Prevents users from picking date fields for the group-by selector ({kibana-pull}177830[#177830]). -* Fixes undefined issue cased due row check missing ({kibana-pull}177293[#177293]). -* Fixes making IDs unique to capture multiple invocations of the same query ({kibana-pull}173433[#173433]). -Querying & Filtering:: -* Fixes autocomplete value suggestions for KQL when the corresponding index has no tier preference set ({kibana-pull}176355[#176355]). -SharedUX:: -* Fixes how sample data test install state is determined in test ({kibana-pull}178529[#178529]). -* Fixed a bug in Stack Management Reporting where the Delete button was not disabled after click ({kibana-pull}173707[#173707]). -Uptime:: -* Require `unifiedSearch` plugin and include in top-level Kibana Context Provider ({kibana-pull}178421[#178421]). -* Omit the request `Content-Type` header if body check is empty ({kibana-pull}178399[#178399]). -* Fixes Certificates page for monitors that have status alert disabled ({kibana-pull}178336[#178336]). -* Fixes allowing Synthetics global parameters to include dashes ({kibana-pull}178054[#178054]). -* Change test now trigger route from GET to POST ({kibana-pull}177093[#177093]). -* Fixes and simplifies write access default behavior ({kibana-pull}177088[#177088]). - -[[release-notes-8.12.2]] -== {kib} 8.12.2 - -The 8.12.2 release includes the following bug fixes. - -[float] -[[fixes-v8.12.2]] -=== Bug Fixes -Alerting:: -* Fixes Discover results when an alert excludes matches from previous runs ({kibana-pull}176690[#176690]). -* Fixes bug where using select all on the rules list bypassed filters ({kibana-pull}176962[#176962]). -Elastic Security:: -For the Elastic Security 8.12.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes a popover about inactive agents not being dismissible ({kibana-pull}176929[#176929]). -* Fixes logstash output being link:https://www.rfc-editor.org/rfc/rfc952[RFC-952] compliant ({kibana-pull}176298[#176298]). -* Fixes assets being unintentionally moved to the default space during Fleet setup ({kibana-pull}176173[#176173]). -* Fixes categories labels in integration overview ({kibana-pull}176141[#176141]). -* Fixes the ability to delete agent policies with inactive agents from UI, the inactive agents need to be unenrolled first ({kibana-pull}175815[#175815]). -Machine Learning:: -* Fixes Single Metric Viewer's zoom range settings in URL not being restored if the URL specifies a `forecastId` ({kibana-pull}176969[#176969]). -* Fixes incorrect document count values in Top Values statistics ({kibana-pull}176328[#176328]). -* Fixes color of markers in Single Metric Viewer when there is sparse data for anomaly detection ({kibana-pull}176303[#176303]). -Management:: -* Fixes package showing 'Needs authorization' warning even after transform assets were authorized successfully ({kibana-pull}176647[#176647]). -Observability:: -* Fixes and simplifies write access default behavior ({kibana-pull}177088[#177088]). -* Fixes recall speed when using CVS output ({kibana-pull}176428[#176428]). - -[[release-notes-8.12.1]] -== {kib} 8.12.1 - -The 8.12.1 release includes the following enhancements and bug fixes. - -[float] -[[enhancement-v8.12.1]] -=== Enhancements - -Elastic Security:: -For the Elastic Security 8.12.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Observability:: -* Adds `defer_validation: true` to transforms on creation to stop errors when the destination index doesn't exist yet ({kibana-pull}174463[#174463]). - -[float] -[[fixes-v8.12.1]] -=== Bug Fixes -Alerting:: -* Fixes context variables not being passed in to the action parameters when an alert- as-data document is available ({kibana-pull}175682[#175682]). -* Fixes the Rules page loosing user selections when navigating back ({kibana-pull}174954[#174954]). -* Fixes the custom threshold rendering in the create rule flyout ({kibana-pull}174982[#174982]). -APM:: -* Fixes a transactions error link for mobile ({kibana-pull}174655[#174655]). -* Increases the number of maximum function calls from 3 to 5 ({kibana-pull}175588[#175588]). -Dashboard:: -* Fixes a caching issue that caused problems updating dashboard information ({kibana-pull}175635[#175635]). -Elastic Security:: -For the Elastic Security 8.12.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes the display of category label on the Integration overview page ({kibana-pull}176141[#176141]). -* Fixes conflicting dynamic template mappings for intermediate objects ({kibana-pull}175970[#175970]). -* Fixes reserved keys for Elasticsearch output YAML box ({kibana-pull}175901[#175901]). -* Prevent deletion of agent policies with inactive agents from UI ({kibana-pull}175815[#175815]). -* Fixes incorrect count of agents in bulk actions ({kibana-pull}175318[#175318]). -* Fixes a custom integrations not displaying on the Installed integrations page ({kibana-pull}174804[#174804]). -Lens & Visualizations:: -* Fixes a validation error for invalid formula and math columns in *Lens* ({kibana-pull}175644[#175644]). -Machine Learning:: -* Fixes Allocation rendering for failed deployments ({kibana-pull}174882[#174882]). -* Fixes an issue where a user could create an anomaly rule but couldn't see it or interact with the rule via stack management ({kibana-pull}174791[#174791]). -Security:: -* Fixes API Key table sorting ({kibana-pull}175813[#175813]). -* Ensures all API Keys have a defined name ({kibana-pull}175721[#175721]). -* Fixes an issue with `@kbn-handlebars`, where nested inputs were not being escaped properly ({kibana-pull}175490[#175490]). - -[[release-notes-8.12.0]] -== {kib} 8.12.0 - -For information about the {kib} 8.12.0 release, review the following information. - -[float] -[[known-issues-8.12.0]] -=== Known issues - -[discrete] -[[known-177938-8.12]] -.Index templates UI incorrectly sets the `allow_auto_create` field to `false` by default. -[%collapsible] -==== -*Details* + -If you are creating or editing an index template using the Index Templates form under the Index Management page, the `allow_auto_create` field is incorrectly set to `false` by default (the default value should be `undefined`). For more information, refer to ({kibana-issue}177938[#177938]). -==== - -[float] -[[breaking-changes-8.12.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.12.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.New SLO architecture -[%collapsible] -==== -*Details* + -We introduce a breaking change in the SLO features that will break any SLOs created before 8.12. These SLOs have to be manually reset through an API until we provide a UI for it. The data aggregated over time (rollup) is still available in the sli v2 index, but won't be used for summary calculation when reset. - -The previous summary transforms summarizing every SLOs won't be used anymore and can be stopped and deleted: - -* slo-summary-occurrences-7d-rolling -* slo-summary-occurrences-30d-rolling -* slo-summary-occurrences-90d-rolling -* slo-summary-occurrences-monthly-aligned -* slo-summary-occurrences-weekly-aligned -* slo-summary-timeslices-7d-rolling -* slo-summary-timeslices-30d-rolling -* slo-summary-timeslices-90d-rolling -* slo-summary-timeslices-monthly-aligned -* slo-summary-timeslices-weekly-aligned - -Be aware that when installing a new SLO (or after resetting an SLO), we install two transforms (one for the rollup data and one that summarize the rollup data). Do not delete the new `slo-summary-{slo_id}-{slo_revision}` transforms. For more information, refer to ({kibana-pull}172224[#172224]). -==== - -[discrete] -.A new sub-feature privilege to control user access to the cases settings -[%collapsible] -==== -*Details* + -Roles with at least a sub-feature privilege configured will not have access to the cases setting like they had previously. All roles without a sub-feature privilege configured will not be affected. For more information, refer to ({kibana-pull}170635[#170635]). -==== - -[float] -[[features-8.12.0]] -=== Features -{kib} 8.12.0 adds the following new and notable features. - -APM:: -* Adds viewInApp URL to the custom threshold rule type ({kibana-pull}171985[#171985]). -* Adds back the mobile crashes & errors tab ({kibana-pull}165892[#165892]). -Cases:: -* The case list filter bar is now customizable, filters are removable and custom fields can be used as filters ({kibana-pull}172276[#172276]). -Elastic Security:: -For the Elastic Security 8.12.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Elastic Search:: -* Display E5 multilingual callout ({kibana-pull}171887[#171887]). -* Replace model selection dropdown with list ({kibana-pull}171436[#171436]). -Fleet:: -* Adds support for preconfigured output secrets (Scrypt edition) ({kibana-pull}172041[#172041]). -* Adds UI components to create and edit output secrets ({kibana-pull}169429[#169429]). -* Adds support for remote ES output ({kibana-pull}169252[#169252]). -* Adds the ability to specify secrets in outputs ({kibana-pull}169221[#169221]). -* Adds an integrations configs tab to display input templates ({kibana-pull}168827[#168827]). -* Adds a {kib} task to publish Agent metrics ({kibana-pull}168435[#168435]). -Lens & Visualizations:: -* Adds the ability to edit charts made by {esql} queries in Dashboard ({kibana-pull}169911[#169911]). -Machine Learning:: -* Adds E5 model configurations ({kibana-pull}172053[#172053]). -* Adds the ability to create a categorization anomaly detection job from pattern analysis ({kibana-pull}170567[#170567]). -* Adds and displays alerts data in the Anomaly Explorer ({kibana-pull}167998[#167998]). -Observability:: -* Adds logic to update flyout highlights ({kibana-pull}172193[#172193]). -* Adds logic to display highlights in the flyout ({kibana-pull}170650[#170650]). -* Changes the Custom threshold title to Beta ({kibana-pull}172360[#172360]). -Security:: -* Disables the connector parameters field ({kibana-pull}173610[#173610]). -* Adds a risk engine missing privileges callout ({kibana-pull}171250[#171250]). -* Asset criticality privileges API ({kibana-pull}172441[#172441]). -Uptime:: -* Global params Public APIs ({kibana-pull}169669[#169669]). -* Private location public API's ({kibana-pull}169376[#169376]). -* Settings public API ({kibana-pull}163400[#163400]). - -For more information about the features introduced in 8.12.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.12.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.12.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.12.0]] -=== Enhancements -Alerting:: -* Auto close ServiceNow incidents when alerts are resolved ({kibana-pull}171760[#171760]). -* PagerDuty connector now supports the links and `custom_details` attributes ({kibana-pull}171748[#171748]). -* Adds a mute and unmute action component in the alerts table row actions ({kibana-pull}170651[#170651]). -* Extends the PagerDuty connector API to support the `links` and `custom_details` attributes provided by the Event API ({kibana-pull}170459[#170459]). -* Adds toggle for alert as data fields in alert templating ({kibana-pull}170162[#170162]). -APM:: -* Perform functions and LLM interactions on the server ({kibana-pull}172590[#172590]). -* Adds viewInApp URL to the custom threshold rule type ({kibana-pull}171985[#171985]). -* Adds the KQL bar to embeddables ({kibana-pull}171016[#171016]). -* Enables the average mobile app launch time panel ({kibana-pull}170773[#170773]). -* Enables the mobile most launches panel ({kibana-pull}168925[#168925]). -* Improves the Differential Top N functions grid view ({kibana-pull}170008[#170008]). -Cases:: -* Users can copy to the clipboard the hashes of files uploaded to cases ({kibana-pull}172450[#172450]). -* Allow users to configure which columns are displayed in the cases list including custom fields ({kibana-pull}170950[#170950]). -* Adds a new sub-feature privilege to control user access to the cases settings ({kibana-pull}170635[#170635]). -Dashboard:: -* Adds Links to the Visualization library ({kibana-pull}170810[#170810]). -Discover:: -* Adds a field tokens column in the grid header ({kibana-pull}167179[#167179]). -* Enables the addition of columns from the document viewer when using ES|QL ({kibana-pull}171083[#171083]). -* Adds field search via wildcards in the document viewer ({kibana-pull}168616[#168616]). -* Improves search for field names by handling spaces like wildcards ({kibana-pull}168381[#168381]). -* Updates mapping conflict popover with types list ({kibana-pull}169855[#169855]). -* On search source error, show 'view details' action that opens request in inspector ({kibana-pull}170790[#170790]). -* Adds an Unsaved changes label when in an unsaved state of saved search ({kibana-pull}169548[#169548]). -* Allows changing the current sample size and saving it with a saved search ({kibana-pull}157269[#157269]). -* Adds new sparse vector and dense vector icons ({kibana-pull}169493[#169493]). -* Adds `sparse_vector` field support ({kibana-pull}168186[#168186]). -Elastic Security:: -For the Elastic Security 8.12.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Elastic Search:: -* Trained models can now be deployed and started directly from the Machine Learning inference pipeline configuration flyout ({kibana-pull}173434[#173434]). -Fleet:: -* Adds support for Elasticsearch output performance presets ({kibana-pull}172359[#172359]). -* Adds a new `keep_monitoring_alive` flag to agent policies ({kibana-pull}168865[#168865]). -* Adds support for additional types for dynamic mappings ({kibana-pull}168842[#168842]). -* Implements Elastic Agent upgrade states UI ({kibana-pull}167539[#167539]). -* Use default component templates from Elasticsearch ({kibana-pull}163731[#163731]). -Lens & Visualizations:: -* Moves the tagcloud visualization in *Lens* out of experimental status ({kibana-pull}168824[#168824]). -* Allows coloring an entire metric panel when applying a maximum value to the metric visualization in **Lens** ({kibana-pull}172531[#172531]). -* Adds truncation for data view pickers and field lists with many characters ({kibana-pull}172296[#172296]). -* Allows searching in the {esql} inline documentation description ({kibana-pull}171916[#171916]). -* Allows setting non-numeric metrics for metric visualizations in *Lens* ({kibana-pull}169258[#169258]). -Machine Learning:: -* Removes the beta badge from ML alerting rules ({kibana-pull}173545[#173545]). -* Removes the technical preview badge from AIOps log rate analysis ({kibana-pull}172722[#172722]). -* Adds anomaly description as an alert message for the anomaly detection rule type ({kibana-pull}172473[#172473]). -* Adds a sampled percentage of documents, and cardinality, for text fields for the Data Visualizer Field statistics tab and addresses an issue with a missing bucket in the document count chart ({kibana-pull}172378[#172378]). -* Adds option to display an overlay chart on the data drift expanded row ({kibana-pull}172239[#172239]). -* AIOps: Shows top N results when no documents are in baseline or deviation in log rate analysis({kibana-pull}171924[#171924]). -* AIOps: Adds support to restore baseline and deviation from URL state on page refresh for log rate analysis ({kibana-pull}171398[#171398]). -* Validates and limits threading parameters for starting a model deployment ({kibana-pull}171921[#171921]). -* Trained models: Adds a missing job node to models map view when original job has been deleted ({kibana-pull}171590[#171590]). -* Trained models list: Disables the View training data action if data frame analytics job no longer exists ({kibana-pull}171061[#171061]). -* Adds a trained model flyout with available models to download for in the Trained Models UI ({kibana-pull}171024[#171024]). -* Allows temporary data views in the anomaly detection jobs wizards ({kibana-pull}170112[#170112]). -* Assigns downloaded ELSER models to the `*` space ({kibana-pull}169939[#169939]). -* Adds pattern analysis to the anomaly action menu ({kibana-pull}169400[#169400]). -* Adds test pipeline action for data frame analysis trained models in models list ({kibana-pull}168400[#168400]). -Management:: -* Adds a search bar to the Clusters and shards tab ({kibana-pull}171806[#171806]). -* Aligns data view and destination index creation workflows in Transforms and Data Frame Analytics wizards ({kibana-pull}171202[#171202]). -* The index lifecycle summary on the Index lifecycle page is now displayed in a separate tab ({kibana-pull}170726[#170726]). -* Adds the ability to view mappings conflicts in data views on the data view management page ({kibana-pull}169381[#169381]). -* Implements index overview cards ({kibana-pull}168153[#168153]). -Observability:: -* Reset UI for updating outdated SLOs ({kibana-pull}172883[#172883]). -* Adds timeslice metric indicator for SLOs ({kibana-pull}168539[#168539]). -* Adds logic to update flyout highlights ({kibana-pull}172193[#172193]). -* Sets budget consumed mode as the default mode for burn rate rule configuration ({kibana-pull}171433[#171433]). -* Allow users to define burn rate windows using budget consumed ({kibana-pull}170996[#170996]). -* Makes rules created in Discover visible in Observability ({kibana-pull}171364[#171364]). -* Adds support for document count to custom metric indicator ({kibana-pull}170913[#170913]). -* Improves displaying inline frames ({kibana-pull}169212[#169212]). -* Adds summary insight to the Differential flamegraph ({kibana-pull}168978[#168978]). -* Include `search-*` when recalling documents ({kibana-pull}173710[#173710]). -Platform:: -* Limits `elasticsearch.maxSockets` to 800 by default ({kibana-pull}151911[#151911]). -Presentation:: -* Adds popover message in the control title ({kibana-pull}172094[#172094]). -* Displays incomplete results warning in layer legend ({kibana-pull}171144[#171144]). -* Updates incomplete data messaging ({kibana-pull}169578[#169578]). -Reporting:: -* Makes searches used for CSV export inspectable ({kibana-pull}171248[#171248]). -* Adds `max_concurrent_shards` setting to schema for the point in time CSV report generation ({kibana-pull}170344[#170344]). -Security:: -* The default value of the `elasticsearch.requestHeadersWhitelist` configuration option has been expanded to include the `es-client-authentication` HTTP header, in addition to `authorization` ({kibana-pull}172444[#172444]). -* Adds risk engine missing privileges callout ({kibana-pull}171250[#171250]). -* Implements Asset Criticality Create, Read & Delete APIs ({kibana-pull}172073[#172073]). - -[float] -[[fixes-v8.12.0]] -=== Bug Fixes -Alerting:: -* Fixes the alert details page search bar not considering Query configurations in the {kib} advanced settings ({kibana-pull}172498[#172498]). -* Fixes adding evaluation threshold to alert payload for ES query rule ({kibana-pull}171571[#171571]). -* Hides the Logs tab in Rules page to unauthorized users ({kibana-pull}171417[#171417]). -* Fixes hyperlinks in Slack messages being broken when there is "_" or "*" in the URL ({kibana-pull}170067[#170067]). -APM:: -* Removes usage of internal client when fetching agent configuration etags metrics ({kibana-pull}173001[#173001]). -* Fixes encoding custom links values ({kibana-pull}171032[#171032]). -* Fixes an issue where data views were previously not space aware ({kibana-pull}170857[#170857]). -* Fixes issue with onboarding page around java agent ({kibana-pull}168816[#168816]). -* Adds a data tier filter to the `/has_data` API ({kibana-pull}173382[#173382]). -Cases:: -* Fixes a bug that prevented users with read permission from being assigned to cases ({kibana-pull}172047[#172047]). -Dashboard:: -* Prevents unnecessary loss of dashboard unsaved state ({kibana-pull}167707[#167707]). -Discover:: -* Fixes escaping column names when copying ({kibana-pull}170997[#170997]). -* Discover sharing links now preserve customized column widths ({kibana-pull}172405[#172405]). -* Fixes displaying the columns as they are returned from the query ({kibana-pull}171874[#171874]). -* Fixes issue with `defaultColumns` when changing data views ({kibana-pull}168994[#168994]). -Elastic Security:: -For the Elastic Security 8.12.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Allows agent upgrades if patch version is higher than {kib} ({kibana-pull}173167[#173167]). -* Fixes secrets with dot-separated variable names ({kibana-pull}173115[#173115]). -* Fixes endpoint privilege management endpoints return errors ({kibana-pull}171722[#171722]). -* Fixes expiration time for immediate bulk upgrades being too short ({kibana-pull}170879[#170879]). -* Fixes incorrect overwrite of `logs-*` and `metrics-*` data views on every integration install ({kibana-pull}170188[#170188]). -* Creates intermediate objects when using dynamic mappings ({kibana-pull}169981[#169981]). -Lens & Visualizations:: -* Fixes the sorting of null values so they are displayed last ({kibana-pull}172691[#172691]). -* Fixes the overwriting of chart descriptions after editing a visualization in *Lens* ({kibana-pull}172653[#172653]). -* Fixes an issue where the timerange panel wasn't correctly assigned during a conversion from dashboard to *Lens* ({kibana-pull}172647[#172647]). -* Various fixes for heatmap in *Lens* ({kibana-pull}172602[#172602]). -* Fixes filters being lost when navigating from dashboard -> editor -> *Lens* in *TSVB* ({kibana-pull}172566[#172566]). -* Ignore drop ES|QL commands for date histogram in discover ({kibana-pull}171769[#171769]). -Machine Learning:: -* Ensures data frame analytics job can be deleted from analytics map ({kibana-pull}174212[#174212]). -* Fixes filter for boolean fields filtering for numbers in Field statistics / Data Visualizer ({kibana-pull}174212[#174050]) -* Fixes registering of the ML alerting rules with the basic license ({kibana-pull}173644[#173644]). -* Fixes display of actions column in the datafeed chart flyout ({kibana-pull}173365[#173365]). -* Fixes View in Discover option in Anomaly explorer not handling multiple field values or values with quotation marks ({kibana-pull}172897[#172897]). -* Fixes field stats in Discover showing 0 sample count at times when switching data views ({kibana-pull}172734[#172734]). -* Fixes long field names overflowing in Anomaly detection wizard detector selection ({kibana-pull}172715[#172715]). -* Fixes data drift numeric fields not showing correctly ({kibana-pull}172504[#172504]). -* Fixes Data Visualizer / ML field stats and Data Frame Analytics to exclude _tier fields ({kibana-pull}172223[#172223]). -* Uses standard analyzer in log pattern analysis to ensure filter in Discover matches correct documents ({kibana-pull}172188[#172188]). -* Fixes ML node check and checks user privileges to create job button in dashboard ({kibana-pull}172022[#172022]). -* Fixes {kib} object list in new job from recognized index page ({kibana-pull}171935[#171935]). -Management:: -* Fixes retention policy field name not setting by default correctly in the Transform creation wizard ({kibana-pull}172609[#172609]). -Metrics:: -* Moves formulas and dashboard config to inventory models ({kibana-pull}171872[#171872]). -Platform:: -* Fixes a bug that could cause the `rollingFile` log appender to not properly rotate files on DST switch days ({kibana-pull}173811[#173811]). -* Fixes context formula functions ({kibana-pull}172710[#172710]). -Observability:: -* Removes legacy screenshot image data from the codepath in Synthetics ({kibana-pull}172684[#172684]). -* Fixes incorrect rule parameters when changing aggregation type using a custom equation ({kibana-pull}171958[#171958]). -* Adds parent link in host detail's breadcrumb ({kibana-pull}170792[#170792]). -Presentation:: -* Fixes validation query for nested fields ({kibana-pull}173690[#173690]). -* Fixes user privileges around Links panels saved to the library ({kibana-pull}173332[#173332]). -* Prevents overflowing dashboard title on saved toast notifications ({kibana-pull}172620[#172620]). -* Ignore indices without geometry field in vector tile requests ({kibana-pull}171472[#171472]). -* Fixes layer displaying no data instead of error ({kibana-pull}170084[#170084]). - -[[release-notes-8.11.4]] -== {kib} 8.11.4 - -[float] -[[fixes-v8.11.4]] -=== Bug fixes and enhancements -There are no user-facing changes in the 8.11.4 release. - -[[release-notes-8.11.3]] -== {kib} 8.11.3 - -The 8.11.3 release includes the following bug fixes. - -[float] -[[fixes-v8.11.3]] -=== Bug Fixes -Elastic Security:: -For the Elastic Security 8.11.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes a 500 error in the Fleet API when a request for the product versions endpoint throws `ECONNREFUSED` ({kibana-pull}172850[#172850]). -* Fixes agent policy timeout to accept only integers ({kibana-pull}172222[#172222]). -Machine Learning:: -* Fixes data drift numeric fields not displaying correctly ({kibana-pull}172504[#172504]). -* Fixes Data visualizer, ML field stats, and Data Frame Analytics so the `_tier` field can be excluded ({kibana-pull}172223[#172223]). -Operations:: -* Fixes an issue where running `kibana-keystore` commands required `kibana.yml` to exist ({kibana-pull}172943[#172943]). - -[[release-notes-8.11.2]] -== {kib} 8.11.2 - -The 8.11.2 release includes the following bug fixes. - -[float] -[[security-update-v8.11.2]] -=== Security updates - -* The 8.11.2 patch release contains a fix for a potential security vulnerability. https://discuss.elastic.co/c/announcements/security-announcements/31[Please see our security advisory for more details]. - -[float] -[[enhancement-v8.11.2]] -=== Enhancements -APM:: -* Added `context_propagation_only` APM agent setting ({kibana-pull}170405[#170405]). -Elastic Security:: -For the Elastic Security 8.11.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Improve UX for policy secrets ({kibana-pull}171405[#171405]). -Observability:: -* Adds `date_formats` to SLI ingest pipeline template ({kibana-pull}172377[#172377]). -Platform:: -* It is now possible to hot reload Kibana's TLS (`server.ssl`) configuration by updating it and then sending a `SIGHUP` signal to the Kibana process ({kibana-pull}171823[#171823]). - -[float] -[[fixes-v8.11.2]] -=== Bug Fixes -Dashboard:: -* Fixes reference extract method ({kibana-pull}171360[#171360]). -* Adds Dashboard title to browser tab title ({kibana-pull}171255[#171255]). -Elastic Security:: -For the Elastic Security 8.11.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Support integration secrets in a local package registry with variables `secret: true` and `required: false` ({kibana-pull}172078[#172078]). -* Fixes agents metrics retrieval on the agent list page, previously displaying N/A for metrics for users with more than 10 agents. ({kibana-pull}172016[#172016]). -* Only add `time_series_metric` if TSDB is enabled ({kibana-pull}171712[#171712]). -* Fixes inability to upgrade agents from version 8.10.4 to version 8.11 ({kibana-pull}170974[#170974]). -Lens & Visualizations:: -* Handle invalid values gracefully for static value operation in *Lens* ({kibana-pull}172198[#172198]). -* Make the dashboard SO lighter ({kibana-pull}172130[#172130]). -Machine Learning:: -* Fixes blocked jobs polling interval ({kibana-pull}171878[#171878]). -Management:: -* Fixes autocomplete to show suggestions even if user types in every letter ({kibana-pull}171952[#171952]). -* Fixes wrong autocomplete suggestions when using the slash symbol ({kibana-pull}171948[#171948]). -* Fixes clusters and shards table expanded row not updating when request is changed ({kibana-pull}171232[#171232]). -Maps:: -* Fixes using `max_result_window` to set up a mapbox vector tile (MVT) size request leading to all results not showing ({kibana-pull}171344[#171344]). -Observability:: -* Fixes the custom threshold document link ({kibana-pull}171125[#171125]). -SharedUX:: -* Fixes custom branding for users without "Saved Object Management" privilege ({kibana-pull}171308[#171308]). -* Fixes the custom threshold document link ({kibana-pull}171125[#171125]). -Uptime:: -* Fixes advanced fields broken for ICMP monitors ({kibana-pull}171161[#171161]). -Ê -[[release-notes-8.11.1]] -== {kib} 8.11.1 - -For information about the {kib} 8.11.1 release, review the following information. - -[float] -[[security-update-v8.11.1]] -=== Security updates - -* An issue was discovered by Elastic whereby sensitive information is recorded -in {kib} logs in the event of an error. The error message recorded in the log -may contain account credentials for the `kibana_system` user, API Keys, and -credentials of {kib} end users. -+ --- -The issue impacts {kib} {kib} versions on or after 8.0.0 and before 8.11.1. The -issue is resolved in {kib} 8.11.1. - -**Nov 15, 2023 Update:** After additional investigation, it has been determined -that {kib} 7.x versions are not affected by this issue. We previously reported -this issue impacted {kib} versions before 7.17.15. - -For more information, see our related -https://discuss.elastic.co/t/8-11-1-7-17-15-security-update-esa-2023-25/347149[security -announcement]. --- - -[float] -[[fixes-v8.11.1]] -=== Bug Fixes - -Fleet:: -* Append space ID to security solution tag ({kibana-pull}170789[#170789]). -* Modify bulk unenroll to include inactive agents ({kibana-pull}170249[#170249]). -Lens & Visualizations:: -* Fixes error handling for ES|QL nested error messages ({kibana-pull}170005[#170005]). -Machine Learning:: -* Disable anomaly detection job creation from ES|QL lens visualizations ({kibana-pull}170711[#170711]). -Presentation:: -* Fixes vector tile layer with joins stuck in loading state when not visible ({kibana-pull}170984[#170984]). -* Fixes expand layer control is not clickable when layers are loading ({kibana-pull}170912[#170912]). - -[[release-notes-8.11.0]] -== {kib} 8.11.0 - - -For information about the {kib} 8.11.0 release, review the following information. - - -[float] -[[known-issues-8.11.0]] -=== Known issues - -// tag::known-issue-169170[] -[discrete] -.Gatekeeper error on macOS -[%collapsible] -==== -*Details* + -Due to a version upgrade of the server binary used by {kib} and an upstream notarization issue, a Gatekeeper error may display for "node" -when starting {kib} in macOS environments. - -*Workaround* + -More information can be found at <>. - -==== -// end::known-issue-169170[] - -[float] -[[breaking-changes-8.11.0]] -=== Breaking changes - - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.11.0, review the breaking changes, then mitigate the impact to your application. - - -[discrete] -.Improve config output validation for default output. -[%collapsible] -==== -*Details* + -Improve config output validation to not allow to defining multiple default outputs in {kib} configuration. For more information, refer to ({kibana-pull}167085[#167085]). -==== - -[discrete] -.Convert filterQuery to KQL. -[%collapsible] -==== -*Details* + -Converts `filterQuery` to a KQL query string. For more information, refer to ({kibana-pull}161806[#161806]). -==== - -[float] -[[deprecations-8.11.0]] -=== Deprecations - - -The following functionality is deprecated in 8.11.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.11.0. - - -[discrete] -[[deprecation-164651]] -.Updates to move from doc_root.vulnerability.package -> doc_root.package (ECS). -[%collapsible] -==== -*Details* + -This updates all instances of vulnerability.package to the ECS standard package fieldset. For more information, refer to ({kibana-pull}164651[#164651]). -==== -[float] -[[features-8.11.0]] -=== Features -{kib} 8.11.0 adds the following new and notable features. - - -Alerting:: -* Adds support for the new ES|QL language for {es} query rules ({kibana-pull}165973[#165973]). -* Elasticsearch query rule can select multiple group-by terms ({kibana-pull}166146[#166146]). -* Adds a Log tab to the Observability Rules page ({kibana-pull}165115[#165115]). -APM:: -* Adds bulk action to untrack selected alerts ({kibana-pull}167579[#167579]). -* Introduce custom dashboards tab in service overview ({kibana-pull}166789[#166789]). -* Adds service profiling Top 10 Functions ({kibana-pull}166226[#166226]). -* Adds service profiling flamegraph ({kibana-pull}165360[#165360]). -Cases:: -* Adds custom fields in Cases ({kibana-pull}167016[#167016]). -Dashboard:: -* Copy panel refactor ({kibana-pull}166991[#166991]). -* Make links panel available under technical preview ({kibana-pull}166896[#166896]). -* Store view mode in local storage ({kibana-pull}166523[#166523]). -* Adds a read only state for Managed Dashboards ({kibana-pull}166204[#166204]). -Discover:: -* Adds resize support to the Discover field list sidebar ({kibana-pull}167066[#167066]). -Elastic Security:: -For the Elastic Security 8.11.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search service:: -For the Elastic Enterprise Search service 8.11.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Release notes_]. -Fleet:: -* Set env variable `ELASTIC_NETINFO:false` in {kib} ({kibana-pull}166156[#166156]). -* Added restart upgrade action ({kibana-pull}166154[#166154]). -* Adds ability to set a proxy for agent binary source ({kibana-pull}164168[#164168]). -* Adds ability to set a proxy for agent download source ({kibana-pull}164078[#164078]). -Lens & Visualizations:: -* Adds color mapping for categorical dimensions in *Lens* available under technical preview ({kibana-pull}162389[#162389]). -* Inline editing of **Lens** panels on a dashboard or canvas ({kibana-pull}166169[#166169]). -* Individual annotation editing from library ({kibana-pull}163346[#163346]). -Logs:: -* Convert log explorer profile into standalone app available under technical preview ({kibana-pull}164493[#164493]). -Machine Learning:: -* Adds support for the ELSER v2 download in the Trained Models UI ({kibana-pull}167407[#167407]). -* Adds data drift detection workflow from Trained Models to Data comparison view ({kibana-pull}162853[#162853]). -Management:: -* Supports for viewing and editing data retention per data stream in Index Management is available under technical preview ({kibana-pull}167006[#167006]). -* Supports for viewing and editing data retention per data stream in Index Management is available under technical preview ({kibana-pull}167006[#167006]). -* Index details can now be viewed on a new index details page in Index Management ({kibana-pull}165705[#165705]). -* Supports for managing, executing, and deleting enrich policies in Index Management ({kibana-pull}164080[#164080]). -Platform:: -* ES|QL, a new query language, is available under technical preview in Discover and Dashboards ({kibana-pull}146971[#146971]). -Querying & Filtering:: -* Saved queries can now be shared between multiple spaces ({kibana-pull}163436[#163436]). -Uptime:: -* Adds a document viewer to the summary pings table ({kibana-pull}163926[#163926]). - - -For more information about the features introduced in 8.11.0, refer to <>. - - -[[enhancements-and-bug-fixes-v8.11.0]] -=== Enhancements and bug fixes - - -For detailed information about the 8.11.0 release, review the enhancements and bug fixes. - - -[float] -[[enhancement-v8.11.0]] -=== Enhancements -APM:: -* Changed mobile badge from 'technical preview' to 'beta' ({kibana-pull}167543[#167543]). -* New Profiling ES Flamegraph API ({kibana-pull}167477[#167477]). -* Adds Universal Profiling to O11y overview and Setup guide ({kibana-pull}165092[#165092]). -* Mark disabled alerts as Untracked in both Stack Management and o11y ({kibana-pull}164788[#164788]). -* Adds time range to event metadata API ({kibana-pull}167132[#167132]). -* New settings to control CO2 calculation ({kibana-pull}166637[#166637]). -* Adds permissions for "input-only" package ({kibana-pull}166234[#166234]). -* Adds selecting the consumer based on the authorized consumers when a user is creating an ES Query threshold rule ({kibana-pull}166032[#166032]). -* Migrate Ace based `EuiCodeEditor` to Monaco based code editor ({kibana-pull}165951[#165951]). -* Mobile UI crash widget added ({kibana-pull}163527[#163527]). -Cases:: -* Show a warning message to inform user that navigating after the 10Kth case is not possible ({kibana-pull}164323[#164323]). -Dashboard:: -* Focus on a single panel while disabling all other panels ({kibana-pull}165417[#165417]). -* Adds filter details to panel settings ({kibana-pull}162913[#162913]). -* Adds support for date fields in the options list controls ({kibana-pull}164362[#164362]). -Discover:: -* Redesign for the grid, panels and sidebar ({kibana-pull}165866[#165866]). -* Set data table row height to auto-fit by default ({kibana-pull}164218[#164218]). -* Allow fetching more documents on Discover page ({kibana-pull}163784[#163784]). -Elastic Security:: -For the Elastic Security 8.11.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Search:: -* Self-managed connector clients now show advanced configuration options in the UI ({kibana-pull}167770[#167770]). -Fleet:: -* Adds sidebar navigation showing headings extracted from the readme ({kibana-pull}167216[#167216]). -Inspector:: -* Clusters tab added under Inspector ({kibana-pull}166025[#166025]). -* Open incomplete response warning in Inspector ({kibana-pull}167205[#167205]). -Lens & Visualizations:: -* Other bucket defaults to false for top values greater than equal 1000 in *Lens* ({kibana-pull}167141[#167141]). -* Adds support for decimals in percentiles in *Lens* ({kibana-pull}165703[#165703]). -Machine Learning:: -* Updates ELSER version for Elastic Assistant ({kibana-pull}167522[#167522]). -* Retains `created_by` setting when exporting anomaly detection jobs ({kibana-pull}167319[#167319]). -* Improves the wording of awaiting ML nodes messages ({kibana-pull}167306[#167306]). -* Adds `created_by` job property for the advanced wizard ({kibana-pull}167021[#167021]). -* Trained model testing: only show indices with supported fields ({kibana-pull}166490[#166490]). -* Alerts as data integration for Anomaly Detection rule type ({kibana-pull}166349[#166349]). -* Data Frame Analytics Trained models: adds the ability to reindex after pipeline creation ({kibana-pull}166312[#166312]). -* Adds Create a data view button to index or saved search selector in ML pages and Transforms management ({kibana-pull}166668[#166668]). -* Improvements to UX of adding ML embeddables to a dashboard ({kibana-pull}165714[#165714]). -* AIOps: Supports text fields in log rate analysis ({kibana-pull}165124[#165124]). -* Data Frame Analytics creation wizard: adds ability to add custom URLs to jobs ({kibana-pull}164520[#164520]). -Management:: -* Adds Create a data view button to index or saved search selector in ML pages and Transforms management ({kibana-pull}166668[#166668]). -* Improve loading behavior of Transforms list if stats request is slow or is not available ({kibana-pull}166320[#166320]). -* Adds support for PATCH requests in Console ({kibana-pull}165634[#165634]). -* Improves autocomplete to suggest knn in search query ({kibana-pull}165531[#165531]). -* Improves display for long descriptions in Transforms ({kibana-pull}165149[#165149]). -* Improve transform list reloading behavior ({kibana-pull}164296[#164296]). -Maps:: -* Allow by value styling for EMS boundary fields ({kibana-pull}166306[#166306]). -* Adds support for `geo_shape` fields as the entity geospatial field when creating tracking containment alerts ({kibana-pull}164100[#164100]). -Observability:: -* ES|QL query generation ({kibana-pull}166041[#166041]). -Querying & Filtering:: -* New "Saved Query Management" privilege to allow saving queries across Kibana ({kibana-pull}166937[#166937]). -* Improvements to the filter builder inputs for long fields ({kibana-pull}166024[#166024]). -Uptime:: -* Added ability to hide public locations ({kibana-pull}164863[#164863]). - - -[float] -[[fixes-v8.11.0]] -=== Bug Fixes -Alerting:: -* Improve error handling in ES Index action response ({kibana-pull}164841[#164841]). -* Bring back toggle column on alert table ({kibana-pull}168158[#168158]). -* Fixes Errors rules link on observability alert page ({kibana-pull}167027[#167027]). -* Enable read-only users to access rules ({kibana-pull}167003[#167003]). -* Fixes rule snooze toast copy ({kibana-pull}166030[#166030]). -APM:: -* Ensure APM data view is available across all spaces ({kibana-pull}167704[#167704]). -* Adds an environment param to the service metadata details endpoint ({kibana-pull}167173[#167173]). -* Fixes set up process ({kibana-pull}167067[#167067]). -Dashboard:: -* Generate new panel IDs on Dashboard clone ({kibana-pull}166299[#166299]). -Elastic Security:: -For the Elastic Security 8.11.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Search:: -* Native connector external documentation links are now rendered conditionally to avoid empty links ({kibana-pull}169121[#169121]). -* Fixed an issue which caused Access Control Syncs to be scheduled when Document Level Security was disabled ({kibana-pull}168987[#168987]). -* Restored access and admin checks for App Search and Workplace Search product cards ({kibana-pull}168890[#168890]). -* The filter box in the *Browse documents* tab under *Search > Content > Indices* now escapes Lucene reserved characters instead of throwing errors ({kibana-pull}168092[#168092]). -* Fixed an issue associated with changing the indices underlying a search application. When a user modifies the indices underlying a search application in Kibana, the associated search template is now reverted to the default template ({kibana-pull}167532[#167532]). -* Fixed an issue where the Search plugin was inaccessible for unauthenticated users, eg. for Kibana in read-only demo setups ({kibana-pull}167171[#167171]). -* Fixed an issue with the welcome banner in Search ({kibana-pull}166814[#166814]). -* Self managed connector clients now show advanced configuration options in the UI ({kibana-pull}167770[#167770]). -Fleet:: -* Vastly improve performance of Fleet final pipeline's date formatting logic for `event.ingested` ({kibana-pull}167318[#167318]). -Lens & Visualizations:: -* Fixes heatmap color assignment on single value scenario in *Lens* ({kibana-pull}167995[#167995]). -* Fixes mosaic with 2 axis coloring in *Lens* ({kibana-pull}167035[#167035]). -* Show icons/titles instead of previews in suggestions panel in *Lens* ({kibana-pull}166808[#166808]). -* Consider root level filters buckets correctly when building other terms bucket ({kibana-pull}165656[#165656]). -* Prevent user to use decimals for custom Percentile rank function in Top values in *Lens* ({kibana-pull}165616[#165616]). -* Fixes the Graph application settings tab when in dark mode ({kibana-pull}165614[#165614]). -* Fixes Visualize List search and CRUD operations via content management ({kibana-pull}165485[#165485]). -Logs:: -* Use correct ML API to query blocking tasks ({kibana-pull}167779[#167779]). -Machine Learning:: -* AIOps: Fixes log pattern analysis sparklines and chart ({kibana-pull}168337[#168337]). -* AIOps: Fixes Data View runtime fields support in the Change point detection UI ({kibana-pull}168249[#168249]). -* Fixes anomaly charts when partition field contains an empty string ({kibana-pull}168102[#168102]). -* Data Frame analytics outlier detection results: ensure scatterplot matrix adheres to bounding box ({kibana-pull}167941[#167941]). -* Fixes Anomaly charts embeddable fails to load if partition value is empty string ({kibana-pull}167827[#167827]). -Management:: -* Fixes `isErrorResponse` when cluster details are provided ({kibana-pull}166667[#166667]). -* Fixes autocomplete not to be prompted between triple quotes ({kibana-pull}165535[#165535]). -* Fixes autocomplete on only 1 letter typed in Console's request editor ({kibana-pull}164707[#164707]). -* Fixing duration field formatter showing 0 seconds instead of "few seconds" ({kibana-pull}164659[#164659]). -* Fixes a bug that autocomplete does not work right after a comma ({kibana-pull}164608[#164608]). -* Fixes unnecessary autocompletes on HTTP methods ({kibana-pull}163233[#163233]). -Presentation:: -* Fixes ES query rule boundary field changed when editing the rule ({kibana-pull}165155[#165155]). - -[[release-notes-8.10.4]] -== {kib} 8.10.4 - -The 8.10.4 release includes the following bug fixes. - -[float] -[[fixes-v8.10.4]] -=== Bug Fixes -Elastic Security:: -For the Elastic Security 8.10.4 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes validation errors in KQL queries ({kibana-pull}168329[#168329]). - -[[release-notes-8.10.3]] -== {kib} 8.10.3 - -[float] -[[security-update-8.10.3]] -=== Security updates - -* **Kibana heap buffer overflow vulnerability** -+ -On Sept 11, 2023, Google Chrome announced CVE-2023-4863, described as “Heap buffer overflow in libwebp in Google Chrome prior to 116.0.5845.187 and libwebp 1.3.2 allowed a remote attacker to perform an out of bounds memory write via a crafted HTML page”. Kibana includes a bundled version of headless Chromium that is only used for Kibana’s reporting capabilities and which is affected by this vulnerability. An exploit for Kibana has not been identified, however as a resolution, the bundled version of Chromium is updated in this release. -+ -The issue is resolved in 8.10.3. -+ -For more information, see our related -https://discuss.elastic.co/t/kibana-8-10-3-7-17-14-security-update/344735[security -announcement]. - -[float] -[[enhancement-v8.10.3]] -=== Enhancements -Elastic Security:: -For the Elastic Security 8.10.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[float] -[[fixes-v8.10.3]] -=== Bug Fixes -Dashboard:: -* Fixes an error the panel descriptions weren't retrieved from the right method ({kibana-pull}166825[#166825]). -Discover:: -* Soften saved search content management response `sort` schema ({kibana-pull}166886[#166886]). -Elastic Security:: -For the Elastic Security 8.10.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.10.3 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Fixes incorrect index template used from the data stream name ({kibana-pull}166941[#166941]). -* Increase package install max timeout limit and add concurrency control to rollovers ({kibana-pull}166775[#166775]). -* Fixes bulk action dropdown ({kibana-pull}166475[#166475]). -Machine Learning:: -* AIOps: Fixes render loop when using a saved search ({kibana-pull}166934[#166934]). -Monitoring:: -* Convert node roles into array ({kibana-pull}167628[#167628]). -Observability:: -* Fixes a set up process error in Universal Profiling ({kibana-pull}167068[#167068]). -Uptime:: -* Fixes an error when updating browser monitor in a project ({kibana-pull}168064[#168064]). - -[[release-notes-8.10.2]] -== {kib} 8.10.2 - -The 8.10.2 release includes the following bug fixes. - -[float] -[[fixes-v8.10.2]] -=== Bug fixes - -Fleet:: -* Fixes force delete package, updated used by agents check ({kibana-pull}166623[#166623]). -Management:: -* Fixes showing `Received partial message` instead of results when there are some remote shard errors in a {ccs} ({kibana-pull}166544[#166544]). - -[[release-notes-8.10.1]] -== {kib} 8.10.1 - -The 8.10.1 release includes the following bug fixes. - -[float] -[[fixes-v8.10.1]] -=== Bug fixes - -Dashboard:: -* Fixes content editor flyout footer ({kibana-pull}165907[#165907]). -Elastic Security:: -For the Elastic Security 8.10.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Show snapshot version in agent upgrade modal and allow custom values ({kibana-pull}165978[#165978]). -Observability:: -* Fix(slo): Use comma-separarted list of source index for transform ({kibana-pull}166294[#166294]). -Presentation:: -* Fixes air-gapped enviroment hitting `400` error when loading fonts for layer ({kibana-pull}165986[#165986]). - -[[release-notes-8.10.0]] -== {kib} 8.10.0 - -IMPORTANT: {kib} 8.10.0 has been withdrawn. - -For information about the {kib} 8.10.0 release, review the following information. - -[float] -[[security-updates-v8.10.0]] -=== Security updates - -* An issue was discovered by Elastic whereby sensitive information is recorded -in {kib} logs in the event of an error. The issue impacts only {kib} version -8.10.0 when logging in the JSON layout or when the pattern layout is configured -to log the `%meta` pattern. -+ -The issue is resolved in {kib} 8.10.1. Version 8.10.0 has been removed from our -download sites. -+ -For more information, see our related -https://discuss.elastic.co/t/kibana-8-10-1-security-update/343287[security -announcement]. - -[float] -[[breaking-changes-8.10.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.10.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.New summary search capabilities cause existing SLOs to stop working -[%collapsible] -==== -*Details* + -New summary search capabilities introduce breaking changes in various places, and we have decided not to handle backward compatibility: - -* SLO find API body parameters have changed. -* The index mapping used by the rollup data has changed, and we have added a summary index that becomes the new source of truth for search. -* The rollup transforms have been updated, but existing SLO with their transforms won't be updated. - -If some SLOs have been installed in a prior version at 8.10, they won't work after migrating to 8.10. There are two approaches to handle this breaking change. The recommended route is to delete all SLOs before migrating to 8.10. The alternative is to migrate to 8.10 and manually remove the SLOs. - -*Removing SLOs before migrating to 8.10* - -Use the SLO UI or the SLO delete API to delete all existing SLOs. This takes care of the Saved Object, Transform and rollup data. When all SLOs have been deleted, then delete the residual rollup indices: `.slo-observability.sli-v1*`. Note that this is v1. - -*Removing SLOs after migrating to 8.10* - -After migrating to 8.10, the previously created SLOs won’t appear in the UI because the API is using a new index. The previously created SLOs still exist, and associated transforms are still rolling up data into the previous index `.slo-observability.sli-v1*`. The SLO delete API can't be used now, so remove the resources resources manually: - -. Find all existing transforms -All SLO related transforms start with the `slo-` prefix, this request returns them all: -+ -[source, bash] ----- -GET _transform/slo-* ----- -+ -Make a note of all the transforms IDs for later. - -. Stop all transforms -+ -[source, bash] ----- -POST _transform/slo-*/_stop?force=true ----- - -. Remove all transforms -+ -From the list of transforms returned during the first step, now delete them one by one: -+ -[source, bash] ----- -DELETE _transform/{transform_id}?force=true ----- - -. Find the SLO saved objects -+ -This request lists all the SLO saved objects. The SLO IDs and the saved object IDs are not the same. -+ -[source, bash] ----- -GET kbn:/api/saved_objects/_find?type=slo ----- -+ -Make a note of all the saved object IDs from the response. - -. Remove the SLO saved objects -+ -For each saved object ID, run the following: -+ -[source, bash] ----- -DELETE kbn:/api/saved_objects/slo/{Saved_Object_Id} ----- - -. Delete the rollup indices v1 -+ -Note that this is v1. -+ -[source, bash] ----- -DELETE .slo-observability.sli-v1* ----- -==== - -[discrete] -.Get case metrics APIs now internal -[%collapsible] -==== -*Details* + -The get case metrics APIs are now internal. For more information, refer to ({kibana-pull}162506[#162506]). -==== - -[discrete] -.Case limits -[%collapsible] -==== -*Details* + -Limits are now imposed on the number of objects cases can process or the amount of data those objects can store. -//// -For example: -* Updating a case comment is now included in the 10000 user actions restriction. ({kibana-pull}163150[#163150]) -* Updating a case now fails if the operation makes it reach more than 10000 user actions. ({kibana-pull}161848[#161848]) -* The total number of characters per comment is limited to 30000. ({kibana-pull}161357[#161357]) -* The getConnectors API now limits the number of supported connectors returned to 1000. ({kibana-pull}161282[#161282]) -* There are new limits and restrictions when retrieving cases. ({kibana-pull}162411[#162411]), ({kibana-pull}162245[#162245]), ({kibana-pull}161111[#161111]), ({kibana-pull}160705[#160705]) -* A case can now only have 100 external references and persistable state(excluding files) attachments combined. ({kibana-pull}162071[#162071]). -* New limits on titles, descriptions, tags and category. ({kibana-pull}160844[#160844]). -* The maximum number of cases that can be updated simultaneously is now 100. The minimum is 1. ({kibana-pull}161076[#161076]). -* The Delete cases API now limits the number of cases to be deleted to 100.({kibana-pull}160846[#160846]). -//// -For the full list, refer to {kib-issue}146945[#146945]. -==== - -[discrete] -.`addProcessorDefinition` is removed -[%collapsible] -==== -*Details* + -The function `addProcessorDefinition` is removed from the Console plugin start contract (server side). For more information, refer to ({kibana-pull}159041[#159041]). -==== - -[discrete] -.The Download CSV endpoint has changed. -[%collapsible] -==== -*Details* + -The API endpoint for downloading a CSV file from a saved search in the Dashboard application has changed to reflect the fact that this is an internal API. The previous API path of -`/api/reporting/v1/generate/immediate/csv_searchsource` has been changed to `/internal/reporting/generate/immediate/csv_searchsource`. For more information, refer to {kibana-pull}162288[#162288]. -==== - -[float] -[[deprecations-8.10.0]] -=== Deprecations - -The following functionality is deprecated in 8.10.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.10.0. - -[discrete] -[[deprecation-161136]] -.Action variables in the UI and in tests that were no longer used have been replaced -[%collapsible] -==== -*Details* + -The following rule action variables have been deprecated; use the recommended variables (in parentheses) instead: - -* alertActionGroup (alert.actionGroup) -* alertActionGroupName (alert.actionGroupName) -* alertActionSubgroup (alert.actionSubgroup) -* alertId (rule.id) -* alertInstanceId (alert.id) -* alertName (rule.name) -* params (rule.params) -* spaceId (rule.spaceId) -* tags (rule.tags) - -For more information, refer to ({kibana-pull}161136[#161136]). -==== - -[float] -[[features-8.10.0]] -=== Features -{kib} 8.10.0 adds the following new and notable features. - -Alerting:: -* Adds support for self-signed SSL certificate authentication in webhook connector ({kibana-pull}161894[#161894]). -* Allow runtime fields to be selected for {es} query rule type 'group by' or 'aggregate over' options ({kibana-pull}160319[#160319]). -APM:: -* Adds KQL filtering in APM rules ({kibana-pull}163825[#163825]). -* Make service group saved objects exportable ({kibana-pull}163569[#163569]). -* Added ability to manage cross-cluster API keys ({kibana-pull}162363[#162363]). -* Enable Trace Explorer by default ({kibana-pull}162308[#162308]). -* Adds error.grouping_name to group alerts in Error Count rule ({kibana-pull}161810[#161810]). -* Adds query to check for overflow bucket in service groups ({kibana-pull}159990[#159990]). -Elastic Security:: -For the Elastic Security 8.10.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.10.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Only enable secret storage once all fleet servers are above 8.10.0 ({kibana-pull}163627[#163627]). -* Kafka integration API ({kibana-pull}159110[#159110]). -Machine Learning:: -* AIOps: Adds/edits change point charts embeddable from the Dashboard app ({kibana-pull}163694[#163694]). -* AIOps: Adds change point detection charts embeddable ({kibana-pull}162796[#162796]). -* Adds ability to deploy trained models for data frame analytics jobs ({kibana-pull}162537[#162537]). -* Adds map view for models in Trained Models and expands support for models in Analytics map ({kibana-pull}162443[#162443]). -* Adds new Data comparison view ({kibana-pull}161365[#161365]). -Management:: -* Added ability to create a remote cluster with the API key based security model ({kibana-pull}161836[#161836]). -* REST endpoint for swapping saved object references ({kibana-pull}157665[#157665]). -Maps:: -* Maps tracks layer now uses group by time series logic ({kibana-pull}159267[#159267]). -Observability:: -* SLO definition and computed values are now summarized periodically into a summary search index, allowing users to search by name, tags, SLO budgeting type or time window, and even by and sort by error budget consumed, error budget remaining, SLI value or status ({kibana-pull}162665[#162665]). -* Adds indicator to support histogram fields ({kibana-pull}161582[#161582]). - -For more information about the features introduced in 8.10.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.10.0-revised]] -=== Enhancements and bug fixes - -For detailed information about the 8.10.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.10.0]] -=== Enhancements -Alerting:: -* Fixes the event log data stream to use Data stream lifecycle instead of Index Lifecycle Management. If you had previously customized the Kibana event log ILM policy, you should now update the lifecycle of the event log data stream itself. ({kibana-pull}163210[#163210]). -* KQL search bar for Rules page ({kibana-pull}158106[#158106]). -APM:: -* Lens function ({kibana-pull}163872[#163872]). -* Adds several function implementations to the AI Assistant ({kibana-pull}163764[#163764]). -* Feature controls ({kibana-pull}163232[#163232]). -* Added improved JVM runtime metrics dashboard ({kibana-pull}162460[#162460]). -* Move to new plugin, update design and use connectors ({kibana-pull}162243[#162243]). -* Adding endpoint to upload android map files ({kibana-pull}161252[#161252]). -* Navigate from the transaction details view into the Profiling ({kibana-pull}159686[#159686]). -Dashboard:: -* Change badge color in options list ({kibana-pull}161401[#161401]). -* Edit title, description, and tags from dashboard listing page ({kibana-pull}161399[#161399]). -* Editing toolbar update ({kibana-pull}154966[#154966]). -Discover:: -* Inline shard failures warnings ({kibana-pull}161271[#161271]). -* Improve shard error message formatting ({kibana-pull}161098[#161098]). -Elastic Security:: -For the Elastic Security 8.10.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.10.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Adds support for runtime fields ({kibana-pull}161129[#161129]). -Lens & Visualizations:: -* Migrate range slider to `EuiDualRange` and make styling consistent across all controls ({kibana-pull}162651[#162651]). -* Introduce new duration formatter in *Lens* ({kibana-pull}162246[#162246]). -* Create a filter with field:value when last value metric is used on a data table in *Lens* ({kibana-pull}160509[#160509]). -* Adds tooltip for partition and heatmap filtering ({kibana-pull}162716[#162716]). -Machine Learning:: -* Hides paging controls in anomaly swim lane if only one page is available ({kibana-pull}163931[#163931]). -* Adds a throughput description in the Trained Models Deployment stats table ({kibana-pull}163481[#163481]). -* Provides hints for empty fields in dropdown options in Anomaly detection & Transform creation wizards, Change point detection view ({kibana-pull}163371[#163371]). -* AIOps: Adds dip support to log rate analysis in ML AIOps Labs ({kibana-pull}163100[#163100]). -* AIOps: Improves table hovering for log rate analysis ({kibana-pull}162941[#162941]). -* AIOps: Adds dip support for log rate analysis in observability alert details page ({kibana-pull}162476[#162476]). -* Adds validation of field selected for log pattern analysis ({kibana-pull}162319[#162319]). -* AIOps: Renames Explain Log Rate Spikes to Log Rate Analysis ({kibana-pull}161764[#161764]). -* Adds new Data comparison view ({kibana-pull}161365[#161365]). -* Adds test UI for text expansion models ({kibana-pull}159150[#159150]). -* Adds update index mappings step to ML pipeline config workflow ({kibana-pull}163723[#163723]). -Management:: -* Adds multiple formats for geo_point fields and make geo conversion tools part of field_format/common/utils ({kibana-pull}147272[#147272]). -Maps:: -* Support time series split for top hits per entity source ({kibana-pull}161799[#161799]). -Observability:: -* Adds support for group by to SLO burn rate rule ({kibana-pull}163434[#163434]). -* Applying consistent design to Histogram and Custom Metric forms ({kibana-pull}162083[#162083]). -* Adds preview chart to custom metric indicator ({kibana-pull}161597[#161597]). -* Support filters for good/total custom metrics ({kibana-pull}161308[#161308]). -Reporting:: -* Increase max size bytes default to 250mb ({kibana-pull}161318[#161318]). -Security:: -* Change the default value of `session.idleTimeout` from 8 hours to 3 days ({kibana-pull}162313[#162313]). -* User roles displayed on the user profile page ({kibana-pull}161375[#161375]). -Uptime:: -* Implement private location run once ({kibana-pull}162582[#162582]). - -[float] -[[fixes-v8.10.0]] -=== Bug fixes -APM:: -* Fixes styling and port issue with new onboarding ({kibana-pull}163922[#163922]). -* Fixes missing alert index issue ({kibana-pull}163600[#163600]). -* Fixes trace waterfall loading logic to handle empty scenarios ({kibana-pull}163397[#163397]). -* Fixes the action menu overlapping the 'Create custom link' flyout ({kibana-pull}162664[#162664]). -* Improve service groups error messages and validations ({kibana-pull}162556[#162556]). -* Fixes throwing appropriate error when user is missing necessary permission ({kibana-pull}162466[#162466]). -* Hide components when there is no support from agents ({kibana-pull}161970[#161970]). -* Fixes link to onboarding page in the Observability Onboarding plugin ({kibana-pull}161847[#161847]). -Dashboard:: -* Disables top navigation actions when cloning or overlay is showing ({kibana-pull}162091[#162091]). -Discover:: -* Fixes document failing to load when the ID contains a slash ({kibana-pull}160239[#160239]). -* Fixes NoData screen in alignment with Dashboard and Lends behavior ({kibana-pull}160747[#160747]). -Elastic Security:: -For the Elastic Security 8.10.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.10.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Only show agent dashboard links if there is more than one non-server agent and if the dashboards exist ({kibana-pull}164469[#164469]). -* Exclude Synthetics from per-policy-outputs ({kibana-pull}161949[#161949]). -* Fixing the path for hint templates for auto-discover ({kibana-pull}161075[#161075]). -Lens & Visualizations:: -* Fixes params._interval conversion to Lens formula ({kibana-pull}164150[#164150]). -* Fixes issues with field name that contains the `:` character in it in *Lens* ({kibana-pull}163626[#163626]). -* Fixes other request merge behavior when empty string key is retrieved ({kibana-pull}163187[#163187]). -* Fixes editing of multi values filters when adding a custom item ({kibana-pull}161940[#161940]). -* Allow setting custom colors to be collapsed by slices pie's multiple metrics in *Lens* ({kibana-pull}160592[#160592]). -* Fixes data table sorting for keyword values in *Lens* ({kibana-pull}160163[#160163]). -* Fixes override parameter when creating data views ({kibana-pull}160953[#160953]). -Logs:: -* Amend lazy imports in logs_shared plugin ({kibana-pull}164102[#164102]). -Machine Learning:: -* Fixes Trained models list crashes on browser refresh if not on page 1 ({kibana-pull}164163[#164163]). -* Fixes query bar not switching from KQL to Lucene and vice versa in Anomaly explorer ({kibana-pull}163625[#163625]). -* Data Frame Analytics creation wizard: ensures validation works correctly ({kibana-pull}163446[#163446]). -* Fixes capabilities polling in manage page ({kibana-pull}163399[#163399]). -* Fixes unhandled promise rejection from ML plugin ({kibana-pull}163129[#163129]). -* AIOps: Uses Kibana's http service instead of fetch and fixes throttling ({kibana-pull}162335[#162335]). -* Uses model supplied mask token for testing trained models ({kibana-pull}162168[#162168]). -Management:: -* Fixes how a bulk request body with variables are processed in Console ({kibana-pull}162745[#162745]). -* Improves a way of variable substitution and its documentation in Console ({kibana-pull}162382[#162382]). -* Transforms: Reduces rerenders and multiple fetches of source index on transform wizard load ({kibana-pull}160979[#160979]). -Maps:: -* Fixes Map layer preview blocks adding layer until all tiles are loaded ({kibana-pull}161994[#161994]). -Monitoring:: -* Rewrite CPU usage rule to improve accuracy ({kibana-pull}159351[#159351]). -Observability:: -* Fixes email connector rule URL ({kibana-pull}162954[#162954]). -* Disable the 'View rule details' option from the Alert Details' Actions list when the rule is deleted ({kibana-pull}163183[#163183]). -Reporting:: -* Fixes a bug where Kibana Reporting would not work in Elastic Docker without adding a special setting in kibana.yml to disable the Chromium sandbox. ({kibana-pull}149080[#149080]). -* Fixes an issue where certain international characters would not appear correctly in the contents of a print-optimized PDF report of a dashboard ({kibana-pull}161825[#161825]). -Uptime:: -* Fixes auto-expand feature for failed step detail ({kibana-pull}162747[#162747]). - -[[release-notes-8.9.2]] -== {kib} 8.9.2 - -Review the following information about the {kib} 8.9.2 release. - -[float] -[[enhancement-v8.9.2]] -=== Enhancements - -Fleet:: -* Adds the configuration setting `xpack.fleet.packageVerification.gpgKeyPath` as an environment variable in the {kib} container ({kibana-pull}163783[#163783]). - -[float] -[[fixes-v8.9.2]] -=== Bug fixes - -Dashboard:: -* Fixes missing state on short URLs could be lost on an alias match redirect ({kibana-pull}163658[#163658]). -* Fixes 'Download CSV' returning no data when panel has custom time range outside the time range of the global time picker ({kibana-pull}163887[#163887]). -* Fixes **Dashboard** getting stuck at loading in {kib} when Controls is used and mapping changed from integer to keyword ({kibana-pull}163529[#163529]). -Elastic Security:: -For the Elastic Security 8.9.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Lens & Visualizations:: -* Allow removing temporary data view from event annotation group in *Lens* ({kibana-pull}163976[#163976]). -Machine Learning:: -* Anomaly detection wizard: ensure custom URLs test functionality works as expected ({kibana-pull}165055[#165055]). -* Fixes anomaly detection module manifest queries for {kib} sample data sets, so cold and frozen tiers are not queried ({kibana-pull}164332[#164332]). -Management:: -* Transforms: Fixes privileges check ({kibana-pull}163687[#163687]). -Operations:: -* Fixes an issue where {kib} did not start on CentOS/RHEL 7 ({kibana-pull}165151[#165151]). -Reporting:: -* Allow custom roles to use image reporting in **Dashboard** ({kibana-pull}163873[#163873]). - -[[release-notes-8.9.1]] -== {kib} 8.9.1 - -Review the following information about the {kib} 8.9.1 release. - -[float] -[[breaking-changes-8.9.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.9.0, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in the {kib} 8.9.1 release. - -To review the breaking changes in the previous release, check {kibana-ref-all}/8.9/release-notes-8.9.0.html#breaking-changes-8.9.0[8.9.0]. - -[float] -[[fixes-v8.9.1]] -=== Bug fixes -APM:: -* Fixes flame graph rendering on the transaction detail page ({kibana-pull}162968[#162968]). -* Check if documents are missing `span.name` ({kibana-pull}162899[#162899]). -* Fixes transaction action menu for Trace Explorer and dependency operations ({kibana-pull}162213[#162213]). -Canvas:: -* Fixes embeddables not rendering in Canvas ({kibana-pull}163013[#163013]). -Discover:: -* Fixes grid styles to enable better content wrapping ({kibana-pull}162325[#162325]). -* Fixes search sessions using temporary data views ({kibana-pull}161029[#161029]). -* Make share links and search session information shorter for temporary data views ({kibana-pull}161180[#161180]). -Elastic Security:: -For the Elastic Security 8.9.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Fixes for query error on Agents list in the UI ({kibana-pull}162816[#162816]). -* Remove duplicate path being pushed to package archive ({kibana-pull}162724[#162724]). -Management:: -* Resolves potential errors present in v8.9.0 with data views that contain field filters that have been edited ({kibana-pull}162860[#162860]). -Uptime:: -* Fixes Monitor not found 404 message display ({kibana-pull}163501[#163501]). - -[float] -[[enhancement-v8.9.1]] -=== Enhancements -Discover:: -* Set legend width to extra large and enable text wrapping in legend labels ({kibana-pull}163009[#163009]). - -[[release-notes-8.9.0]] -== {kib} 8.9.0 - -For information about the {kib} 8.9.0 release, review the following information. - -[float] -[[known-issues-8.9.0]] -=== Known issues - -// tag::known-issue-160116[] -[discrete] -.Changes to Lens visualizations do not appear in the saved object. -[%collapsible] -==== -*Details* + -Changes to Lens visualizations do not appear in the saved object. - -*Impact* + -When you remove fields from Lens visualizations, then save your changes, the removed fields continue to appear in the Lens visualization saved objects. -For example, when you remove runtime fields from a Lens visualization and {kib}, then inspect the Lens visualization saved object, the runtime fields continue to appear and an error message appears. - -*Workaround* + -In 8.10.0, we are addressing this issue by merging the existing and changed saved object instead of replacing the saved object. - -==== -// end::known-issue-161249[] - -[float] -[[breaking-changes-8.9.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.9.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Hide Uptime app if no data is available -[%collapsible] -==== -*Details* + -The Uptime app now gets hidden from the interface when it doesn't have any data for more than a week. If you have a standalone Heartbeat pushing data to Elasticsearch, the Uptime app is considered active. You can disable this automatic behavior from the advanced settings in Kibana using the **Always show legacy Uptime app** option. -For synthetic monitoring, we now recommend to use the new Synthetics app. For more information, refer to {kibana-pull}159118[#159118] -==== - -[discrete] -.Remove synthetics pattern from Uptime settings -[%collapsible] -==== -*Details* + -Data from browser monitors and monitors of all types created within the Synthetics App or via the Elastic Synthetics Fleet Integration will no longer appear in Uptime. For more information, refer to {kibana-pull}159012[#159012] -==== - -[float] -[[deprecations-8.9.0]] -=== Deprecations - -The following functionality is deprecated in 8.9.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.9.0. - -[discrete] -[[deprecation-156455]] -.Hide ability to create legacy input controls -[%collapsible] -==== -*Details* + -The option to create legacy input controls when creating a new visualization is hidden. For more information, refer to {kibana-pull}156455[#156455] -==== - -[discrete] -[[deprecation-155503]] -.Remove legacy field stats -[%collapsible] -==== -*Details* + -Legacy felid stats that were previously shown within a popover have been removed. For more information, refer to {kibana-pull}155503[#155503] -==== - -[float] -[[features-8.9.0]] -=== Features -{kib} 8.9.0 adds the following new and notable features. - -APM:: -* Removes default service name and environment {kibana-pull}159901[#159901] -* Adds Agent status action {kibana-pull}159227[#159227] -* Added `sessionSampleRate` to agent configuration, which is a mobile specific setting {kibana-pull}159061[#159061] -* Adds storage explorer improvements {kibana-pull}157303[#157303] - -Elastic Security:: -For the Elastic Security 8.9.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.9.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Adds CloudFormation install method to CSPM {kibana-pull}159994[#159994] -* Adds flags to give permissions to write to any dataset and namespace {kibana-pull}157897[#157897] -* Disables Agent ID verification for Observability projects {kibana-pull}157400[#157400] -* Setup ignore_malformed in fleet {kibana-pull}157184[#157184] - -Lens & Visualizations:: -* Adds several new capabilities for annotation groups in *Lens* {kibana-pull}152623[#152623] - -Observability:: -* Adds SLO create callout to service overview, transactions page and transactions details {kibana-pull}159958[#159958] -* Adds the Logs threshold alert detail page, which provides more information and context about the Logs threshold alert {kibana-pull}159947[#159947] - -Security:: -* Adds vulnerability dashboard tables {kibana-pull}159699[#159699] -* Adds new Vulnerabilities tab to the Group by Resource page {kibana-pull}158987[#158987] -* Adds display errors and check licenses for actions in response actions {kibana-pull}155254[#155254] -* Adds common response actions tab in the alert flyout {kibana-pull}155362[#155362] - -For more information about the features introduced in 8.9.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.9.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.9.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.9.0]] -=== Enhancements -Alerting:: -* Adds a Mustache lambda for alerting actions to format numbers with `{{#FormatNumber}}` using `Intl.NumberFormat` {kibana-pull}159644[#159644] -* Removes bulk snoozing of rules in Select All mode {kibana-pull}159749[#159749] -* Adds refresh button to maintenance windows list {kibana-pull}159618[#159618] -* Adds the feature for a Slack API to have allowed list on channels {kibana-pull}159534[#159534] -* Integrate Conditional Actions with several Observability rule types {kibana-pull}159522[#159522] -* Adds AAD Fields API {kibana-pull}158516[#158516] -* Adds API to retrieve the `fieldsForAAD` from a given rule type {kibana-pull}158516[#158516] -* Improves the performance of clearing expired snooze schedules {kibana-pull}157909[#157909] -APM:: -* Ensure Saved Objects are versionable {kibana-pull}159881[#159881] -* Adds active alerts column for transaction group table {kibana-pull}159552[#159552] -* Adds an OpenAI integration {kibana-pull}158678[#158678] -* Adds Storage explorer improvements {kibana-pull}157303[#157303] -* Adds logic to replace transaction histogram with summary for backwards compatibility {kibana-pull}155714[#155714] -Dashboard:: -* Adds design enhancements to the clone experience in Dashboards {kibana-pull}159752[#159752] -* Adds enhancements to the empty state screen in Dashboards {kibana-pull}158496[#158496] -* Adds a query DSL documentation link to filters UI {kibana-pull}156543[#156543] -* Adds a counter displaying the min/max values of the time series counter field in the field popover {kibana-pull}155499[#155499] -* Adds the ability for Controls to recover from non-fatal error state {kibana-pull}158087[#158087] -Discover:: -* Updates Discover sharing capabilities to enable sharing a link when using temporary data views {kibana-pull}154947[#154947] -Elastic Security:: -For the Elastic Security 8.9.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.9.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Adds agent integration health reporting in the Fleet UI {kibana-pull}158826[#158826] -Lens & Visualizations:: -* Adds feature to ignore global filters at layer level in *Lens* {kibana-pull}159248[#159248] -* Adds significant terms support as ranking function in Top Values in *lens* {kibana-pull}158962[#158962] -* Adds support for curved, linear and stepped lines in *Lens* {kibana-pull}158896[#158896] -* Allow wildcard searching in options list {kibana-pull}158427[#158427] -* Adds tag cloud to *Lens* {kibana-pull}157751[#157751] -Machine Learning:: -* Data Frame Analytics: Allow interval time range selection in custom URLs {kibana-pull}159874[#159874] -* Increase limit of anomaly charts to max of 50 {kibana-pull}159816[#159816] -* Enable auto-complete on filter by influencer search box on anomaly explorer page {kibana-pull}159739[#159739] -* Moves import buttons in file data visualizer {kibana-pull}159722[#159722] -* Explain Log Rate Spikes: Adds secondary sort by `doc_count` only if sorted by `p-value` {kibana-pull}159568[#159568] -* Adds hyperlink to anomaly explorer for job from anomaly layer in maps {kibana-pull}159268[#159268] -* Support pipelines deletion and force flag for delete action {kibana-pull}158671[#158671] -* Use auto layout for anomalies table columns {kibana-pull}157687[#157687] -* Versioning all ML APIs {kibana-pull}156949[#156949] -Management:: -* Transforms: Adds extra checkpoint stats to details tab {kibana-pull}157287[#157287] -* Adds in-product docs for cross cluster search index pattern input {kibana-pull}156155[#156155] -Maps:: -* Adds a new layer wizard for the spatial join option {kibana-pull}156618[#156618] -Metrics:: -* Adds copilot to hosts process {kibana-pull}159413[#159413] -Observability:: -* Adds TLS Certificates page copied from Uptime, which only displays certificates from the synthetics application {kibana-pull}159541[#159541] -* Adds creating, editing, deleting monitors in private locations, which no longer requires all permissions in feet. You will only need synthetics write permissions. {kibana-pull}159378[#159378] -* Adds burn rate windows to SLO detail page {kibana-pull}159750[#159750] -* Adds *Normalize by* time and scale factor on Diff TopN functions page {kibana-pull}159394[#159394] -* Adds a severity label to SLO burn rate rule reason message {kibana-pull}158954[#158954] -* Adds Copy JSON button to Clipboard for SLO form {kibana-pull}157902[#157902] -* Adds Custom Metric SLI {kibana-pull}157421[#157421] -* Adds Data Views to index pattern selector {kibana-pull}158033[#158033] -Platform:: -* The savedObjects export API now supports exporting all types using the `*` wildcard. Please refer to the documentation {kibana-pull}159289[#159289] -Security:: -* Hide create spaces button when limit is reached {kibana-pull}159102[#159102] -Uptime:: -* Adds the option to send an HTML email instead of a plaintext email to users when assigned to a case {kibana-pull}159335[#159335] -* Implement standard time formatting {kibana-pull}143799[#143799] -* Adds a new field, called `category`, to categorize cases. Users can create a new category, set or select an existing one on a case, and filter by multiple categories on the cases table. {kibana-pull}159890[#159890] - -[float] -[[fixes-v8.9.0]] -=== Bug fixes -Alerting:: -* Fixes containment boundaries not being re-fetched when a query changes {kibana-pull}157408[#157408] -* Fixes the charts on Log threshold breached details page {kibana-pull}160321[#160321] -APM:: -* Fixes infinite loading of APM alert table {kibana-pull}161134[#161134] -* Fixes other bucket message and sorting {kibana-pull}159919[#159919] -* Fixes percentiles for service transaction metrics {kibana-pull}158913[#158913] -* Fixes stack trace on errors when only available as plain text {kibana-pull}156831[#156831] -Cases:: -* Fixes a bug in the alerts table where you cannot create a new case when attaching alerts to a case from the cases modal {kibana-pull}160526[#160526] -* Fixes an issue where the following special characters could not be included in the case tags: `\\():<>"*` because it resulted in a bug where the case would not be displayed in the cases table when filtered for those tags. These characters are now handled correctly and the cases will be shown in the table. {kibana-pull}159815[#159815] -Dashboard:: -* Fixes an issue where a Dashboard redirect alias displayed a blank screen instead of redirecting properly {kibana-pull}161043[#161043] -* Fixes an issue where the time slider would override custom time ranges {kibana-pull}160938[#160938] -* Fixes an issue where if the Reset button is clicked after changing the Title or Description in Panel settings before clicking Save, the Title or Description would revert to previous values {kibana-pull}159430[#159430] -* Fixes dashboard reset when initial state has no controls {kibana-pull}159404[#159404] -Design:: -* Accessibility: Make links on job validation step distinguished from surrounding text {kibana-pull}160608[#160608] -* Fixes the range slider rendering issues and performance improvements {kibana-pull}159271[#159271] -Discover:: -* Fixes refresh fields when entering Discover {kibana-pull}160195[#160195] -Elastic Security:: -For the Elastic Security 8.9.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Enterprise Search:: -For the Elastic Enterprise Search 8.9.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. -Fleet:: -* Fixes bug that prevented `index.mapping` settings to be propagated into component templates from default settings {kibana-pull}157289[#157289] -Lens & Visualizations:: -* Fixes missing datasource migration sometimes failing to run in *Lens* {kibana-pull}160129[#160129] -* Removes wrong padding on the dashboard in *Lens* {kibana-pull}159992[#159992] -* Fixes counter fields being used with Top values in *Lens* {kibana-pull}159709[#159709] -* Fixes dimension labels being partially translated on language change in *Lens* {kibana-pull}159089[#159089] -* Fixes the threshold visibility rendering in XY charts {kibana-pull}158917[#158917] -* Fixes a tag cloud warning about container being too small that never disappears {kibana-pull}159611[#159611] -* Default format in *Lens* will apply dataView field format as usual now in new Metric visualization {kibana-pull}158468[#158468] -* Fixes the handling of partition chart empty slices in *Lens* {kibana-pull}158346[#158346] -* Make reference lines use the correct formatter when configured in *Lens* {kibana-pull}158266[#158266] -* Fixes an issue where dropping a date field into a XY visualization with multiple mixed layers resets the chart type of all layers in *Lens* {kibana-pull}157871[#157871] -* Fixes an issue where incompatible actions were visible from the panels {kibana-pull}156667[#156667] -Machine Learning:: -* Fixing time range selector in recognizer wizard {kibana-pull}160910[#160910] -* Fixes Anomaly Explorer URL for alerting context with non-default space {kibana-pull}160899[#160899] -* Hide inference stats for PyTorch models {kibana-pull}160599[#160599] -* Outlier detection results: ensure feature influence color persists on column position change {kibana-pull}160470[#160470] -* Anomaly detection: fixes time format used in query for datafeed chart {kibana-pull}160325[#160325] -* Hide `cache_miss_count` for PyTorch models {kibana-pull}160265[#160265] -* Fixes time range in link to data visualizer after file upload {kibana-pull}160189[#160189] -* Fixes links to dashboards in Lens created anomaly detection jobs {kibana-pull}160156[#160156] -* Adds warning to log pattern analysis page if data view is not time based {kibana-pull}160021[#160021] -Management:: -* Fixes creation and editing of composite runtime fields with dots in the names {kibana-pull}160458[#160458] -* Fixes decreasing network delays when cross cluster search is running by sending `ccs_minimize_roundtrips=true` for async search requests {kibana-pull}159848[#159848] -* Fixes max page search size limit for Transforms {kibana-pull}159052[#159052] -* Fixes issue with single value for fields parameters {kibana-pull}157930[#157930] -* Fixes data view timestamp validation {kibana-pull}150398[#150398] -* Fixes theming for search sessions management {kibana-pull}160182[#160182] -Maps:: -* Fixes geojson layer with joins and no left source matches stuck in loading state {kibana-pull}160222[#160222] -* Fixes size legend not indicating when min/max clamped by standard deviation range {kibana-pull}156927[#156927] -Metrics:: -* Fixes `metric_explorer` flaky test{kibana-pull}157194[#157194] -Operations:: -* Fixes Elasticsearch snapshot startup for parameters with dots in their path {kibana-pull}161022[#161022] -Platform:: -* Fixes theming for error toast messages {kibana-pull}160219[#160219] -* Fixes a bug that could cause old Kibana deployments to loose their uiSettings after an upgrade {kibana-pull}159649[#159649] -* Fixes the handling of non-existing objects in _copy_saved_objects API call {kibana-pull}158036[#158036] -Security:: -* Fixes theming of CodeEditors {kibana-pull}159638[#159638] -* Update session viewer Policy permissions to use Policy specific check {kibana-pull}160448[#160448] -* Fixes an issue when opening an endpoint exception from the Alert's summary flyout actions button, the exception did not auto-populate {kibana-pull}159908[#159908] -Uptime:: -* Fixes parsing of response check on JSON expressions {kibana-pull}161634[#161634] -* Fixes an API error stating no key exists when a user was visiting the getting started page or tried to add monitor view by enabling synthetics {kibana-pull}160360[#160360] -* Fixes copy on private locations popover {kibana-pull}159740[#159740] - -[[release-notes-8.8.2]] -== {kib} 8.8.2 - -Review the following information about the {kib} 8.8.2 release. - -[float] -[[known-issues-8.8.2]] -=== Known issues - -// tag::known-issue-161249[] -[discrete] -.Kibana can run out of memory during an upgrade when there are many {fleet} agent policies. -[%collapsible] -==== -*Details* + -Due to a schema version update, during {fleet} setup in 8.8.x, all agent policies are being queried and deployed. -This action triggers a lot of queries to the Elastic Package Registry (EPR) to fetch integration packages. As a result, -there is an increase in Kibana's resident memory usage (RSS). - -*Impact* + -Because the default batch size of `100` for schema version upgrade of {fleet} agent policies is too high, this can -cause Kibana to run out of memory during an upgrade. For example, we have observed 1GB Kibana instances run -out of memory during an upgrade when there were 20 agent policies with 5 integrations in each. - -*Workaround* + -Two workaround options are available: - -* Increase the Kibana instance size to 2GB. So far, we are not able to reproduce the issue with 2GB instances. -* Set `xpack.fleet.setup.agentPolicySchemaUpgradeBatchSize` to `2` in the `kibana.yml` and restart the Kibana instance(s). - -In 8.9.0, we are addressing this by changing the default batch size to `2`. - -==== -// end::known-issue-161249[] - -[float] -[[fixes-v8.8.2]] -=== Bug fixes - -APM:: -* Fixes the latency graph displaying all service transactions, rather than the selected one, on the transaction detail page {kibana-pull}159085[#159085] - -Dashboard:: -* Fixes styling of top nav bar {kibana-pull}159754[#159754] -* Fixes alias redirect and update error handling {kibana-pull}159742[#159742] -* Fixes time range regression {kibana-pull}159337[#159337] - -Elastic Security:: -For the Elastic Security 8.8.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.8.2 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Fixes usage of AsyncLocalStorage for audit log {kibana-pull}159807[#159807] -* Fixing issue of returning output API key {kibana-pull}159179[#159179] - -Logs:: -* Fixes log categorization UI failure due to an infinite loop {kibana-pull}159090[#159090] - -Machine Learning:: -* Hiding pattern analysis button for non-time series data {kibana-pull}160051[#160051] -* Fixes blocking forced downgrades/installation if indices can't be deleted {kibana-pull}159814[#159814] - -Maps:: -* Fixes layer group loading indicator always on when group has non-visible layer {kibana-pull}159517[#159517] -* Fixes geo line source not loading unless the Maps application is open {kibana-pull}159432[#159432] -* Fixes Maps orphan sources on layer deletion {kibana-pull}159067[#159067] - -Monitoring:: -* Permanently hide the telemetry notice on dismissal {kibana-pull}159893[#159893] - -Observability:: -* Handle buildEsQuery error (such as leading wildcard) in status change {kibana-pull}159891[#159891] - -Platform:: -* Fixes global search crash on missing tag {kibana-pull}159196[#159196] -* Fixes a regression where the "saved_object_resolve" audit action was not being logged per object {kibana-pull}160014[#160014] - -Uptime:: -* Ensures that users can configure custom `Content-Type` headers for HTTP monitors in the Synthetics app {kibana-pull}159737[#159737] -* Fixes an issue where alerting on Synthetics monitors was sometimes delayed {kibana-pull}159511[#159511] - -[[release-notes-8.8.1]] -== {kib} 8.8.1 - -Review the following information about the {kib} 8.8.1 release. - -[float] -[[known-issues-8.8.1]] -=== Known issues - -// tag::known-issue-161249[] -[discrete] -.Kibana can run out of memory during an upgrade when there are many {fleet} agent policies. -[%collapsible] -==== -*Details* + -Due to a schema version update, during {fleet} setup in 8.8.x, all agent policies are being queried and deployed. -This action triggers a lot of queries to the Elastic Package Registry (EPR) to fetch integration packages. As a result, -there is an increase in Kibana's resident memory usage (RSS). - -*Impact* + -Because the default batch size of `100` for schema version upgrade of {fleet} agent policies is too high, this can -cause Kibana to run out of memory during an upgrade. For example, we have observed 1GB Kibana instances run -out of memory during an upgrade when there were 20 agent policies with 5 integrations in each. - -*Workaround* + -Two workaround options are available: - -* Increase the Kibana instance size to 2GB. So far, we are not able to reproduce the issue with 2GB instances. -* Set `xpack.fleet.setup.agentPolicySchemaUpgradeBatchSize` to `2` in the `kibana.yml` and restart the Kibana instance(s). - -In 8.9.0, we are addressing this by changing the default batch size to `2`. - -==== -// end::known-issue-161249[] - -// tag::known-issue-159807[] -[discrete] -.Memory leak in {fleet} audit logging. -[%collapsible] -==== -*Details* + -{fleet} introduced audit logging for various CRUD (create, read, update, and delete) operations in version 8.8.0. - -While audit logging is not enabled by default, we have identified an off-heap memory leak in the implementation of {fleet} audit logging that can result in poor {kib} performance, and in some cases {kib} instances being terminated by the OS kernel's oom-killer. This memory leak can occur even when {kib} audit logging is not explicitly enabled (regardless of whether `xpack.security.audit.enabled` is set in the `kibana.yml` settings file). - -*Impact* + -The version 8.8.2 release includes in {kibana-pull}159807[a fix] for this problem. If you are using {fleet} integrations -and {kib} audit logging in version 8.8.0 or 8.8.1, you should upgrade to 8.8.2 or above to obtain the fix. -==== -// end::known-issue-159807[] - -[float] -[[breaking-changes-8.8.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.8.1, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in the {kib} 8.8.1 release. - -To review the breaking changes in the previous release, check {kibana-ref-all}/8.8/release-notes-8.8.0.html#breaking-changes-8.8.0[8.8.0]. - -[float] -[[enhancement-v8.8.1]] -=== Enhancements - -Elastic Security:: -For the Elastic Security 8.8.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Add Elastic Agent UI instructions for Universal Profile {kibana-pull}158936[#158936] - -[float] -[[fixes-v8.8.1]] -=== Bug fixes - -Alerting:: -* Fixes a bug where ML embeddables, OsQuery, and IoCs attachments in a case render the wrong view {kibana-pull}158441[#158441] -* Makes alert links shorter {kibana-pull}158582[#158582] -* Throws a Mustache error when validating action message for warnings {kibana-pull}158668[#158668] -* Adds null checks when iterating through an index template list {kibana-pull}158742[#158742] - -APM:: -* Displays the size of hidden indices in storage explorer {kibana-pull}158746[#158746] -* Changes the APM latency value and latency threshold to microseconds {kibana-pull}158703[#158703] -* Fixes service transaction metrics by using `transaction.duration.histogram` for percentile aggregations {kibana-pull}158909[#158909] - -Discover:: -* Update single doc view locator to URL encode `rowId` {kibana-pull}158635[#158635] -* Fixes the display of grid row selection when in dark mode {kibana-pull}158231[#158231] - -Elastic Security:: -For the Elastic Security 8.8.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Include hidden data streams in package upgrade {kibana-pull}158654[#158654] - -Logs:: -* Fixes Log Categorization UI failure due to an infinite loop {kibana-pull}159090[#159090] - -Machine Learning:: -* Increases calendar events request limit {kibana-pull}158726[#158726] -* Disables the delete option for deployed models {kibana-pull}158533[#158533] -* Applies theme based on the User Profile settings {kibana-pull}158258[#158258] - -Maps:: -* Fixes toolbar action button not filled when selected {kibana-pull}158284[#158284] -* Fixes Maps to display dark theme when enabled {kibana-pull}158219[#158219] - -Operations:: -* Fixes configuration stacking order {kibana-pull}158827[#158827] - -Platform:: -* Fixes {kib} crashing on Safari versions prior to 16.4 {kibana-pull}158825[#158825] -* Updates all aliases with a single `updateAliases()` when relocating saved objects {kibana-pull}158940[#158940] -* Fixes a race condition that could cause intermittent upgrade migration failures when {kib} connects to a single node {es} cluster {kibana-pull}158182[#158182] -* Dynamically reduces the `migrations.batchSize` value when {kib} encounters a migration batch that's too big to process {kibana-pull}157494[#157494] - -[[release-notes-8.8.0]] -== {kib} 8.8.0 - -Review the following information about the {kib} 8.8.0 release. - -[float] -[[known-issues-8.8.0]] -=== Known issues - -// tag::known-issue-161249[] -[discrete] -.Kibana can run out of memory during an upgrade when there are many {fleet} agent policies. -[%collapsible] -==== -*Details* + -Due to a schema version update, during {fleet} setup in 8.8.x, all agent policies are being queried and deployed. -This action triggers a lot of queries to the Elastic Package Registry (EPR) to fetch integration packages. As a result, -there is an increase in Kibana's resident memory usage (RSS). - -*Impact* + -Because the default batch size of `100` for schema version upgrade of {fleet} agent policies is too high, this can -cause Kibana to run out of memory during an upgrade. For example, we have observed 1GB Kibana instances run -out of memory during an upgrade when there were 20 agent policies with 5 integrations in each. - -*Workaround* + -Two workaround options are available: - -* Increase the Kibana instance size to 2GB. So far, we are not able to reproduce the issue with 2GB instances. -* Set `xpack.fleet.setup.agentPolicySchemaUpgradeBatchSize` to `2` in the `kibana.yml` and restart the Kibana instance(s). - -In 8.9.0, we are addressing this by changing the default batch size to `2`. - -==== -// end::known-issue-161249[] - -// tag::known-issue-158940[] -[discrete] -.Failed upgrades to 8.8.0 can cause bootlooping and data loss -[%collapsible] -==== -*Details* + -The 8.8.0 release splits the `.kibana` index into multiple saved object indices. If an upgrade to 8.8.0 partially succeeds, but not all the indices are created successfully, {kib} may be unable to successfully complete the upgrade on the next restart. - -This can result in a loss of saved objects during the upgrade. This can also leave {kib} in a bootlooping state where it's unable to start due to `write_blocked` indices. - -*Impact* + -The 8.8.1 release includes in {kibana-pull}158940[a fix] for this problem. Customers affected by a failed 8.8.0 upgrade should contact Elastic support. For more information, see the {kibana-issue}158733[related issue]. -==== -// end::known-issue-158940[] - -// tag::known-issue-159807[] -[discrete] -.Memory leak in {fleet} audit logging. -[%collapsible] -==== -*Details* + -{fleet} introduced audit logging for various CRUD (create, read, update, and delete) operations in version 8.8.0. -While audit logging is not enabled by default, we have identified an off-heap memory leak in the implementation of {fleet} audit logging that can result in poor {kib} performance, and in some cases {kib} instances being terminated by the OS kernel's oom-killer. This memory leak can occur even when {kib} audit logging is not explicitly enabled (regardless of whether `xpack.security.audit.enabled` is set in the `kibana.yml` settings file). - -*Impact* + -The version 8.8.2 release includes in {kibana-pull}159807[a fix] for this problem. If you are using {fleet} integrations -and {kib} audit logging in version 8.8.0 or 8.8.1, you should upgrade to 8.8.2 or above to obtain the fix. -==== -// end::known-issue-159807[] - -// tag::known-issue-155203[] -[discrete] -.Monitors in Synthetics may stop running -[%collapsible] -==== -*Details* + -If Monitor Management was enabled prior to 8.6.0, the API key generated internally will not contain the required permissions. The Synthetics app will attempt to fix this automatically in {kibana-pull}155203[#155203] when a user with https://www.elastic.co/guide/en/observability/8.8/synthetics-role-setup.html[sufficient privileges] visits this page for the first time after upgrading to 8.8.0. - -*Impact* + -All monitors configured to run on Elastic's global managed testing infrastructure will stop running until a user with permissions has loaded the Synthetics app. -==== -// end::known-issue-155203[] - -// tag::known-issue-156798[] -[discrete] -.Network throttling disabled for browser monitors in Synthetics -[%collapsible] -==== -*Details* + -Network throttling has been temporarily disabled for browser-based Synthetics monitors running on Elastic's global managed testing infrastructure and private locations. This will be enabled again at some point in the future. We're providing frequent updates on this issue in https://github.com/elastic/synthetics/blob/main/docs/throttling.md[this document]. - -*Impact* + -With network throttling being disabled, your monitors may run more quickly (i.e. have a lower duration) than you observed previously and than when network throttling is enabled again in the future. No monitor configurations have been changed, but the network throttling settings are ignored at the moment. -==== -// end::known-issue-156798[] - -// tag::known-issue-120[] -[discrete] -.Alert failures when migrating to 8.8.0 from 8.6 or earlier -[%collapsible] -==== -*Details* + -If a cluster meets all of the following conditions, its {elastic-sec} and {observability} rules will fail and no actions will be sent: - -- The {elastic-sec} and {observability} rules were created in version 8.6 or earlier releases. -- There must be an {ref}/index-templates.html[index template] (for any index) that isn't composed of component templates. - -The following error messages in the {kib} log occur when {kib} starts or when the rules run: - -[source,sh] ----- -Error installing component template .alerts-ecs-mappings - Cannot read properties of undefined (reading 'includes') - -Error installing common resources for AlertsService. No additional resources will be installed and rule execution may be impacted. - Failure during installation. Cannot read properties of undefined (reading 'includes') ----- - -*Impact* + -If you have upgraded to 8.8.0 and your alerting rules fail, upgrade to 8.8.1. -==== -// end::known-issue-120[] - -// tag::known-issue-158447[] -[discrete] -.Incorrect attachments are added to cases -[%collapsible] -==== -*Details* + -When you attach {ml} visualizations, OsQuery, or Indicators of Compromise (IoCs) to a case, each attachment has its own view which renders in the *Activity* tab. -For these attachments, a bug was introduced in 8.8.0: - -. If you add two different attachments on a case, the view will be the same for both. -. If you add one attachment to one case and another to a different case, in the second case you will view the attachment of the first case. - -Alerts are not affected. - -*Impact* + -There are no mitigations for the first scenario, other than upgrading to 8.8.1. -For the second scenario, refreshing the case fixes the issue. -==== -// end::known-issue-158447[] - -[float] -[[breaking-changes-8.8.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.8.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Removes legacy project monitor API -[%collapsible] -==== -*Details* + -The project monitor API for Synthetics in Elastic Observability has been removed. For more information, refer to {kibana-pull}155470[#155470]. - -*Impact* + -In 8.8.0 and later, an error appears when you use the project monitor API. -==== - -[discrete] -.Changes the privileges for alerts and cases -[%collapsible] -==== -*Details* + -The privileges for attaching alerts to cases has changed. For more information, refer to {kibana-pull}147985[#147985]. - -*Impact* + -To attach alerts to cases, you must have `Read` access to an {observability} or Security feature that has alerts and `All` access to the **Cases** feature. For detailed information, check link:https://www.elastic.co/guide/en/kibana/current/kibana-privileges.html[{kib} privileges] and link:https://www.elastic.co/guide/en/kibana/current/setup-cases.html[Configure access to cases]. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.7/release-notes-8.7.0.html#breaking-changes-8.7.0[8.7.0] | {kibana-ref-all}/8.6/release-notes-8.6.0.html#breaking-changes-8.6.0[8.6.0] | {kibana-ref-all}/8.5/release-notes-8.5.0.html#breaking-changes-8.5.0[8.5.0] | {kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[deprecations-8.8.0]] -=== Deprecations - -The following functionality is deprecated in 8.8.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.8.0. - -[discrete] -[[deprecation-154275]] -.Deprecates ephemeral Task Manager settings -[%collapsible] -==== -*Details* + -The following Task Manager settings are deprecated: - -* `xpack.task_manager.ephemeral_tasks.enabled` -* `xpack.task_manager.ephemeral_tasks.request_capacity` -* `xpack.alerting.maxEphemeralActionsPerAlert` - -For more information, refer to {kibana-pull}154275[#154275]. - -*Impact* + -To improve task execution resiliency, remove the deprecated settings from the `kibana.yml` file. For detailed information, check link:https://www.elastic.co/guide/en/kibana/current/task-manager-settings-kb.html[Task Manager settings in {kib}]. -==== - -[discrete] -[[deprecation-154010]] -.Deprecates monitor schedules -[%collapsible] -==== -*Details* + -Synthetics and Uptime monitor schedules and zip URL fields are deprecated. For more information, refer to {kibana-pull}154010[#154010] and {kibana-pull}154952[#154952]. - -*Impact* + -When you create monitors in Uptime Monitor Management and the Synthetics app, unsupported schedules are automatically transfered to the nearest supported schedule. To use zip URLs, use project monitors. -==== - -[discrete] -[[deprecation-152236]] -.Deprecates Agent reassign API PUT endpoint -[%collapsible] -==== -*Details* + -The PUT endpoint for the agent reassign API is deprecated. For more information, refer to {kibana-pull}152236[#152236]. - -*Impact* + -Use the POST endpoint for the agent reassign API. -==== - -[discrete] -[[deprecation-151564]] -.Deprecates `total` in `/agent_status` Fleet API -[%collapsible] -==== -*Details* + -The `total` field in `/agent_status` Fleet API responses is deprecated. For more information, refer to {kibana-pull}151564[#151564]. - -*Impact* + -The `/agent_status` Fleet API now returns the following statuses: - -* `all` — All active and inactive -* `active` — All active -==== - -[discrete] -[[deprecation-149506]] -.Deprecates Elastic Synthetics integration -[%collapsible] -==== -*Details* + -The Elastic Synthetics integration is deprecated. For more information, refer to {kibana-pull}149506[#149506]. - -*Impact* + -To monitor endpoints, pages, and user journeys, go to **{observability}** -> **Synthetics (beta)**. -==== - -[float] -[[features-8.8.0]] -=== Features -{kib} 8.8.0 adds the following new and notable features. - -Alerting:: -* Adds Maintenance Window Task Runner Integration + New AAD/Event Log Fields {kibana-pull}154761[#154761] -* Adds support for users authenticated with API keys to manage alerting rules {kibana-pull}154189[#154189] -* Adds the ability to control allowed attached file mime types and the maximum file size {kibana-pull}154013[#154013] -* Adds query and timeframe params to RuleAction to filter alerts {kibana-pull}152360[#152360] - -APM:: -* Adds group-by feature in APM rules {kibana-pull}155001[#155001] -* Adds queues as nodes to the service map {kibana-pull}153784[#153784] -* Adds the ability to display the latest agent version in agent explorer {kibana-pull}153643[#153643] -* Adds table tabs showing summary of metrics {kibana-pull}153044[#153044] -* Adds warning to Edit Rule Flyout when publicUrl is not configured {kibana-pull}149832[#149832] - -Cases:: -* Adds support for file attachments in Cases {kibana-pull}154436[#154436] -* Adds the Cases column to the alerts table {kibana-pull}150963[#150963] -* Adds filtering and sorting for the case activity {kibana-pull}149396[#149396] -* Adds the ability to filter user activities with pagination {kibana-pull}152702[#152702] - -Dashboard:: -Pins the unified search bar and dashboard toolbar to the top of the dashboard page when scrolling {kibana-pull}145628[#145628] - -Discover:: -Adds log pattern analysis {kibana-pull}153449[#153449] - -Elastic Security:: -For the Elastic Security 8.8.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.8.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Adds audit logging for core CRUD operations {kibana-pull}152118[#152118] -* Adds modal to display versions changelog {kibana-pull}152082[#152082] - -Infrastructure:: -* Adds the logs tab to the Hosts View {kibana-pull}152995[#152995] -* Adds Alerts tab into Hosts View {kibana-pull}149579[#149579] -* Adds refactoring to the Time and Position log stream state {kibana-pull}149052[#149052] - -Machine Learning:: -* Adds ELSER config to the Trained Models UI {kibana-pull}155867[#155867] -* Adds support for custom URLs in jobs for Data Frame Analytics {kibana-pull}154287[#154287] -* Adds support to filter fields from grouping in Explain Log Rate Spikes {kibana-pull}153864[#153864] -* Adds log pattern analysis in Discover {kibana-pull}153449[#153449] - -Management:: -* Adds support for global settings {kibana-pull}148975[#148975] -* Adds Custom Branding settings to Global settings {kibana-pull}150080[#150080] - -Maps:: -Adds map.emsUrl to docker env variables {kibana-pull}153441[#153441] - -Observability:: -* Adds the ability to changes all SLO assets to managed, and indices to hidden {kibana-pull}154953[#154953] -* Adds Exploratory View to a separate app {kibana-pull}153852[#153852] - -Platform:: -Adds text {kibana-pull}151631[#151631] - -Security:: -* Adds CloudFormation agent install method {kibana-pull}155045[#155045] -* Adds Vul mgmt flyout details panel {kibana-pull}154873[#154873] -* Adds Vulnerabilities Table {kibana-pull}154388[#154388] -* Adds the ability to select a theme preference for {kib} in the User Profile {kibana-pull}151507[#151507] - -Uptime:: -Adds UUID to RuleAction {kibana-pull}148038[#148038] - -For more information about the features introduced in 8.8.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.8.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.8.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.8.0]] -=== Enhancements -Alerting:: -* Adds the ability to predefine IDs when you create connectors {kibana-pull}155392[#155392] -* Adds the ability to allow the footer added to emails sent from {kib} alerting rules to **NOT** be added {kibana-pull}154919[#154919] -* Adds conditional actions UI for timeframe {kibana-pull}153944[#153944] -* Adds a single view in the app function for rule actions variables and UI page {kibana-pull}148671[#148671] - -APM:: -* Adds error grouping key filter in error count rule type {kibana-pull}155410[#155410] -* Adds transaction name filter in failed transaction rate rule type {kibana-pull}155405[#155405] -* Replaces most used charts with the Lens embeddable {kibana-pull}155026[#155026] -* Adds transaction name filter in latency threshold rule {kibana-pull}154241[#154241] -* Adds Unified Search for APM {kibana-pull}153842[#153842] -* Adds migratation for the remaining tx-based visualizations {kibana-pull}153375[#153375] -* Adds migration for the tx latency chart and group stats to rollups/service metrics {kibana-pull}153162[#153162] -* Disables agent configuration creation for opentelemetry agents {kibana-pull}150697[#150697] - -Cases:: -* Adds the ability to set a new connector to default {kibana-pull}151884[#151884] -* Improves the design of the description markdown editor on the Cases page {kibana-pull}155151[#155151] - -Dashboard:: -* Adds support to Dashboard for searching saved objects by tags {kibana-pull}154946[#154946] -* Adds reset button {kibana-pull}154872[#154872] -* Adds unified dashboard settings {kibana-pull}153862[#153862] -* Adds the ability to scroll to a new panel {kibana-pull}152056[#152056] - -Discover:: -* Adds the ability to allow wildcards in field search {kibana-pull}155540[#155540] -* Adds a loading indicator during Discover table updates {kibana-pull}155505[#155505] -* Adds drag & drop capabilities for adding columns to the table {kibana-pull}153538[#153538] -* Adds a progress indicator when a saved search embeddable is updating {kibana-pull}152342[#152342] -* Adds inline data fetching errors {kibana-pull}152311[#152311] -* Adds a loading indicator for the classic table embeddable {kibana-pull}152072[#152072] -* Adds the ability to suppress "Missing index" toasts {kibana-pull}149625[#149625] - -Elastic Security:: -For the Elastic Security 8.8.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.8.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Adds support for fields of type aggregate_metric_double {kibana-pull}154920[#154920] -* Adds overview dashboards in fleet {kibana-pull}154914[#154914] -* Adds raw status to Agent details UI {kibana-pull}154826[#154826] -* Adds support for dynamic_namespace and dynamic_dataset {kibana-pull}154732[#154732] -* Adds the ability to show pipelines and mappings editor for input packages {kibana-pull}154077[#154077] -* Adds placeholder to integration select field {kibana-pull}153927[#153927] -* Adds the ability to show integration subcategories {kibana-pull}153591[#153591] -* Adds the ability to create and update the package policy API return 409 conflict when names are not unique {kibana-pull}153533[#153533] -* Adds the ability to display policy changes in Agent activity {kibana-pull}153237[#153237] -* Adds the ability to display errors in Agent activity with link to Logs {kibana-pull}152583[#152583] -* Adds support for select type in integrations {kibana-pull}152550[#152550] -* Adds the ability to make spaces plugin optional {kibana-pull}152115[#152115] -* Adds proxy ssl key and certificate to agent policy {kibana-pull}152005[#152005] -* Adds `_meta` field `has_experimental_data_stream_indexing_features` {kibana-pull}151853[#151853] -* Adds the ability to create templates and pipelines when updating package of a single package policy from type integration to input {kibana-pull}150199[#150199] -* Adds user's secondary authorization to Transforms {kibana-pull}154665[#154665] - -Infrastructure:: -Adds Memory Available Graph To Hosts View {kibana-pull}151863[#151863] - -Lens & Visualizations:: -* Adds the ability to sync the partition legend order with the filters order in *Lens* {kibana-pull}154820[#154820] -* Adds support for icons in the new *Lens* metric {kibana-pull}154210[#154210] -* Adds the ability to share with reports in *Lens* {kibana-pull}153429[#153429] -* Adds show and hide heatmap ticks in *Lens* {kibana-pull}153425[#153425] -* Adds the ability to remove empty headers when there is no x-axis in *Lens* {kibana-pull}153420[#153420] -* Adds improvements to the Metric formatter to support bit format in *Lens* {kibana-pull}153389[#153389] -* Adds the ability to prevent default behaviour from action callback in *Lens* {kibana-pull}152842[#152842] -* Adds Random Sampling to *Lens* {kibana-pull}151749[#151749] - -Machine Learning:: -* Data Frame Analytics creation wizard: add ability to add time field to result data view {kibana-pull}155669[#155669] -* Display info when no datafeed preview results are found {kibana-pull}155650[#155650] -* Adding ignore unavailable indices option to anomaly detection job wizards {kibana-pull}155527[#155527] -* Support multiple model deployments {kibana-pull}155375[#155375] -* Uses two weeks before now for default start time in job start date picker {kibana-pull}155312[#155312] -* AIOps: Adds filter action for the Change point detection results {kibana-pull}155256[#155256] -* Adds search links for AIOps Labs pages {kibana-pull}155202[#155202] -* AIOps: Adds field stats for metric and split fields {kibana-pull}155177[#155177] -* AIOps: Link from Explain Log Rate Spikes to Log Pattern Analysis {kibana-pull}155121[#155121] -* Explain Log Rate Spikes: adds popover to analysis table for viewing other field values {kibana-pull}154689[#154689] -* Explain Log Rate Spikes: Makes use of random sampling for overall histogram chart {kibana-pull}154520[#154520] -* Explain Log Rate Spikes: Adds table action to copy filter to clipboard {kibana-pull}154311[#154311] -* Change point detection: support for multiple metric and split fields {kibana-pull}154237[#154237] -* Enhances support for counter fields in data visualizer / field statistics {kibana-pull}153893[#153893] -* Custom sorting by message level on Notifications page {kibana-pull}153462[#153462] -* Adds log pattern analysis in Discover {kibana-pull}153449[#153449] -* Explain Log Rate Spikes: Improves grouping using the `include` option of the `frequent_item_sets` agg {kibana-pull}153091[#153091] -* Data Frame Analytics exploration: adds actions column with link to discover {kibana-pull}151482[#151482] -* Allows row expansion for blocked anomaly detection jobs {kibana-pull}151351[#151351] -* Enhances job and datafeed config editors in the Advanced anomaly detection job wizard to provide suggestions and documentation {kibana-pull}146968[#146968] - -Management:: -* Adds timezone support for Transforms date histogram pivot configuration {kibana-pull}155535[#155535] -* Adds more system indices to store internal data when you upgrade to 8.8.0 {kibana-pull}154888[#154888] -* Adds improvements for supporting counter fields in Transforms {kibana-pull}154171[#154171] -* Adds `_schedule_now` action to transform list {kibana-pull}153545[#153545] -* Adds link to Discover from Index Management so users can directly look at documents of their indices {kibana-pull}152640[#152640] -* Adds health information for alerting rule in Transforms{kibana-pull}152561[#152561] -* Adds improvements for index pattern input in the data view flyout {kibana-pull}152138[#152138] -* Adds a new description for the metadata field in ingest pipelines {kibana-pull}150935[#150935] -* Adds a _meta field to the Ingest pipelines form {kibana-pull}149976[#149976] -* Adds option to Reauthorize transform on Management page {kibana-pull}154736[#154736] - -Maps:: -Adds metrics mask {kibana-pull}154983[#154983] - -Observability:: -* Adds invalid license page {kibana-pull}154866[#154866] -* Adds empty state page links {kibana-pull}154678[#154678] -* Adds upload symbols instructions to add data page {kibana-pull}154670[#154670] -* Adds new CPU incl and CPU excl names {kibana-pull}154560[#154560] -* Adds symbols callout on frame information window {kibana-pull}154478[#154478] -* Adds Co2 and dollar cost columns and show more information action to functions table {kibana-pull}154097[#154097] -* Adds improvements to functions {kibana-pull}153873[#153873] -* Adds improvements to Flamegraph {kibana-pull}153598[#153598] -* Adds the ability to open the Traces view when you click on a series in stacked charts {kibana-pull}153325[#153325] -* Adds CPU usage column to replace CPU count column {kibana-pull}151696[#151696] - -Querying & Filtering:: -* Adds the ability to avoid duplicate host IP mapping {kibana-pull}155353[#155353] -* Adds improvements to the saved query terminology {kibana-pull}154517[#154517] - -[float] -[[fixes-v8.8.0]] -=== Bug fixes -Alerting:: -* Fixes Delete Schedule button padding issue {kibana-pull}154503[#154503] -* Fixes error message flash and throttle value reset {kibana-pull}154497[#154497] -* Fixes broken custom snooze recurrences with monthly frequency {kibana-pull}154251[#154251] -* Fixes an issue where you were unable to use retry on updateAPIKey conflict {kibana-pull}151802[#151802] - -APM:: -* Fixes an issue where you were uneable to enable framework alerts as data by default {kibana-pull}154076[#154076] -* Upgraded EUI to v76.0.0 {kibana-pull}152506[#152506] -* Fixes an issue where the OpenTelemetry process and system metrics were unsupported {kibana-pull}151826[#151826] - -Canvas:: -Fixes `createElement` callback {kibana-pull}154398[#154398] - -Cases:: -Fixes the Lens visualization in the comment and description markdown on the New Case page {kibana-pull}155897[#155897] - -Dashboard:: -* Fixes unsaved changes bug on empty dashboard {kibana-pull}155648[#155648] -* Removed Reload on Clone and Replace Panel {kibana-pull}155561[#155561] -* Fixes z index of toolbar items {kibana-pull}154501[#154501] -* Fixes inherited input race condition {kibana-pull}154293[#154293] -* Fixes Changing label of a geospatial filter causes filter disappear from map {kibana-pull}154087[#154087] - -Discover:: -* Adds a "Temporary" badge for temporary data views in the Alerts flyout {kibana-pull}155717[#155717] -* Adds the ability to exclude counter fields from Breakdown options {kibana-pull}155532[#155532] -* Adds the ability to skip requests for the time series metric counter field {kibana-pull}154319[#154319] -* Fixes KQL autocomplete suggestions, which now support IP-type fields when the `autocomplete:valueSuggestionMethod advanced setting is set to terms_enum {kibana-pull}154111[#154111] -* Fixes an issue where saved search "Manage searches" button was unable to apply the "search" type filter {kibana-pull}152565[#152565] - -Elastic Security:: -For the Elastic Security 8.8.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.8.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Fixes package license check to use new `conditions.elastic.subscription` field {kibana-pull}154831[#154831] -* Fixes the OpenAPI spec from `/agent/upload` to `/agent/uploads` for Agent uploads API {kibana-pull}151722[#151722] - -Infrastructure:: -Adds a 404 page for metrics and logs {kibana-pull}153005[#153005] - -Integrations:: -Fixes the slow process event for queries + xterm.js {kibana-pull}155326[#155326] - -Kibana Home & Add Data:: -Fixes the guided onboarding API prefix to indicate that it's intended for internal use {kibana-pull}155643[#155643] - -Lens & Visualizations:: -* Adds a default label on field changes for counter rate in *Lens* {kibana-pull}155509[#155509] -* Panel titles and descriptions are now transferred to the converted Lens panels in *TSVB* {kibana-pull}154713[#154713] -* Adds the ability to use the empty label for `/` terms in *TSVB* {kibana-pull}154647[#154647] -* Fixes the formatting for the legend actions title {kibana-pull}153747[#153747] -* Adds support for negative filter ratios in *TSVB* {kibana-pull}152053[#152053] -* Adds the ability to always retain source order for multi-metric partition chart layers in *Lens* {kibana-pull}151949[#151949] - -Machine Learning:: -* Data Frame Analytics/Anomaly Detection: Custom URLs - entity dropdown reflects Data View update {kibana-pull}155096[#155096] -* AIOps: Fix race condition where stale url state would reset search bar {kibana-pull}154885[#154885] -* Fixes anomalies table drilldown time range for longer bucket spans {kibana-pull}153678[#153678] -* Do not match time series counter fields with aggs in wizards {kibana-pull}153021[#153021] -* Anomaly Detection datafeed chart: ensure chart y axis minimum set correctly {kibana-pull}152051[#152051] - -Management:: -* Improves the display when there are many columns {kibana-pull}155119[#155119] -* Fixes stale submit handler ref update {kibana-pull}154242[#154242] -* Fixes terms aggregation support in wizard for Transforms {kibana-pull}151879[#151879] -* Fixes an issue where you were unable to accept additional dynamic field values for an index template {kibana-pull}150543[#150543] - -Maps:: -* Fixes raster layer is missing in pdf/png exports {kibana-pull}154686[#154686] -* Fixes RegionMap chart type does not work with reporting {kibana-pull}153492[#153492] -* Fixes layers are not displayed in offline environment and map.includeElasticMapsService not set to false {kibana-pull}152396[#152396] - -Monitoring:: -Removes usage for the stats endpoint {kibana-pull}151082[#151082] - -Observability:: -* Adds space-specific feature privileges {kibana-pull}154734[#154734] -* Adds the ability to properly handle NO DATA with multiple conditions with a mix of aggregations and document count thresholds {kibana-pull}154690[#154690] -* Adds additional types to the fields to be use with cardinality aggregation for Metric Threshold Rule {kibana-pull}154197[#154197] -* Adds persistent normalization mode {kibana-pull}153116[#153116] -* Fixes refresh every in the alert search bar {kibana-pull}152246[#152246] - -Platform:: -Fixes badge counter for global settings {kibana-pull}150869[#150869] - -Querying & Filtering:: -* Adds the ability to unload a selected query when it is deleted {kibana-pull}154644[#154644] -* Removes failures in wrong custom timerange {kibana-pull}154643[#154643] - -Reporting:: -* Fixes report generation when image panel is in the end of the layout {kibana-pull}153846[#153846] -* Updates Chromium to 111.0.5555.0 (r1095492) and Puppeteer to 19.7.2 {kibana-pull}153033[#153033] - -Uptime:: -* Fixes default date range on errors page {kibana-pull}155661[#155661] -* Removes the "Beta" labels in Synthetics {kibana-pull}155589[#155589] -* Fixes ML job/rule edit error {kibana-pull}155212[#155212] - -[[release-notes-8.7.1]] -== {kib} 8.7.1 - -Review the following information about the {kib} 8.7.1 release. - -[float] -[[breaking-changes-8.7.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.7.1, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in the {kib} 8.7.1 release. - -To review the breaking changes in the previous release, check {kibana-ref-all}/8.7/release-notes-8.7.0.html#breaking-changes-8.7.0[8.7.0]. - -[float] -[[enhancement-v8.7.1]] -=== Enhancement -Fleet:: -The agent policy "Host name format" selector is now enabled by default {kibana-pull}154563[#154563] - -[float] -[[fixes-v8.7.1]] -=== Bug fixes -APM:: -* Scoring is now applied by ES {kibana-pull}154627[#154627] -* Fixes the APM Java Agent download link {kibana-pull}154023[#154023] -* Improves the overflow message text {kibana-pull}153676[#153676] - -Canvas:: -* Disables the Edit in Lens action for the legacy savedVisualization function {kibana-pull}154656[#154656] -* Fixes the home page redirect loop {kibana-pull}154568[#154568] -* Fixes an issue where the image upload component was unable to load for image elements {kibana-pull}154385[#154385] - -Dashboard:: -Improves controls flyout performance for data views with a large number of fields {kibana-pull}154004[#154004] - -Discover:: -Fixes aborted request handling in the saved search embeddable {kibana-pull}153822[#153822] - -Elastic Security:: -For the Elastic Security 8.7.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Fixes an issue where the Advanced options toggle in the policy editor was always showing {kibana-pull}154612[#154612] -* Fixes an issue where the warning icon was unable to display in 8.7 {kibana-pull}154119[#154119] -* Adds updates to output logic {kibana-pull}153226[#153226] - -Infrastructure:: -Fixes the inventory table pagination navigation {kibana-pull}153849[#153849] - -Lens & Visualizations:: -Fixes the timezone that *Lens* uses in normalize by unit {kibana-pull}154472[#154472] - -Machine Learning:: -* Change point detection: Fixes applied filters and queries to the charts {kibana-pull}154707[#154707] -* Change point detection: Fixes support for running over relative time range {kibana-pull}154313[#154313] -* Reinstates cold and frozen tier filters for Linux and Windows security modules {kibana-pull}153222[#153222] - -Maps:: -Fixes an issue where geographic filters were unable to work when courier:ignoreFilterIfFieldNotInIndex was enabled {kibana-pull}153816[#153816] - -Monitoring:: -Fixes the CCR read_exceptions alert {kibana-pull}153888[#153888] - -Querying & Filtering:: -Fixes the ability to copy and paste the comma delimeter for multifields {kibana-pull}153772[#153772] - -[[release-notes-8.7.0]] -== {kib} 8.7.0 - -Review the following information about the {kib} 8.7.0 release. - -[float] -[[known-issues-8.7.0]] -=== Known issues - -// tag::known-issue-151698[] -[discrete] -.Observability Overview shows empty User Experience panel -[%collapsible] -==== -*Details* + -Release 8.7.0 has a bug causing the Observability Overview page to show an empty User Experience panel, even when there is RUM data (fixed in {kibana-pull}154419[#154419]). - -*Impact* + -While the User Experience panel on the Observability Overview page is empty, any RUM data will still be available from the User Experience Dashboard. -==== -// end::known-issue-151698[] - -[float] -[[breaking-changes-8.7.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.7.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Removes the fields list sampling setting -[%collapsible] -==== -*Details* + -`lens:useFieldExistenceSampling` has been removed from *Advanced Settings*. The setting allowed you to enable document sampling to determine the fields that are displayed in *Lens*. For more information, refer to {kibana-pull}149482[#149482]. - -*Impact* + -In 8.1.0 and later, {kib} uses the field caps API, by default, to determine the fields that are displayed in *Lens*. -==== - -[discrete] -.Removes the legacy pie chart visualization setting -[%collapsible] -==== -*Details* + -`visualization:visualize:legacyPieChartsLibrary` has been removed from *Advanced Settings*. The setting allowed you to create aggregation-based pie chart visualizations using the legacy charts library. For more information, refer to {kibana-pull}146990[#146990]. - -*Impact* + -In 7.14.0 and later, the new aggregation-based pie chart visualization is available by default. For more information, check <>. -==== - -[discrete] -.Removes the current_upgrades endpoint -[%collapsible] -==== -*Details* + -The `api/fleet/current_upgrades` endpoint has been removed. For more information, refer to {kibana-pull}147616[#147616]. - -*Impact* + -When you upgrade to 8.7.0, use the `/action_status` endpoint. -==== - -[discrete] -.Removes the preconfiguration API route -[%collapsible] -==== -*Details* + -The `/api/fleet/setup/preconfiguration` API, which was released as generally available by error, has been removed. For more information, refer to {kibana-pull}147199[#147199]. - -*Impact* + -Do not use `/api/fleet/setup/preconfiguration`. To manage preconfigured agent policies, use kibana.yml. For more information, check link:https://www.elastic.co/guide/en/kibana/current/fleet-settings-kb.html#_preconfiguration_settings_for_advanced_use_cases[Preconfigured settings]. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.6/release-notes-8.6.0.html#breaking-changes-8.6.0[8.6.0] | {kibana-ref-all}/8.5/release-notes-8.5.0.html#breaking-changes-8.5.0[8.5.0] | {kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[features-8.7.0]] -=== Features -{kib} 8.7.0 adds the following new and notable features. - -Alerting:: -* Alerts Table- Inspect Modal {kibana-pull}149586[#149586] -* Updates Rule Action Form to add Summary UX {kibana-pull}149367[#149367] -* Users can now search for Cases by ID {kibana-pull}149233[#149233] -* Alerts table row loading state {kibana-pull}148874[#148874] -* Adds default summary message {kibana-pull}148749[#148749] -* AlertsTable - Add persistent controls that show even on empty state {kibana-pull}148735[#148735] -* Connector logs view {kibana-pull}148291[#148291] -* Make action retries configurable {kibana-pull}147876[#147876] -* Adds summary capabilities to the API and execution logic {kibana-pull}147360[#147360] -* Adds flapping state to alert context for action parameters {kibana-pull}147136[#147136] -* Adds triggered actions list in task state {kibana-pull}146183[#146183] -* Moves “Notify When” and throttle from rule to action {kibana-pull}145637[#145637] - -APM:: -* Increases maxTraceItems {kibana-pull}149062[#149062] -* Disables navigation to _other bucket and show warning tooltip {kibana-pull}148641[#148641] -* Show warning if transaction groups are dropped {kibana-pull}148625[#148625] -* Show alert indicator on alerts tab {kibana-pull}148048[#148048] -* Adds latency alert history chart on the Alert details page for APM {kibana-pull}148011[#148011] -* Adds alert annotation and threshold shade on the APM latency chart on the Alert Details page {kibana-pull}147848[#147848] -* Errors group sampler {kibana-pull}147571[#147571] -* Show alert indicator on service inventory page {kibana-pull}147511[#147511] -* Adds alertDetailAppSection to the APM Rule Details page {kibana-pull}143298[#143298] - -Dashboard:: -* Adds the ability to load more options list suggestions when you scroll {kibana-pull}148331[#148331] -* Adds alert filters to the Detection page {kibana-pull}146989[#146989] -* Adds the image embeddable {kibana-pull}146421[#146421] -* Adds the "Convert to lens" action to Dashboard {kibana-pull}146363[#146363] -* Adds a step size to the time slider control {kibana-pull}145033[#145033] -* Adds the ability to sort the options list suggestions {kibana-pull}144867[#144867] - -Elastic Security:: -For the Elastic Security 8.7.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.7.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Adds ability to show FQDN of agents {kibana-pull}150239[#150239] -* Adds `getStatusSummary` query parameter to `GET /api/fleet/agents` API {kibana-pull}149963[#149963] -* Enabling diagnostics feature flag and changed query for files to use upload_id {kibana-pull}149575[#149575] -* Experimental toggles for doc-value-only {kibana-pull}149131[#149131] -* We now display agent metrics, CPU and memory in the agent list table and agent details page {kibana-pull}149119[#149119] -* Implement subcategories in integrations UI {kibana-pull}148894[#148894] -* Added rollout period to upgrade action {kibana-pull}148240[#148240] -* Adds per-policy inactivity timeout + use runtime fields for agent status {kibana-pull}147552[#147552] -* Show dataset combo box for input packages {kibana-pull}147015[#147015] -* Adds UI controls to setting/outputs to configure new shipper {kibana-pull}145755[#145755] - -Infrastructure:: -* Adds link to ingest pipeline dashboard from Stack Monitoring {kibana-pull}149721[#149721] - -Integrations:: -* User friendly UX added alongside advanced yaml editor {kibana-pull}147900[#147900] -* Custom fleet policy UX for new integration (cloud defend v1) {kibana-pull}147300[#147300] - -Kibana Home & Add Data:: -Self-managed {kib} instances now have a link to instructions for migrating self-managed clusters to Elastic Cloud {kibana-pull}145523[#145523] - -Lens & Visualizations:: -Adds the share link feature in *Lens* {kibana-pull}148829[#148829] - -Machine Learning:: -* Adds change point detection feature {kibana-pull}150308[#150308] -* Remove Technical Preview label from the Trained Models UI {kibana-pull}149715[#149715] -* Adds a new memory usage by job and by model view {kibana-pull}149419[#149419] -* Allow Anomaly Detection geo jobs to be created from maps dashboard {kibana-pull}147797[#147797] -* Adds geo fields support for Unified field list, add statistics flyover to Anomaly detection job creation wizards {kibana-pull}147322[#147322] -* Anomaly Detection wizards: adds geo job wizard {kibana-pull}147043[#147043] - -Management:: -* Adds field statistics popovers for Data Frame Analytics & Transform creation wizards {kibana-pull}149879[#149879] -* Transforms: Shows health status of transform in UI {kibana-pull}150359[#150359] - -Monitoring:: -* Adds duration configuration to Stack Monitoring Cluster Health rule {kibana-pull}147565[#147565] - -Observability:: -* Adds alert summary widget to overview page {kibana-pull}149581[#149581] -* Adds AlertSummaryWidget full-size on the Alerts page {kibana-pull}148539[#148539] -* Additional context for log threshold rule {kibana-pull}148503[#148503] -* Adds charts to Alert Summary Widget {kibana-pull}148143[#148143] -* Adds rule details locator and make AlertSummaryWidget clickable {kibana-pull}147103[#147103] -* Adds groupByKeys context to recovered alerts for Log Threshold Rule and Metric Threshold Rule {kibana-pull}146874[#146874] -* Adds new context variable called groupByKeys {kibana-pull}146633[#146633] -* Adds new context variable for group by keys {kibana-pull}145654[#145654] -* Adds Platinum license check for SLO APIs and SLO pages {kibana-pull}149055[#149055] -* Create SLO / Edit SLO Form - Custom KQL {kibana-pull}147843[#147843] -* SLO List {kibana-pull}147447[#147447] - -Platform:: -New trigger actions for chart legends and table cell actions {kibana-pull}146779[#146779] - -Querying & Filtering:: -* Insight filter builder form as markdown plugin {kibana-pull}150363[#150363] -* Adds the ability to support complex filters with AND/OR relationships {kibana-pull}143928[#143928] - -Security:: -* Adds the ability to allow administrators to limit the number of concurrent user sessions with `xpack.security.session.сoncurrentSessions.maxSessions` {kibana-pull}147442[#147442] -* API Keys can now be updated with new role descriptors and metadata in the API Keys Management screen {kibana-pull}146237[#146237] - -For more information about the features introduced in 8.7.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.7.0]] -=== Enhancements and bug fixes -For detailed information about the 8.7.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.7.0]] -=== Enhancements -Alerting:: -* Bring flapping status and settings in o11y {kibana-pull}150483[#150483] -* RenderCustomActionsRow with named params instead of args {kibana-pull}149304[#149304] -* Ram 145739 use bulk enable disable in UI {kibana-pull}145928[#145928] -* Create generic retry if function {kibana-pull}145713[#145713] -* Return rules from bulk enable {kibana-pull}145391[#145391] -* Create bulk disable endpoint {kibana-pull}145179[#145179] -* Adding group by options to ES query rule type {kibana-pull}144689[#144689] - -APM:: -* Adds APM alert status to the alerts table {kibana-pull}150500[#150500] -* Promotes the Alerts tab in the APM UI to GA {kibana-pull}150528[#150528] -* Switches get environment function to use `terms_enum` api {kibana-pull}150175[#150175] -* Uses (rolled up) service metrics for service inventory {kibana-pull}149938[#149938] -* Adds KQL filter bar to the service map page {kibana-pull}149900[#149900] -* Integrates Alert search bar in the alerts tab {kibana-pull}149610[#149610] -* Adds Azure Functions support in the APM UI {kibana-pull}149479[#149479] -* Adds a 404 page {kibana-pull}149471[#149471] -* Adds single-click setup from Kibana {kibana-pull}148959[#148959] -* Updates sparklines to support the bar chart graph style {kibana-pull}148702[#148702] -* Adds a flamegraph legend {kibana-pull}147910[#147910] -* Adds API keys to APM package policies {kibana-pull}147650[#147650] -* Only renders waterfall items up until 3 levels {kibana-pull}147569[#147569] -* Improves span links navigation {kibana-pull}147426[#147426] -* Updates default refresh interval to 60 seconds {kibana-pull}146791[#146791] -* Adds pagination to source map API {kibana-pull}145959[#145959] -* Adds ability to offset point labels on maps {kibana-pull}145773[#145773] - -Cases:: -* Adds new column `Updated on ` in `all cases list ` table. This column can be sorted and can persist sorting options {kibana-pull}149116[#149116] -* Improves the design of all cases list select modal {kibana-pull}149851[#149851] -* Adds a button to Case Detail and All Cases List to copy case UUIDs to the clipboard {kibana-pull}148962[#148962] -* Adds the ability to persist sorting, severity filter, and status filter in the URL and local storage for the all cases list {kibana-pull}148549[#148549] -* Adds the ability to allow sorting by status, severity, and title in the all-cases list {kibana-pull}148193[#148193] -* See "My recently assigned cases" to the recent cases widget of Overview dashboard in Security {kibana-pull}147763[#147763] -* Adds the ability to bulk edit assignees on multiple cases {kibana-pull}146907[#146907] -* Adds the ability to save draft comments {kibana-pull}146327[#146327] - -Dashboard:: -* Add new panel settings option to change the title, description, and time range for panels {kibana-pull}148301[#148301] -* Anchor time slider to start {kibana-pull}148028[#148028] -* Show document count beside options list suggestions {kibana-pull}146241[#146241] - -Discover:: -* Show "Copy value" button for any grid cell {kibana-pull}149525[#149525] -* Align field list filters UI between Discover and Lens {kibana-pull}148547[#148547] -* Persist field list sections state in local storage {kibana-pull}148373[#148373] -* Enable adhoc data views creation from no data views state {kibana-pull}147850[#147850] -* Adds a way to quickly expand time range from "No results" screen {kibana-pull}147195[#147195] -* Optimize checking for multifields during grid rendering {kibana-pull}145698[#145698] -* Align field list sections between Discover and Lens {kibana-pull}144412[#144412] -* Update Discover's histogram to use Lens, and add support for breaking down the histogram by top values of a selected field {kibana-pull}143117[#143117] - -Elastic Security:: -For the Elastic Security 8.7.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.7.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Fixes discard changes link taking user to "page not found" {kibana-pull}150174[#150174] -* Adds filebeat_input index to agent policy default {kibana-pull}149974[#149974] -* Bugfix: Apply namespace from agent policy if there is one when adding integration {kibana-pull}149949[#149949] -* Agent List: Inform users when agents have become inactive since last page view {kibana-pull}149226[#149226] -* Experimental toggles for doc-value-only {kibana-pull}149131[#149131] -* Create index templates and ingest pipeline at package policy creation time for input packages {kibana-pull}148772[#148772] -* Do not allow namespace or dataset to be edited for input only package policies {kibana-pull}148422[#148422] -* Adds deprecation warning to unenrollment timeout agent policy setting {kibana-pull}147963[#147963] -* Adds active filter count to agent status filter {kibana-pull}147821[#147821] - -Kibana UI:: -The list view in Dashboard, Visualize Library, Maps, and Graph now stores the latest state of the table in the URL {kibana-pull}145517[#145517] - -Lens & Visualizations:: -* Enable nice rounding for scalar axis in *Lens* {kibana-pull}149388[#149388] -* Don't block render on missing field in *Lens* {kibana-pull}149262[#149262] -* Enable previous time shift when using a date histogram in *Lens* {kibana-pull}149126[#149126] -* Displays the annotation icon on the annotation dimension label in *Lens* {kibana-pull}147686[#147686] -* Extend explore data in Discover/open in Discover drilldown to visualizations with annotations and reference lines in *Lens* {kibana-pull}147541[#147541] -* Moves the mosaic/waffle charts into GA in *Lens* {kibana-pull}146261[#146261] -* Color by slice for multi-metric partition chart in *Lens* {kibana-pull}145948[#145948] -* Save function to integrate listing Inspector {kibana-pull}145381[#145381] -* Absolute time shift support in formula in *Lens* {kibana-pull}144564[#144564] - -Machine Learning:: -* Adding multi-modal distribution to the explain anomaly results {kibana-pull}150014[#150014] -* Adding anomaly explanation help link {kibana-pull}149674[#149674] -* Data Frame Analytics results view: add link to custom visualizations for viewing scatterplot charts {kibana-pull}149647[#149647] -* Explain Log Rate Spikes: highlight field pairs unique to groups in expanded row {kibana-pull}148601[#148601] -* Adds delete annotations option to delete and reset job modals {kibana-pull}147537[#147537] -* Adds override for data which doesn't contain a time field {kibana-pull}147504[#147504] -* Adds responsive layout to Index data visualizer, fix doc count chart margin {kibana-pull}147137[#147137] -* Use anomaly score explanation for chart tooltip multi-bucket impact {kibana-pull}146866[#146866] -* Remove beta badge for Field statistics table in Discover {kibana-pull}140991[#140991] - -Management:: -* Transforms: Adds "Use full data" button to transform creation wizard {kibana-pull}150030[#150030] -* Adds override field to Dot expander processor form {kibana-pull}149599[#149599] -* Adds fields to Append Ingest Pipeline processor form {kibana-pull}149520[#149520] -* Adds support for S3 intelligent tiering in Snapshot and Restore {kibana-pull}149129[#149129] -* Transforms: Adds date picker to transform wizard for data view with time fields {kibana-pull}149049[#149049] -* Use data view formatter for fields preview in Edit field flyout {kibana-pull}148446[#148446] -* Adds a new global ui settings client {kibana-pull}146270[#146270] -* Update Transform installation mechanism to support upgrade paths {kibana-pull}142920[#142920] - -Maps:: -Adds support for hex aggregation with geo_shape field {kibana-pull}143890[#143890] - -Monitoring:: -* Link to individual host page on hosts view {kibana-pull}147380[#147380] -* Adds support for beats datastream patterns {kibana-pull}146184[#146184] - -Observability:: -* Custom equation editor for Metric Threshold Rule {kibana-pull}148732[#148732] -* Adds context.originalAlertState to the Metric Threshold and Inventory Threshold recovery context {kibana-pull}147928[#147928] - -Querying & Filtering:: -Allows case sensitive option on multiselection filters input {kibana-pull}149570[#149570] - -Security:: -* The default `csp.disableUnsafeEval` value is now `true`, so now the `unsafe-eval` source expression isn't present by default in the Kibana Content Security Policy (CSP) {kibana-pull}150157[#150157] -* Adds client IP address to Kibana audit log {kibana-pull}148055[#148055] -* Adds `Cross-Origin-Opener-Policy: same-origin` HTTP header to Kibana default response headers {kibana-pull}147874[#147874] - -Sharing:: -Enables multiple values filtering on tooltip actions {kibana-pull}148372[#148372] - -Uptime:: -TLS rule allow monitors filtering {kibana-pull}150339[#150339] - -[float] -[[fixes-v8.7.0]] -=== Bug fixes -Alerting:: -* Event log failure message {kibana-pull}149355[#149355] -* Optimize alerting task runner for persistent (non-lifecycle rule types) {kibana-pull}149043[#149043] -* Failed test x-pack/plugins/triggers_actions_ui/public/application/lib/transformActionVariables {kibana-pull}147579[#147579] -* Rule create/update form re-render {kibana-pull}147221[#147221] -* Hiding all features in a space causes rules to stop running {kibana-pull}146188[#146188] -* Send complete test data to xMatters, so it can create an alert {kibana-pull}145431[#145431] -* Hiding all features in a space causes rules to stop running {kibana-pull}145372[#145372] - -APM:: -* Latency threshold rule's threshold context variable should use milliseconds instead of microseconds {kibana-pull}150234[#150234] -* Cannot read/write APM Settings Indices page with minimally-privileged user {kibana-pull}150107[#150107] -* Adds `service.environment` log correlation {kibana-pull}150065[#150065] -* Remove `host.name` correlation {kibana-pull}150005[#150005] -* Fixes display of stacktrace with EuiCodeBlocks {kibana-pull}149911[#149911] -* Alert rules: The transaction type and environment options are not filtered by the selected service {kibana-pull}149849[#149849] -* Unable to create Latency threshold rule for All services or All Transaction types {kibana-pull}149735[#149735] -* Adds language specific headers {kibana-pull}149400[#149400] -* Adds stacktrace support for php {kibana-pull}149122[#149122] -* Tech preview feature on General settings {kibana-pull}148996[#148996] -* Fixes APM sourcemap upload route {kibana-pull}148508[#148508] -* Change order of tabs {kibana-pull}147518[#147518] -* Show values of highlighted sample in TopN chart {kibana-pull}147431[#147431] -* Synchronous Anomaly detection jobs creation {kibana-pull}145969[#145969] -* Change default refresh interval to 60 seconds {kibana-pull}144389[#144389] - -Dashboard:: -* Retain maximized panel on link/unlink from library {kibana-pull}150405[#150405] -* Fixes Unlink from Library / Save to Library for Maximized Panel {kibana-pull}150338[#150338] -* Fixes Darktheme is missing from add drilldowns panel {kibana-pull}147270[#147270] -* Removes options list `"Allow "` toggles {kibana-pull}147216[#147216] - -Design:: -* Fixes a11y issue with dev tool tabs {kibana-pull}149349[#149349] -* Fixes a11y issues with cross cluster replication flyouts {kibana-pull}149069[#149069] -* Fixes a11y for snapshot policy flyout {kibana-pull}148972[#148972] - -Discover:: -* Fixes Phrase_filter query for scripted fields {kibana-pull}148943[#148943] -* Use Discover locator for alert results link {kibana-pull}146403[#146403] -* Validate if Data View time field exists on Alert creation / editing {kibana-pull}146324[#146324] - -Elastic Security:: -For the Elastic Security 8.7.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.7.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Truncate long names in agents table {kibana-pull}150069[#150069] -* Update kubernetes templates for elastic-agent {kibana-pull}143275[#143275] - -Infrastructure:: -Remove ts-ignore annotation {kibana-pull}145759[#145759] - -Lens & Visualizations:: -* Always use resolved time range when computing Top values order agg with timeshifts in *Lens* {kibana-pull}150418[#150418] -* Fixes problem with timeshift in formula and breakdown in *Lens* {kibana-pull}150406[#150406] -* Fixes nested other bucket for empty string {kibana-pull}150321[#150321] -* Fixes chart padding on reference lines/annotations icon on the left side in *Lens* {kibana-pull}149573[#149573] -* Fixes the partition legend actions header format problem in *Lens* {kibana-pull}149114[#149114] -* Automatically enable show array values for non-numeric runtime fields in *Lens* {kibana-pull}149025[#149025] -* Always display the major label {kibana-pull}148999[#148999] -* Adds multi fields support to selected fields list in *Lens* {kibana-pull}148899[#148899] -* Allows cleaning up of the filters aggregatiob custom label in *Lens* {kibana-pull}148535[#148535] -* Order date fields first on discover drilldown in *Lens* {kibana-pull}146786[#146786] -* Fixes the syncing of other series color in *Lens* {kibana-pull}146785[#146785] - -Machine Learning:: -* Data Frame Analytics creation wizard: ensure includes table is populated correctly on job type change {kibana-pull}150112[#150112] -* Data Frame Analytics maps view: Fix update of map when selecting results index node {kibana-pull}149993[#149993] -* Fixes Typical to actual connector lines in AnomalyLayer have dot halfway {kibana-pull}149270[#149270] -* Fixes responsive behaviour of page header with date picker {kibana-pull}149073[#149073] -* Delayed data visualization: ensure y-axis count is visible {kibana-pull}148982[#148982] -* Allow dedicated index override in JSON editor {kibana-pull}148887[#148887] -* Anomaly Detection: Fix button switch issue with unmounted component {kibana-pull}148239[#148239] -* Anomaly Detection: Fix Anomaly Explorer context handling {kibana-pull}148231[#148231] -* Fixes modal titles {kibana-pull}147855[#147855] - -Management:: -* Replace global `GET /_mapping` request with `GET /_mapping` {kibana-pull}147770[#147770] -* Fixes form validation UX when the same data view name already exists {kibana-pull}146126[#146126] -* The field preview in the data view field editor now works for all fields, whether or not they are in the document's `_source` {kibana-pull}145943[#145943] - -Maps:: -* Fixes Kibana maps should not override the sort field if not provided by the user {kibana-pull}150400[#150400] -* Show embeddable filters in spatial layer {kibana-pull}150078[#150078] -* Fixes Kibana Maps UI upload geojson failure should be received as such {kibana-pull}149969[#149969] -* Verify CRS for geojson upload {kibana-pull}148403[#148403] - -Monitoring:: -Use UI time range filter in logstash pipeline details query {kibana-pull}150032[#150032] - -Observability:: -Adds ALERT_RULE_PARAMETERS to the common fields in Rule Registry {kibana-pull}147458[#147458] - -Platform:: -Support cgroup v2 in core metric collection {kibana-pull}147082[#147082] - -[[release-notes-8.6.1]] -== {kib} 8.6.1 - -Review the following information about the {kib} 8.6.1 release. - -[float] -[[breaking-changes-8.6.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.6.1. - -{kibana-ref-all}/8.5/release-notes-8.5.0.html#breaking-changes-8.5.0[8.5.0] | {kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.6.1]] -=== Enhancements -Alerting:: -* Create OAS for get rule types and get alerting framework health {kibana-pull}148774[#148774] -* Create open API specification for create/update connector {kibana-pull}148691[#148691] -* Create open API specification for disable/enable rule and mute/unmute all alerts {kibana-pull}148494[#148494] - -Elastic Security:: -For the Elastic Security 8.6.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[float] -[[fixes-v8.6.1]] -=== Bug fixes -Canvas:: -Replaces React.lazy and withSuspense with async imports in expressions plugins {kibana-pull}147693[#147693] - -Dashboard:: -* Adds styling to allow clickable *TSVB* markdown images {kibana-pull}147802[#147802] -* Changes the visibility of the panel filters action {kibana-pull}146335[#146335] - -Discover:: -* Adds support for case-insensitive search in Document Viewer {kibana-pull}148312[#148312] -* Fixes the field stats for the epoch time format {kibana-pull}148288[#148288] - -Elastic Security:: -For the Elastic Security 8.6.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Fixes missing policy Id in installation URL for cloud integrations {kibana-pull}149243[#149243] -* Fixes package installation APIs to install packages without a version {kibana-pull}149193[#149193] -* Fixes issue where the latest GA version could not be installed if there was a newer prerelease version in the registry {kibana-pull}149133[#149133] and {kibana-pull}149104[#149104] - -Infrastructure:: -Fixes an issue where the summary request piled up {kibana-pull}148670[#148670] - -Machine Learning:: -* Fixes the bucket span estimator in the advanced wizard {kibana-pull}149008[#149008] -* Fixes the transforms JSON display {kibana-pull}147996[#147996] - -Management:: -* Fixes the runtime field format editor {kibana-pull}148497[#148497] -* Improves the check for response size in the `/autocomplete_entities` endpoint {kibana-pull}148328[#148328] - -Maps:: -Fixes an issue where Maps was unable to initialize the time range from URLs {kibana-pull}148465[#148465] - -Platform:: -Fixes the server-side import of the contract `CloudStart` {kibana-pull}149203[#149203] - -Uptime:: -* ssl fields are now omitted when ssl is disabled {kibana-pull}149087[#149087] -* Adds the ability to disable throttling for project monitors {kibana-pull}148669[#148669] - -[[release-notes-8.6.0]] -== {kib} 8.6.0 - -Review the following information about the {kib} 8.6.0 release. - -[float] -[[known-issues-8.6.0]] -=== Known issues - -[discrete] -[[known-issue-146020]] -.Attempting to create APM latency threshold rules from the Observability rules page fail -[%collapsible] -==== -*Details* + -When you attempt to create an APM latency threshold rule in **Observability** > **Alerts** > **Rules** for all services or all transaction types, the request will fail with a `params invalid` error. - -*Impact* + -This known issue only impacts the Observability Rules page. To work around this issue, create APM latency threshold rules in the APM Alerts and Rules dialog. See {observability-guide}/apm-alerts.html[Alerts and rules] for detailed instructions. -==== - -[float] -[[breaking-changes-8.6.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.6.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Changes the `histogram:maxBars` default setting -[%collapsible] -==== -*Details* + -To configure higher resolution data histogram aggregations without changing the *Advanced Settings*, the default histogram:maxBars setting is now 1000 instead of 100. For more information, refer to {kibana-pull}143081[#143081]. - -*Impact* + -For each {kibana-ref}/xpack-spaces.html[space], complete the following to change *histogram:maxBars* to the previous default setting: - -. Open the main menu, then click *Stack Management > Advanced Settings*. -. Scroll or search for *histogram:maxBars*. -. Enter `100`, then click *Save changes*. -==== - -[discrete] -.CSV reports use PIT instead of Scroll -[%collapsible] -==== -*Details* + -CSV reports now use PIT instead of Scroll. Previously generated CSV reports that used an index alias with alias-only privileges, but without privileges on the alias referenced-indices will no longer generate. For more information, refer to {kibana-pull}158338[#158338]. - -*Impact* + -To generate CSV reports, grant `read` privileges to the underlying indices. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.5/release-notes-8.5.0.html#breaking-changes-8.5.0[8.5.0] | {kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[features-8.6.0]] -=== Features -{kib} 8.6.0 adds the following new and notable features. - -Alerting:: -* Notify users by email when assigned to a case {kibana-pull}144391[#144391] -* Adds flapping state object and interface in AAD index and Event Log {kibana-pull}143920[#143920] -* Change Alerts > Actions execution order {kibana-pull}143577[#143577] -* Adds the ability to remove alerts attached to a case {kibana-pull}143457[#143457] -* This feature allows users to create and close alerts within Opsgenie {kibana-pull}142411[#142411] -* Adds filter field to index threshold rule type {kibana-pull}142255[#142255] -* Allow users to see event logs from all spaces they have access to {kibana-pull}140449[#140449] - -Elastic Security:: -For the Elastic Security 8.6.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.6.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Differentiate kubernetes integration multipage experience {kibana-pull}145224[#145224] -* Adds prerelease toggle to Integrations list {kibana-pull}143853[#143853] -* Adds link to allow users to skip multistep add integration workflow {kibana-pull}143279[#143279] - -Infrastructure:: -Adds support for the the Unified Search Bar for Query input {kibana-pull}143222[#143222] - -Lens & Visualizations:: -Adds support for trend lines in *Lens* metric visualizations {kibana-pull}141851[#141851] - -Machine Learning:: -* Trained model testing with index data {kibana-pull}144629[#144629] -* Adding anomaly score explanations {kibana-pull}142999[#142999] - - -Monitoring:: -Collect metrics about the active/idle connections to ES nodes {kibana-pull}141434[#141434] - -Observability:: -* Integrate alert search bar on rule details page {kibana-pull}144718[#144718] -* Adds additional context to recovered alerts of Infrastructure rules {kibana-pull}144683[#144683] -* Adds list of containers in context variable of Inventory rule {kibana-pull}144526[#144526] -* Adds new contextual attributes to Infrastructure - Metric threshold rule {kibana-pull}143001[#143001] -* Adds alert details page feature flag by App {kibana-pull}142839[#142839] -* Adds new contextual attributes to Infrastructure - Inventory Rule {kibana-pull}140598[#140598] - -Osquery:: - -Allows users to deploy Osquery across all {agent} policies or on specified policies only {kibana-pull}143948[#143948] - -Platform:: -Adds notifications plugin, offering basic email service {kibana-pull}143303[#143303] - -Security:: -Adds the ability to show sub-feature privileges when using the Basic license {kibana-pull}142020[#142020] - -Uptime:: -Adds `created_at` field in saved objects {kibana-pull}143507[#143507] - -For more information about the features introduced in 8.6.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.6.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.6.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.6.0]] -=== Enhancements -Alerting:: -* Clone rule {kibana-pull}144741[#144741] -* Remove errors and warning in triggers_actions_ui jest test {kibana-pull}144443[#144443] - -* Increase the default table size of the cases table to 10 {kibana-pull}144228[#144228] -* Bulk enable rules api {kibana-pull}144216[#144216] -* Create bulk delete on rules front {kibana-pull}144101[#144101] -* Improve Task Manager’s retry logic for ad-hoc tasks {kibana-pull}143860[#143860] -* Increases the max length limit of the case title to 160 characters {kibana-pull}143664[#143664] -* Adds the ability to bulk edit tags in the cases table {kibana-pull}143450[#143450] -* Filter cases without assignees {kibana-pull}143390[#143390] -* Make actions retry when encountering failures {kibana-pull}143224[#143224] -* Adds a backlink to cases when pushing in external services {kibana-pull}143174[#143174] -* Move Connectors to own page {kibana-pull}142485[#142485] -* 142183 create bulk delete on rules {kibana-pull}142466[#142466] -* Allow `_source` field for ES DSL query rules {kibana-pull}142223[#142223] -* Update rule status {kibana-pull}140882[#140882] - -APM:: -* Adds pie charts displaying the most used mobile devices, operating systems, etc. {kibana-pull}144232[#144232] -* Adds the ability to filter mobile APM views {kibana-pull}144172[#144172] -* Adds average latency map to the mobile service overview {kibana-pull}144127[#144127] -* Adds new options to APM central configuration {kibana-pull}143668[#143668] -* Adds a trace waterfall to the dependency operation detail view {kibana-pull}143257[#143257] -* Adds a configuration table above code sample in getting started guide {kibana-pull}143178[#143178] -* Adds improvements to the AWS Lambda metrics view {kibana-pull}143113[#143113] -* Adds total APM size and perecent of disk space used to storage explorer {kibana-pull}143179[#143179] -* [Technical preview] Adds the ability to display a critical path for a single trace {kibana-pull}143735[#143735] -* [Technical preview] Adds the agent explorer inventory and detail page {kibana-pull}143844[#143844] - -Dashboard:: -* Adds unmapped runtime field support to options list {kibana-pull}144947[#144947] -* Adds "Exists" functionality to options list {kibana-pull}143762[#143762] -* Adds `excludes` toggle to options list {kibana-pull}142780[#142780] -* Adds support for IP field to options list {kibana-pull}142507[#142507] -* Adds option to disable cursor sync on dashboards {kibana-pull}143355[#143355] - -Discover:: -* Adds the ability to edit ad hoc data views without permissions {kibana-pull}142723[#142723] -* Enables `esQuery` alert for adhoc data views {kibana-pull}140885[#140885] - -Elastic Security:: -For the Elastic Security 8.6.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.6.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -Adds `?full` option to get package info endpoint to return all package fields {kibana-pull}144343[#144343] - -Infrastructure:: -* Use the Unified Search Bar for date range selection {kibana-pull}144351[#144351] -* Adds network traffic to Hosts table {kibana-pull}142137[#142137] - -Kibana UI:: -Updates the Dashboard, Visualize Library, and Maps pages with enhanced tag filtering {kibana-pull}142108[#142108] - -Lens & Visualizations:: -* Rearranges the options in *Lens* {kibana-pull}144891[#144891] -* Adds the ability to open *TSVB* tables in *Lens* {kibana-pull}143946[#143946] -* Adds advanced params to the formula API in *Lens* {kibana-pull}143876[#143876] -* Adds the ability to display value labels on histogram and stacked charts in *Lens* {kibana-pull}143635[#143635] -* Distinguishes the adhoc data views from the permanent data views in the dropdowns {kibana-pull}143525[#143525] -* Adds the ability to filter metrics in the *Lens* data table {kibana-pull}143219[#143219] -* Adds support for navigate Variance aggregations in *Lens* {kibana-pull}143209[#143209] -* Adds selected field accordion to the fields list in *Lens* {kibana-pull}143175[#143175] -* Adds the ability to open aggregation-based xy charts in *Lens* {kibana-pull}142936[#142936] -* Adds the ability to open aggregation-based Gauge and Goal visualizations in *Lens* {kibana-pull}142838[#142838] -* Enables cursor syncronization in *Lens* heatmaps {kibana-pull}142821[#142821] -* Adds a reduced time range option for formula in *Lens* {kibana-pull}142709[#142709] -* Adds the ability to open aggregation-based metric visualization in *Lens* {kibana-pull}142561[#142561] -* Adds the ability to edit data views in the *Lens* flyout {kibana-pull}142362[#142362] -* Adds conditional operations in the *Lens* formula {kibana-pull}142325[#142325] -* Adds the ability to explore fields in Discover from *Lens* {kibana-pull}142199[#142199] -* Adds the ability to open *TSVB* Gauge visualizations in *Lens* {kibana-pull}142187[#142187] -* Adds new defaults function in *Lens* {kibana-pull}142087[#142087] -* Adds support for mustache context variables with periods {kibana-pull}143703[#143703] -* Adds explore matching indices to data view menu {kibana-pull}141807[#141807] -* Adds control in the *Lens* annotations layer menu for global filters {kibana-pull}141615[#141615] -* Adds field filter to popover in *Lens* {kibana-pull}141582[#141582] -* Improves the performance for large formulas in *Lens* {kibana-pull}141456[#141456] -* Improves the Quick function in-product assistance in *Lens* {kibana-pull}141399[#141399] -* Adds bit formatter in *Lens* {kibana-pull}141372[#141372] -* Adds the ability to open aggregation-based pie visualizations in *Lens* {kibana-pull}140879[#140879] -* Adds the ability to open *TSVB* metric visualizations in *Lens* {kibana-pull}140878[#140878] -* Adds the ability to open aggregation-based table visualizations in *Lens* {kibana-pull}140791[#140791] -* Adds the ability to allow date functions in formula {kibana-pull}143632[#143632] - -Machine Learning:: -* Data Frame Analytics: Highlight filtered data in scatterplot charts {kibana-pull}144871[#144871] -* Allow updates for number of allocations and priority for trained model deployments {kibana-pull}144704[#144704] -* Switch from normal sampling to random sampler for Index data visualizer table {kibana-pull}144646[#144646] -* Explain Log Rate Spikes: Replace chunks of queries with concurrent queue {kibana-pull}144220[#144220] -* Explain Log Rate Spikes: Allow to continue failed stream {kibana-pull}143301[#143301] -* Entity filter for the Notifications page {kibana-pull}142778[#142778] -* Show an info callout for new notifications {kibana-pull}142245[#142245] -* Adding dashboard custom url to lens created jobs {kibana-pull}142139[#142139] -* Adds ML open API output to appendix {kibana-pull}141556[#141556] - -Management:: -Adds missing geo aggs to autocomplete in Console {kibana-pull}141504[#141504] - -Maps:: -* Adds the ability to invert color ramp and size {kibana-pull}143307[#143307] -* Adds layer groups {kibana-pull}142528[#142528] -* Adds the ability to hide or show all layers {kibana-pull}141495[#141495] - -Observability:: -* Adds kibana.alert.time_range field to Alert-As-Data mappings and populate it {kibana-pull}141309[#141309] -* Alert summary widget new design {kibana-pull}141236[#141236] -* Adds histogram support for avg, max, min, sum and percentiles {kibana-pull}139770[#139770] - -Platform:: -Adds maxIdleSockets and idleSocketTimeout to Elasticsearch config {kibana-pull}142019[#142019] - -Security:: -* Adds a read-only mode to the User management screen for users with `read_security` cluster privilege {kibana-pull}143438[#143438] -* Adds a read-only mode to the API keys management screen for users with `read_security` cluster privilege {kibana-pull}144923[#144923] -* Adds `user.id` field to Kibana audit log {kibana-pull}141092[#141092] - -Uptime:: -* Allow using AND for tags filtering {kibana-pull}145079[#145079] -* Adds monitor detail flyout {kibana-pull}136156[#136156] - -[float] -[[fixes-v8.6.0]] -=== Bug fixes -Alerting:: -* Fixes logger text and fix bulk error type {kibana-pull}144598[#144598] -* Flaky bulkDisable tasks functional test {kibana-pull}144405[#144405] -* Adding back unknown outcome filter {kibana-pull}143546[#143546] -* Fixing flaky test in x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list·ts {kibana-pull}142855[#142855] -* Rule run history displays success with a message when the rule status is warning {kibana-pull}142645[#142645] -* Elasticsearch query rule type allows SIZE: 0, but flags as error on re-edit {kibana-pull}142225[#142225] -* Rules and Connectors: Current page in breadcrumbs shows as link {kibana-pull}141838[#141838] -* Move save button into connector config form {kibana-pull}141361[#141361] - -APM:: -* Show a recommended minimum size when going below 5 minutes {kibana-pull}144170[#144170] -* Fixes ML permissions by removing usage of `canAccessML` {kibana-pull}143631[#143631] -* Fallback to terms aggregation search if terms enum doesn’t return results {kibana-pull}143619[#143619] -* Fixes bug that causes alert expression to not close {kibana-pull}143531[#143531] -* Fixes `apm.transaction_duration` alert to aggregrate over service environment {kibana-pull}143238[#143238] -* Fixes broken latency and services layout {kibana-pull}143453[#143453] -* Fixes metadata API environment filter {kibana-pull}144472[#144472] - -Dashboard:: -* The extra reload caused by Controls is now skipped {kibana-pull}142868[#142868] -* Modifies the state shared in dashboard permalinks {kibana-pull}141985[#141985] - -Discover:: -* Fixes theme for Alerts popover {kibana-pull}145390[#145390] -* Improves the no data views state for `esQuery` alert {kibana-pull}145052[#145052] -* Updates the data view id on adhoc data view change {kibana-pull}142069[#142069] -* Improves the error and fix app state when updating data view ID in the URL to an invalid ID {kibana-pull}141540[#141540] - -Elastic Security:: -For the Elastic Security 8.6.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.6.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -Only show fleet managed data streams on data streams list page {kibana-pull}143300[#143300] - -Infrastructure:: -Adds disk latency metrics to hosts table {kibana-pull}144312[#144312] - -Kibana Home & Add Data:: -* Updates the examples {kibana-pull}141265[#141265] - -Lens & Visualizations:: -* All saved queries are now returned on the list instead of only the first 50 {kibana-pull}145554[#145554] -* The baseTheme is now always included with the charts theme {kibana-pull}145401[#145401] -* Do not throw on undefined sorting column referenced in *Lens* {kibana-pull}144716[#144716] -* Fixes suggestion bug in *Lens* {kibana-pull}144708[#144708] -* The reference layer is now excluded from the cursor sync hook in *Lens* {kibana-pull}144384[#144384] -* Improves the embeddable warnings placement in *Lens* metric visualizations {kibana-pull}144368[#144368] -* Fixes the list control popover background color in dark mode {kibana-pull}144204[#144204] -* The unused dimension label from the tooltip in *Lens* is now hidden {kibana-pull}143721[#143721] -* Improves the default text for the controls options list {kibana-pull}143413[#143413] -* Fixes styling issues in *Vega* {kibana-pull}143168[#143168] -* Fixes an issue where the shard failure notices made *Lens* unusable {kibana-pull}142985[#142985] -* Fixes the syncing for colors and tooltips {kibana-pull}142957[#142957] -* Updates the label for Time field annotations in *TSVB* {kibana-pull}142452[#142452] -* Fixes an issue where empty annotation query strings in *TSVB* and *Lens* displayed different results {kibana-pull}142197[#142197] -* Drag and drop capabilities of a single element in *Lens* is no longer allowed {kibana-pull}141793[#141793] -* Fixes the ability to close the settings popover with a click in *Lens* {kibana-pull}141272[#141272] - -Machine Learning:: -* Fixes the default time range on the Notifications page {kibana-pull}145578[#145578] -* Data Frame Analytics maps view: ensure nodes reload correctly after using timepicker refresh {kibana-pull}145265[#145265] -* Explain Log Rate Spikes: Fix applying overall params to histogram queries {kibana-pull}144219[#144219] -* Calculate model memory limit for Lens created jobs {kibana-pull}143456[#143456] -* Explain Log Rate Spikes: fix chart showing as empty when filter matches field/value pair in hovered row {kibana-pull}142693[#142693] - -Management:: -* Fixes nested formatter for terms {kibana-pull}144543[#144543] -* Cache ad-hoc data views to avoid repeated field list calls {kibana-pull}144465[#144465] -* In the case of 2 or more panels on the dashboard, TSVB renderComplete fires 2 times {kibana-pull}143999[#143999] -* Shard failure notifications have been reduced when many queries fail at the same time {kibana-pull}131776[#131776] - -Maps:: -* Fixes an issue where the Time Slider text was not working properly with Dark Mode {kibana-pull}145612[#145612] -* Adds ungroup layers action {kibana-pull}144574[#144574] - -Observability:: -Fixes alerts' blank page in case of invalid query string {kibana-pull}145067[#145067] - -Observability Home:: -* Use bucketSize from request options for overview query {kibana-pull}145032[#145032] -* Solution nav with no data page {kibana-pull}144280[#144280] - -Querying & Filtering:: -* Fixes an issue with autocomplete value suggestions where the date range was sometimes incorrectly applied {kibana-pull}144134[#144134] -* Fixes Moment.js timezone error when defining a range filter {kibana-pull}143213[#143213] - -Reporting:: -* Fixed a bug with CSV export in Discover, where searching over hundreds of shards would result in an incomplete CSV file {kibana-pull}144201[#144201] -* Fixes an issue where downloading a report caused a new browser tab to open with the report content, rather than receiving a downloaded file {kibana-pull}144136[#144136] -* Fixed an issue with CSV exports from Discover, where using the `_id` field in an export, when `_id` is a very high numeric value, the value could lose precision {kibana-pull}143807[#143807] - -[[release-notes-8.5.2]] -== {kib} 8.5.2 - -Review the following information about the {kib} 8.5.2 release. - -[float] -[[breaking-changes-8.5.2]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.5.2. - -{kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.5.2]] -=== Enhancement -Security:: -* Adds a `Content-Security-Policy` header to all `/api/*` responses {kibana-pull}144902[#144902] - -[float] -[[fixes-v8.5.2]] -=== Bug fixes -APM:: -* Limits the number of source map artifacts {kibana-pull}144963[#144963] -* Fixes an incorrect documentation link {kibana-pull}145077[#145077] -* Suppresses error toast when data view cannot be created {kibana-pull}143639[#143639] - -Dashboard:: -Fixes unexpected suggestions for text/keyword multi-fields {kibana-pull}145177[#145177] - -Discover:: -Fixes % for field stats calculations (edge cases) {kibana-pull}144962[#144962] - -Management:: -Fixes autocomplete_entities API crash when response size is too big {kibana-pull}140569[#140569] - -Uptime:: -Adjust formula for synthetics monitor availability {kibana-pull}144868[#144868] - -[[release-notes-8.5.1]] -== {kib} 8.5.1 - -Review the following information about the {kib} 8.5.1 release. - -[float] -[[breaking-changes-8.5.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.5.1. - -{kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.5.1]] -=== Enhancements -Elastic Security:: -For the Elastic Security 8.5.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[float] -[[fixes-v8.5.1]] -=== Bug fixes -APM:: -* Fixes a bug where Metadata API does not filter by environment {kibana-pull}144472[#144472] -* Fixes a bug where AWS lambda checks for an undefined value {kibana-pull}143987[#143987] -* Limits the number of source map artifacts {kibana-pull}144963[#144963] -* Fixes an incorrect documentation link {kibana-pull}145077[#145077] - -Dashboard:: -* Removes support for scripted fields in options list {kibana-pull}144643[#144643] -* Fixes help documentation link for dashboard {kibana-pull}143894[#143894] - -Elastic Security:: -For the Elastic Security 8.5.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -Make asset tags space aware {kibana-pull}144066[#144066] - -Machine Learning:: -* Correcting the size of the free ML node on cloud {kibana-pull}144512[#144512] -* Fixes model testing flyout reload {kibana-pull}144318[#144318] -* Explain Log Rate Spikes: Wrap analysis in try/catch block {kibana-pull}143651[#143651] -* Explain Log Rate Spikes: Fix uncompressed streams and backpressure handling {kibana-pull}142970[#142970] - -Osquery:: -* Fixes a bug that prevented users from viewing Osquery results if they were in a non-default {kib} space {kibana-pull}144210[#144210] - -Platform:: -Fixes the execution pipeline not to stop on a flaky subexpression {kibana-pull}143852[#143852] - -Uptime:: -* Adjust forumla for synthetics monitor availability {kibana-pull}144868[#144868] -* TLS alert - do not alert when status cannot be determined {kibana-pull}144767[#144767] - -[[release-notes-8.5.0]] -== {kib} 8.5.0 - -Review the following information about the {kib} 8.5.0 release. - -[float] -[[known-issues-8.5.0]] -=== Known issues - -Due to a recent change in the Red Hat scan verification process, -{kib} 8.5.0 is not available in the Red Hat Ecosystem Catalog. -This known issue will be fixed in the next release. -To download the {kib} 8.5.0 image, use the https://www.docker.elastic.co/r/kibana/kibana[Elastic docker registry]. - -[float] -[[breaking-changes-8.5.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.5.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Updates bulk action API to return actionId instead of agent success -[%collapsible] -==== -*Details* + -To make bulk action responses consistent, returns `actionId` instead of agent ids with `success: True` or `success: False` results. For more information, refer to {kibana-pull}141757[#141757]. - -*Impact* + -When you use `FleetBulkResponse`, you now receive only `actionId` responses. -==== - -[discrete] -.Removes filter validation for ad-hoc data views -[%collapsible] -==== -*Details* + -Filters associated with unknown data views, such as deleted data views, are no longer automatically disabled. For more information, refer to {kibana-pull}139431[#139431]. - -*Impact* + -Filters associated with unknown data views now display a warning message instead of being automatically disabled. -==== - -[discrete] -.Removes the `package_policies` field from the agent policy saved object -[%collapsible] -==== -*Details* + -The bidirectional foreign key between agent policy and package policy has been removed. For more information, refer to {kibana-pull}138677[#138677]. - -*Impact* + -The agent policy saved object no longer includes the `package_policies` field. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.4/release-notes-8.4.0.html#breaking-changes-8.4.0[8.4.0] | {kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[features-8.5.0]] -=== Features -{kib} 8.5.0 adds the following new and notable features. - -Alerting:: -* Adds dynamic field selection to the alerts table {kibana-pull}140516[#140516] -* Show alerts count {kibana-pull}140473[#140473] -* Adds the ability to allows users to assign other users to cases {kibana-pull}140208[#140208] -* Ability run a rule on-demand {kibana-pull}139848[#139848] -* Ability to bulk update API keys for alerting rules {kibana-pull}139036[#139036] -* Index threshold alert can't use unsigned long data type {kibana-pull}138452[#138452] -* Category fields endpoint {kibana-pull}138245[#138245] -* Index threshold alert UI does not fill index picker with data streams {kibana-pull}137584[#137584] - -APM:: -* Display kubernetes metadata in service icons popup and instance accordion {kibana-pull}139612[#139612] -* AWS lambda metrics api {kibana-pull}139041[#139041] - -Discover:: -* Adds support for storing time with saved searches {kibana-pull}138377[#138377] -* Enables tags for saved searches {kibana-pull}136162[#136162] - -Elastic Security:: -For the Elastic Security 8.5.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Adds agent activity flyout {kibana-pull}140510[#140510] -* Adds a new event toggle to capture terminal output in endpoint {kibana-pull}139421[#139421] -* Makes batch actions asynchronous {kibana-pull}138870[#138870] -* Adds ability to tag integration assets {kibana-pull}137184[#137184] -* Adds support for input only packages {kibana-pull}140035[#140035] - -Infrastructure:: -Inital hosts page {kibana-pull}138173[#138173] - -Lens & Visualizations:: -* Adds query-based annotations in *Lens* {kibana-pull}138753[#138753] -* Enables ad-hoc data views in *Lens* {kibana-pull}138732[#138732] - -Machine Learning:: -* Notifications page {kibana-pull}140613[#140613] -* Explain Log Rate Spikes: Add option to view grouped analysis results {kibana-pull}140464[#140464] -* Stubs out UI for the ML Inference Pipeline panel {kibana-pull}140456[#140456] -* Attach the anomaly charts embeddable to Case {kibana-pull}139628[#139628] -* Log pattern analysis UI {kibana-pull}139005[#139005] -* Attach the anomaly swim lane embeddable to Case {kibana-pull}138994[#138994] - -Management:: -* Adds the ability to allow variables in URL Drilldown titles {kibana-pull}140076[#140076] -* Enables time series downsampling action in ILM configurations {kibana-pull}138748[#138748] -* Adds the composite runtime field editor {kibana-pull}136954[#136954] - -Observability:: -Feat(slo): Create basic SLO route {kibana-pull}139490[#139490] - -Osquery:: -* Adds Osquery results to cases {kibana-pull}139909[#139909] -* Add support for differential logs {kibana-pull}140660[#140660] - -Security:: -Adds the ability to set a default Access Agreement for all `xpack.security`-level authentication providers {kibana-pull}139217[#139217] - -For more information about the features introduced in 8.5.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.5.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.5.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.5.0]] -=== Enhancements -Alerting:: -* 141189 alerts table performance {kibana-pull}141385[#141385] -* 141119 remove visibility toogle + use_columns refactor {kibana-pull}141250[#141250] -* Adds Stats on top of execution logs {kibana-pull}140883[#140883] -* Adds the Logs tab to Rules and Connectors UI {kibana-pull}138852[#138852] -* Adds "exclude previous hits" check box to ESQuery rule form {kibana-pull}138781[#138781] -* The ES Query Rule Type now supports Runtime Mappings and the Fields parameters when using an Elasticsearch DSL query {kibana-pull}138427[#138427] - -APM:: -* Adds option to power APM inventory with service metrics {kibana-pull}140868[#140868] -* Adds a sort order to the trace samples on the transaction details page {kibana-pull}140589[#140589] -* Adds a tail-based sampling storage limit (APM integration) {kibana-pull}140567[#140567] -* Adds AWS Lambda metrics to the "Metrics" tab {kibana-pull}140550[#140550] -* Adds an experimental mode to the APM app {kibana-pull}139553[#139553] -* Renames JVMs to Metrics {kibana-pull}138437[#138437] -* Changes how partial data buckets are displayed {kibana-pull}137533[#137533] - -Dashboard:: -Adds the ability to view panel-level filters and queries {kibana-pull}136655[#136655] - -Discover:: -* Enables `Explore in Discover` for adhoc data views in *Lens* {kibana-pull}140726[#140726] -* Adds the ability to show actions inline in the Expanded Document view for quick access {kibana-pull}140085[#140085] -* Updates the layout for unified histogram {kibana-pull}139446[#139446] -* Adds new field stats in sidebar popover {kibana-pull}139072[#139072] -* Adds ad-hoc data views {kibana-pull}138283[#138283] -* Updates the formatter for aggregate_metric_double field values {kibana-pull}138205[#138205] - -Elastic Security:: -For the Elastic Security 8.5.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Adds toggle for experimental synthetic `_source` support in Fleet data streams {kibana-pull}140132[#140132] -* Enhances the package policy API to create or update a package policy API with a simplified way to define inputs {kibana-pull}139420[#139420] -* Support new subscription and license fields {kibana-pull}137799[#137799] - -Infrastructure:: -* Adds log-* index pattern support on SM UI {kibana-pull}139121[#139121] -* Adds health API support for data ingested from package {kibana-pull}138964[#138964] -* Adds support for integration package {kibana-pull}138224[#138224] -* Adds the inital hosts page {kibana-pull}138173[#138173] - -Lens & Visualizations:: -* Adds the Collapse by option for partition charts in *Lens* {kibana-pull}140336[#140336] -* Adds the ability to show the metric name if there are multiple layers with breakdowns in *Lens* {kibana-pull}140314[#140314] -* Adds time scaling without date histogram in *Lens* {kibana-pull}140107[#140107] -* Improves the field drag defaults in *Lens* {kibana-pull}140050[#140050] -* Adds the time marker setting for time axis in *Lens* {kibana-pull}139950[#139950] -* Adds the ability to make sure shard size stays stable for low number of sizes in *TSVB*, *Lens*, and Agg based visualizations {kibana-pull}139791[#139791] -* Adds the one click filter to the *Lens* table {kibana-pull}139701[#139701] -* Improves the metric palette behavior in *Lens* {kibana-pull}139596[#139596] -* Adds separate dimension groups for mosaic rows and columns in *Lens* {kibana-pull}139214[#139214] -* Adds display-infinity option to custom palette editor in *Lens* {kibana-pull}139061[#139061] -* Adds TSDB support for *Lens*, *TSVB* and *Timelion* {kibana-pull}139020[#139020] -* Adds the format selector to the new metric visualization in *Lens* {kibana-pull}139018[#139018] -* Shows the edit/delete button while field stats are loading in *Lens* {kibana-pull}138899[#138899] -* Adds auto mode for secondary metric prefix in *Lens* {kibana-pull}138167[#138167] -* Adds open in *Lens* extendability {kibana-pull}136928[#136928] -* Adds TSDB warning handling support for *Lens*, Agg based, and *TSVB* {kibana-pull}136833[#136833] -* Adds reduced time range option in *Lens* {kibana-pull}136706[#136706] -* Migrates xy visualization type to new unified xy expression {kibana-pull}136475[#136475] -* Adds the ability to duplicate layers in *Lens* {kibana-pull}140603[#140603] - -Machine Learning:: -* Explain Log Rate Spikes: add main chart sync on row hover at group level {kibana-pull}141138[#141138] -* Show "No anomalies found" message instead of empty swim lane {kibana-pull}141098[#141098] -* Explain Log Rate Spikes: Group results API {kibana-pull}140683[#140683] -* Match Data Visualizer/Field stats table content with the popover {kibana-pull}140667[#140667] -* Explain Log Rate Spikes: Adds discover link to analysis table {kibana-pull}139877[#139877] -* Adding ecs_compatibility setting for find structure calls {kibana-pull}139708[#139708] -* Improves messaging when an anomaly detection forecast errors {kibana-pull}139345[#139345] -* Anomaly Detection: adds maps link when source data contains geo fields {kibana-pull}139333[#139333] -* Quickly create ML jobs from lens visualizations {kibana-pull}136421[#136421] - -Management:: -* Url drilldown `date` helper now allows rounding up relative dates {kibana-pull}137874[#137874] -* In CSV reports, an error message now appears on the job when fewer CSV rows are generated than expected {kibana-pull}137800[#137800] - -Maps:: -* Adds support for adhoc data views {kibana-pull}140858[#140858] -* Timeslider control {kibana-pull}139228[#139228] -* Support Vector tile runtime geo_point fields {kibana-pull}139047[#139047] -* Show data view name in UI {kibana-pull}138928[#138928] -* Adds ability to disable tooltips for layer {kibana-pull}138275[#138275] -* Cancel button when editing by value from dashboard {kibana-pull}137880[#137880] - -Security:: -Adds audit events to "login-less" authentication flows (e.g. PKI, Kerberos) {kibana-pull}139492[#139492] - -Uptime:: -* Project monitors - support lightweight project monitors {kibana-pull}141066[#141066] -* Adds Actions popover menu {kibana-pull}136992[#136992] - -[float] -[[fixes-v8.5.0]] -=== Bug fixes -Alerting:: -* Render the grid only if we have alerts {kibana-pull}142481[#142481] -* Alerts Table browser field - fix siem browser fields call {kibana-pull}141431[#141431] -* Adds getActionsHealth method to return permanent encryption key existence {kibana-pull}140535[#140535] -* Clarify rule notification values {kibana-pull}140457[#140457] -* Actions are not able to configure a max number of attempts {kibana-pull}138845[#138845] -* Elasticsearch Query Rule doesn't have 'dark mode' view for query {kibana-pull}138631[#138631] -* Getting error about secrets not being saved when import a SO (Connector Saved Object) {kibana-pull}138019[#138019] -* Provide indication of how many rules are using connector on Connector List view {kibana-pull}137181[#137181] - -APM:: -* Remove check for infra data {kibana-pull}142835[#142835] -* Prefer span metrics over span events {kibana-pull}141519[#141519] -* Fixes search bar suggestions {kibana-pull}141101[#141101] -* Sort trace samples {kibana-pull}140589[#140589] - -Dashboard:: -Fixes pinned filters that backed up in Session Storage {kibana-pull}142262[#142262] - -Discover:: -* Adds support for line breaks in Document explorer {kibana-pull}139449[#139449] -* Cancelled request errors for embeddables are now hidden {kibana-pull}137690[#137690] -* Fixes legacy sort saved search stored in Dashboard saved objects {kibana-pull}137488[#137488] -* Fixes column width handling {kibana-pull}137445[#137445] - -Elastic Security:: -For the Elastic Security 8.5.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.5.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Refresh search results when clearing category filter {kibana-pull}142853[#142853] -* Respect `default_field: false` when generating index settings {kibana-pull}142277[#142277] -* Fixes repeated debug logs when bundled package directory does not exist {kibana-pull}141660[#141660] - -Graph:: -Fixes query bar autocomplete {kibana-pull}140963[#140963] - -Infrastructure:: -* Adds support for Logstash datastream in standalone query {kibana-pull}138689[#138689] - -Lens & Visualizations:: -* Fixes the detailed tooltip wrap problem {kibana-pull}142818[#142818] -* Fixes an issue where columns normalized by unit were unable to display properly on Dashboards for *Lens* metric visualizations {kibana-pull}142741[#142741] -* Adds back ticks on bands in *Lens* {kibana-pull}142702[#142702] -* Fixes guidance panel appearing for a moment when saving Graph {kibana-pull}141228[#141228] -* Fixes pie filter without slice {kibana-pull}141227[#141227] -* Fixes an issue where using annotations from different data views than the visualizations created panel breaks in *TSVB* {kibana-pull}141104[#141104] -* Fixes drilldown url templates for sample data {kibana-pull}141079[#141079] -* Fixes time shift with reduced time range tabification in *Lens* {kibana-pull}141076[#141076] -* Fixes the time shifted pipeline agg in *Lens* {kibana-pull}140723[#140723] -* Fixes an A11y issue where the query input doesn't react to `escape` button in *Lens* {kibana-pull}140382[#140382] -* Boolean values are now correctly formatted by default in *TSVB* {kibana-pull}140308[#140308] -* All data views are no longer loaded on broken data view reference in *Lens* {kibana-pull}139690[#139690] -* Removes the exclamation circle icon in *TSVB* {kibana-pull}139686[#139686] -* Theme is now passed to visualize save modal {kibana-pull}139685[#139685] -* Push-out behavior is now preserved for table cells when possible in *Lens* {kibana-pull}139619[#139619] -* The metric visualization state is now cleared in *Lens* {kibana-pull}139154[#139154] -* Adds the ability to set minimum table width for column split tables {kibana-pull}139004[#139004] -* Adds the ability to scroll tall metric visualizations in *Lens* {kibana-pull}138178[#138178] - -Machine Learning:: -* Explain Log Rate Spikes: update more groups badge for clarity {kibana-pull}142793[#142793] -* Fixes Index data visualizer doc count when time field is not defined {kibana-pull}142409[#142409] -* Explain Log Rate Spikes: Fix error handling {kibana-pull}142047[#142047] -* Fixes date picker not allowing unpause when refresh interval is 0 {kibana-pull}142005[#142005] -* Fixes expanded row layout in the Nodes table {kibana-pull}141964[#141964] -* Fixes links to Discover and Maps and custom URLs for jobs with a query in the datafeed {kibana-pull}141871[#141871] - -Management:: -* The progress bar is now visible in Expression renderer {kibana-pull}142699[#142699] -* Transforms: Preserves the `field` for unsupported aggs {kibana-pull}142106[#142106] -* Removes unnecessary time units in ILM policy dialog {kibana-pull}140815[#140815] -* Fixes search query builder to generate wildcard query for keyword fields {kibana-pull}140629[#140629] -* Updates "Copy as cURL" to interpolate variables and strip request-body comments {kibana-pull}140262[#140262] -* Fixes previewing data streams in template editor {kibana-pull}140189[#140189] -* Fixes an issue where selecting requests with characters ending with '{}' was not possible {kibana-pull}140068[#140068] -* Filters that are associated with an unknown data view, such as deleted data views, are no longer automatically disabled, but now instead display a warning message {kibana-pull}139431[#139431] -* Watches no longer get stuck in a "Firing" state in Watcher {kibana-pull}138563[#138563] -* Fixes an issue where data view search results were not showing the value of mapped fields that shared a name with a runtime field {kibana-pull}138471[#138471] - -Maps:: -* Fixes Go To - lat/long values outside expected range cause blank Maps app {kibana-pull}141873[#141873] -* Fixes scaling and term join in product help popover width {kibana-pull}139120[#139120] -* Fixes legacy tile_map and region_map visualizations do not display title in Map embeddable action modals {kibana-pull}139054[#139054] -* Fixes Filters applied to map visualization not preserved when added to dashboard {kibana-pull}138188[#138188] - -Monitoring:: -Health api: account for ccs in indices regex {kibana-pull}137790[#137790] - -Observability:: -* Fixes Alert tab goes blank in APM because of Alert Details page feature flag {kibana-pull}142188[#142188] -* Update links to Observability rule management {kibana-pull}140009[#140009] - -Platform:: -* Fixes an issue where the expressions executor stopped on failing partially emitted results {kibana-pull}142105[#142105] -* A 0 is now returned when there are no overdue tasks for capacity estimation {kibana-pull}140720[#140720] -* The task health calculation now never returns Error or Warning, but logs the HealthStatus {kibana-pull}139274[#139274] - -Uptime:: -* Fixes Next and Previous button on step screenshot carousel {kibana-pull}141422[#141422] -* Fixes disrupted UI on Browser Test Results` step screenshots {kibana-pull}139017[#139017] - -[[release-notes-8.4.3]] -== {kib} 8.4.3 - -Review the following information about the {kib} 8.4.3 release. - -[float] -[[breaking-changes-8.4.3]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.4.3. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.4.3]] -=== Bug fixes -Cases:: -Fixes an issue where the recent cases widget shows cases from other solutions {kibana-pull}141221[#141221] - -Discover:: -* Fixes scrolling prevented by saved search embeddable on touch devices {kibana-pull}141718[#141718] -* Fixes columns management for saved search embeddable {kibana-pull}140799[#140799] - -Elastic Security:: -For the Elastic Security 8.4.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Graph:: -* Fixes the position of Add fields popover {kibana-pull}141040[#141040] -* Fixes responsive styles of field manager {kibana-pull}140948[#140948] - -Machine Learning:: -Fixes an issue where Data visualizer was unable to update distribution when changing shard size, forbidden error with recognize modules on basic license {kibana-pull}141313[#141313] - -Management:: -Fixes the removal of a single field formatter {kibana-pull}141078[#141078] - -Observability:: -Fixes an alert summary widget issue in non-default space {kibana-pull}140842[#140842] - -[[release-notes-8.4.2]] -== {kib} 8.4.2 - -Review the following information about the {kib} 8.4.2 release. - -[float] -[[breaking-changes-8.4.2]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.4.2. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.4.2]] -=== Enhancements -Security:: -Logs a hash of the saved objects encryption key (`xpack.encryptedSavedObjects.encryptionKey`) when {kib} starts to assist in identifying mismatched encryption keys {kibana-pull}139874[#139874] - -[float] -[[fixes-v8.4.2]] -=== Bug fixes -Connectors:: -The connectors table now uses "compatibility" rather than "availability" {kibana-pull}139024[#139024] - -Discover:: -Fixes saved search embeddable rendering {kibana-pull}140264[#140264] - -Elastic Security:: -For the Elastic Security 8.4.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Applies fixes for package policy upgrade API with multiple ids {kibana-pull}140069[#140069] -* Improves performance for many integration policies {kibana-pull}139648[#139648] - -Lens & Visualizations:: -* Fixes "Collapse by" for table and XY visualizations with multiple metrics in *Lens* {kibana-pull}140381[#140381] -* Fixes action menu in *Lens* {kibana-pull}139588[#139588] - -Machine Learning:: -* Explain Log Rate Spikes: Histogram fixes {kibana-pull}139933[#139933] -* Explain Log Rate Spikes: Improve streaming headers for certain proxy configs {kibana-pull}139637[#139637] -* Fixes navigation for the Basic licence {kibana-pull}139469[#139469] -* Corrects file.path field name in v3_windows_anomalous_script job {kibana-pull}139109[#139109] - -Management:: -Bfetch` response headers now include `X-Accel-Buffering: no` {kibana-pull}139534[#139534] - -Maps:: -* Fixes issue where percentile aggregation was not working with vector tiles {kibana-pull}140318[#140318] -* Fixes Map app crashing on file upload request timeout {kibana-pull}139760[#139760] - -Monitoring:: -* Ensures GlobalState class has it's destroy() method called on unmount {kibana-pull}139908[#139908] -* Adds KibanaThemeProvider to Stack Monitoring UI {kibana-pull}139839[#139839] - -Uptime:: -Fixes an issue where decryption errors caused the entire suite of monitors to fail syncing {kibana-pull}140549[#140549] - -[[release-notes-8.4.1]] -== {kib} 8.4.1 - -Review the following information about the {kib} 8.4.1 release. - -[float] -[[breaking-changes-8.4.1]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.4.1. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.4.1]] -=== Bug fixes - -Alerting:: -* Fixes alert tab crash on rule details page {kibana-pull}139372[#139372] -* Fixes issue where some 8.3.x clusters failed to upgrade with a saved object migration failure {kibana-pull}139427[#139427] - -Lens & Visualizations:: -* Fixes table pagination in *Lens* and *Aggregation-based* visualization editors {kibana-pull}139160[#139160] - -[[release-notes-8.4.0]] -== {kib} 8.4.0 - -Review the following information about the {kib} 8.4.0 release. - -[float] -[[known-issue-8.4.0]] -=== Known issues - -If you have alerting rules that have been snoozed, do not upgrade {kib} to 8.4.0. Upgrade to 8.4.1 instead. - -To determine if you have snoozed alerting rules, open the main menu, then click -**{stack-manage-app}** -> **{rac-ui}**. Filter the rule list by selecting -**View** -> **Snoozed**. If you must upgrade to 8.4.0, for each space, cancel -the snooze for all affected rules before you upgrade. - -To identify snoozed rules in all Spaces using **Dev Tools**, run the following -query: - -[source,console] ----- -GET /.kibana/_search -{ - "query": { - "exists": { - "field": "alert.isSnoozedUntil" - } - } -} ----- - -If you upgraded {kib} to 8.4.0 and you have alerting rules configured to -snooze notifications, you will receive the following error message: - -[source,text] ----- -FATAL Error: Unable to complete saved object migrations for the [.kibana] index. ----- - -To fix that problem, restore your previous version, then upgrade to 8.4.1 instead. - -[float] -[[breaking-changes-8.4.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.4.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.xpack.agents.* are uneditable in UI when defined in kibana.yml -[%collapsible] -==== -*Details* + -When you configure `setxpack.fleet.agents.fleet_server.hosts` and `xpack.fleet.agents.elasticsearch.hosts` in kibana.yml, you are unable to update the fields on the Fleet UI. - -For more information, refer to {kibana-pull}135669[#135669]. - -*Impact* + -To configure `setxpack.fleet.agents.fleet_server.hosts` and `xpack.fleet.agents.elasticsearch.hosts` on the Fleet UI, avoid configuring the settings in kibana.yml. -==== - -[discrete] -.Removes the legacy charts library -[%collapsible] -==== -*Details* + -The legacy implementation of the *Timelion* visualization charts library has been removed. All *Timelion* visualizations now use the elastic-charts library, which was introduced in 7.15.0. - -For more information, refer to {kibana-pull}134336[#134336]. - -*Impact* + -In 8.4.0 and later, you are unable to configure the *Timelion* legacy charts library advanced setting. For information about visualization Advanced Settings, check link:https://www.elastic.co/guide/en/kibana/8.4/advanced-options.html#kibana-visualization-settings[Visualization]. -==== - -{kibana-ref-all}/8.3/release-notes-8.3.0.html#breaking-changes-8.3.0[8.3.0] | {kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[deprecations-8.4.0]] -=== Deprecations - -The following functionality is deprecated in 8.4.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.4.0. - -[discrete] -[[deprecation-136422]] -.Deprecates ApiKey authentication for interactive users -[%collapsible] -==== -*Details* + -The ability to authenticate interactive users with ApiKey via a web browser has been deprecated, and will be removed in a future version. - -For more information, refer to {kibana-pull}136422[#136422]. - -*Impact* + -To authenticate interactive users via a web browser, use <>. Use API keys only for programmatic access to {kib} and {es}. -==== - -[float] -[[features-8.4.0]] -=== Features -{kib} 8.4.0 adds the following new and notable features. - -Alerting:: -* Adds the "updated at" feature in new alerts table {kibana-pull}136949[#136949] -* Adds a rule detail table with bulk actions {kibana-pull}136601[#136601] -* Adds bulk Actions for Alerts Table {kibana-pull}135797[#135797] -* Adds the Alerting stack-monitoring PoC {kibana-pull}135365[#135365] -* Adds custom inline/row actions for alerts table {kibana-pull}134015[#134015] - -Cases:: -Adds the ability to customize permissions to prevent users from deleting Cases entities, such as Cases themselves, attachments, and comments {kibana-pull}135487[#135487] - -Connectors:: -The {webhook-cm} connector allows users to build a custom connector for any third-party case/ticket management system {kibana-pull}131762[#131762] - -Discover:: -Adds the ability to add a custom number of rows in the results and save the specified number with a Saved Search {kibana-pull}135726[#135726] - -Elastic Security:: -For the Elastic Security 8.4.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Enables package signature verification feature {kibana-pull}137239[#137239] -* Modal to allow user to force install an unverified package {kibana-pull}136108[#136108] -* Display package verification status {kibana-pull}135928[#135928] -* Tag rename and delete feature {kibana-pull}135712[#135712] -* Bulk update agent tags ui {kibana-pull}135646[#135646] -* Adds API to bulk update tags {kibana-pull}135520[#135520] -* Adds and remove agent tags {kibana-pull}135320[#135320] -* Support sorting agent list {kibana-pull}135218[#135218] -* Promote Logstash output support to GA {kibana-pull}135028[#135028] -* Create new API to manage download_source setting {kibana-pull}134889[#134889] - -Machine Learning:: -* Adds random sampler to Data visualizer document count chart {kibana-pull}136150[#136150] -* Adds explain log rate spikes feature to the ML plugin {kibana-pull}135948[#135948] - -Management:: -* Run packs live {kibana-pull}132198[#132198] -* Ability to set human readable title of data view & ability to edit data view {kibana-pull}124191[#124191] - -Monitoring:: -Adds stale status reporting for Kibana {kibana-pull}132613[#132613] - -Observability:: -* Adds Beta label to Infrastructure tab {kibana-pull}136710[#136710] -* Creates and adds Rule Alerts Summary as a sharable component to the O11y Rule Details {kibana-pull}135805[#135805] -* Rule Details Page - Use RuleStatusPanel from triggersActionsUI {kibana-pull}135643[#135643] -* Adds Top erroneous transactions to errors details page {kibana-pull}134929[#134929] -* Introduces Alerts tab on service overview page {kibana-pull}134350[#134350] -* Adds single metric report type {kibana-pull}132446[#132446] - -Platform:: -Adds new bulkUpdatesSchedules method to Task Manager {kibana-pull}132637[#132637] - -Security:: -Adds the ability to create personal avatars {kibana-pull}132522[#132522] - -Sharing:: -Adds the new metric visualization {kibana-pull}136567[#136567] - -For more information about the features introduced in 8.4.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.4.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.4.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.4.0]] -=== Enhancements -Alerting:: -* Adds snooze state UI to Rule Details page {kibana-pull}135146[#135146] -* Adds Snooze Scheduling UI and API {kibana-pull}134512[#134512] -* Adds recovery context for ES query rule type {kibana-pull}132839[#132839] -* Visualize alerting metrics in Stack Monitoring {kibana-pull}123726[#123726] - -Canvas:: -* Markdown element auto-applies text changes {kibana-pull}133318[#133318] -* Lines operations keybindings {kibana-pull}132914[#132914] -* Detailed tooltip {kibana-pull}131116[#131116] - -Cases:: -* Improved the cases search bar functionality. The search functionality will only consider the title and description fields {kibana-pull}136776[#136776] -* Performance improvements were made to reduce the time required to create, update, and delete cases and comments. In our testing we saw around a half second reduction in the round trip time for the UI requests {kibana-pull}136452[#136452] - -Dashboard:: -Hide controls callout when the `hideAnnouncements` setting is `true` {kibana-pull}136410[#136410] - -Design:: -* Adds an H1 tag with the workpad title when viewing workpads {kibana-pull}135504[#135504] -* Improve keyboard navigation in Discover top nav menu {kibana-pull}134788[#134788] - -Discover:: -* Improves the HTML formatting of fields with a list of values {kibana-pull}136684[#136684] -* Adds support for accessing the edit field flyout from the document explorer column popover {kibana-pull}135277[#135277] -* Adds support for copying the query from the add rule flyout {kibana-pull}135098[#135098] -* Adds focus to h1 on navigate for single document and surrounding document views {kibana-pull}134942[#134942] -* Improves the creation and editing of "Elasticsearch query" rule in Management {kibana-pull}134763[#134763] -* Adds data view changed warning after alert rule created {kibana-pull}134674[#134674] -* Make 'Test query' button pretty {kibana-pull}134605[#134605] -* Improves the document explorer timestamp tooltip accessibility {kibana-pull}134411[#134411] -* Adds focus to h1 element when client side routing is executed {kibana-pull}133846[#133846] -* Adds an option to copy column values to Clipboard in Document Explorer {kibana-pull}132330[#132330] - -Elastic Security:: -For the Elastic Security 8.4.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Remove Kubernetes Package granularity {kibana-pull}136622[#136622] -* Elastic-agent manifests: align with elastic-agent repo; add comments {kibana-pull}136394[#136394] -* Configure source URI in global settings and in agent policy settings {kibana-pull}136263[#136263] -* Adds Kubernetes in platforms selection list && update managed agent installation steps {kibana-pull}136109[#136109] -* That PR will enable user to write custom ingest pipeline for Fleet installed datastream {kibana-pull}134578[#134578] -* Update manifests for agent on kubernetes with new permissions {kibana-pull}133495[#133495] -* Adds support for a textarea type in integrations {kibana-pull}133070[#133070] - -Kibana Home & Add Data:: -Adds AnalyticsNoDataPage {kibana-pull}134172[#134172] - -Lens & Visualizations:: -* Adds supports for include and exclude terms in *Lens* {kibana-pull}136179[#136179] -* Adds the ability to set top values limit to 10,000 in *Lens* {kibana-pull}136399[#136399] -* Addss value count to *Lens* {kibana-pull}136385[#136385] -* Adds standard deviation function in *Lens* {kibana-pull}136323[#136323] -* Adds the ability to set the font size for mosaic outer level in *Lens* {kibana-pull}135911[#135911] -* Adds the ability to rank top values by custom metric in *Lens* {kibana-pull}134811[#134811] -* Adds the ability to convert TSVB series agg to *Lens* configuration {kibana-pull}134681[#134681] -* Adds the ability to allow multiple split accessors {kibana-pull}134566[#134566] -* Adds the ability to render newlines in data table in *Lens* {kibana-pull}134441[#134441] -* Extends Axis bounds for XY chart when using Interval operation in *Lens* {kibana-pull}134020[#134020] -* Adds the ability to use pick_max instead of clamp for positive only {kibana-pull}133460[#133460] -* Adds a new pick_min/max operation and clamp fixes in *Lens* {kibana-pull}132449[#132449] -* Adds support for percentile_ranks aggregation in *Lens* {kibana-pull}132430[#132430] -* Implements the ability to drag and drop between layers in *Lens* {kibana-pull}132018[#132018] -* Adds optimization for percentiles fetching in *Lens* {kibana-pull}131875[#131875] - -Machine Learning:: -* Adds tooltips for disabled actions in the Trained Models list {kibana-pull}137176[#137176] -* Data visualizer: Add field types in-product help {kibana-pull}137121[#137121] -* Plot zero scores on the Overall anomaly swim lane {kibana-pull}136951[#136951] -* One-way cursor sync added from Anomaly detection swimlane to other charts {kibana-pull}136775[#136775] -* Adds action to view datafeed counts chart to jobs list rows {kibana-pull}136274[#136274] -* Data Visualizer: Remove duplicated geo examples, support 'version' type, add filters for boolean fields, and add sticky header to Discover {kibana-pull}136236[#136236] -* Adds a link to ML trained models list from ID in Stack Management app table {kibana-pull}135700[#135700] -* Adds information callouts to trained model testing flyout {kibana-pull}135566[#135566] -* Limit Use full data button in anomaly detection job wizards to past data only {kibana-pull}135449[#135449] -* Replace a fixed Y-axis width with a max width setting for Anomaly Swim Lane Embeddable {kibana-pull}135436[#135436] -* Adds support for setting threading params when starting a trained model deployment {kibana-pull}135134[#135134] -* Refactors Management page to focus on space management tasks {kibana-pull}134893[#134893] -* Disable the Single Metric Viewer button for not viewable jobs {kibana-pull}134048[#134048] -* Anomaly Detection: allow snapshot to be reverted from the view datafeed flyout {kibana-pull}133842[#133842] - -Management:: -* Transforms: Adds per-transform setting for num_failure_retries to creation wizard and edit flyout and authorization info {kibana-pull}135486[#135486] -* Transforms: Adds sorting to audit messages tab {kibana-pull}135047[#135047] -* Console now supports saving the state of folding/unfolding of commands {kibana-pull}134810[#134810] -* Render most severe response status code from Console response pane {kibana-pull}134627[#134627] -* You can now create variables in Console {kibana-pull}134215[#134215] -* Make index template previews copyable {kibana-pull}134060[#134060] -* Console now supports adding comments in the body of a request by using `//` for a single line and `/*....*/` for multiline comments {kibana-pull}133852[#133852] -* Surface HTTP status badges next to each response in Console {kibana-pull}132494[#132494] -* Adds updated `essql` expression function {kibana-pull}132332[#132332] -* Adds a "get all" REST API for data views: `GET /api/data_views` {kibana-pull}131683[#131683] - -Maps:: -* Automatically display the maps legend {kibana-pull}136872[#136872] -* Custom raster source example plugin {kibana-pull}136761[#136761] -* Label zoom range style property {kibana-pull}136690[#136690] -* Adjust icon size when cluster resolution changes {kibana-pull}136573[#136573] -* Adds context for 'No longer contained' geo-containment alert {kibana-pull}136451[#136451] -* Keydown+scroll to zoom {kibana-pull}135330[#135330] -* Synchronize map views in dashboard and canvas {kibana-pull}134272[#134272] -* Adds spatial filter from cluster {kibana-pull}133673[#133673] -* Customizable colors in basemaps {kibana-pull}131576[#131576] - -Observability:: -* Prefer DataView client over SavedObjects client when possible {kibana-pull}136694[#136694] -* Use proper header nesting {kibana-pull}136559[#136559] -* Removes "no data" redirects for observability overview {kibana-pull}136442[#136442] -* Allow connectors to explicitly register which features they will be available in {kibana-pull}136331[#136331] -* Display node details metrics for kubernetes containers {kibana-pull}135585[#135585] -* Replace sourceId with mandatory logView prop in LogStream component {kibana-pull}134850[#134850] -* Backend operation distribution chart {kibana-pull}134561[#134561] -* Display top spans for operation {kibana-pull}134179[#134179] -* Show descriptive loading, empty and error states in the metrics table {kibana-pull}133947[#133947] -* Backend operations detail view + metric charts {kibana-pull}133866[#133866] -* Backend operations list view {kibana-pull}133653[#133653] - -Platform:: -* Upgrade Kibana logs to ECS 8.4 {kibana-pull}136362[#136362] -* Adds error messaging to the report contents when there is a timeout in page setup {kibana-pull}134868[#134868] -* Adds migrations.discardCorruptObjects flag {kibana-pull}132984[#132984] -* Adds migrations.discardUnknownObjects flag {kibana-pull}132167[#132167] - -Querying & Filtering:: -Hides the tour component when the hideAnnouncements uiSetting is on {kibana-pull}135990[#135990] - -Security:: -Eliminates the need for a full page reload when navigating to a user profile page {kibana-pull}135543[#135543] - -[float] -[[fixes-v8.4.0]] -=== Bug fixes -Alerting:: -* Error message hidden after closing action accordion {kibana-pull}136570[#136570] -* Allow wildcard search on rule's name and tags {kibana-pull}136312[#136312] - -Canvas:: -* Fixes Filter not saving the selected Sort field option {kibana-pull}136085[#136085] -* Fixes "Element status" is inaccurate for grouped elements {kibana-pull}135829[#135829] -* Fixes Canvas filter behaviour on table {kibana-pull}134801[#134801] -* Fixes Uploaded asset not being saved {kibana-pull}133166[#133166] -* Lines operations keybindings {kibana-pull}132914[#132914] -* Fixes pointseries don't get updated on datasource change {kibana-pull}132831[#132831] - -Connectors:: -* Fixing ES index connector so that it can index into data streams as well as indices {kibana-pull}136011[#136011] -* Verify emails when creating an email connector, even if allowedDomain {kibana-pull}133859[#133859] - -Dashboard:: -Fixes Copy to dashboard includes filters {kibana-pull}136275[#136275] - -Discover:: -* Fixes hiding histogram for rollup data views {kibana-pull}137157[#137157] -* Fixes filtering out custom meta fields of Elasticsearch plugins enhanced documents {kibana-pull}137147[#137147] -* Disables refresh interval for data views without time fields and rollups {kibana-pull}137134[#137134] -* Fixes Discover breadcrumb losing context after page refresh or when opening in a new tab {kibana-pull}136749[#136749] -* Improves support for pinned filters in surrounding documents {kibana-pull}135722[#135722] -* Fixes flaky accessibility functional tests {kibana-pull}135596[#135596] -* Improves alerts popover accessibility and semantics {kibana-pull}135270[#135270] -* Migrate from savedObjectsClient to dataViews and fix the displayed data view name {kibana-pull}135142[#135142] -* Removes _type of metaFields to remove of sidebar {kibana-pull}134453[#134453] -* Fixes legacy sort parameter provided by URL {kibana-pull}134447[#134447] -* Make footer visible under Document Explorer if sample size is less than hits number {kibana-pull}134231[#134231] -* Do not update defaultIndex in case of insufficient permissions {kibana-pull}134202[#134202] -* Fixes flaky test for "allows editing of a newly created field" {kibana-pull}132812[#132812] -* Fixes flaky test for "context encoded URL params" {kibana-pull}132808[#132808] - -Elastic Security:: -For the Elastic Security 8.4.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -Using point in time for agent status query to avoid discrepancy {kibana-pull}135816[#135816] - -Lens & Visualizations:: -* Make reference line chart more robust in *Lens* {kibana-pull}137101[#137101] -* Format the label with the right default formatter in *TSVB* {kibana-pull}136934[#136934] -* Removes extra space from the legend when it is positioned on top/bottom {kibana-pull}135982[#135982] -* Display Y-axis tick labels {kibana-pull}135976[#135976] -* Fixes Date histogram bounds calculation doesn't update "now" {kibana-pull}135899[#135899] -* Fixes internal links in *Vega* {kibana-pull}135890[#135890] -* Do not set non-unique id for legend action popovers in *Lens* {kibana-pull}135656[#135656] -* Fixes non-editable Lens panel when using prefix wildcard in *Lens* {kibana-pull}135654[#135654] -* Removes saved search references from all places on unlink in *Visualize* {kibana-pull}135628[#135628] -* Fix multi-field top values for Heatmap visualizations in *Lens* {kibana-pull}135581[#135581] -* Fixes styling issues in *Lens* {kibana-pull}135406[#135406] -* Show badge for read-only in *Lens* {kibana-pull}135313[#135313] -* Don't let reference line fills on different axes collide in *Lens* {kibana-pull}135299[#135299] -* Fixes css specificity issue in *TSVB* {kibana-pull}135245[#135245] -* Always show palette on first dimension for mosaic in *Lens* {kibana-pull}135198[#135198] -* Wrong `visType` for `horizontal_bar` visualization {kibana-pull}135013[#135013] -* Unlinking Some Agg Based Visualizations Results in Unsaved Changes in *Visualize* {kibana-pull}134229[#134229] -* Fixes an issue where ellipsis truncation is not visible in table visualization cells, and letters are cut off in *Lens* {kibana-pull}134065[#134065] -* Switching dashboard mode doesn't update missing data view prompt in *Visualize* {kibana-pull}133873[#133873] -* Fixes application of suffix formats in *Lens* {kibana-pull}133780[#133780] -* Error messages not centered in *TSVB* {kibana-pull}133288[#133288] -* Use correct time zone for time shifting {kibana-pull}133141[#133141] - -Machine Learning:: -* Lock the delete annotation button on click {kibana-pull}137306[#137306] -* Fixes globally pinned filters in Data visualizer and query search bar not clearing properly for saved searches {kibana-pull}136897[#136897] -* Fixes overflow in start datafeed modal {kibana-pull}136292[#136292] -* Fixes error in categorization wizard summary step {kibana-pull}134228[#134228] -* Fixes flaky job selection on the Anomaly Explorer page {kibana-pull}137596[#137596] -* Fixes query in the Anomaly Explorer when viewing a job with no influencers {kibana-pull}137670[#137670] -* Fixes the Dashboard saving indicator with Anomaly Swim Lane embeddable {kibana-pull}137989[#137989] -* Anomaly detection job wizards now use data view names {kibana-pull}138255[#138255] - -Management:: -* The ILM UI now supports configuring policies with rollover based on `max_primary_shard_docs` {kibana-pull}137364[#137364] -* Fixes a bug in Console when sending a request with encoded characters resulted in an error {kibana-pull}136788[#136788] -* Fixes a bug where the autocomplete popup remains open when navigating away from Console {kibana-pull}136268[#136268] -* Fixes a bug in Index Management where the number of documents for an index could appear wrong {kibana-pull}135748[#135748] -* Fixes a bug in the Painless code editor that was incorrectly handling expressions with multiple division operators {kibana-pull}135423[#135423] -* Transforms: Fixes unsupported boolean filter when cloning {kibana-pull}137773[#137773] -* Transforms: Fixes restoring a field name with the exists filter aggregation {kibana-pull}138630[#138630] -* Transforms: Fixes data view error on cloning due to missing indices {kibana-pull}138756[#138756] -* Fixes Watcher stuck firing state {kibana-pull}138563[#138563] - -Maps:: -* Fixes "other" is always shown in legend for category styling rules {kibana-pull}137008[#137008] -* Fixes Tooltip loses pages on refresh {kibana-pull}135593[#135593] -* Fixes Pinned filters should be visible on new maps without user having to do any action on layers {kibana-pull}135465[#135465] -* Keep timeframe when editing a map from a dashboard {kibana-pull}135374[#135374] -* Reduce precision of coordinates for geo imports {kibana-pull}135133[#135133] -* Fixes onDataLoadEnd and onDataLoadError event handler callbacks only called for source data requests {kibana-pull}134786[#134786] -* Fixes sort not applied to vector tile search request {kibana-pull}134607[#134607] -* Fixes array values out of order in tooltips {kibana-pull}134588[#134588] - -Monitoring:: -Removes beta icon from logstash pipeline {kibana-pull}131752[#131752] - -Observability:: -* Invalid array value is permitted in Origin Headers for RUM configuration {kibana-pull}137228[#137228] -* When comparison feature is disabled, we still see the shaded area {kibana-pull}137223[#137223] -* Fixes responsivity Alert Summary chart in the Rule details page {kibana-pull}137175[#137175] -* Fixes custom link filter select value {kibana-pull}137025[#137025] -* Fixes Spark plots loading state when there are no data {kibana-pull}136817[#136817] -* Adds support for metrics for latency distribution histogram {kibana-pull}136594[#136594] -* Navigation from Span to Service breaks due to wrong transactionType {kibana-pull}136569[#136569] -* Breadcrumbs not updating from service jump on service map {kibana-pull}136144[#136144] -* Adds support for metrics for latency distribution histogram {kibana-pull}136083[#136083] -* Disallow spaces in index pattern {kibana-pull}135977[#135977] -* WrappedElasticsearchClientError: Request aborted {kibana-pull}135752[#135752] -* Fixes waterfall skew due to accordion left margins {kibana-pull}135544[#135544] -* Service inventory: detailed stats fetched for all services {kibana-pull}134844[#134844] -* Update network fields {kibana-pull}134471[#134471] -* Fixes Metrics Table Pod link to Details Page {kibana-pull}134354[#134354] -* Adds last updated at label and fix started at label {kibana-pull}134254[#134254] -* Adds event module filter to metrics table {kibana-pull}133872[#133872] -* APM Correlations: Fixes chart errors caused by inconsistent histogram range steps {kibana-pull}138259[#138259] - -Platform:: -* Migrations wait for index status green if create index returns acknowledged=false or shardsAcknowledged=false {kibana-pull}136605[#136605] -* Fixes CSV generator to include unmapped fields in the search source {kibana-pull}132972[#132972] -Security:: -Fixes keyboard and screen reader navigation for the spaces selector {kibana-pull}134454[#134454] - -[[release-notes-8.3.3]] -== {kib} 8.3.3 - -Review the following information about the {kib} 8.3.3 release. - -[float] -[[breaking-changes-8.3.3]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.3.3. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.3.3]] -=== Bug fixes -Dashboard:: -* Fixes `z-index` of `embPanel__header--floater` {kibana-pull}136463[#136463] -* Filter out experimental visualizations when labs setting is disabled {kibana-pull}136332[#136332] - -Discover:: -Fixes filter in / filter out buttons for empty values {kibana-pull}135919[#135919] - -Elastic Security:: -For the Elastic Security 8.3.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Pass start_time to actions when the maintenance window for rolling upgrades is set to immediately {kibana-pull}136384[#136384] -* Allow agent bulk actions without specific licence restrictions {kibana-pull}136334[#136334] -* Adds reinstall button to integration settings page {kibana-pull}135590[#135590] - -Lens & Visualizations:: -Fixes normalizeTable performance bottleneck in *Lens* {kibana-pull}135792[#135792] - -[[release-notes-8.3.2]] -== {kib} 8.3.2 - -Review the following information about the {kib} 8.3.2 release. - -[float] -[[breaking-changes-8.3.2]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.3.2. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.3.2]] -=== Bug fixes -Alerting:: -Fixes an issue where alerting rules that were created or edited in 8.2.0 stopped running when you upgraded {kib} to 8.3.0 or 8.3.1 {kibana-pull}135663[#135663] - -Discover:: -* Hide Alerts menu item when user does not have access to Stack Rules {kibana-pull}135655[#135655] -* Fixes loading of a single doc JSON when using index alias based data views {kibana-pull}135446[#135446] - -Elastic Security:: -For the Elastic Security 8.3.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -Keep all agents selected in query selection mode {kibana-pull}135530[#135530] - -Machine Learning:: -* Fixes put anomaly detection job endpoint when payload contains datafeed {kibana-pull}134986[#134986] -* Fixes trained model map associating wrong model to job {kibana-pull}134849[#134849] -* Use time range when validating datafeed preview {kibana-pull}134073[#134073] - -Maps:: -* Do not show layer error for term joins when terms aggregation does not return results {kibana-pull}135564[#135564] -* Fixes Vector map layers will not render when runtime field has '%' {kibana-pull}135491[#135491] - -[[release-notes-8.3.1]] -== {kib} 8.3.1 - -Review the following information about the {kib} 8.3.1 release. - -[float] -[[known-issues-8.3.1]] -=== Known issues - -[discrete] -[[known-issue-133965]] -.URL arguments cause API requests in Dev Tools to fail -[%collapsible] -==== -*Details* + -When you add any URL arguments, such as `?v` or `?pretty`, to API requests, the requests fail {kibana-issue}133965[#133965] - -*Impact* + -The known issue only impacts {kib} Dev Tools. All other sources of API requests are unaffected, such as curl and Elastic Cloud API console. -==== - -[discrete] -[[known-issue-alerting-rule]] -.Alerting rules stop running when you upgrade to 8.3.0 or 8.3.1 -[%collapsible] -==== -*Details* + -In 8.3.0 and 8.3.1, there is a known issue where alerting rules that were created or edited in 8.2.0 stop running when you upgrade {kib}. When you upgrade to 8.3.0 or 8.3.1, and your alerting rules have stopped running, the following error appears: - -[source,text] ----- -:: execution failed - security_exception: [security_exception] Reason: missing authentication credentials for REST request [/_security/user/_has_privileges], caused by: "" ----- - -*Impact* + -If you have upgraded to 8.3.0 or 8.3.1, and your alerting rules fail, reset the rules by disabling, then re-enabling them. When you disable, then re-enable your alerting rules, {kib} generates a new API key using the credentials of the user that manages the rules. - -To disable, then re-enable your alerting rules: - -. Open the main menu, then click *{stack-manage-app} > {rac-ui}*. - -. Select the failed alerting rules. - -. Click **Manage rules > Disable**, then click **Manage rules > Enable**. - -For more details about API key authorization, refer to <>. -==== - -[float] -[[breaking-changes-8.3.1]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.3.1. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.3.1]] -=== Enhancements -Operations:: -Adds EsArchiver datastream support {kibana-pull}132853[#132853] - -[float] -[[fixes-v8.3.1]] -=== Bug fixes -Alerting:: -Prevent negative snooze intervals {kibana-pull}134935[#134935] - -Elastic Security:: -For the Elastic Security 8.3.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Fixes dropping select all {kibana-pull}135124[#135124] -* Improves bulk actions for more than 10k agents {kibana-pull}134565[#134565] - -Infrastructure:: -Query persistent queue size for metricbeat documents {kibana-pull}134569[#134569] - -Observability:: -* Fixes a bug that displayed a toast error when deleting a rule {kibana-pull}135132[#135132] -* Fixes viewInAppUrl for custom metrics for Inventory Threshold Rule {kibana-pull}134114[#134114] - -Platform:: -* Fixes an issue where importing/copying the same saved object to the same space multiple times using the "Check for existing objects" option could fail or cause duplicates to be created {kibana-pull}135358[#135358] -* Fixes a bug where {es} nodes that stopped, then started again, were unreachable by {kib} for a given amount of requests when {kib} was configured to connect to multiple {es} nodes {kibana-pull}134628[#134628] - -[[release-notes-8.3.0]] -== {kib} 8.3.0 - -Review the following information about the {kib} 8.3.0 release. - -[float] -[[known-issues-8.3.0]] -=== Known issues - -Alerting users who are running 8.2 should not upgrade to either 8.3.0 or 8.3.1. -Both 8.3.0 and 8.3.1 have a bug where alerting rules that were created or edited -in 8.2 will stop running on upgrade. If you have upgraded to 8.3.0 or 8.3.1 and -your alerting rules have stopped running with an error similar to the following -example, you will need to go to *{stack-manage-app} > {rac-ui}*, multi-select -the failed rules, click on **Manage rules > Disable** and then click on **Manage -rules > Enable**. Disabling and re-enabling the rule will generate a new API key -using the credentials of the user performing these actions and reset the rule -state. For more details about API key authorization, refer to -<>. - -Example error message:: - -[source,text] ----- -:: execution failed - security_exception: [security_exception] Reason: missing authentication credentials for REST request [/_security/user/_has_privileges], caused by: "" ----- - -[float] -[[breaking-changes-8.3.0]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -[discrete] -.Removes Quandl and Graphite integrations -[%collapsible] -==== -*Details* + -The experimental `.quandl` and `.graphite` functions and advanced settings are removed from *Timelion*. For more information, check {kibana-pull}129581[#129581]. - -*Impact* + -When you use the `vis_type_timelion.graphiteUrls` kibana.yml setting, {kib} successfully starts, but logs a `[WARN ][config.deprecation] You no longer need to configure "vis_type_timelion.graphiteUrls".` warning. - -To leave your feedback about the removal of `.quandl` and `.graphite`, go to the link:https://discuss.elastic.co/c/elastic-stack/kibana/7[discuss forum]. -==== - -[discrete] -.Makes Osquery All with All base privilege -[%collapsible] -==== -*Details* + -The Osquery {kib} privilege has been updated, so that when the *Privileges for all features level* is set to *All*, this now applies *All* to Osquery privileges as well. Previously, users had to choose the *Customize* option to grant any access to Osquery. For more information, refer to {kibana-pull}130523[#130523]. - -*Impact* + -This impacts user roles that have *Privileges for all features* set to *All*. After this update, users with this role will have access to the Osquery page in {kib}. However, to use the Osquery feature fully, these requirements remain the same: users also need Read access to the logs-osquery_manager.result* index and the Osquery Manager integration must be deployed to Elastic Agents. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[deprecations-8.3.0]] -=== Deprecations - -The following functionality is deprecated in 8.3.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.3.0. - -[discrete] -[[deprecation-132790]] -.Removes `apm_user` -[%collapsible] -==== -*Details* + -Removes the `apm_user` role. For more information, check {kibana-pull}132790[#132790]. - -*Impact* + -The `apm_user`role is replaced with the `viewer` and `editor` built-in roles. -==== - -[discrete] -[[deprecation-132562]] -.Deprecates input controls -[%collapsible] -==== -*Details* + -The input control panels, which allow you to add interactive filters to dashboards, are deprecated. For more information, check {kibana-pull}132562[#132562]. - -*Impact* + -To add interactive filters to your dashboards, use the link:https://www.elastic.co/guide/en/kibana/8.3/add-controls.html[new controls]. -==== - -[discrete] -[[deprecation-131636]] -.Deprecates anonymous authentication credentials -[%collapsible] -==== -*Details* + -The apiKey, including key and ID/key pair, and `elasticsearch_anonymous_user` credential types for anonymous authentication providers are deprecated. For more information, check {kibana-pull}131636[#131636]. - -*Impact* + -If you have anonymous authentication provider configured with apiKey or `elasticsearch_anonymous_user` credential types, a deprecation warning appears, even when the provider is not enabled. -==== - -[discrete] -[[deprecation-131166]] -.Deprecates v1 and v2 security_linux and security_windows jobs -[%collapsible] -==== -*Details* + -The v1 and v2 job configurations for security_linux and security_windows are deprecated. For more information, check {kibana-pull}131166[#131166]. - -*Impact* + -The following security_linux and security_windows job configurations are updated to v3: - -* security_linux: - -** v3_linux_anomalous_network_activity -** v3_linux_anomalous_network_port_activity_ecs -** v3_linux_anomalous_process_all_hosts_ecs -** v3_linux_anomalous_user_name_ecs -** v3_linux_network_configuration_discovery -** v3_linux_network_connection_discovery -** v3_linux_rare_metadata_process -** v3_linux_rare_metadata_user -** v3_linux_rare_sudo_user -** v3_linux_rare_user_compiler -** v3_linux_system_information_discovery -** v3_linux_system_process_discovery -** v3_linux_system_user_discovery -** v3_rare_process_by_host_linux_ecs - -* security_windows: - -** v3_rare_process_by_host_windows_ecs -** v3_windows_anomalous_network_activity_ecs -** v3_windows_anomalous_path_activity_ecs -** v3_windows_anomalous_process_all_hosts_ecs -** v3_windows_anomalous_process_creation -** v3_windows_anomalous_script -** v3_windows_anomalous_service -** v3_windows_anomalous_user_name_ecs -** v3_windows_rare_metadata_process -** v3_windows_rare_metadata_user -** v3_windows_rare_user_runas_event -** v3_windows_rare_user_type10_remote_login -==== - -[discrete] -[[deprecation-130336]] -.Updates the default legend size -[%collapsible] -==== -*Details* + -In the *Lens* visualization editor, the *Auto* default for *Legend width* has been deprecated. For more information, check {kibana-pull}130336[#130336]. - -*Impact* + -When you create *Lens* visualization, the default for the *Legend width* is now *Medium*. -==== - -[discrete] -[[deprecation-122075]] -.Deprecates `xpack.data_enhanced.*` -[%collapsible] -==== -*Details* + -In kibana.yml, the `xpack.data_enhanced.*` setting is deprecated. For more information, check {kibana-pull}122075[#122075]. - -*Impact* + -Use the `data.*` configuration parameters instead. -==== - -[float] -[[features-8.3.0]] -=== Features - -{kib} 8.3.0 adds the following new and notable features. - -Alerting:: -* Adds circuit breaker for max number of actions by connector type {kibana-pull}128319[#128319] -* Adds `bulkEdit` method to alerting rulesClient and internal _bulk_edit API, that allow bulk editing of rules {kibana-pull}126904[#126904] - -Cases:: -* Adds average time to close metric in Cases {kibana-pull}131909[#131909] -* View all alerts attached to a case in the alerts table. The feature is experimental {kibana-pull}131883[#131883] -* Adds severity field to Cases {kibana-pull}131626[#131626] -* Adds the ability to delete comments in Cases {kibana-pull}130254[#130254] - -Dashboard:: -Enables the new controls by default {kibana-pull}131341[#131341] - -Discover:: -* To enable Threshold Alerts, adds the ability to edit dataView, query, & filters {kibana-pull}131688[#131688] -* To enable Threshold Alerts, extended the {es} query rule with search source-based data fetching {kibana-pull}124534[#124534] - -Elastic Security:: -For the Elastic Security 8.3.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -Changes to agent upgrade modal to allow for rolling upgrades {kibana-pull}132421[#132421] - -Lens & Visualizations:: -* Adds method to re-link visualizations with missing `SavedSearch` {kibana-pull}132729[#132729] -* Adds support of Data View switching for Agg-Based visualizations {kibana-pull}132184[#132184] - -Machine Learning:: -* Adds the ability to create anomaly detection jobs from Lens visualizations {kibana-pull}129762[#129762] -* Adds trained model testing for additional pytorch models {kibana-pull}129209[#129209] - -Management:: -* Adds saved object relationships to data view management {kibana-pull}132385[#132385] -* Adds support for feature_states {kibana-pull}131310[#131310] - -Monitoring:: -Adds the Stack monitoring health API {kibana-pull}132705[#132705] - -Observability:: -* Adds the ability to bulk attach multiple alerts to a Case {kibana-pull}130958[#130958] -* Adds rule details page {kibana-pull}130330[#130330] -* Adds span link {kibana-pull}126630[#126630] -* Adds ML expected model bounds as an option to Comparison controls {kibana-pull}132456[#132456] - -Platform:: -Adds `xyVis` and `layeredXyVis` {kibana-pull}128255[#128255] - -Querying & Filtering:: -Improves the current filter/search experience {kibana-pull}128401[#128401] - -Sharing:: -Adds method to re-link visualizations with missing index-pattern {kibana-pull}132336[#132336] - -For more information about the features introduced in 8.3.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.3.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.3.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.3.0]] -=== Enhancements -Alerting:: -* Adds helper text in the edit rule form about the change in privileges when saving the rule {kibana-pull}131738[#131738] -* Display rule API key owner to users who can manage API keys {kibana-pull}131662[#131662] - -Canvas:: -Fixes reference line overlay {kibana-pull}132607[#132607] - -Cases:: -* Show a warning for deprecated preconfigured connectors {kibana-pull}132237[#132237] -* Reduce space taken by the reporter column in the all cases table {kibana-pull}132200[#132200] -* Adds a tooltip to show truncate tags in Cases {kibana-pull}132023[#132023] -* Adds the ability to create a case from within the selection case modal {kibana-pull}128882[#128882] - -Content Management:: -The list view for Dashboard, Visualize Library, Maps, and Graph has a new "Last updated" column to easily access content that has been recently modified {kibana-pull}132321[#132321] - -Dashboard:: -* Improves the banner {kibana-pull}132301[#132301] -* Adds Analytics No Data Page {kibana-pull}132188[#132188] -* Adds field first control creation {kibana-pull}131461[#131461] -* Make text field based Options list controls case Insensitive {kibana-pull}131198[#131198] -* Allow existing controls to change type {kibana-pull}129385[#129385] - -Discover:: -* Adds an option to hide specified filter actions from SearchBar filter panels {kibana-pull}132037[#132037] -* Adds Analytics No Data Page {kibana-pull}131965[#131965] -* Adds close button to field popover using Document Explorer {kibana-pull}131899[#131899] -* Adds monospace font in Document Explorer {kibana-pull}131513[#131513] -* Adds a tour for Document Explorer {kibana-pull}131125[#131125] -* Display current interval setting {kibana-pull}130850[#130850] -* Adds a direct link from sample data to Discover {kibana-pull}130108[#130108] - -Elastic Security:: -For the Elastic Security 8.3.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Move integration labels below title and normalise styling {kibana-pull}134360[#134360] -* Adds First Integration Multi Page Steps Flow MVP (cloud only) {kibana-pull}132809[#132809] -* Optimize package installation performance, phase 2 {kibana-pull}131627[#131627] -* Adds APM instrumentation for package install process {kibana-pull}131223[#131223] -* Adds "Label" column + filter to Agent list table {kibana-pull}131070[#131070] -* Adds `cache-control` headers to key `/epm` endpoints in Fleet API {kibana-pull}130921[#130921] -* Optimize package installation performance, phase 1 {kibana-pull}130906[#130906] -* Adds experimental features (feature flags) config to fleet plugin {kibana-pull}130253[#130253] -* Adds redesigned Fleet Server flyout {kibana-pull}127786[#127786] - -Lens & Visualizations:: -* Renders no data component if there is no {es} data or dataview in *Visualize* {kibana-pull}132223[#132223] -* Swaps dimensions for mosaic in *Lens* {kibana-pull}131945[#131945] -* Adds log and sqrt scale in *Lens* {kibana-pull}131940[#131940] -* Adds collapse fn to table and xy chart in *Lens* {kibana-pull}131748[#131748] -* Allow filtering on metric vis in *Lens* {kibana-pull}131601[#131601] -* Improved interval input in *Lens* {kibana-pull}131372[#131372] -* Adds the Discover drilldown to *Lens* {kibana-pull}131237[#131237] -* Update defaults for metric vis in *Lens* {kibana-pull}129968[#129968] -* Adds range event annotations in *Lens* {kibana-pull}129848[#129848] -* Adds accuracy mode for Top Values in *Lens* {kibana-pull}129220[#129220] -* Adds type murmur3 into the *Lens* fields list {kibana-pull}129029[#129029] - -Machine Learning:: -* Optimize resize behaviour for the Anomaly Explorer page {kibana-pull}132820[#132820] -* Wizard validation improvements {kibana-pull}132615[#132615] -* Support version fields in anomaly detection wizards {kibana-pull}132606[#132606] -* Context for recovered alerts {kibana-pull}132496[#132496] -* Adding UI for question_answering model testing {kibana-pull}132033[#132033] -* Adds recognized modules links for Index data visualizer {kibana-pull}131342[#131342] -* Anomaly Detection: Adds View in Maps item to Actions menu in the anomalies table {kibana-pull}131284[#131284] -* Adding v3 modules for Security_Linux and Security_Windows and Deprecating v1 + v2 {kibana-pull}131166[#131166] -* Data Frame Analytics creation wizard: add support for filters in saved searches {kibana-pull}130744[#130744] -* Edit job selection on data frame analytics results and map pages {kibana-pull}130419[#130419] -* Resizable/Collapsible Top Influencers section {kibana-pull}130018[#130018] - -Management:: -* Adds context for recovered alerts {kibana-pull}132707[#132707] -* Adds warnings for managed system policies {kibana-pull}132269[#132269] -* Skip empty prompt screen {kibana-pull}130862[#130862] -* Console now supports properly handling multiple requests. For es errors such as `400`, `405` exception results are displayed with successful request results in the order they called {kibana-pull}129443[#129443] -* Display vector tile API response in Console {kibana-pull}128922[#128922] -* Adds option to disable keyboard shortcuts {kibana-pull}128887[#128887] - -Maps:: -* Show marker size in legend {kibana-pull}132549[#132549] -* Fixes marker size scale issue for counts {kibana-pull}132057[#132057] -* Scale marker size by area {kibana-pull}131911[#131911] -* Localized basemaps {kibana-pull}130930[#130930] -* Support term joins for Elasticsearch document source with vector tile scaling {kibana-pull}129771[#129771] -* Allow feature editing for document layers with "applyGlobalTime", "applyGlobalQuery", and joins {kibana-pull}124803[#124803] - -Observability:: -* Bumps synthetics integration package to 0.9.4 {kibana-pull}133423[#133423] -* Immediately re-run monitors in the synthetics service when they're edited {kibana-pull}132639[#132639] -* Enables log flyouts on APM logs tables {kibana-pull}132617[#132617] -* Adds logging to Metric Threshold Rule {kibana-pull}132343[#132343] -* Adds Page load distribution chart to overview page {kibana-pull}132258[#132258] -* Show experimental locations only when a particular flag is enabled {kibana-pull}132063[#132063] -* Trace explorer {kibana-pull}131897[#131897] -* Static Java agent version list becomes stale quickly {kibana-pull}131759[#131759] -* Adds recovery context to Log Threshold rule {kibana-pull}131279[#131279] -* Adds recovery context to the Metric Threshold rule {kibana-pull}131264[#131264] -* Adds context variables to recovery alerts for Inventory Threshold rule {kibana-pull}131199[#131199] -* Copy alert state to alert context and implement alert recovery {kibana-pull}128693[#128693] -* Progressive fetching (experimental) {kibana-pull}127598[#127598] -* Replace environment dropdown with SuggestionsSelect in landing pages and service overview page {kibana-pull}126679[#126679] -* Store Logs UI settings in a dedicated `infrastructure-monitoring-log-view` saved object {kibana-pull}125014[#125014] - -Platform:: -* The saved objects management table has a new "Last updated" column to easily access recently modified saved objects {kibana-pull}132525[#132525] -* Sync panels tooltips on dashboard level {kibana-pull}130449[#130449] - -Querying & Filtering:: -* Support fields custom label on filter editor {kibana-pull}130533[#130533] -* Allows comma delimiter on the filters multiple selections dropdowns {kibana-pull}130266[#130266] - -Security:: -* Disallows creating a role with an existing name in the role management page. Introduces an optional boolean `createOnly` parameter in the create role API to prevent overwriting existing roles; the default value is false, preserving the original API behavior {kibana-pull}132218[#132218] -* Adds experimental `csp.disableUnsafeEval` config option. Set this to `true` to remove the link:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#unsafe_eval_expressions[`unsafe-eval`] source expression from the `script-src` Content Security Policy (CSP) directive. The default value is `false`, which is identical to the original Kibana behavior {kibana-pull}124484[#124484] - -[float] -[[fixes-v8.3.0]] -=== Bug fixes -Alerting:: -* Don't load connectors and connector types when there isn't an encryptionKey {kibana-pull}133335[#133335] -* Adds cloud icon "ess-icon" at the end of the config keys in "alerting" {kibana-pull}131735[#131735] -* Fixes optional spaceId in rules_client {kibana-pull}130704[#130704] - -Content Managment:: -Fixes the listingLimit settings url {kibana-pull}129701[#129701] - -Dashboard:: -* Adds Fatal Error Handling {kibana-pull}133579[#133579] -* Hide in Print Mode {kibana-pull}133446[#133446] -* Send Control State to Reporting Via Locator {kibana-pull}133425[#133425] -* Fixes new controls causing unsaved changes bug {kibana-pull}132850[#132850] - -Design:: -* Keyboard shortcut popup {kibana-pull}133069[#133069] -* Adding aria-label for discover data grid select document checkbox {kibana-pull}131277[#131277] -* Adds item descriptions to edit button screen reader labels in TableListView {kibana-pull}125334[#125334] - -Discover:: -* Hide "Add a field", "Edit" and "Create a data view" buttons in viewer mode {kibana-pull}134582[#134582] -* Unify definition of field names and field descriptions {kibana-pull}134463[#134463] -* Address "Don't call Hooks" React warnings {kibana-pull}134339[#134339] -* Include current filters into "Test query" request {kibana-pull}134184[#134184] -* Prevent rule flyout from being open simultaneously with other popovers like search suggestions {kibana-pull}132108[#132108] -* Fixes link to open new window {kibana-pull}131930[#131930] -* Discover Classic View Filter In/Out placement when `truncate:maxHeight` is set to 0 {kibana-pull}129942[#129942] -* Fixes inconsistent usage of arrow icons on Surrounding documents page {kibana-pull}129292[#129292] -* Show a fallback empty message when no results are found {kibana-pull}128754[#128754] - -Elastic Security:: -For the Elastic Security 8.3.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Bulk reassign kuery optimize {kibana-pull}134673[#134673] -* Fixes flickering tabs layout in add agent flyout {kibana-pull}133769[#133769] -* Adds $ProgressPreference to windows install command in flyout {kibana-pull}133756[#133756] -* Fixes sorting by size on data streams table {kibana-pull}132833[#132833] - -Infrastructure:: -Pass decorated server to routes {kibana-pull}133264[#133264] - -Lens & Visualizations:: -* Hide null cells in Heatmap {kibana-pull}134450[#134450] -* Fixes formula generate error in *Lens* {kibana-pull}134434[#134434] -* Better default for date_range agg in *Visualize* {kibana-pull}134220[#134220] -* Keep suggestions stable in *Lens* {kibana-pull}134212[#134212] -* Fixes voiceover drag and drop in *Lens* {kibana-pull}134196[#134196] -* Fixes palette bug {kibana-pull}134159[#134159] -* Fixes multi index pattern load on the server in *TSVB* {kibana-pull}134091[#134091] -* Fixes axis title visibility bug in *Lens* {kibana-pull}134082[#134082] -* Fixes broken drilldowns for gauges and heatmaps in *Lens* {kibana-pull}134008[#134008] -* Fixes application of suffix formats in *Lens* {kibana-pull}133780[#133780] -* Do not show edit field for record field in *Lens* {kibana-pull}133762[#133762] -* Fixes discover drilldown for non-time field case in *Lens* {kibana-pull}133334[#133334] -* Do not reset session on Lens load with filters in *Lens* {kibana-pull}133191[#133191] -* Fixes transition issue in *Lens* {kibana-pull}132956[#132956] -* Escape label in lodash set command in *TSVB* {kibana-pull}132932[#132932] -* Changing the `Data View` logic with an initially missed `Data View` does not work in *TSVB* {kibana-pull}132796[#132796] -* Terms with keyword field with "numbers" is displayed with a weird date in *TSVB* {kibana-pull}132226[#132226] -* TSVB] Chart is failing when the user tries to add a percentile_rank {kibana-pull}132105[#132105] -* Fixes metric label font size in *Visualize* {kibana-pull}132100[#132100] -* Datatable: Do not apply truncation in value popover in *Lens* {kibana-pull}132005[#132005] -* Fixes percentile rank math in *TSVB* {kibana-pull}132003[#132003] -* Fixes timezone bucket shift in *Timelion* {kibana-pull}131213[#131213] -* Fixes vega controls layout in *Vega* {kibana-pull}130954[#130954] -* Fixes requesting not permitted or used data views in *Timelion* {kibana-pull}130899[#130899] -* Fixed bugs when using `include/exclude` options for Terms in *TSVB* {kibana-pull}130884[#130884] -* Make series agg work after math in *TSVB* {kibana-pull}130867[#130867] -* Use elastic-charts axis calculation in *Lens* {kibana-pull}130429[#130429] -* Make suggestions depend on active data in *Lens* {kibana-pull}129326[#129326] -* Adds back setMapView function in *Vega* {kibana-pull}128914[#128914] -* Fixes the Order by setting for split chart in metric and custom metric visualizations {kibana-pull}128185[#128185] - -Machine Learning:: -* Fixes creation of the custom URLs for Kibana Dashboard {kibana-pull}134248[#134248] -* Fixes expanded row stats not loading all correctly whenever sort by cardinality {kibana-pull}134113[#134113] -* Fixes Data visualizer showing 0 count in the doc count chart even though documents do exist {kibana-pull}134083[#134083] -* Fixes querying anomalies for the Single Metric Viewer {kibana-pull}133419[#133419] -* Fixes Anomaly Charts filtering based on the swim lane job selection {kibana-pull}133299[#133299] -* Fixes handling of unrecognised URLs {kibana-pull}133157[#133157] -* Prevent duplicate field selection in detector modal {kibana-pull}133018[#133018] -* Fixes single metric job with doc_count field {kibana-pull}132997[#132997] -* Hide job messages clear notifications tooltip on click {kibana-pull}132982[#132982] -* Filtering category runtime fields in advanced wizard {kibana-pull}132916[#132916] -* Fixes trained model testing so it is available for users with ML read permissions {kibana-pull}132698[#132698] -* Adding type for job summary state {kibana-pull}131643[#131643] - -Management:: -* Fixes linebreaks (\r\n) mis-applied from history {kibana-pull}131037[#131037] -* Fixes Kibana DevTool Copy as CURL does not url encode special chars in indice date math {kibana-pull}130970[#130970] -* Fixes cat APIs returning as escaped string {kibana-pull}130638[#130638] -* Fixes Elasticsearch doc VIEW IN CONSOLE will clean local Kibana console form history {kibana-pull}127430[#127430] - -Maps:: -* Fixes icon markers fail to load when browser zoomed out {kibana-pull}134367[#134367] -* Hide create filter UI in canvas {kibana-pull}133943[#133943] -* Use label features from ES vector tile search API to fix multiple labels {kibana-pull}132080[#132080] -* Fixes Map panels should not show the user controls in a dashboard report {kibana-pull}131970[#131970] -* Show "no results" found for vector tile aggregations when there are no results {kibana-pull}130821[#130821] - -Monitoring:: -* Prevent exceptions in rule when no data present {kibana-pull}131332[#131332] -* Fixes displaying ES version for external collection {kibana-pull}131194[#131194] -* Fixes node type detection for external collection {kibana-pull}131156[#131156] -* Use server.publicBaseUrl in Alert links {kibana-pull}131154[#131154] - -Observability:: -* Fixes x-axis on error charts {kibana-pull}134193[#134193] -* Display ENVIRONMENT_ALL label instead of value {kibana-pull}133616[#133616] -* Fixes normalizers to not parse list values if they are already parsed {kibana-pull}133563[#133563] -* Change bucket_scripts to use params for thresholds {kibana-pull}133214[#133214] -* Use Observability rule type registry for list of rule types {kibana-pull}132484[#132484] -* APM anomaly rule type should appear in observability rules page {kibana-pull}132476[#132476] -* Fixes monitors details page errors {kibana-pull}132196[#132196] -* Set a valid `service_name` for python APM onboarding {kibana-pull}131959[#131959] -* Rename service groups template titles and links {kibana-pull}131381[#131381] -* Show service group icon only for service groups {kibana-pull}131138[#131138] -* Refactor Metric Threshold rule to push evaluations to Elasticsearch {kibana-pull}126214[#126214] -* Ellipsis truncation issue - dependencies and service section {kibana-pull}122203[#122203] -* Fixes lookback window for anomalies for anomaly alert {kibana-pull}93389[#93389] - -Operations:: -Fixes error handling on precommit hook {kibana-pull}132998[#132998] - -Platform:: -Prevents Kibana from bootlooping during migrations when Elasticsearch routing allocation settings are incompatible {kibana-pull}131809[#131809] - -Querying & Filtering:: -Allows the negative character on the number type fields {kibana-pull}130653[#130653] - -Reporting:: -Remove controls from reports {kibana-pull}134240[#134240] - -Security:: -* Session view process events index will now match on prefixed index {kibana-pull}133984[#133984] -* Timestamp issue fix + updated Jest to include mock date format {kibana-pull}132290[#132290] -* Session view alerts loading improvements, and other polish / bug fixes {kibana-pull}131773[#131773] - -[[release-notes-8.2.3]] -== {kib} 8.2.3 - -Review the following information about the {kib} 8.2.3 release. - -[float] -[[breaking-changes-8.2.3]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.2.2. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.2.3]] -=== Bug fixes -Elastic Security:: -For the Elastic Security 8.2.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Elastic Agent integration now installs automatically if agent monitoring is turned on in the agent policy {kibana-pull}133530[#133530] -* Removes {beats} tutorials from the Elastic Stack category {kibana-pull}132957[#132957] -Management:: -Fixes an edge case in the Inspector request selector where duplicate request names could result in a UI bug {kibana-pull}133511[#133511] -Operations:: -Fixes an issue where `node.options` was reset between upgrades in deb and rpm packages {kibana-pull}133249[#133249] -Platform:: -defaultIndex attribute was migrated for config saved object {kibana-pull}133339[#133339] - -[[release-notes-8.2.2]] -== {kib} 8.2.2 - -Review the following information about the {kib} 8.2.2 release. - -[float] -[[breaking-changes-8.2.2]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.2.2. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.2.2]] -=== Bug fix -Machine Learning:: -Fixes width of icon column in Messages table {kibana-pull}132444[#132444] - -[[release-notes-8.2.1]] -== {kib} 8.2.1 - -Review the following information about the {kib} 8.2.1 release. - -[float] -[[breaking-changes-8.2.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.2.1. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.2/release-notes-8.2.0.html#breaking-changes-8.2.0[8.2.0] | {kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.2.1]] -=== Enhancements -Elastic Security:: -For the Elastic Security 8.2.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Monitoring:: -* Adds the ability collect Telemetry {kibana-pull}130498[#130498] -* Adds the ability to report panels in dashboards by type {kibana-pull}130166[#130166] - -[float] -[[fixes-v8.2.1]] -=== Bug fixes -Discover:: -* Fixes Document Explorer infinite height growth {kibana-pull}131723[#131723] -* Fixes links in helper callouts {kibana-pull}130873[#130873] -Elastic Security:: -For the Elastic Security 8.2.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Removes legacy component templates on package install {kibana-pull}130758[#130758] -Lens & Visualizations:: -* Fixes time shift bug in *Lens* {kibana-pull}132000[#132000] -* Fixes single color palette configuration {kibana-pull}131128[#131128] -Machine Learning:: -* Removes alerting_rules from general job list items {kibana-pull}131936[#131936] -* Fixes management app docs links {kibana-pull}130776[#130776] -Management:: -* Restores data view management field type conflict detail modal {kibana-pull}132197[#132197] -* Fixes test data for import and export between versions tests {kibana-pull}131470[#131470] -* Fixes condition auto-completion for templates in Console {kibana-pull}126881[#126881] -Maps:: -* Fixes background tiles in a map panel might not load in a screenshot report {kibana-pull}131185[#131185] -Observability:: -* Services without application metrics display an error {kibana-pull}131347[#131347] -* Correctly interprets the `resetting` and `reverting` job states {kibana-pull}129570[#129570] -Platform:: -* Migrations incorrectly detects cluster routing allocation setting as incompatible {kibana-pull}131712[#131712] -* Fixes resetting image values {kibana-pull}131610[#131610] -* Fixes a bug causing the newsfeed to not be properly displayed in locales other than english {kibana-pull}131315[#131315] - -[[release-notes-8.2.0]] -== {kib} 8.2.0 - -Review the following information about the {kib} 8.2.0 release. - -[float] -[[known-issue-v8.2.0]] -=== Known issue - -Lens & visualizations:: -A change in the Markdown library that {kib} uses to create *TSVB* *Markdown* visualizations and *Text* dashboard panels renders some tables differently. For more information, check out link:https://github.com/markdown-it/markdown-it/pull/767[#767]. - -[float] -[[breaking-changes-8.2.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.2.0. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.1/release-notes-8.1.0.html#breaking-changes-8.1.0[8.1.0] | {kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[features-8.2.0]] -=== Features -{kib} 8.2.0 adds the following new and notable features. - -Alerting:: -* Keep the number_of_scheduled_actions in event log {kibana-pull}128438[#128438] -* Remove defaultRuleTaskTimeout and set ruleType specific timeout from kibana.yml {kibana-pull}128294[#128294] -* Limit the executable actions per rule execution {kibana-pull}128079[#128079] and {kibana-pull}126902[#126902] - -Cases:: -* Adds Cases to the Stack Management page as a technical preview feature {kibana-pull}125224[#125224] - -Dashboard:: -* Adds time slider control {kibana-pull}128305[#128305] -* Adds Control group search settings {kibana-pull}128090[#128090] -* Adds hierarchical chaining setting to Controls {kibana-pull}126649[#126649] -* Adds options list API and validation system {kibana-pull}123889[#123889] - -Discover:: -* Enables document explorer by default {kibana-pull}125485[#125485] -* Adds `Copy to clipboard` ability for column name of Document Explorer {kibana-pull}123892[#123892] - -Elastic Security:: -For the Elastic Security 8.2.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Lens & Visualizations:: -* Adds manual annotations in *Lens* {kibana-pull}126456[#126456] -* Adds multi-field group by in *TSVB* {kibana-pull}126015[#126015] -* Adds ability to navigate to *Lens* with your current *TSVB* configuration {kibana-pull}114794[#114794] - -Machine Learning:: -* Add link to maps in charts section of Anomaly Explorer {kibana-pull}128697[#128697] -* Testing trained models in UI {kibana-pull}128359[#128359] -* Space aware trained models {kibana-pull}123487[#123487] - -Management:: -* Adds support for auto-complete for data streams {kibana-pull}126235[#126235] -* Adds ability to filter Data View UI for runtime fields {kibana-pull}124114[#124114] -* Adds ability to share data views across spaces via data view management {kibana-pull}123991[#123991] - -Observability:: -* Adds button which allows users to signup for the Synthetics service public beta {kibana-pull}128798[#128798] -* Adds "View in App URL" {{context.viewInAppUrl}} variable to the rule templating language {kibana-pull}128281[#128281] -* Adds "View in App URL" {{context.viewInAppUrl}} variable to the rule templating language {kibana-pull}128243[#128243] -* Adds "View in App URL" {{context.viewInAppUrl}} variable to the rule templating language {kibana-pull}127890[#127890] -* Adds view in app url as an action variable in the alert message for uptime app {kibana-pull}127478[#127478] - -For more information about the features introduced in 8.2.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.2.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.2.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.2.0]] -=== Enhancements -Alerting:: -* Adds error logs in rule details page {kibana-pull}128925[#128925] -* Simplify error banner on rules {kibana-pull}128705[#128705] -* Adds Previous Snooze button {kibana-pull}128539[#128539] -* Adds Snooze UI and Unsnooze API {kibana-pull}128214[#128214] -* Adds aggs to know how many rules are snoozed {kibana-pull}128212[#128212] -* Adds a connector for xMatters {kibana-pull}122357[#122357] - -Dashboard:: -* Adds option to open dashboard drilldowns in new tab or window {kibana-pull}125773[#125773] -* Adds range slider Control {kibana-pull}125584[#125584] - -Discover:: -Adds ability to edit histogram as vis {kibana-pull}125705[#125705] - -Elastic Security:: -For the Elastic Security 8.2.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.2.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Merge settings & mappings component template in @package {kibana-pull}128498[#128498] -* Redesign agent flyout {kibana-pull}128381[#128381] -* Adds a link from agent details page to agent dashboard {kibana-pull}127882[#127882] -* Update add agent instructions in fleet managed mode for Kubernetes {kibana-pull}127703[#127703] -* Added time_series_metric mapping for metric_type package field {kibana-pull}126322[#126322] -* Added support for dimension field {kibana-pull}126257[#126257] -* Refactor auto upgrade package policies logic {kibana-pull}125909[#125909] -* Move mappings from index template to component template {kibana-pull}124013[#124013] - -Lens & Visualizations:: -* Adds normalize_by_unit function and option in *Lens* {kibana-pull}128303[#128303] -* Adds suffix formatter in *Lens* {kibana-pull}128246[#128246] -* Adds Xy gap settings in *Lens* {kibana-pull}127749[#127749] -* Implements null instead of zero switch in *Lens* {kibana-pull}127731[#127731] -* Adds ability to include empty rows setting for date histogram in *Lens* {kibana-pull}127453[#127453] -* Adds support for multi rows headers for the table visualization in *Lens* {kibana-pull}127447[#127447] -* Adds ability to open *Lens* visualizations in *Discover* from dashboards {kibana-pull}127355[#127355] -* Auto-set exists filtering for last value in *Lens* {kibana-pull}127251[#127251] -* Adds ability to include number of values in default terms field label in *lens* {kibana-pull}127222[#127222] -* Adds ability to drop partial buckets option in *Lens* {kibana-pull}127153[#127153] -* Addds ability to allow top metric for last value in *Lens* {kibana-pull}127151[#127151] -* Improves Datatable content height with custom row height in *Lens* {kibana-pull}127134[#127134] -* Adds ability to set legend pixel width in *Lens* {kibana-pull}126018[#126018] -* Adds underlying data editor navigation in *Lens* {kibana-pull}125983[#125983] -* Adds top metrics aggregation to AggConfigs, Expressions, and Visualize {kibana-pull}125936[#125936] -* Adds the ability to detach from global time range in *Lens* {kibana-pull}125563[#125563] -* Adds last value, min and max on dates, allow last value on ip_range, number_range, and date_range in *Lens* {kibana-pull}125389[#125389] -* Adds version-aware sorting to data table in *Lens* {kibana-pull}125361[#125361] -* Cancel discarded searches in *Timelion* {kibana-pull}125255[#125255] -* Cancel discarded searches in *TSVB* {kibana-pull}125197[#125197] -* Adds the ability to allow users to disable auto-apply in *Lens* {kibana-pull}125158[#125158] -* Adds Filter custom label for kibanaAddFilter in *Vega* {kibana-pull}124498[#124498] -* Adds metric Viz config options, title position, and sizing in *Lens* {kibana-pull}124124[#124124] -* Adds the ability to make graph edges easier to click {kibana-pull}124053[#124053] -* Adds "Show empty rows" options to intervals function in *Lens* {kibana-pull}118855[#118855] - -Machine Learning:: -* Combines annotations into one block if multiple annotations overlap {kibana-pull}128782[#128782] -* Adds `throughput_last_minute` to the deployment stats {kibana-pull}128611[#128611] -* Adds new API endpoint to improve anomaly chart performance {kibana-pull}128165[#128165] -* Utilize ML memory stats endpoint for the memory overview chart {kibana-pull}127751[#127751] -* Deleting trained model space checks {kibana-pull}127438[#127438] -* Show at least one correlation value and consolidate correlations columns {kibana-pull}126683[#126683] -* Include fields not in docs in Data Visualizer field name control {kibana-pull}126519[#126519] -* Anomaly Explorer performance enhancements {kibana-pull}126274[#126274] -* Fixes Index data visualizer reaching Elasticsearch rate request limits {kibana-pull}124898[#124898] -* Adds cache for data recognizer module configs to reduce number of privilege checks {kibana-pull}126338[#126338] - -Management:: -* Extend Transform Health alerting rule with error messages check {kibana-pull}128731[#128731] -* Enable opening queries from any UI {kibana-pull}127461[#127461] -* No Data Views Component {kibana-pull}125403[#125403] - -Maps:: -* Remove usage of max file size advanced setting 1GB limit in geo file upload {kibana-pull}127639[#127639] -* Adds support for geohex_grid aggregation {kibana-pull}127170[#127170] -* Lens choropleth chart {kibana-pull}126819[#126819] -* Register GeoJson upload with integrations page {kibana-pull}126350[#126350] -* Support custom icons in maps {kibana-pull}113144[#113144] - -Observability:: -* Guided setup progress {kibana-pull}128382[#128382] -* Enable check for public beta {kibana-pull}128240[#128240] -* Guided setup button on the overview page {kibana-pull}128172[#128172] -* Show warning when users exceed a Synthetics Node throttling limits {kibana-pull}127961[#127961] -* Adds logging to Inventory Threshold Rule {kibana-pull}127838[#127838] -* O11y rules page {kibana-pull}127406[#127406] -* Enrich documents generated by the synthetics service with `port` information {kibana-pull}127180[#127180] -* Make UI indices space aware (support for spaces) {kibana-pull}126176[#126176] -* Setting for default env for service inventory {kibana-pull}126151[#126151] -* Alerts in overview page {kibana-pull}125337[#125337] -* Adds log rate to Exploratory View {kibana-pull}125109[#125109] -* Support switching between log source modes {kibana-pull}124929[#124929] -* Overview style updates {kibana-pull}124702[#124702] -* Adds full screen/copy button ability in browser inline script editing {kibana-pull}124500[#124500] -* Update position of legend and it's controls {kibana-pull}115854[#115854] - -Platform:: -Allow customizing {es} client maxSockets {kibana-pull}126937[#126937] - -[float] -[[fixes-v8.2.0]] -=== Bug fixes -Alerting:: -* Fixes bug when providing a single value to the `fields` query parameter of the Cases find API {kibana-pull}128143[#128143] -* Fixes the count of alerts in the cases table. Only unique alerts are being counted {kibana-pull}127721[#127721] -* Do not show the lens action if Visualize feature is not enabled {kibana-pull}127613[#127613] - -Dashboard:: -* Fixes control removal {kibana-pull}128699[#128699] -* Select televant data view ID {kibana-pull}128440[#128440] -* Close controls flyouts on unmount, save, and view mode change {kibana-pull}128198[#128198] - -Discover:: -* Account for hidden time column in default sort {kibana-pull}129659[#129659] -* Make field icons consistent across field list and doc tables {kibana-pull}129621[#129621] -* Fixes `Filter for field present` in expanded document view of Document Explorer {kibana-pull}129588[#129588] -* Cancel long running request after navigating out from Discover {kibana-pull}129444[#129444] -* Fixes height of JSON tab in Document flyout when using Document explorer in Safari {kibana-pull}129348[#129348] -* Fixes stuck action menu in expanded document sidebar {kibana-pull}127588[#127588] - -Elastic Security:: -For the Elastic Security 8.2.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Lens & Visualizations:: -* Fixes multi index pattern load bug in *TSVB* {kibana-pull}130428[#130428] -* Handle empty values for range formatters {kibana-pull}129572[#129572] -* Apply pinned filters to *Lens* {kibana-pull}129503[#129503] -* Imported vislib pie triggers unsaved viz warning when embedded on a dashboard in *Visualize* {kibana-pull}129336[#129336] -* Fixes auto session-renewal on non-timebased data views in *Lens* {kibana-pull}129313[#129313] -* Fixes steps behavior to happen at the change point in *TSVB* {kibana-pull}128741[#128741] -* Improve check for 0 opacity in *TSVB* {kibana-pull}128630[#128630] -* Fixes firefox scrollbars in *Vega* {kibana-pull}128515[#128515] -* Log data tables properly in *Lens* {kibana-pull}128297[#128297] -* Fixes annotation bounds bug in *TSVB* {kibana-pull}128242[#128242] -* Make sure x axis values are always strings in *Lens* {kibana-pull}128160[#128160] -* Use default number formatter as fallback if nothing else is specified in *Timelion* {kibana-pull}128155[#128155] -* Enable Save&Return button for canvas when dashboard permissions are off in *Visualize* {kibana-pull}128136[#128136] -* Fixes permission problem for "Save and return" button in *Lens* {kibana-pull}127963[#127963] -* Restore operation auto switch based on field type in *Lens* {kibana-pull}127861[#127861] -* Fixes mosaic color syncing in *Lens* {kibana-pull}127707[#127707] -* Make edge selection work {kibana-pull}127456[#127456] -* Remove opacity for fitting line series {kibana-pull}127176[#127176] -* Handle line/area fitting function when the editor has started with bar configuration in *Visualize* {kibana-pull}126891[#126891] -* Preserve custom label when changing with multi-terms settings in *Lens* {kibana-pull}126773[#126773] -* Fixes multi terms fields validation in *Lens* {kibana-pull}126618[#126618] -* Make Embeddable resilient when toggling actions in *Lens* {kibana-pull}126558[#126558] -* Make graph app resilient to no fields or missing data views {kibana-pull}126441[#126441] -* Fixes Formula to Quick functions does not preserve custom formatting in *Lens* {kibana-pull}124840[#124840] -* Inspector displays only visible content {kibana-pull}124677[#124677] -* Coloring tooltips in Heatmap are not properly positioned in *Visualize* {kibana-pull}124507[#124507] -* Adds rison helper and URL encoding for drilldown urls in *TSVB* {kibana-pull}124185[#124185] - -Machine Learning:: -* Fixes alignment of Anomaly Explorer swim lane annotations label on Firefox {kibana-pull}130274[#130274] -* Fixes Single Metric Viewer chart failing to load if no points during calendar event {kibana-pull}130000[#130000] -* Fixes Single Metric Viewer for jobs that haven't been run {kibana-pull}129063[#129063] -* Fix outlier detection results exploration color legend display {kibana-pull}129058[#129058] -* Fixes new anomaly detection job from saved search with no query filter {kibana-pull}129022[#129022] -* Fixes data frame analytics map saved object sync warning {kibana-pull}128876[#128876] -* Adds error toast to Data visualizer when using unpopulated time field {kibana-pull}127196[#127196] - -Management:: -* Transforms: Fix to not pass on default values in configurations {kibana-pull}129091[#129091] -* Encode + sign in ISO8601 time range in query {kibana-pull}126660[#126660] - -Maps:: -* Fixes lens region map visualization throws a silent error {kibana-pull}129608[#129608] -* Fixes double click issue when deleting a shape {kibana-pull}124661[#124661] - -Monitoring:: -* Exclude Malwarescore + Ransomware EP alerts from DRule telemetry {kibana-pull}130233[#130233] -* Rename "APM & Fleet Server" to "Integrations Server" {kibana-pull}128574[#128574] -* Fixes sorting by node status on nodes listing page {kibana-pull}128323[#128323] - -Observability:: -* Service environment should be selected when you edit the agent configuration {kibana-pull}129929[#129929] -* Adds migration to include synthetics and heartbeat indices on 8.2.0 {kibana-pull}129510[#129510] -* Rules summary on the Alerts view is not showing the count of rules {kibana-pull}129052[#129052] -* Fixes shadow for overview panels {kibana-pull}128878[#128878] -* Ensure rum_allow_origins setting only saves valid YAML strings {kibana-pull}128704[#128704] -* Standardize NOW as startedAt from executor options {kibana-pull}128020[#128020] -* Fixes synthetics recorder file upload {kibana-pull}127614[#127614] -* Service Maps popover detail metrics are aggregates over all transaction types {kibana-pull}125580[#125580] - -Platform:: -* Fixes an issue where duplicate data appears in the inspector datatable in *Lens* for heatmap visualizations, and stale data persists in the inspector datatable when you remove layers {kibana-pull}126786[#126786] -* Fixes an issue that caused {kib} to become unresponsive while generating a PDF report {kibana-pull}124787[#124787] -* Fixes an issue where an unfriendly notification title displays after you create a report {kibana-pull}123607[#123607] - -Security:: -* Fixes styles for "You do not have permission" screen {kibana-pull}129715[#129715] -* Change session expiration to override on app leave behavior {kibana-pull}129384[#129384] - -[[release-notes-8.1.3]] -== {kib} 8.1.3 - -Review the following information about the {kib} 8.1.3 release. - -[float] -[[security-update-v8.1.3]] -=== Security update - -The 8.1.3 release contains a fix to a potential security vulnerability. For more information, check link:https://discuss.elastic.co/t/kibana-7-17-3-and-8-1-3-security-update/302826[Security Announcements]. - -[float] -[[breaking-changes-8.1.3]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.1.3. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[fixes-v8.1.3]] -=== Bug fix -Discover:: -* Fixes toggle table column for classic table {kibana-pull}128603[#128603] - -[[release-notes-8.1.2]] -== {kib} 8.1.2 - -Review the following information about the {kib} 8.1.2 release. - -[float] -[[breaking-changes-8.1.2]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.1.2. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.1.2]] -=== Enhancement -Dashboard:: -Improve controls management UX {kibana-pull}127524[#127524] - -[float] -[[fixes-v8.1.2]] -=== Bug fixes -Discover:: -* Fixes toggle table column for classic table {kibana-pull}128603[#128603] -* Fixes selection popover close action without making a selection in Document Explorer {kibana-pull}128124[#128124] - -Elastic Security:: -For the Elastic Security 8.1.2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Management:: -Handle scenario when user has no indices {kibana-pull}128066[#128066] - -Monitoring:: -Rename "APM & Fleet Server" to "Integrations Server" {kibana-pull}128574[#128574] - -Platform:: -Fixes KQL typeahead missing description and improve display for long field names {kibana-pull}128480[#128480] - -[[release-notes-8.1.1]] -== {kib} 8.1.1 - -Review the following information about the {kib} 8.1.1 release. - -[float] -[[breaking-changes-8.1.1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.1.1, review the breaking changes, then mitigate the impact to your application. - -There are no breaking changes in {kib} 8.1.1. - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[enhancement-v8.1.1]] -=== Enhancement -Dashboard:: -Improves controls empty state {kibana-pull}125728[#125728] - -[float] -[[fixes-v8.1.1]] -=== Bug fixes -Data ingest:: -The dot expander processor in the Ingest Pipelines UI now allows setting a wildcard (`*`) for the field parameter {kibana-pull}123522[#123522] - -Elastic Security:: -For the Elastic Security 8.1.1 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.1.1 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Adds a new validation message {kibana-pull}127239[#127239] -* Fixes empty assets on package install {kibana-pull}127070[#127070] -* Hide enroll command when user creates a new agent policy in the Add agent flyout {kibana-pull}126431[#126431] -* Makes input IDs unique in agent policy yaml {kibana-pull}127343[#127343] -* Fixes links to Agent logs for APM, Endpoint, Synthetics, and OSQuery {kibana-pull}127480[#127480] - -[[release-notes-8.1.0]] -== {kib} 8.1.0 - -Review the following information about the {kib} 8.1.0 release. - -[float] -[[breaking-changes-8.1.0]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.1.0, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Removes legacy CSV export type -[%collapsible] -==== -*Details* + -The `/api/reporting/generate/csv` endpoint has been removed. For more information, refer to {kibana-pull}121435[#121435]. - -*Impact* + -If you are using 7.13.0 and earlier, {kibana-ref-all}/8.1/automating-report-generation.html[regenerate the POST URLs] that you use to automatically generate CSV reports. -==== - -[discrete] -.Removes legacy PDF shim -[%collapsible] -==== -*Details* + -The POST URLs that you generated in {kib} 6.2.0 no longer work. For more information, refer to {kibana-pull}121369[#121369]. - -*Impact* + -{kibana-ref-all}/8.1/automating-report-generation.html[Regenerate the POST URLs] that you use to automatatically generate PDF reports. -==== - -To review the breaking changes in previous versions, refer to the following: - -{kibana-ref-all}/8.0/release-notes-8.0.0.html#breaking-changes-8.0.0[8.0.0] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc2.html#breaking-changes-8.0.0-rc2[8.0.0-rc2] | {kibana-ref-all}/8.0/release-notes-8.0.0-rc1.html#breaking-changes-8.0.0-rc1[8.0.0-rc1] | {kibana-ref-all}/8.0/release-notes-8.0.0-beta1.html#breaking-changes-8.0.0-beta1[8.0.0-beta1] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha2.html#breaking-changes-8.0.0-alpha2[8.0.0-alpha2] | {kibana-ref-all}/8.0/release-notes-8.0.0-alpha1.html#breaking-changes-8.0.0-alpha1[8.0.0-alpha1] - -[float] -[[features-8.1.0]] -=== Features -{kib} 8.1.0 adds the following new and notable features. - -Canvas:: -* Adds Heatmap {kibana-pull}120239[#120239] -* Adds the *Filters* panel for element settings {kibana-pull}117270[#117270] and {kibana-pull}116592[#116592] - -Discover:: -* Adds document explorer callout {kibana-pull}123814[#123814] -* Adds ability to create data views from the sidebar {kibana-pull}123391[#123391] -* Adds redirect if there are no data views {kibana-pull}123366[#123366] -* Adds row height options {kibana-pull}122087[#122087] - -Elastic Security:: -For the Elastic Security 8.1.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Lens & Visualizations:: -* Adds the waffle visualization type to *Lens* {kibana-pull}119339[#119339] -* Adds the gauge visualization type to *Lens* {kibana-pull}118616[#118616] -* Adds multi terms support to *Top Values* in *Lens* {kibana-pull}118600[#118600] -* Adds a new heatmap implementation with elastic-charts to *Visualize Library* {kibana-pull}118338[#118338] -* Adds the Mosaic or mekko visualization type to *Lens* {kibana-pull}117668[#117668] -* Adds the ability to configure the Metric visualization type color palette in *Lens* {kibana-pull}116170[#116170] - -Machine Learning:: -* Enable Field statistics table on by default {kibana-pull}124046[#124046] -* Adds grouping to the side nav {kibana-pull}123805[#123805] -* Integration part 1: Create anomalies layer in maps {kibana-pull}122862[#122862] -* Replace navigation bar with a side nav {kibana-pull}121652[#121652] -* Overview page redesign {kibana-pull}120966[#120966] - -Management:: -* Support suggesting index templates v2 {kibana-pull}124655[#124655] -* *Console* now supports autocompletion for index templates and component templates introduced in {es} 7.8.0. -* Transforms: Support to set destination ingest pipeline {kibana-pull}123911[#123911] -* Transforms: Adds reset action to transforms management {kibana-pull}123735[#123735] -* Transforms: Support for terms agg in pivot configurations {kibana-pull}123634[#123634] - -Observability:: -* Adds Tail-based sampling settings {kibana-pull}124025[#124025] -* APM UI changes for serverless services / AWS lambda {kibana-pull}122775[#122775] - -For more information about the features introduced in 8.1.0, refer to <>. - -[[enhancements-and-bug-fixes-v8.1.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.1.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.1.0]] -=== Enhancements -Alerting:: -* Adds P50/95/99 for rule execution duration in the rules table {kibana-pull}123603[#123603] -* Adds dropdown for number of executions in Rule Details view {kibana-pull}122595[#122595] - -Canvas:: -* Adds titles to the heatmap axis {kibana-pull}123992[#123992] -* Adds the esql Monaco editor {kibana-pull}118531[#118531] -* Adds expression `metrisVis` workpad arguments {kibana-pull}114808[#114808] - -Dashboard:: -Adds the ability to always allow internal URLs in *Vega* {kibana-pull}124705[#124705] - -Data ingest:: -Adds the ability to create ingest pipelines from a CSV upload that enables mapping custom data source into ECS {kibana-pull}101216[#101216] - -Discover:: -* Improves the document explorer flyout {kibana-pull}120116[#120116] -* Adds the ability to preserve *Discover* main route state in breadcrumb links {kibana-pull}119838[#119838] -* Adds error state if chart loading fails {kibana-pull}119289[#119289] -* Enable Field statistics table on by default {kibana-pull}124046[#124046] - -Elastic Security:: -For the Elastic Security 8.1.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -* Adds shipper label {kibana-pull}122491[#122491] -* Adds support for non-superuser access to *Fleet* and *Integrations* {kibana-pull}122347[#122347] -* Adds support for bundling packages as zip archives with {kib} source {kibana-pull}122297[#122297] -* Makes the default integration install explicit {kibana-pull}121628[#121628] - -Lens & Visualizations:: -* Addx suport for timefilter/min/max in *Vega* URLs {kibana-pull}124077[#124077] -* The filtered field list now uses field caps API in *Lens* {kibana-pull}122915[#122915] -* Updates the *Lens* empty state copy {kibana-pull}122174[#122174] -* Adds a global filter for formulas in *Lens* {kibana-pull}121768[#121768] -* Adds rare terms in *Lens* {kibana-pull}121500[#121500] -* Adds previous time shift back in *Lens* {kibana-pull}121284[#121284] -* Adds the size ratio setting to pie and donut charts in *Lens* {kibana-pull}120101[#120101] -* Adds multi terms dnd support in *Lens* {kibana-pull}119841[#119841] -* Improves the color stop UI in *Lens* {kibana-pull}119165[#119165] -* Enables table pagination in *Lens* {kibana-pull}118557[#118557] -* Adds support for ephemeral sort to the data table embeddable {kibana-pull}117742[#117742] -* Debounce duplicate error messages in *Vega* {kibana-pull}116408[#116408] -* Replaces EUICodeEditor with Monaco in *Vega* {kibana-pull}116041[#116041] - -Machine Learning:: -* Adds missing document titles {kibana-pull}124125[#124125] -* Synchronize Anomaly charts cursor position for X-axis with *Lens* visualizations in *Dashboard* {kibana-pull}123951[#123951] -* Adds grouping to the side nav {kibana-pull}123805[#123805] -* Adds empty states for the Jobs list pages {kibana-pull}123462[#123462] -* Adds error messages to Index data visualizer and improve distribution charts for fields with low cardinality {kibana-pull}123306[#123306] -* Standardize Add embeddable flow from the Anomaly Explorer page {kibana-pull}123199[#123199] -* Integration part 1: Create anomalies layer in *Maps** {kibana-pull}122862[#122862] -* Adds options to exclude or include frozen data tier for Anomaly detection and Index data visualizer {kibana-pull}122306[#122306] -* Editing semi-structured text fields in grok pattern {kibana-pull}122274[#122274] -* Adds extra search deep links for nodes overview and file upload {kibana-pull}121740[#121740] -* Replace navigation bar with a side nav {kibana-pull}121652[#121652] -* File data visualizer reduce chunk size for slow processors {kibana-pull}121353[#121353] -* Adds ability to save session to Index data visualizer {kibana-pull}121053[#121053] -* Overview page redesign {kibana-pull}120966[#120966] -* Adds *Maps* UI action to Index data visualizer/*Discover* Field statistics {kibana-pull}120846[#120846] -* Adds auto generated drill down link to *Discover* for Anomaly explorer table {kibana-pull}120450[#120450] -* Adds multilayer time axis style to Data visualizer doc count chart {kibana-pull}117398[#117398] - -Management:: -* Transforms: Add call out warning & delete option if a task exists for a transform without a config {kibana-pull}123407[#123407] -* Adds warnings for actions for managed Anomaly detection jobs and Transforms {kibana-pull}122305[#122305] -* Refresh frequency refinements {kibana-pull}122125[#122125] -* Configure refresh frequency {kibana-pull}121874[#121874] -* Geo point field formatter {kibana-pull}121821[#121821] -* Adds links to docs {kibana-pull}121066[#121066] -* Highlight the tutorial example text with console syntax {kibana-pull}120474[#120474] -* Compress mappings response size for autocomplete {kibana-pull}120456[#120456] -* Handle binary data response {kibana-pull}119586[#119586] -* Improve error handling when local storage quota is full {kibana-pull}118495[#118495] -* Error handling {kibana-pull}109233[#109233] - -Maps:: -* Adds Shapefile import {kibana-pull}123764[#123764] -* Should be able to zoom in on selected range of timeslider {kibana-pull}122131[#122131] -* Delete button should be toggleable in Edit Features {kibana-pull}122017[#122017] -* Change "show as" from EuiSelect to EuiButtonGroup {kibana-pull}121960[#121960] -* Format counts {kibana-pull}119646[#119646] -* Convert maki icons to SDF sprites on-the-fly {kibana-pull}119245[#119245] -* Convert HeatmapLayer to vector tiles and add support for high resolution grids {kibana-pull}119070[#119070] -* Make the icon for max results limit more evident {kibana-pull}118044[#118044] -* Enable on-prem for *Vega* {kibana-pull}104422[#104422] - -Monitoring:: -Compatibility for agent data streams {kibana-pull}119112[#119112] - -Observability:: -* Adds Tail-based sampling settings {kibana-pull}124025[#124025] -* UI Monitor Management - Add namespace field {kibana-pull}123248[#123248] -* Default alert connectors email settings {kibana-pull}123244[#123244] -* Only show span.sync badge when relevant {kibana-pull}123038[#123038] -* Optimize waffle map {kibana-pull}122889[#122889] -* APM UI changes for serverless services / AWS lambda {kibana-pull}122775[#122775] -* Update the style of the service/backend info icons in the selected service/backend header {kibana-pull}122587[#122587] -* Adds basic infra metrics config {kibana-pull}120881[#120881] -* Adds comparision to service maps popover {kibana-pull}120839[#120839] -* Link originating service in traces list table {kibana-pull}120768[#120768] -* Prefer `service.name` for logs correlation {kibana-pull}120694[#120694] -* Query numerator & denominator simultaneously for log threshold alerts {kibana-pull}107566[#107566] - -Operations:: -Improves the file logging capabilities so that missing directories in the configured file path are now created before {kib} attempts to write to the file {kibana-pull}117666[#117666] - -Platform:: -* Add a new `elasticsearch.compression` configuration property to enable compression for communications between {kib} and {es} {kibana-pull}124009[#124009] -* Adds support of comments {kibana-pull}122457[#122457] -* Adds support for PNG and PDF reports on Darwin Arm64 architecture {kibana-pull}122057[#122057] -* Short URL client is now accessible on the frontend through plugin contract. *Dashboard* and *Discover* shared short URLs now contain a three word, human-readable slug {kibana-pull}121886[#121886] -* Adds the ability to add URL drilldowns to *Dashboard* panels {kibana-pull}121801[#121801] -* Adds a new structure to the report details flyout to help you find information faster {kibana-pull}120617[#120617] -* Adds HTML tag and impact level to axe-core CI violation reporter {kibana-pull}119903[#119903] -* Exposes {es} accuracy warnings to the user {kibana-pull}116632[#116632] - -Querying & Filtering:: -Improves the version field type {kibana-pull}123739[#123739] - -Security:: -* Audit logs now include records for individual saved objects when an entire space is deleted {kibana-pull}124145[#124145] -* User login audit events now include the session ID for better correlation, and single sign-on flows no longer result in an extra `user_logout` event {kibana-pull}124299[#124299] - -[float] -[[fixes-v8.1.0]] -=== Bug fixes -Alerting:: -* Fixes the pagination results for fetching existing alerts {kibana-pull}122474[#122474] -* Running disabled rules are now skipped {kibana-pull}119239[#119239] - -Canvas:: -* Fixes an issue where the image repeat element was not updating {kibana-pull}118701[#118701] -* Fixes an issue where *Canvas* validated values before saving variables {kibana-pull}118694[#118694] - -Dashboard:: -Adds the listing page callout when new dashboards are in progress {kibana-pull}117237[#117237] - -Discover:: -* Adds the ability to close the expanded document sidebar when you change data views {kibana-pull}119736[#119736] -* Fixes search on page load tests {kibana-pull}119087[#119087] - -Elastic Security:: -For the Elastic Security 8.1.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Enterprise Search:: -For the Elastic Enterprise Search 8.1.0 release information, refer to {enterprise-search-ref}/changelog.html[_Elastic Enterprise Search Documentation Release notes_]. - -Fleet:: -* Readded missing packages to keep up to date list {kibana-pull}125787[#125787] -* Trimmed whitespace from package policy names {kibana-pull}125400[#125400] - -Lens & Visualizations:: -* Fixes some dashboard visualizations that could show "Could not located index pattern" errors when copied from one space to another {kibana-pull}126499[#126499] -* Rarity is not allowed in some cases in *Lens* {kibana-pull}125523[#125523] -* Fixes formatting logic for terms in *Lens* {kibana-pull}125408[#125408] -* Fixes focus on submitting filter popover in *Lens* {kibana-pull}125247[#125247] -* Fixes agg filter for sibling pipeline aggs {kibana-pull}125227[#125227] -* Panel intervals are now used for annotations in *TSVB* {kibana-pull}125222[#125222] -* Outdated inspector data is now hidden in *Vega* {kibana-pull}125051[#125051] -* *Vega* visualizations are no longer missing in sample data reports {kibana-pull}124886[#124886] -* Lucene queries on dashboards are now accepted on annotations and tables in *TSVB* {kibana-pull}124802[#124802] -* Top values now work for custom numeric formatters in *Lens* {kibana-pull}124566[#124566] -* Coloring tooltip in Heatmap is now working for `">= n"` values in *Visualize Library* {kibana-pull}124521[#124521] -* Fixes a metric contrast issue in *TSVB* {kibana-pull}124509[#124509] -* Do not refresh session on "now" drift on incoming data in *Lens* {kibana-pull}124389[#124389] -* Coloring tooltips in Pie are not properly positioned in *Visualize* {kibana-pull}124330[#124330] -* Label placeholder always defaults to the lens proposed text in *Lens* {kibana-pull}124222[#124222] -* Show warning for completely static formula in *Lens* {kibana-pull}124213[#124213] -* Adds step value to make Safari validation work properly in *Lens* {kibana-pull}124210[#124210] -* Guard against parse failures in *Visualize* {kibana-pull}124209[#124209] -* Fixes heatmap suggestions in *Lens* {kibana-pull}124099[#124099] -* Fixes the percentage format for percentiles series {kibana-pull}124098[#124098] -* Displays custom bounds error for right axis when lower bound is above 0 in *Lens* {kibana-pull}124037[#124037] -* Clicking a series agg timeseries chart split by terms should not create a filter in *TSVB* {kibana-pull}124031[#124031] -* Save default data view in *TSVB* {kibana-pull}123997[#123997] -* Switch default bar width to 0px in *TSVB* {kibana-pull}123926[#123926] -* Formatting in the left axis is not respected when I have two separate axis in *TSVB* {kibana-pull}123903[#123903] -* Fixes series containing colon in *TSVB* {kibana-pull}123897[#123897] -* Fixes records field name and migrate in *Lens* {kibana-pull}123894[#123894] -* Hides ticks on the y axis for layers with the same format and different template in *TSVB* {kibana-pull}123598[#123598] -* Various fixes for Lens embeddables in *Lens* {kibana-pull}123587[#123587] -* Make sure session is updated and passed to the embeddable in *Visualize* {kibana-pull}123538[#123538] -* Fixes time range issue on save in *Lens* {kibana-pull}123536[#123536] -* Report override data views to the dashboard in *TSVB* {kibana-pull}123530[#123530] -* Handle ignore daylight time correctly and fix shift problem in *TSVB* {kibana-pull}123398[#123398] -* AggConfigs: Make base id check more stable {kibana-pull}123367[#123367] -* TSVB fix flickering {kibana-pull}122921[#122921] -* Hide tooltips while dragging dimensions in *Lens* {kibana-pull}122198[#122198] -* Make sure saved search id is carried over to saved object {kibana-pull}121082[#121082] -* Paginate through index patterns {kibana-pull}120972[#120972] -* Show generic error for invalid time shift string in *Lens* {kibana-pull}120077[#120077] -* Improves column type detection in table for alignment in *Lens* {kibana-pull}120007[#120007] -* Fixes the broken "aggregate function" in *TSVB* table {kibana-pull}119967[#119967] -* Hide fit from suggestions in *Timelion* {kibana-pull}119568[#119568] -* Match visualization type to first series type when available {kibana-pull}119377[#119377] -* Timelion & vega apply dataview from first filter in *Vega* {kibana-pull}119209[#119209] -* Reset filter state whenever group-by changed in *TSVB* {kibana-pull}118953[#118953] -* Prevent KQL Popovers From Stacking in *Lens* {kibana-pull}118258[#118258] -* Improves outside label placement for pie/donut charts in *Lens* {kibana-pull}115966[#115966] - -Machine Learning:: -* Fixes permission check for 'View examples' link from Anomaly detection explorer page {kibana-pull}125090[#125090] -* Fixes auto-refresh interval {kibana-pull}124851[#124851] -* Fixes permission check for Discover/data view redirect from Anomaly detection explorer page {kibana-pull}124408[#124408] -* Fixes breadcrumbs inconsistencies and titles capitalisation {kibana-pull}123019[#123019] - -Management:: -* Update painless antlr grammar for fields API $-syntax {kibana-pull}125818[#125818] -* Adds permission check for 'Set as default data view' button on data view detail page {kibana-pull}124897[#124897] -* In *Index Management*, index details now display previously missing values for the number of deleted documents and the primary storage size {kibana-pull}124731[#124731] -* Transforms: Fix retention policy reset {kibana-pull}124698[#124698] -* Transforms: Fix sort on field names containing dots not applied in wizard preview grid {kibana-pull}124587[#124587] -* Transforms: Fix refresh when transform list is filtered {kibana-pull}124267[#124267] -* Fixes autocomplete inserting comma in triple quotes {kibana-pull}123572[#123572] -* Encode pathname {kibana-pull}122080[#122080] -* Autocomplete missing comma on correct location {kibana-pull}121611[#121611] -* Fixes wrong values in field format editor; fix wrong value formatting in field preview {kibana-pull}121300[#121300] -* Fixes autocomplete suggestions for lowercase methods and other related bug {kibana-pull}121033[#121033] -* Fixes autocomplete suggestions for repository of type `fs` (typo) {kibana-pull}120775[#120775] -* Fixes editor error while adding second request {kibana-pull}120593[#120593] -* Dev Tools Console: Expose the error_trace parameter for completion {kibana-pull}120290[#120290] -* Auto complete for script suggests deprecated query type {kibana-pull}120283[#120283] -* Fixes "Expected one of GET/POST/PUT/DELETE/HEAD" for lowercase methods {kibana-pull}120209[#120209] -* Make the Define script label non clickable {kibana-pull}119947[#119947] -* Fixes error markers in editor output {kibana-pull}119831[#119831] -* Change suggestions for Sampler and Diversified sampler aggregations {kibana-pull}119355[#119355] -* Adds Autocompletion for boxplot aggregation in Kibana Dev tools {kibana-pull}117024[#117024] -* Adds overrides for request parameters for Logstash PUT Pipeline API {kibana-pull}116450[#116450] -* @timestamp as default for timestamp field name in index pattern {kibana-pull}116126[#116126] - -Maps:: -* Fixes vector tile URL not properly encoded {kibana-pull}126208[#126208] -* Allows feature editing with vector tile scaling {kibana-pull}123409[#123409] -* Fixes Error rendering cluster layer of geoshape documents styled by category {kibana-pull}123308[#123308] -* Fetch geometry from fields API {kibana-pull}122431[#122431] -* Fixes vector tile double counting geo_shapes that cross tile boundaries {kibana-pull}121703[#121703] -* Refactor map telemetry to incrementally calculate usage stats {kibana-pull}121467[#121467] -* Fixes creating filter from array fields {kibana-pull}119548[#119548] - -Monitoring:: -* Stronger typing for monitoring configs {kibana-pull}125467[#125467] -* Fixes Alerts and Rules menu persisting to other apps {kibana-pull}124291[#124291] -* Fixes Logstash Pipeline hover timestamp isn't visible {kibana-pull}123091[#123091] -* Fixes date picker range options {kibana-pull}121295[#121295] - -Observability:: -* Set display names for columns and fix reason message {kibana-pull}124570[#124570] -* Rename Backend to Dependency {kibana-pull}124067[#124067] -* Enable parseTechnicalFields to accept partial alert documents {kibana-pull}123983[#123983] -* Include error documents in fallback query for services {kibana-pull}123554[#123554] -* Rewrite the data fetching for Inventory Threshold rule {kibana-pull}123095[#123095] -* Optimizations for Inventory Threshold Alerts {kibana-pull}122460[#122460] -* Increase composite size to 10K for Metric Threshold Rule and optimize processing {kibana-pull}121904[#121904] -* Fixes missing EUI theme in context {kibana-pull}121796[#121796] -* Rename alerting types in triggers_actions_ui {kibana-pull}121107[#121107] -* Fixes loading message for correlations table {kibana-pull}120921[#120921] -* Prefer host.name over host.hostname {kibana-pull}119952[#119952] - -Platform:: -* Improve `bfetch` error handling {kibana-pull}123455[#123455] -* Fixes a CSV export Reporting issue where expensive queries were used to collect the data when they were not needed {kibana-pull}123412[#123412] -* Fixes URL drilldown placeholder text and add placeholder capability to Monaco {kibana-pull}121420[#121420] -* Consider expired tasks invalid {kibana-pull}119664[#119664] -* `columns`. Fixes Bugs caused by using name instead of ID {kibana-pull}118470[#118470] - -Security:: -User login audit events now include the session ID for better correlation, and single sign-on flows no longer result in an extra `user_logout` event {kibana-pull}124299[#124299] - -[[release-notes-8.0.0]] -== {kib} 8.0.0 - -Review the {kib} 8.0.0 changes, then use the {kibana-ref-all}/7.17/upgrade-assistant.html[Upgrade Assistant] to complete the upgrade. - -[float] -[[breaking-changes-8.0.0]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade to 8.0.0, review the breaking change, then mitigate the impact to your application. - -[discrete] -.Removes the `console.ssl` setting -[%collapsible] -==== -*Details* + -The `console.ssl` setting has been removed. For more information, refer to {kibana-pull}123754[#123754]. - -*Impact* + -Before you upgrade to 8.0.0, remove `console.ssl` from kibana.yml. -==== - -To review the breaking changes in previous versions, refer to the following: - -<> | <> | <> | <> | -<> - -[float] -[[deprecations-8.0.0]] -=== Deprecation - -The following functionality is deprecated in 8.0.0, and will be removed in 9.0.0. -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend -you make the necessary updates after you upgrade to 8.0.0. - -[discrete] -[[deprecation-123229]] -.Removes support for `monitoring.cluster_alerts.allowedSpaces` -[%collapsible] -==== -*Details* + -The `monitoring.cluster_alerts.allowedSpaces` setting, which {kib} uses to create Stack Monitoring alerts, has been removed. For more information, refer to {kibana-pull}123229[#123229]. - -*Impact* + -Before you upgrade to 8.0.0, remove `monitoring.cluster_alerts.allowedSpaces` from kibana.yml. -==== - -To review the deprecations in previous versions, refer to the following: - -<> | <> - -[float] -[[known-issue-8.0.0]] -=== Known issue - -[discrete] -[[known-issue-123550]] -.Importing and copying saved objects causes weak links to break -[%collapsible] -==== -*Details* + -{kib} supports weak links in some saved objects. For example, a dashboard may include a Markdown panel that contains a relative URL to -another dashboard. Weak links are defined by free text, _not_ the saved object's relationships, and can break if **both** of the following -conditions are true: - -* You are importing saved objects into multiple spaces, _OR_ you are copying saved objects into another space -* Before you upgraded to 8.0.0, the saved objects did not already exist in the destinations - -In 8.0.0 and later, weak links break because <>. -This applies to both the UI and the API. -For more information, refer to {kibana-issue}123550[#123550]. - -*Impact* + -Saved objects in 7.x that are migrated during upgrade are **not** impacted. -Only _new_ saved objects that are imported or copied _multiple times_ (causing object IDs to change) are impacted. -If you are impacted, you can re-import or re-copy your saved objects after the fix is -implemented to preserve the weak links. -==== - -[float] -[[features-8.0.0]] -=== Features -For information about the features introduced in 8.0.0, refer to <>. - -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -To review the features in previous versions, refer to the following: - -<> | <> | <> | <> - -[[enhancements-and-bug-fixes-v8.0.0]] -=== Enhancements and bug fixes - -For detailed information about the 8.0.0 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.0.0]] -==== Enhancements -Dashboard:: -Clone ReferenceOrValueEmbeddables by value {kibana-pull}122199[#122199] - -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[float] -[[fixes-v8.0.0]] -==== Bug fixes -APM:: -Restrict aggregated transaction metrics search to date range {kibana-pull}123445[#123445] - -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -Fleet:: -Allow empty strings for required text fields in package policies {kibana-pull}123610[#123610] - -Maps:: -Fixes Label border color is not removed from legend when disabled {kibana-pull}122705[#122705] - -Monitoring:: -Ensure logstash getNodes always contains a uuid {kibana-pull}124201[#124201] - -Security:: -Long-running requests no longer cause sporadic logouts in certain cases, even when user sessions are active {kibana-pull}122155[#122155] - -[[release-notes-8.0.0-rc2]] -== {kib} 8.0.0-rc2 - -For information about the {kib} 8.0.0-rc2 release, review the following information. - -[float] -[[breaking-changes-8.0.0-rc2]] -=== Breaking change - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking change, then mitigate the impact to your application. - -[discrete] -.Removes the ability to use `elasticsearch.username: elastic` in production -[%collapsible] -==== -*Details* + -In production, you are no longer able to use the `elastic` superuser to authenticate to {es}. For more information, refer to {kibana-pull}122722[#122722]. - -*Impact* + -When you configure `elasticsearch.username: elastic`, {kib} fails. -==== - -To review the breaking changes in previous versions, refer to the following: - -<> | <> | <> | -<> - -[float] -[[features-8.0.0-rc2]] -=== Features -{kib} 8.0.0-rc2 adds the following new and notable features. - -Dashboard:: -Dashboard Integration {kibana-pull}115991[#115991] -Elastic Security:: -For the Elastic Security 8.0.0-rc2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Monitoring:: -Enterprise Search Stack Monitoring {kibana-pull}114303[#114303] -Observability:: -* Adds Agent Keys in APM settings - Create agent keys {kibana-pull}120373[#120373] -* Adds Agent Keys in APM settings - Agent key table {kibana-pull}119543[#119543] -* Allows users to set Download Speed, Upload Speed, and Latency for their synthetic monitors in Uptime {kibana-pull}118594[#118594] -Platform:: -Changes saved objects management inspect view to a read-only JSON view of the whole saved object {kibana-pull}112034[#112034] - -[[enhancements-and-bug-fixes-v8.0.0-rc2]] -=== Enhancements and bug fixes - -For detailed information about the 8.0.0-rc2 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.0.0-rc2]] -==== Enhancements -Elastic Security:: -For the Elastic Security 8.0.0-rc2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Security:: -Adds session cleanup audit logging {kibana-pull}122419[#122419] -Observability:: -Make a monitor's steps details page work on mobile resolutions in Uptime {kibana-pull}122171[#122171] - -[float] -[[fixes-v8.0.0-rc2]] -==== Bug fixes -Alerting:: -Fixes PagerDuty timestamp validation {kibana-pull}122321[#122321] -Dashboard:: -* Creates Explicit Diffing System {kibana-pull}121241[#121241] -* Fixes blank panel save and display issue {kibana-pull}120815[#120815] -* Fixes full screen error when pressing back arrow on browser {kibana-pull}118113[#118113] -Elastic Security:: -For the Elastic Security 8.0.0-rc2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Maps:: -* Fixes Point to point and Tracks layers label properties not showing in the legend {kibana-pull}122993[#122993] -* Fixes Color ramp UI for percent of a top term in join layer is broken {kibana-pull}122718[#122718] -Observability:: -* Updates index pattern permission error in APM {kibana-pull}122680[#122680] -* Honor time unit for Inventory Threshold in Metrics {kibana-pull}122294[#122294] -* Adds locator to aid other plugins in linking properly to Uptime {kibana-pull}123004[#123004] -* Fixes a bug in which headers would be incorrectly centered on desktop in Uptime {kibana-pull}122643[#122643] - -[[release-notes-8.0.0-rc1]] -== {kib} 8.0.0-rc1 - -Review the {kib} 8.0.0-rc1 changes, then use the <> to complete the upgrade. - -[float] -[[breaking-changes-8.0.0-rc1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. -Before you upgrade, review the breaking changes, then mitigate the impact to your application. - -[discrete] -.Splits package policy `upgrade` endpoint for Fleet -[%collapsible] -==== -*Details* + -For package policy upgrades, the packagePolicy `upgrade` endpoint format supports a mutative upgrade operation (when `dryRun: false`) and a read-only dry run operation (when `dryRun: true`): - -[source,text] --- - POST /package_policies/upgrade - { - packagePolicyIds: [...], - dryRun: false - } --- - -For more information, refer to {kibana-pull}118854[#118854]. - -*Impact* + -The endpoint is now split into two separate endpoints: - -[source,text] --- - POST /package_policies/upgrade - { - packagePolicyIds: [...] - } - - POST /package_policies/upgrade/dry_run - { - packagePolicyIds: [...] - } --- -==== - -[discrete] -.Removes APM jobs from Machine Learning -[%collapsible] -==== -*Details* + -APM Node.js and RUM JavaScript anomaly detection job modules have been removed. For more information, refer to {kibana-pull}119945[#119945]. - -*Impact* + -When you upgrade to 8.0.0, you are unable to create and view the APM Node.js and RUM JavaScript jobs in Machine Learning. -==== - -[discrete] -.Fails migrations for unknown types -[%collapsible] -==== -*Details* + -Unknown saved object types now cause {kib} migrations to fail. For more information, refer to {kibana-issue}107678[#107678]. - -*Impact* + -To complete the migration, re enable plugins or delete documents from the index in the previous version. -==== - -[discrete] -.Removes deprecated config fields from Logs and Metrics APIs and saved objects -[%collapsible] -==== -*Details* + -On the Logs and Metrics UIs, references to the following API and saved object deprecated fields have been removed: - -* `timestamp` -* `tiebreaker` -* `container` -* `pod` -* `host` - -For more information, refer to {kibana-pull}116821[#116821] and {kibana-pull}115874[#115874]. - -*Impact* + -When you upgrade to 8.0.0, you are unable to use references to the deprecated fields. -==== - -To review the breaking changes in previous versions, refer to the following: - -<> | <> | -<> - -[float] -[[deprecations-8.0.0-rc1]] -=== Deprecations - -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend you make the necessary updates after you complete the upgrade. - -[discrete] -.Renames the `autocreate` data view APM setting -[%collapsible] -==== -*Details* + -The `xpack.apm.autocreateApmIndexPattern` APM setting has been removed. For more information, refer to {kibana-pull}120689[#120689]. - -*Impact* + -To automatically create data views in APM, use `xpack.apm.autoCreateApmDataView`. -==== - -[discrete] -.Updates Fleet API to improve consistency -[%collapsible] -==== -*Details* + -The Fleet API has been updated to improve consistency: - -* Hyphens are changed to underscores in some names. -* The `pkgkey` path parameter in the packages endpoint is split. -* The `response` and `list` properties are renamed to `items` or `item` in some -responses. - -For more information, refer to {kibana-pull}119494[#119494]. - -*Impact* + -When you upgrade to 8.0.0, use the following API changes: - -* Use `enrollment_api_keys` instead of `enrollment-api-keys`. - -* Use `agent_status` instead of `agent-status`. - -* Use `service_tokens` instead of `service-tokens`. - -* Use `/epm/packages/{packageName}/{version}` instead of `/epm/packages/{pkgkey}`. - -* Use `items[]` instead of `response[]` in: -+ -[source,text] --- -/api/fleet/enrollment_api_keys -/api/fleet/agents -/epm/packages/ -/epm/categories -/epm/packages/_bulk -/epm/packages/limited -/epm/packages/{packageName}/{version} <1> --- -<1> Use `items[]` when the verb is `POST` or `DELETE`. Use `item` when the verb -is `GET` or `PUT`. - -For more information, refer to {fleet-guide}/fleet-api-docs.html[Fleet APIs]. - -==== - -To review the deprecations in previous versions, refer to the <>. - - -[float] -[[features-8.0.0-rc1]] -=== Features -{kib} 8.0.0-rc1 adds the following new and notable features. - -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Management:: -Display managed badge for transforms {kibana-pull}117679[#117679] -Monitoring:: -Enterprise Search Stack Monitoring {kibana-pull}114303[#114303] -Observability:: -* Adds ability to create agent keys in APM settings {kibana-pull}120373[#120373] -* Adds Agent key table in APM settings {kibana-pull}119543[#119543] -* Allows users to set Download Speed, Upload Speed, and Latency for their synthetic monitors {kibana-pull}118594[#118594] - -[[enhancements-and-bug-fixes-v8.0.0-rc1]] -=== Enhancements and bug fixes - -For detailed information about the 8.0.0-rc1 release, review the enhancements and bug fixes. - -[float] -[[enhancement-v8.0.0-rc1]] -=== Enhancements -Canvas:: -Reverts By-Value Embeddables {kibana-pull}117613[#117613] -Discover:: -Adds multi-layer time axis for opt-out only {kibana-pull}115853[#115853] -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -Adds consistent `_meta` property to all Fleet ES assets {kibana-pull}119380[#119380] -Kibana Home & Add Data:: -Moves overview page and link to the accordion solution title {kibana-pull}114018[#114018] -Lens & Visualizations:: -* Handle removal of deprecated date histogram interval in *Vega* {kibana-pull}109090[#109090] -* Adds value labels to Heatmap in *Lens* {kibana-pull}106406[#106406] -Machine Learning:: -* Adds support for `force` stop deployment {kibana-pull}118563[#118563] -* Refactors data view loading to remove unnecessary searches {kibana-pull}116455[#116455] -Observability:: -* Service Maps: Adds sparklines to the detail popover {kibana-pull}120021[#120021] -* Offer users upgrade to multi-metric job {kibana-pull}119980[#119980] -* Display relevant anomalies from multi-metric job {kibana-pull}119709[#119709] -* Adds service icon for the originating service in traces table {kibana-pull}119421[#119421] -* Auto attachment for java agent beta in APM integration settings {kibana-pull}119131[#119131] -* Errors: Enhancements to the Errors list page (part II) {kibana-pull}118878[#118878] -* Store Alerts View table state in localStorage {kibana-pull}118207[#118207] -* Handle other values popup when correlated value is not in top 10 {kibana-pull}118069[#118069] -* Adds links to navigate from alerts table to rule {kibana-pull}118035[#118035] -* Reinstates ML multi-metric job {kibana-pull}117836[#117836] -* Re-enables metric-based UI {kibana-pull}117021[#117021] -* Make Alerts page use shared {kib} time range {kibana-pull}115192[#115192] -* Adds enabled toggle {kibana-pull}119994[#119994] -* Adds missing tooltip to the report metric badge in *Exploratory View* {kibana-pull}119940[#119940] -* Adds step duration in step list {kibana-pull}116266[#116266] -Platform:: -Moves developer architecture docs to user docs {kibana-pull}119125[#119125] -Reporting:: -* Decouples screenshotting plugin from the reporting {kibana-pull}120110[#120110] -* Updates the design of the *Reports* management UI, including the addition of a link to {kib} app where the report was generated {kibana-pull}111412[#111412] -Security:: -Adds ability to clone role mappings {kibana-pull}118434[#118434] -Adds user logout audit events {kibana-pull}121455[#121455] - -[float] -[[fixes-v8.0.0-rc1]] -=== Bug fixes -Canvas:: -* Fixes Error overflow {kibana-pull}122158[#122158] -* Fixes expression input {kibana-pull}121490[#121490] -* Hides edit menu when in view-only mode {kibana-pull}118779[#118779] -Dashboard:: -* Allow text wrapping for panel titles and dashboard descriptions for PDF generation {kibana-pull}121360[#121360] -* Page now resets to zero when rows per page is changed on *Add from Library* window {kibana-pull}118627[#118627] -* Fixes full screen error when pressing back arrow in browser {kibana-pull}118113[#118113] -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Fleet:: -* Adds `installed_kibana_space_id` to `epm-packages` saved objects {kibana-pull}120517[#120517] -* Handle Saved Object ID changes {kibana-pull}119527[#119527] -* Fixes upgradeable agents filter {kibana-pull}119338[#119338] -Lens & Visualizations:: -* Enables normal mode for percentage charts in *Lens* {kibana-pull}120197[#120197] -* Fixes existing fields query for epoch_millis dates in *Lens* {kibana-pull}119508[#119508] -* Include frozen indices in *Lens* {kibana-pull}118555[#118555] -* Fixes focus on legend action popovers in *Lens* {kibana-pull}115066[#115066] -Machine Learning:: -* Fixes data view search based on title {kibana-pull}120737[#120737] -* Data frame analytics wizard: Only allow data view creation if job will be started immediately {kibana-pull}120042[#120042] -* Fixes anomaly detection module manifest queries to ignore frozen and cold data tiers {kibana-pull}119635[#119635] -* Catches syntax error in job wizard editor {kibana-pull}119457[#119457] -* Fixes error handling for missing data view in data frame analytics wizard {kibana-pull}119455[#119455] -* Ensures auto refresh interval is used in Data Frame Analytics list {kibana-pull}117959[#117959] -* Ignores frozen indices in data recognizer {kibana-pull}117208[#117208] -Management:: -* Fixes data grid column actions button when histogram charts are visible {kibana-pull}120202[#120202] -* Disables delete data view for data frame analytics and transforms wizards {kibana-pull}119732[#119732] -* Check {kib} capabilities for all saving, editing, and deleting {kibana-pull}118480[#118480] -* Adds autocomplete for search_after and pit in search query {kibana-pull}117864[#117864] -* Autocomplete for t_test aggregation {kibana-pull}117782[#117782] -* Disables create data view for data frame analytics and transforms wizards {kibana-pull}117690[#117690] -Maps:: -* Fixes an issue where drawings do not show when there is a global filter {kibana-pull}121239[#121239] -* Use minimum symbol size if meta is not loaded {kibana-pull}119119[#119119] -* Do not fail migration when JSON.parse fails {kibana-pull}117342[#117342] -* Do not allow label overlap {kibana-pull}116190[#116190] -Monitoring:: -Correct linear regression formula {kibana-pull}120222[#120222] -Observability:: -* Renames alerting types in Infra {kibana-pull}121061[#121061] -* Renames occurrences of `alert_type` to `rule_type` in Infra {kibana-pull}120455[#120455] -* Fixes failing alerts table pagination functional tests {kibana-pull}119985[#119985] -* Switch to _source for updating documents instead of fields API {kibana-pull}118245[#118245] -* Fixes an issue where search terms with certain characters caused the APM UI to crash {kibana-pull}118063[#118063] -* Ignore unavailable indices for ML jobs {kibana-pull}117632[#117632] -* Disables the actions button when users have inadequate privileges {kibana-pull}117488[#117488] -* Replaces manual rate calculation with `rate` agg {kibana-pull}115651[#115651] -* Adds migration to fix incorrect action group spelling {kibana-pull}119626[#119626] -* Fixes bug with manage views button {kibana-pull}118547[#118547] -* Disables No Data checkboxes for doc count alerts {kibana-pull}117194[#117194] -* Prevent event propagation on step_duration {kibana-pull}122039[#122039] -* Disables the button to create alerts in Uptime when users do not have permissions to do so {kibana-pull}120379[#120379] -* Fixes a bug that prevented users from saving Uptime configurations when the `inspect` option was turned on {kibana-pull}119142[#119142] -* Adds a callout to informs users that they do not have permissions to create ML jobs for Uptime monitors {kibana-pull}117684[#117684] -Platform:: -Fixes font glitches in code editor {kibana-pull}121392[#121392] -Reporting:: -Fixes an issue where PDF and PNG reports break on Windows operating systems when the {kib} server hostname is `0.0.0.0` {kibana-pull}117022[#117022] - -[[release-notes-8.0.0-beta1]] -== {kib} 8.0.0-beta1 - -Review the {kib} 8.0.0-beta1 changes, then use the <> to complete the upgrade. - -[float] -[[breaking-changes-8.0.0-beta1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. Review the following breaking changes, then mitigate the impact to your application. - -To review the breaking changes in previous versions, refer to the following: - -<> | <> - -[float] -[[alerting-breaking-changes-8.0.0-beta1]] -==== Alerting - -[discrete] -.Removes `xpack.task_manager.index` -[%collapsible] -==== -*Details* + -The `xpack.task_manager.index` setting has been removed. For more information, refer to {kibana-pull}114558[#114558]. - -*Impact* + -Before you upgrade to 8.0.0, remove `xpack.task_manager.index` from kibana.yml. -==== - -[discrete] -.Removes ability to remove plugins -[%collapsible] -==== -*Details* + -The `xpack.actions.enabled` setting has been removed. For more information, refer to {kibana-pull}113461[#113461]. - -*Impact* + -Before you upgrade to 8.0.0, remove `xpack.actions.enabled` from kibana.yml. -==== - -[float] -[[lens-visualizations-breaking-changes-8.0.0-beta1]] -==== Lens & visualizations - -[discrete] -.Removes display options from legacy gauge -[%collapsible] -==== -*Details* + -The *Display warnings* option has been removed from the aggregation-based gauge visualization. For more information, refer to {kibana-pull}113516[#113516]. - -*Impact* + -When you create aggregation-based gauge visualizations, the *Display warnings* option is no longer available in *Options > Labels*. -==== - -[discrete] -.Removes settings from visEditors plugins -[%collapsible] -==== -*Details* + -The following deprecated visEditors plugin settings have been removed: - -* `metric_vis.enabled` -* `table_vis.enabled` -* `tagcloud.enabled` -* `metrics.enabled` -* `metrics.chartResolution` -* `chartResolution` -* `metrics.minimumBucketSize` -* `minimumBucketSize` -* `vega.enabled` -* `vega.enableExternalUrls` -* `vis_type_table.legacyVisEnabled` -* `timelion_vis.enabled` -* `timelion.enabled` -* `timelion.graphiteUrls` -* `timelion.ui.enabled` - -For more information, refer to {kibana-pull}112643[#112643]. - -*Impact* + -Before you upgrade, make the following changes in kibana.yml: - -* Replace `metric_vis.enabled` with `vis_type_metric.enabled` -* Replace `table_vis.enabled` with `vis_type_table.enabled` -* Replace `tagcloud.enabled` with `vis_type_tagcloud.enabled` -* Replace `metrics.enabled` with `vis_type_timeseries.enabled` -* Replace `metrics.chartResolution` and `chartResolution` with `vis_type_timeseries.chartResolution` -* Replace `metrics.minimumBucketSize` and `minimumBucketSize` with `vis_type_timeseries.minimumBucketSize` -* Replace `vega.enabled` with `vis_type_vega.enabled` -* Replace `vega.enableExternalUrls` with `vis_type_vega.enableExternalUrls` -* Remove `vis_type_table.legacyVisEnabled` -* Replace `timelion_vis.enabled` with `vis_type_timelion.enabled` -* Replace `timelion.enabled` with `vis_type_timelion.enabled` -* Replace `timelion.graphiteUrls` with `vis_type_timelion.graphiteUrls` -* Remove `timelion.ui.enabled` - -==== - -[discrete] -.Removes dimming opacity setting -[%collapsible] -==== -*Details* + -The *Dimming opacity* setting in *Advanced Settings* has been removed. For more information, refer to {kibana-pull}111704[#111704]. - -*Impact* + -When you upgrade to 8.0.0, you are no longer able to configure the dimming opactiy for visualizations. -==== - -[discrete] -.Removes Less stylesheet support -[%collapsible] -==== -*Details* + -In *TSVB*, custom Less stylesheets have been removed. For more information, refer to {kibana-pull}110985[#110985]. - -*Impact* + -Existing less stylesheets are automatically converted to CSS stylesheets. -==== - -[discrete] -.Disables the input string mode -[%collapsible] -==== -*Details* + -In *TSVB*, the *Index pattern selection mode* option has been removed. For more information, refer to {kibana-pull}110571[#110571]. - -*Impact* + -To use index patterns and {es} indices in *TSVB* visualizations: - -. Open the main menu, then click *Stack Management > Advanced Settings*. - -. Select *Allow string indices in TSVB*. - -. Click *Save changes*. -==== - -[float] -[[logs-breaking-changes-8.0.0-beta1]] -==== Logs - -[discrete] -.Removes deprecated alias config entries -[%collapsible] -==== -*Details* + -The deprecated `xpack.infra.sources.default.logAlias` and `xpack.infra.sources.default.logAlias` settings have been removed. For more information, refer to {kibana-pull}115974[#115974]. - -*Impact* + -Before you upgrade, remove the settings from kibana.yml, then configure the settings in <>. -==== - -[discrete] -.Removes configurable fields in settings -[%collapsible] -==== -*Details* + -The *Logs* and *Metrics* configurable fields settings have been removed. For more information, refer to {kibana-pull}61302[#61302]. - -*Impact* + -Configure the settings in https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[ECS]. -==== - -[float] -[[machine-learning-breaking-changes-8.0.0-beta1]] -==== Machine learning - -[discrete] -.Grants access to machine learning features when base privileges are used -[%collapsible] -==== -*Details* + -Machine learning features are included as base privileges. For more information, refer to {kibana-pull}115444[#115444]. - -*Impact* + -If you do not want to grant users privileges to machine learning features, update <>. -==== - -[float] -[[maps-breaking-changes-8.0.0-beta1]] -==== Maps - -[discrete] -.Removes proxyElasticMapsServiceInMaps -[%collapsible] -==== -*Details* + -The `map.proxyElasticMapsServiceInMaps` setting has been removed. For more information, refer to {kibana-pull}116184[#116184]. - -*Impact* + -Install the on-prem version of the <>, which is a Docker service that resides in the Elastic Docker registry, in an accessible location on your internal network. When you complete the installation, update kibana.yml to point to the service. -==== - -[float] -[[operations-breaking-changes-8.0.0-beta1]] -==== Operations - -[discrete] -.Removes environment variables -[%collapsible] -==== -*Details* + -The `CONFIG_PATH` and `DATA_PATH` environment variables have been removed. For more information, refer to {kibana-pull}111535[#111535]. - -*Impact* + -Replace the `CONFIG_PATH` environment variable with `KBN_PATH_CONF`, and replace `DATA_PATH` with the `path.data` setting. -==== - -[float] -[[platform-breaking-changes-8.0.0-beta1]] -==== Platform - -[discrete] -.Removes supports for csp.rules configuration -[%collapsible] -==== -*Details* + -Support for the `csp.rules` configuration property has been removed. For more information, refer to {kibana-pull}114379[#114379]. - -*Impact* + -Configuring the default `csp.script_src`, `csp.workers_src`, and `csp.style_src` values is not required. -==== - -[discrete] -.Changes and removes deprecated core settings and deprecated settings from core plugins -[%collapsible] -==== -*Details* + -The deprecation notice for `server.cors` has changed from `level:critical` to `level:warning`. - -The following settings have changed: - -* The `xpack.banners.placement` value has been renamed -* The `newsfeed.defaultLanguage` newsfeed item retrieval method and default language has changed - -Support for the following configuration settings has been removed: - -* `newsfeed.defaultLanguage` -* `cpu.cgroup.path.override` -* `cpuacct.cgroup.path.override` -* `server.xsrf.whitelist` -* `xpack.xpack_main.xpack_api_polling_frequency_millis` -* `KIBANA_PATH_CONF` - -For more information, refer to {kibana-pull}113653[#113653]. - -*Impact* + -* The `header` value provided to the `xpack.banners.placement` configuration has been renamed to 'top' -* The `newsfeed.defaultLanguage` newsfeed items are retrieved based on the browser locale and default to English -* Replace `cpu.cgroup.path.override` with `ops.cGroupOverrides.cpuPath` -* Replace `cpuacct.cgroup.path.override` with `ops.cGroupOverrides.cpuAcctPath` -* Replace `server.xsrf.whitelist` with `server.xsrf.allowlist` -* Replace `xpack.xpack_main.xpack_api_polling_frequency_millis` with `xpack.licensing.api_polling_frequency` -* Replace `KIBANA_PATH_CONF` path to the {kib} configuration file using the `KBN_PATH_CONF` environment variable -==== - -[discrete] -.Removes `enabled` settings from plugins -[%collapsible] -==== -*Details* + -Using `{plugin_name}.enabled` to disable plugins has been removed. Some plugins, such as `telemetry`, `newsfeed`, `reporting`, and the various `vis_type` plugins will continue to support this setting. All other {kib} plugins will not support this setting. Any new plugin will support this setting only when specified in the `configSchema`. For more information, refer to {kibana-pull}113495[#113495]. - -The `xpack.security.enabled` setting has been removed. For more information, refer to {kibana-pull}111681[#111681]. - -*Impact* + -Before you upgrade to 8.0.0: - -* Remove `{plugin_name}.enabled` from kibana.yml. If you use the setting to control user access to {kib} applications, use <> instead. -* Replace `xpack.security.enabled` with {ref}/security-settings.html#general-security-settings[`xpack.security.enabled`] in elasticsearch.yml. -==== - -[discrete] -.Removes `--plugin-dir` cli option -[%collapsible] -==== -*Details* + -The `plugins.scanDirs` setting and `--plugin-dir` cli option have been removed. For more information, refer to {kibana-pull}113367[#113367]. - -*Impact* + -Before you upgrade to 8.0.0, remove `plugins.scanDirs` from kibana.yml. -==== - -[discrete] -.Removes support for `optimize.*` settings -[%collapsible] -==== -*Details* + -The legacy `optimize.*` settings have been removed. If your configuration uses the following legacy `optimize.*` settings, {kib} fails to start: - -* `optimize.lazy` -* `optimize.lazyPort` -* `optimize.lazyHost` -* `optimize.lazyPrebuild` -* `optimize.lazyProxyTimeout` -* `optimize.enabled` -* `optimize.bundleFilter` -* `optimize.bundleDir` -* `optimize.viewCaching` -* `optimize.watch` -* `optimize.watchPort` -* `optimize.watchHost` -* `optimize.watchPrebuild` -* `optimize.watchProxyTimeout` -* `optimize.useBundleCache` -* `optimize.sourceMaps` -* `optimize.workers` -* `optimize.profile` -* `optimize.validateSyntaxOfNodeModules` - -For more information, refer to {kibana-pull}113296[#113296]. - -*Impact* + -To run the `@kbn/optimizer` separately in development, pass `--no-optimizer` to `yarn start`. For more details, refer to {kibana-pull}73154[#73154]. -==== - -[discrete] -.Removes `so/server/es` settings -[%collapsible] -==== -*Details* + -Some of the `so/server/es` settings have been removed. If your configuration uses the following settings, {kib} fails to start: - -* `savedObjects.indexCheckTimeout` -* `server.xsrf.token` -* `elasticsearch.preserveHost` -* `elasticsearch.startupTimeout` - -For more information, refer to {kibana-pull}113173[#113173]. - -*Impact* + -Before you upgrade to 8.0.0., remove these settings from kibana.yml. -==== - -[discrete] -.Adds requirement for inline scripting -[%collapsible] -==== -*Details* + -To start {kib}, you must enable inline scripting in {es}. For more information, refer to {kibana-pull}113068[#113068]. - -*Impact* + -Enable {ref}/modules-scripting-security.html[inline scripting]. -==== - -[discrete] -.Removes `kibana.index` settings -[%collapsible] -==== -*Details* + -The `kibana.index`, `xpack.reporting.index`, and `xpack.task_manager.index` settings have been removed. For more information, refer to {kibana-pull}112773[#112773]. - -*Impact* + -Use spaces, cross-cluster replication, or cross-cluster search. To migrate to <>, export your <> from a tenant into the default space. For more details, refer to link:https://github.com/elastic/kibana/issues/82020[#82020]. -==== - -[discrete] -.Removes legacy logging -[%collapsible] -==== -*Details* + -The logging configuration and log output format has changed. For more information, refer to {kibana-pull}112305[#112305]. - -*Impact* + -Use the new <>. -==== - -[float] -[[reporting-breaking-changes-8.0.0-beta1]] -==== Reporting - -[discrete] -.Removes reporting settings -[%collapsible] -==== -*Details* + -The following settings have been removed: - -* `xpack.reporting.capture.concurrency` - -* `xpack.reporting.capture.settleTime` - -* `xpack.reporting.capture.timeout` - -* `xpack.reporting.kibanaApp` - -For more information, refer to {kibana-pull}114216[#114216]. - -*Impact* + -Before you upgrade to 8.0.0, remove the settings from kibana.yml. -==== - -[float] -[[rest-api-breaking-changes-8.0.0-beta1]] -==== REST API - -[discrete] -.Removes `/api/settings` -[%collapsible] -==== -*Details* + -The `/api/settings` REST API has been removed. For more information, refer to {kibana-pull}114730[#114730]. - -*Impact* + -Use `/api/stats`. -==== - -[float] -[[security-breaking-changes-8.0.0-beta1]] -==== Security - -[discrete] -.Removes legacy audit logger -[%collapsible] -==== -*Details* + -The legacy audit logger has been removed. For more information, refer to {kibana-pull}116191[#116191]. - -*Impact* + -Audit logs will be written to the default location in the new ECS format. To change the output file, filter events, and more, use the <>. -==== - -[float] -[[deprecations-8.0.0-beta1]] -=== Deprecations - -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend you make the necessary updates after you complete the upgrade. - -To review the 8.0.0 depcrecations, refer to the <>. - -[float] -[[features-8.0.0-beta1]] -=== Features -The 8.0.0-beta1 release adds the following new and notable features. - -Dashboard:: -* Dashboard Integration {kibana-pull}115991[#115991] -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Machine Learning:: -* Addition of new Model Management tab {kibana-pull}115772[#115772] -Platform:: -* Changes edit view to json read-only view {kibana-pull}112034[#112034] - -[float] -[[enhancement-v8.0.0-beta1]] -=== Enhancements - -The 8.0.0-beta1 release includes the following enhancements. - -Canvas:: -* By-Value embeddables {kibana-pull}113827[#113827] -* Toolbar UI updates {kibana-pull}113329[#113329] -Elastic Security:: -For the Elastic Security 8.0.0 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Lens & Visualizations:: -* Handle removal of deprecated date histogram interval in *Vega* {kibana-pull}109090[#109090] -* Adds value labels to Heatmap in *Lens* {kibana-pull}106406[#106406] -Logs:: -* Make Alerts page use shared Kibana time range {kibana-pull}115192[#115192] -Machine Learning:: -* Adds support to {fleet} {integrations} for installing ML models {kibana-pull}107710[#107710] -* Adds Index data visualizer grid embeddable as extra view within Discover {kibana-pull}107184[#107184] -Maps:: -* Use Elastic Maps Service v8.0 {kibana-pull}116217[#116217] -* Use desaturated map tiles instead of bright map tiles by default {kibana-pull}116179[#116179] -* Use ES mvt {kibana-pull}114553[#114553] -Security:: -* Register "minimal" feature privileges regardless of the current license level {kibana-pull}115992[#115992] -Uptime:: -* Uptime index config using kibana.yml {kibana-pull}115775[#115775] - -[float] -[[fixes-v8.0.0-beta1]] -=== Bug fixes - -The 8.0.0-beta1 release includes the following bug fixes. - -Management:: -* Removes freeze action from Cold phase {kibana-pull}116160[#116160] -* Disallow creating runtime and scripted fields with * in the name {kibana-pull}116119[#116119] -Querying & Filtering:: -* Fixes Add filter button doesnt close popup after openning {kibana-pull}111917[#111917] - -[[release-notes-8.0.0-alpha2]] -== {kib} 8.0.0-alpha2 - -Review the {kib} 8.0.0-alpha2 changes, then use the <> to complete the upgrade. - -[float] -[[breaking-changes-8.0.0-alpha2]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. Review the following breaking changes, then mitigate the impact to your application. - -To review the breaking changes in the previous version, refer to <>. - -[discrete] -.Changes the `GET /api/status` default behavior -[%collapsible] -==== -*Details* + -`GET /api/status` reports a new and more verbose payload. For more information, refer to {kibana-pull}110830[#110830]. - -*Impact* + -To retrieve the {kib} status in the previous format, use `GET /api/status?v7format=true`. -==== - -[discrete] -.Removes support for legacy exports -[%collapsible] -==== -*Details* + -In {kib} 8.0.0 and later, the legacy format from {kib} 6.x is unsupported. For more information, refer to {kibana-pull}110738[#110738] - -*Impact* + -Using the user interface to import saved objects is restricted to `.ndjson` format imports. -==== - -[discrete] -.Removes `map.regionmap.*` -[%collapsible] -==== -*Details* + -The deprecated `map.regionmap.*` setting in kibana.yml has been removed. For more information, refer to {kibana-pull}109896[#109896]. - -*Impact* + -If you have maps that use `map.regionmap` layers: - -. Remove the `map.regionmap` layer. - -. To recreate the choropleth layer, use <> to index your static vector data into {es}. - -. Create a choropleth layer from the indexed vector data. -==== - -[discrete] -.Removes `kibana.defaultAppId` -[%collapsible] -==== -*Details* + -The deprecated `kibana.defaultAppId` setting in kibana.yml, which is also available as `kibana_legacy.defaultAppId`, has been removed. For more information, refer to {kibana-pull}109798[#109798]. - -*Impact* + -When you upgrade, remove `kibana.defaultAppId` from your kibana.yml file. To configure the default route for users when they enter a space, use the <> in *Advanced Settings*. -==== - -[discrete] -.Removes `courier:batchSearches` -[%collapsible] -==== -*Details* + -The deprecated `courier:batchSearches` setting in *Advanced Settings* has been removed. For more information, refer to {kibana-pull}109350[#109350]. - -*Impact* + -When you upgrade, the `courier:batchSearches` setting will no longer be available. -==== - -[discrete] -.Removes `xpack.task_manager.index` -[%collapsible] -==== -*Details* + -The deprecated `xpack.task_manager.index` setting in kibana.yml has been removed. For more information, refer to {kibana-pull}108111[#108111]. - -*Impact* + -When you upgrade, remove `xpack.task_manager.index` from your kibana.yml file. -==== - -[discrete] -.Removes dashboard-only mode -[%collapsible] -==== -*Details* + -The legacy dashboard-only mode has been removed. For more information, refer to {kibana-pull}108103[#108103]. - -*Impact* + -To grant users access to only dashboards, create a new role, then assign only the *Dashboard* feature privilege. For more information, refer to <>. -==== - -[discrete] -.Removes `xpack.maps.showMapVisualizationTypes` -[%collapsible] -==== -*Details* + -The deprecated `xpack.maps.showMapVisualizationTypes` setting in kibana.yml has been removed. For more information, refer to {kibana-pull}105979[#105979] - -*Impact* + -When you upgrade, remove `xpack.maps.showMapVisualizationTypes` from your kibana.yml file. -==== - -[float] -[[deprecations-8.0.0-alpha2]] -=== Deprecations - -Deprecated functionality does not have an immediate impact on your application, but we strongly recommend you make the necessary updates after you complete the upgrade. - -To review the 8.0.0 depcrecations, refer to the <>. - -[float] -[[features-8.0.0-alpha2]] -=== Features -The 8.0.0-alpha2 release adds the following new and notable feature. - -Security:: -* Adds the interactive setup mode {kibana-pull}106881[#106881] - -[float] -[[enhancement-v8.0.0-alpha2]] -=== Enhancements -The 8.0.0-alpha2 release includes the following enhancements. - -Elastic Security:: -For the Elastic Security 8.0.0-alpha2 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. -Security:: -* Interactive setup mode {kibana-pull}106881[#106881] - -[[release-notes-8.0.0-alpha1]] -== {kib} 8.0.0-alpha1 - -Review the {kib} 8.0.0-alpha1 changes, then use the <> to complete the upgrade. - -[float] -[[breaking-changes-8.0.0-alpha1]] -=== Breaking changes - -Breaking changes can prevent your application from optimal operation and performance. Review the breaking changes, then mitigate the impact to your application. - -[float] -[[enterprise-search-change]] -==== Enterprise Search changes - -[discrete] -.Required security plugin in 8.0 -[%collapsible] -==== -*Details* + -Enterprise Search now requires that you enable X-Pack Security. For more information, refer to {kibana-pull}106307[#106307] - -*Impact* + -Enable X-Pack Security. -==== - -[float] -[[index-pattern-change]] -==== Index pattern changes - -[discrete] -.Removed support for time-based interval index patterns -[%collapsible] -==== -*Details* + -Time-based interval index patterns were deprecated in 5.x. In 6.x, you could no longer create time-based interval index patterns, but they continued to function as expected. Support for these index patterns has been removed in 8.0. For more information, refer to {kibana-pull}35173[#35173] - -*Impact* + -You must migrate your time_based index patterns to a wildcard pattern. For example, logstash-*. -==== - -[float] -[[operations-changes]] -==== Operations changes - -[discrete] -.Removed platform from archive root directory -[%collapsible] -==== -*Details* + -After you extract an archive, the output directory no longer includes the target platform. For example, `kibana-8.0.0-linux-aarch64.tar.gz` produces a `kibana-8.0.0` folder. For more information, refer to {kibana-pull}93835[#93835]. - -*Impact* + -To use the new folder, update the configuration management tools and automation. -==== - -[discrete] -.Removed default support for TLS v1.0 and v1.1 -[%collapsible] -==== -*Details* + -The default support for TLS v1.0 and v1.1 has been removed. For more information, refer to {kibana-pull}90511[#90511]. - -*Impact* + -To enable support, set `--tls-min-1.0` in the `node.options` configuration file. To locate the configuration file, go to the kibana/config folder or any other configuration with the `KBN_PATH_CONF` environment variable. For example, if you are using a Debian-based system, the configuration file is located in /etc/kibana. -==== - -[discrete] -.Removed support for sysv init -[%collapsible] -==== -*Details* + -All supported operating systems use systemd service files. Any system that doesn’t have `service` aliased to use kibana.service should use `systemctl start kibana.service` instead of `service start kibana`. For more information, refer to {kibana-pull}74424[#74424]. - -*Impact* + -If your installation uses .deb or .rpm packages with SysV, migrate to systemd. -==== - -[discrete] -.Disabled response logging as a default -[%collapsible] -==== -*Details* + -In previous versions, all events are logged in `json` when `logging.json:true`. With the new logging configuration, you can choose the `json` and pattern output formats with layouts. For more information, refer to {kibana-pull}42353[#42353]. - -*Impact* + -To restore the previous behavior, configure the logging format for each custom appender with the `appender.layout property` in kibana.yml. There is no default for custom appenders, and each appender must be configured expilictly. - -[source,yaml] -------------------- -logging: - appenders: - custom_console: - type: console - layout: - type: pattern - custom_json: - type: console - layout: - type: json - loggers: - - name: plugins.myPlugin - appenders: [custom_console] - root: - appenders: [default, custom_json] - level: warn -------------------- -==== - -[float] -[[reporting-changes-8.0.0-alpha1]] -==== Reporting changes - -[discrete] -.Legacy job parameters are no longer supported -[%collapsible] -==== -*Details* + -*Reporting* is no longer compatible with POST URL snippets generated with {kib} 6.2.0 and earlier. For more information, refer to {kibana-pull}52539[#52539] - -*Impact* + -If you use POST URL snippets to automatically generate PDF reports, regenerate the POST URL strings. -==== - -[float] -[[rest-api-changes]] -==== Security changes - -[discrete] -.Removed `/api/security/v1/saml` route -[%collapsible] -==== -*Details* + -The `/api/security/v1/saml` route has been removed and is reflected in the kibana.yml `server.xsrf.whitelist` setting, {es}, and the Identity Provider SAML settings. For more information, refer to {kibana-pull}47929[#47929] - -*Impact* + -Use the `/api/security/saml/callback` route, or wait to upgrade to 8.0.0-alpha2 when the `/api/security/saml/callback` route breaking change is reverted. -==== - -[discrete] -.Reject legacy browsers by default -[%collapsible] -==== -*Details* + -To provide the maximum level of protection for most installations, the csp.strict config is now enabled by default. Legacy browsers not supported by Kibana, such as Internet Explorer 11, are unable to access {kib} unless explicitly enabled. All browsers officially supported by Kibana do not have this issue. For more information, refer to {kibana-pull}41700[#41700] - -*Impact* + -To enable support for legacy browsers, set `csp.strict: false` in kibana.yml. To effectively enforce the security protocol, we strongly discourage disabling `csp.strict` unless it is critical that you support Internet Explorer 11. -==== - -[float] -[[settings-changes-8.0.0-alpha1]] -==== Settings changes - -[discrete] -.Use new session timeout defaults -[%collapsible] -==== -*Details* + -The default values for the session timeout `xpack.security.session.{lifespan|idleTimeout}` settings have changed. For more information, refer to {kibana-pull}106061[#106061] - -*Impact* + -Use the following default values: - -* `xpack.security.session.idleTimeout: 3d` -* `xpack.security.session.lifespan: 30d` -==== - -[discrete] -.Removed support for setting `server.host` to '0' -[%collapsible] -==== -*Details* + -Support for configuring {kib} with `0` as the `server.host` has been removed. Please use `0.0.0.0` instead. For more information, refer to {kibana-pull}87114[#87114] - -*Impact* + -You are now unable to use `0` as the `server.host`. -==== - -[discrete] -.Removed `xpack.security.public` and `xpack.security.authProviders` -[%collapsible] -==== -*Details* + -The `xpack.security.public` and `xpack.security.authProviders` settings have been removed. For more information, refer to {kibana-pull}38657[#38657] - -*Impact* + -Use the `xpack.security.authc.saml.realm` and `xpack.security.authc.providers` settings. -==== - -[discrete] -.Removed useUTC deprecation -[%collapsible] -==== -*Details* + -The `logging.useUTC` setting has been removed. For more information, refer to {kibana-pull}22696[#22696] - -*Impact* + -The default timezone is UTC. To change the timezone, set `logging.timezone: false` in kibana.yml. Change the timezone when the system, such as a docker container, is configured for a nonlocal timezone. -==== - -[discrete] -.Removed environment variables `CONFIG_PATH` and `DATA_PATH` -[%collapsible] -==== -*Details* + -The environment variables `CONFIG_PATH` and `DATA_PATH` have been removed. For more information, refer to {kibana-pull}32049[#32049] - -*Impact* + -Use the environment variable `KBN_PATH_CONF` instead of `CONFIG_PATH`. Use the setting `path.data` instead of `DATA_PATH`. -==== - -[float] -[[deprecations-8.0.0-alpha1]] -=== Deprecations - -The following functionality is deprecated in 8.0.0, and will be removed in 9.0.0. Deprecated functionality does not have an immediate impact on your application, but we strongly recommend you make the necessary updates after you complete the upgrade. - -[discrete] -.Removed support for SysV init -[%collapsible] -==== -*Details* + -Systems that don't have `service` aliased to use kibana.service are unable to use `service start kibana`. For more information, refer to {kibana-pull}74424[#74424] - -*Impact* + -If your system doesn't have `service` aliased to use kibana.service, use `systemctl start kibana.service`. -==== - -[discrete] -.Removed `xpack:defaultAdminEmail` setting -[%collapsible] -==== -*Details* + -The `xpack:default_admin_email` setting for monitoring use has been removed. For more information, refer to {kibana-pull}33603[#33603] - -*Impact* + -Use the `xpack.monitoring.clusterAlertsEmail` in kibana.yml. -==== - -[float] -[[enhancements-and-bug-fixes-v8.0.0-alpha1]] -=== Bug fix - -The 8.0.0-alpha1 release includes the following bug fix. - -Operations:: -* Moves systemd service to /usr/lib/systemd/system {kibana-pull}83571[#83571] +[[fixes-v9.0.0]] +=== Bug fixes \ No newline at end of file diff --git a/docs/developer/architecture/development-visualize-index.asciidoc b/docs/developer/architecture/development-visualize-index.asciidoc index b941cdedf9df9..6f5f9fc742424 100644 --- a/docs/developer/architecture/development-visualize-index.asciidoc +++ b/docs/developer/architecture/development-visualize-index.asciidoc @@ -19,7 +19,7 @@ We would recommend waiting until later in `7.x` to upgrade your plugins if possi If you would like to keep up with progress on the visualizations plugin in the meantime, here are a few resources: -* The <> documentation, where we try to capture any changes to the APIs as they occur across minors. +* The <> documentation, where we try to capture any changes to the APIs as they occur across minors. * link:https://github.com/elastic/kibana/issues/44121[Meta issue] which is tracking the move of the plugin to the new {kib} platform * Our link:https://www.elastic.co/blog/join-our-elastic-stack-workspace-on-slack[Elastic Stack workspace on Slack]. * The {kib-repo}blob/{branch}/src/plugins/visualizations[source code], which will continue to be diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index ea31863576115..ea84b25dcda4d 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -832,6 +832,10 @@ It uses Chromium and Puppeteer underneath to run the browser in headless mode. |The Inference Endpoints is a tool used to manage inference endpoints +|{kib-repo}blob/{branch}/x-pack/plugins/search_solution/search_navigation/README.mdx[searchNavigation] +|The Search Navigation plugin is used to handle navigation for search solution plugins across both stack and serverless. + + |{kib-repo}blob/{branch}/x-pack/plugins/search_notebooks/README.mdx[searchNotebooks] |This plugin contains endpoints and components for rendering search python notebooks in the persistent dev console. diff --git a/docs/migration.asciidoc b/docs/migration.asciidoc index dd7a4d097d834..1e3b67b96ec10 100644 --- a/docs/migration.asciidoc +++ b/docs/migration.asciidoc @@ -6,9 +6,9 @@ This section discusses the changes that you need to be aware of when migrating your application from one version of Kibana to another. -* <> +* <> See also <> and <>. -- -include::migration/migrate_8_0.asciidoc[] \ No newline at end of file +include::migration/migrate_9_0.asciidoc[] \ No newline at end of file diff --git a/docs/migration/migrate_8_0.asciidoc b/docs/migration/migrate_8_0.asciidoc deleted file mode 100644 index 7c545cd6ef196..0000000000000 --- a/docs/migration/migrate_8_0.asciidoc +++ /dev/null @@ -1,402 +0,0 @@ -[[breaking-changes-8.0]] -== Breaking changes in 8.0 -++++ -8.0 -++++ - -This section discusses the changes that you need to be aware of when migrating -your application to Kibana 8.0. - -See also <> and <>. - -* <> -* <> - -[float] -[[breaking_80_index_pattern_changes]] -=== Index pattern changes - -[float] -==== Removed support for time-based internal index patterns -*Details:* Time-based interval index patterns were deprecated in 5.x. In 6.x, -you could no longer create time-based interval index patterns, but they continued -to function as expected. Support for these index patterns has been removed in 8.0. - -*Impact:* You must migrate your time_based index patterns to a wildcard pattern, -for example, `logstash-*`. - -[float] -[[breaking_80_setting_changes]] -=== Settings changes - -[float] -==== Multitenancy by changing `kibana.index` is no longer supported -*Details:* `kibana.index`, `xpack.reporting.index` and `xpack.task_manager.index` can no longer be specified. - -*Impact:* Users who relied on changing these settings to achieve multitenancy should use *Spaces*, cross-cluster replication, or cross-cluster search instead. To migrate to *Spaces*, users are encouraged to use saved object management to export their saved objects from a tenant into the default tenant in a space. Improvements are planned to improve on this workflow. See https://github.com/elastic/kibana/issues/82020 for more details. - -[float] -==== Disabling most plugins with the `{plugin_name}.enabled` setting is no longer supported -*Details:* The ability for most plugins to be disabled using the `{plugin_name}.enabled` config option has been removed. - -*Impact:* Some plugins, such as `telemetry`, `newsfeed`, `reporting`, and the various `vis_type` plugins will continue to support this setting, however the rest of the plugins that ship with Kibana will not. By default, any newly created plugins will not support this configuration unless it is explicitly added to the plugin's `configSchema`. - -If you are currently using one of these settings in your Kibana config, please remove it before upgrading to 8.0. If you were using these settings to control user access to certain Kibana applications, we recommend leveraging Feature Controls instead. - -[float] -==== Legacy browsers are now rejected by default -*Details:* `csp.strict` is now enabled by default, so Kibana will fail to load for older, legacy browsers that do not enforce basic Content Security Policy protections - notably Internet Explorer 11. - -*Impact:* To allow Kibana to function for these legacy browsers, set `csp.strict: false`. Since this is about enforcing a security protocol, we *strongly discourage* disabling `csp.strict` unless it is critical that you support Internet Explorer 11. - -[float] -==== Configuring content security policy rules is no longer supported -*Details:* Configuring `csp.rules` is removed in favor of per-directive specific configuration. Configuring the default `csp.script_src`, `csp.workers_src` and `csp.style_src` values is not required. - -*Impact:* Configure per-directive sources instead. See https://github.com/elastic/kibana/pull/102059 for more details. - -[float] -==== Default logging timezone is now the system's timezone -*Details:* In prior releases the timezone used in logs defaulted to UTC. We now use the host machine's timezone by default. - -*Impact:* To restore the previous behavior, in kibana.yml use the pattern layout, with a {kibana-ref}/logging-configuration.html#date-format[date modifier]: -[source,yaml] -------------------- -logging: - appenders: - custom: - type: console - layout: - type: pattern - pattern: "%date{ISO8601_TZ}{UTC}" -------------------- -See https://github.com/elastic/kibana/pull/90368 for more details. - -[float] -==== Responses are never logged by default -*Details:* Previously responses would be logged if either `logging.json` was true, `logging.dest` was specified, or a `TTY` was detected. With the new logging configuration, these are provided by a dedicated logger. - -*Impact:* To restore the previous behavior, in `kibana.yml` enable `debug` for the `http.server.response` logger: -[source,yaml] -------------------- -logging: - appenders: - custom: - type: console - layout: - type: pattern - loggers: - - name: http.server.response - appenders: [custom] - level: debug -------------------- -See https://github.com/elastic/kibana/pull/87939 for more details. - -[float] -==== Logging destination is specified by the appender -*Details:* Previously log destination would be `stdout` and could be changed to `file` using `logging.dest`. With the new logging configuration, you can specify the destination using {kibana-ref}/logging-configuration.html#logging-appenders[appenders]. - -*Impact:* To restore the previous behavior and log records to *stdout*, in `kibana.yml` use an appender with `type: console`. -[source,yaml] -------------------- -logging: - appenders: - custom: - type: console - layout: - type: pattern - root: - appenders: [default, custom] -------------------- - -To send logs to `file` with a given file path, you should define a custom appender with `type:file`: -[source,yaml] -------------------- -logging: - appenders: - file: - type: file - fileName: /var/log/kibana.log - layout: - type: pattern - root: - appenders: [default, file] -------------------- - -[float] -==== Set log verbosity with root -*Details:* Previously logging output would be specified by `logging.silent` (none), `logging.quiet` (error messages only) and `logging.verbose` (all). With the new logging configuration, set the minimum required {kibana-ref}/logging-configuration.html#log-level[log level]. - -*Impact:* To restore the previous behavior, in `kibana.yml` specify `logging.root.level`: -[source,yaml] -------------------- -# suppress all logs -logging: - root: - level: off -------------------- - -[source,yaml] -------------------- -# only log error messages -logging: - root: - level: error -------------------- - -[source,yaml] -------------------- -# log all events -logging: - root: - level: all -------------------- - -[float] -==== Declare log message format -*Details:* Previously all events would be logged in `json` format when `logging.json` was true. With the new logging configuration you can specify the output format with layouts. You can choose between `json` and pattern format depending on your needs. - -*Impact:* To restore the previous behavior, in `kibana.yml` configure the logging format for each custom appender with the `appender.layout` property. There is no default for custom appenders and each one must be configured expilictly. - -[source,yaml] -------------------- -logging: - appenders: - custom_console: - type: console - layout: - type: pattern - custom_json: - type: console - layout: - type: json - loggers: - - name: plugins.myPlugin - appenders: [custom_console] - root: - appenders: [default, custom_json] - level: warn -------------------- - -[float] -==== Configure log rotation with the rolling-file appender -*Details:* Previously log rotation would be enabled when `logging.rotate.enabled` was true. - -*Impact:* To restore the previous behavior, in `kibana.yml` use the {kibana-ref}/logging-configuration.html#rolling-file-appender[`rolling-file`] appender. - -[source,yaml] -------------------- -logging: - appenders: - rolling-file: - type: rolling-file - fileName: /var/logs/kibana.log - policy: - type: size-limit - size: 50mb - strategy: - type: numeric - pattern: '-%i' - max: 2 - layout: - type: pattern - loggers: - - name: plugins.myPlugin - appenders: [rolling-file] -------------------- - -[float] -==== `xpack.security.authProviders` is no longer valid -*Details:* The deprecated `xpack.security.authProviders` setting in the `kibana.yml` file has been removed. - -*Impact:* Use `xpack.security.authc.providers` instead. - -[float] -==== `xpack.security.authc.providers` has changed value format -*Details:* `xpack.security.authc.providers` setting in the `kibana.yml` has changed value format. - -*Impact:* Array of provider types as a value is no longer supported, use extended object format instead. - -[float] -==== `xpack.security.authc.saml` is no longer valid -*Details:* The deprecated `xpack.security.authc.saml` setting in the `kibana.yml` file has been removed. - -*Impact:* Configure SAML authentication providers using `xpack.security.authc.providers.saml.{provider unique name}.*` settings instead. - -[float] -==== `xpack.security.authc.oidc` is no longer valid -*Details:* The deprecated `xpack.security.authc.oidc` setting in the `kibana.yml` file has been removed. - -*Impact:* Configure OpenID Connect authentication providers using `xpack.security.authc.providers.oidc.{provider unique name}.*` settings instead. - -[float] -==== `xpack.security.public` is no longer valid -*Details:* Previously Kibana was choosing the appropriate Elasticsearch SAML realm automatically using the `Assertion Consumer Service` -URL that it derived from the actual server address and `xpack.security.public` setting. Starting in 8.0.0, the deprecated `xpack.security.public` setting in the `kibana.yml` file has been removed and the Elasticsearch SAML realm name that Kibana will use should be specified explicitly. - -*Impact:* Define `xpack.security.authc.providers.saml.{provider unique name}.realm` when using the SAML authentication providers instead. - -[float] -==== `/api/security/v1/saml` endpoint is no longer supported -*Details:* The deprecated `/api/security/v1/saml` endpoint is no longer supported. - -*Impact:* Rely on `/api/security/saml/callback` endpoint when using SAML instead. This change should be reflected in Elasticsearch and Identity Provider SAML settings. - -[float] -==== `/api/security/v1/oidc` endpoint is no longer supported -*Details:* The deprecated `/api/security/v1/oidc` endpoint is no longer supported. - -*Impact:* Rely on `/api/security/oidc/callback` endpoint when using OpenID Connect instead. This change should be reflected in Elasticsearch and OpenID Connect Provider settings. - -[float] -==== `/api/security/v1/oidc` endpoint is no longer supported for Third Party initiated login -*Details:* The deprecated `/api/security/v1/oidc` endpoint is no longer supported for Third Party initiated login. - -*Impact:* Rely on `/api/security/oidc/initiate_login` endpoint when using Third Party initiated OpenID Connect login instead. This change should be reflected in Elasticsearch and OpenID Connect Provider settings. - -[float] -==== `/api/security/v1/oidc/implicit` endpoint is no longer supported -*Details:* The deprecated `/api/security/v1/oidc/implicit` endpoint is no longer supported. - -*Impact:* Rely on `/api/security/oidc/implicit` endpoint when using OpenID Connect Implicit Flow instead. This change should be reflected in OpenID Connect Provider settings. - -[float] -=== `optimize` directory is now in the `data` folder -*Details:* Generated bundles have moved to the configured `path.data` folder. - -*Impact:* Any workflow that involved manually clearing generated bundles will have to be updated with the new path. - -[float] -=== Legacy `optimize.*` settings are no longer supported -*Details:* The legacy optimizer has been removed and any `optimize.*` settings have been deprecated since 7.10. These settings have been removed as they are no longer in use. - -*Impact:* Any of the legacy `optimize.*` settings will prevent Kibana from starting up. Going forward, to run the `@kbn/optimizer` separately in development, pass `--no-optimizer` to `yarn start`. See https://github.com/elastic/kibana/pull/73154 for more details. - -[float] -=== kibana.keystore has moved from the `data` folder to the `config` folder -*Details:* By default, kibana.keystore has moved from the configured `path.data` folder to `/config` for archive distributions -and `/etc/kibana` for package distributions. If a pre-existing keystore exists in the data directory that path will continue to be used. - -[float] -[[breaking_80_user_role_changes]] -=== User role changes - -[float] -=== `kibana_user` role has been removed and `kibana_admin` has been added. - -*Details:* The `kibana_user` role has been removed and `kibana_admin` has been added to better -reflect its intended use. This role continues to grant all access to every -{kib} feature. If you wish to restrict access to specific features, create -custom roles with {kibana-ref}/kibana-privileges.html[{kib} privileges]. - -*Impact:* Any users currently assigned the `kibana_user` role will need to -instead be assigned the `kibana_admin` role to maintain their current -access level. - -[float] -=== `kibana_dashboard_only_user` role has been removed. - -*Details:* The `kibana_dashboard_only_user` role has been removed. -If you wish to restrict access to just the Dashboard feature, create -custom roles with {kibana-ref}/kibana-privileges.html[{kib} privileges]. - -*Impact:* Any users currently assigned the `kibana_dashboard_only_user` role will need to be assigned a custom role which only grants access to the Dashboard feature. - -Granting additional cluster or index privileges may enable certain -**Stack Monitoring** features. - -[float] -[[breaking_80_reporting_changes]] -=== Reporting changes - -[float] -==== Legacy job parameters are no longer supported -*Details:* POST URL snippets that were copied in Kibana 6.2 or earlier are no longer supported. These logs have -been deprecated with warnings that have been logged throughout 7.x. Please use Kibana UI to re-generate the -POST URL snippets if you depend on these for automated PDF reports. - -[float] -=== Configurations starting with `xpack.telemetry` are no longer valid - -*Details:* -The `xpack.` prefix has been removed for all telemetry configurations. - -*Impact:* -For any configurations beginning with `xpack.telemetry`, remove the `xpack` prefix. Use {kibana-ref}/telemetry-settings-kbn.html#telemetry-general-settings[`telemetry.enabled`] instead. - -[float] -=== SysV init support has been removed - -*Details:* -All supported operating systems support using systemd service files. Any system that doesn't already have service aliased to use kibana.service should use `systemctl start kibana.service` instead of the `service start kibana`. - -*Impact:* -Any installations using `.deb` or `.rpm` packages using SysV will need to migrate to systemd. - -[float] -=== TLS v1.0 and v1.1 are disabled by default - -*Details:* -Support can be re-enabled by setting `--tls-min-1.0` in the `node.options` config file that can be found inside `kibana/config` folder or any other configured with the environment variable `KBN_PATH_CONF` (for example in Debian based system would be `/etc/kibana`). - -*Impact:* -Browser and proxy clients communicating over TLS v1.0 and v1.1. - -[float] -=== Platform removed from root folder name for `.tar.gz` and `.zip` archives - -*Details:* -The output directory after extracting an archive no longer includes the target platform. For example, `kibana-8.0.0-linux-aarch64.tar.gz` will produce a folder named `kibana-8.0.0`. - -*Impact:* -Configuration management tools and automation will need to be updated to use the new directory. - -[float] -=== `elasticsearch.preserveHost` is no longer valid -*Details:* The deprecated `elasticsearch.preserveHost` setting in the `kibana.yml` file has been removed. - -*Impact:* Configure {kibana-ref}/settings.html#elasticsearch-requestHeadersWhitelist[`elasticsearch.requestHeadersWhitelist`] to whitelist client-side headers. - -[float] -=== `elasticsearch.startupTimeout` is no longer valid -*Details:* The deprecated `elasticsearch.startupTimeout` setting in the `kibana.yml` file has been removed. - -*Impact:* Kibana will keep on trying to connect to Elasticsearch until it manages to connect. - -[float] -=== `savedObjects.indexCheckTimeout` is no longer valid -*Details:* The deprecated `savedObjects.indexCheckTimeout` setting in the `kibana.yml` file has been removed. - -[float] -=== `server.xsrf.token` is no longer valid -*Details:* The deprecated `server.xsrf.token` setting in the `kibana.yml` file has been removed. - -[float] -=== `newsfeed.defaultLanguage` is no longer valid -*Details:* Specifying a default language to retrieve newsfeed items is no longer supported. - -*Impact:* Newsfeed items will be retrieved based on the browser locale and fallback to 'en' if an item does not have a translation for the locale. Configure {kibana-ref}/i18n-settings-kb.html#general-i18n-settings-kb[`i18n.locale`] to override the default behavior. - -[float] -=== `xpack.banners.placement` has changed value -*Details:* `xpack.banners.placement: 'header'` setting in `kibana.yml` has changed value. - -*Impact:* Use {kibana-ref}/banners-settings-kb.html#banners-settings-kb[`xpack.banners.placement: 'top'`] instead. - -[float] -=== `cpu.cgroup.path.override` is no longer valid -*Details:* The deprecated `cpu.cgroup.path.override` setting is no longer supported. - -*Impact:* Configure {kibana-ref}/settings.html#ops-cGroupOverrides-cpuPath[`ops.cGroupOverrides.cpuPath`] instead. - -[float] -=== `cpuacct.cgroup.path.override` is no longer valid -*Details:* The deprecated `cpuacct.cgroup.path.override` setting is no longer supported. - -*Impact:* Configure {kibana-ref}/settings.html#ops-cGroupOverrides-cpuAcctPath[`ops.cGroupOverrides.cpuAcctPath`] instead. - -[float] -=== `server.xsrf.whitelist` is no longer valid -*Details:* The deprecated `server.xsrf.whitelist` setting is no longer supported. - -*Impact:* Use {kibana-ref}/settings.html#settings-xsrf-allowlist[`server.xsrf.allowlist`] instead. diff --git a/docs/migration/migrate_9_0.asciidoc b/docs/migration/migrate_9_0.asciidoc new file mode 100644 index 0000000000000..a3d2f1587eb39 --- /dev/null +++ b/docs/migration/migrate_9_0.asciidoc @@ -0,0 +1,18 @@ +[[breaking-changes-9.0]] +== Breaking changes in 9.0 +++++ +9.0 +++++ + +This section discusses the changes that you need to be aware of when migrating +your application to Kibana 9.0. + +See also <> and <>. + +* <> + + +[float] +[[breaking_90_setting_changes]] +=== Settings changes + diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 84cf809c66667..c9a81c5d398ce 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -418,10 +418,6 @@ This page has been deleted. Refer to <>. This page has been deleted. Refer to <>. -[role="exclude",id="enhancements-and-bug-fixes-v8.10.0"] -== Enhancements and bug fixes for 8.10.0 - -This content has moved. Refer to <> for 8.10.0. [role="exclude",id="gen-ai-action-type"] == Generative AI connector and action diff --git a/docs/setup/upgrade/upgrade-standard.asciidoc b/docs/setup/upgrade/upgrade-standard.asciidoc index f78a26e8acc89..fb8c4ff419693 100644 --- a/docs/setup/upgrade/upgrade-standard.asciidoc +++ b/docs/setup/upgrade/upgrade-standard.asciidoc @@ -30,7 +30,7 @@ Different versions of {kib} running against the same {es} index, such as during + Make sure you remove or update any configurations -that are indicated in the <> documentation +that are indicated in the <> documentation otherwise {kib} will fail to start. -- . Upgrade any plugins by removing the existing plugin and reinstalling the @@ -51,7 +51,7 @@ and becomes a new instance in the monitoring data. -- . Copy the files from the `config` directory from your old installation to your new installation. Make sure you remove or update any configurations that are - indicated in the <> documentation + indicated in the <> documentation otherwise {kib} will fail to start. . Copy the files from the `data` directory from your old installation to your new installation. diff --git a/docs/upgrade-notes.asciidoc b/docs/upgrade-notes.asciidoc index 4d4208b2253f7..329b6ab5cb667 100644 --- a/docs/upgrade-notes.asciidoc +++ b/docs/upgrade-notes.asciidoc @@ -39,15 +39,15 @@ Check https://docs.elastic.dev/docs/kibana-doc-links (internal) for more details //// -Before you upgrade, review the breaking changes and deprecations introduced in {kib} 8.x, then mitigate the impact. +Before you upgrade, review the breaking changes and deprecations introduced since the version you are migrating from, then mitigate the impact. -For Elastic Security release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +If you are migrating from a version prior to version 9.0, you must first upgrade to the last 8.x version available. + +For Elastic Security solution release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. [float] === Breaking changes -[float] -==== Kibana APIs [discrete] [[breaking-199656]] @@ -97,1327 +97,12 @@ We would love to discuss your use case. ==== -[discrete] -[[breaking-162506]] -.Get case metrics APIs became internal. (8.10) -[%collapsible] -==== -*Details* + -The get case metrics APIs are now internal. For more information, refer to ({kibana-pull}162506[#162506]). -==== - -[discrete] -[[breaking-155470]] -.Removed legacy project monitor API. (8.8) -[%collapsible] -==== -*Details* + -The project monitor API for Synthetics in Elastic Observability has been removed. For more information, refer to {kibana-pull}155470[#155470]. - -*Impact* + -In 8.8.0 and later, an error appears when you use the project monitor API. -==== - -[discrete] -[[breaking-147616]] -.Removed the `current_upgrades` endpoint. (8.7) -[%collapsible] -==== -*Details* + -The `/api/fleet/current_upgrades` endpoint has been removed. For more information, refer to {kibana-pull}147616[#147616]. - -*Impact* + -When you upgrade to 8.7.0, use the `api/fleet/agents/action_status` endpoint. -==== - -[discrete] -[[breaking-147199]] -.Removed the `preconfiguration` API route. (8.7) -[%collapsible] -==== -*Details* + -The `/api/fleet/setup/preconfiguration` API, which was released as generally available by error, has been removed. For more information, refer to {kibana-pull}147199[#147199]. - -*Impact* + -Do not use `/api/fleet/setup/preconfiguration`. To manage preconfigured agent policies, use kibana.yml. For more information, check link:https://www.elastic.co/guide/en/kibana/current/fleet-settings-kb.html#_preconfiguration_settings_for_advanced_use_cases[Preconfigured settings]. -==== - -[discrete] -[[breaking-141757]] -.Updated bulk action API to return actionId instead of agent success. (8.5) -[%collapsible] -==== -*Details* + -To make bulk action responses consistent, returns `actionId` instead of agent ids with `success: True` or `success: False` results. For more information, refer to {kibana-pull}141757[#141757]. - -*Impact* + -When you use `FleetBulkResponse`, you now receive only `actionId` responses. -==== - -[discrete] -[[breaking-116821]] -.Removed deprecated config fields from Logs and Metrics APIs and saved objects. (8.0) -[%collapsible] -==== -*Details* + -On the Logs and Metrics UIs, references to the following API and saved object deprecated fields have been removed: - -* `timestamp` -* `tiebreaker` -* `container` -* `pod` -* `host` - -For more information, refer to {kibana-pull}116821[#116821] and {kibana-pull}115874[#115874]. - -*Impact* + -When you upgrade to 8.0.0, you are unable to use references to the deprecated fields. -==== - -[discrete] -[[breaking-114730]] -.Removed `/api/settings`. (8.0) -[%collapsible] -==== -*Details* + -The `/api/settings` REST API has been removed. For more information, refer to {kibana-pull}114730[#114730]. - -*Impact* + -Use `/api/stats`. -==== - -[discrete] -[[breaking-110830]] -.Changed the `GET /api/status` default behavior. (8.0) -[%collapsible] -==== -*Details* + -`GET /api/status` reports a new and more verbose payload. For more information, refer to {kibana-pull}110830[#110830]. - -*Impact* + -To retrieve the {kib} status in the previous format, use `GET /api/status?v7format=true`. -==== - [float] -==== Kibana platform - -// Alerting -[discrete] -[[breaking-170635]] -.[Alerting] A new sub-feature privilege to control user access to the cases settings. (8.12) -[%collapsible] -==== -*Details* + -Roles with at least a sub-feature privilege configured will not have access to the cases setting like they had previously. All roles without a sub-feature privilege configured will not be affected. For more information, refer to ({kibana-pull}170635[#170635]). -==== - -[discrete] -[[breaking-162492]] -.[Alerting] New case limits. (8.10) -[%collapsible] -==== -*Details* + -Limits are now imposed on the number of objects cases can process or the amount of data those objects can store. -//// -For example: -* Updating a case comment is now included in the 10000 user actions restriction. ({kibana-pull}163150[#163150]) -* Updating a case now fails if the operation makes it reach more than 10000 user actions. ({kibana-pull}161848[#161848]) -* The total number of characters per comment is limited to 30000. ({kibana-pull}161357[#161357]) -* The getConnectors API now limits the number of supported connectors returned to 1000. ({kibana-pull}161282[#161282]) -* There are new limits and restrictions when retrieving cases. ({kibana-pull}162411[#162411]), ({kibana-pull}162245[#162245]), ({kibana-pull}161111[#161111]), ({kibana-pull}160705[#160705]) -* A case can now only have 100 external references and persistable state(excluding files) attachments combined. ({kibana-pull}162071[#162071]). -* New limits on titles, descriptions, tags and category. ({kibana-pull}160844[#160844]). -* The maximum number of cases that can be updated simultaneously is now 100. The minimum is 1. ({kibana-pull}161076[#161076]). -* The Delete cases API now limits the number of cases to be deleted to 100.({kibana-pull}160846[#160846]). -//// -For the full list, refer to {kib-issue}146945[#146945]. -==== - -[discrete] -[[breaking-147985]] -.[Alerting] Changed privileges for alerts and cases. (8.8) -[%collapsible] -==== -*Details* + -The privileges for attaching alerts to cases has changed. For more information, refer to {kibana-pull}147985[#147985]. - -*Impact* + -To attach alerts to cases, you must have `Read` access to an {observability} or Security feature that has alerts and `All` access to the **Cases** feature. For detailed information, check link:https://www.elastic.co/guide/en/kibana/current/kibana-privileges.html[{kib} privileges] and link:https://www.elastic.co/guide/en/kibana/current/setup-cases.html[Configure access to cases]. -==== - -[discrete] -.[Alerting] Removed support for `monitoring.cluster_alerts.allowedSpaces`. (8.0) -[%collapsible] -==== -*Details* + -The `monitoring.cluster_alerts.allowedSpaces` setting, which {kib} uses to create Stack Monitoring alerts, has been removed. For more information, refer to {kibana-pull}123229[#123229]. - -*Impact* + -Before you upgrade to 8.0.0, remove `monitoring.cluster_alerts.allowedSpaces` from kibana.yml. -==== - -[discrete] -[[breaking-114558]] -.[Alerting] Removed `xpack.task_manager.index` setting. (8.0) -[%collapsible] -==== -*Details* + -The `xpack.task_manager.index` setting has been removed. For more information, refer to {kibana-pull}114558[#114558]. - -*Impact* + -Before you upgrade to 8.0.0, remove `xpack.task_manager.index` from kibana.yml. -==== - -[discrete] -[[breaking-113461]] -.[Alerting] Removed ability to remove Elastic-managed plugins. (8.0) -[%collapsible] -==== -*Details* + -The `xpack.actions.enabled` setting has been removed. For more information, refer to {kibana-pull}113461[#113461]. - -*Impact* + -Before you upgrade to 8.0.0, remove `xpack.actions.enabled` from kibana.yml. -==== - - -// Data views - -[discrete] -[[breaking-139431]] -.[Data views] Removed filter validation for ad-hoc data views (8.5) -[%collapsible] -==== -*Details* + -Filters associated with unknown data views, such as deleted data views, are no longer automatically disabled. For more information, refer to {kibana-pull}139431[#139431]. - -*Impact* + -Filters associated with unknown data views now display a warning message instead of being automatically disabled. -==== - -// Dev tools - -[discrete] -[[breaking-159041]] -.[Dev tools] The `addProcessorDefinition` function was removed from Console. (8.10) -[%collapsible] -==== -*Details* + -The function `addProcessorDefinition` is removed from the Console plugin start contract (server side). For more information, refer to ({kibana-pull}159041[#159041]). -==== - -[discrete] -[[breaking-123754]] -.[Dev tools] Removed the `console.ssl` setting. (8.0) -[%collapsible] -==== -*Details* + -The `console.ssl` setting has been removed. For more information, refer to {kibana-pull}123754[#123754]. - -*Impact* + -Before you upgrade to 8.0.0, remove `console.ssl` from kibana.yml. -==== - -// ECS - -[discrete] -.[Elastic Common Schema] Moved `doc_root.vulnerability.package` to doc_root.package (ECS). (8.11) -[%collapsible] -==== -*Details* + -This change updates all instances of `vulnerability.package` to the ECS standard package fieldset. For more information, refer to ({kibana-pull}164651[#164651]). -==== - -// ESQL -[discrete] -[[breaking-182074]] -.[ES|QL] Renamed an advanced setting to enable {esql}. (8.14) -[%collapsible] -==== -*Details* + -The advanced setting which hides {esql} from the UI has been renamed from `discover:enableESQL` to `enableESQL`. It is enabled by default and must be switched off to disable {esql} features from your {kib} applications. For more information, refer to ({kibana-pull}182074[#182074]). -==== - -[discrete] -[[breaking-174674]] -.[ES|QL] Removed `is_nan`, `is_finite`, and `is_infinite` functions from {esql}. (8.13) -[%collapsible] -==== -*Details* + -These functions have been removed from {esql} queries as they are not supported. Errors would be thrown when trying to use them. For more information, refer to ({kibana-pull}174674[#174674]). -==== - -// Fleet -[discrete] -[[breaking-184036]] -.[Fleet] Added rate limiting to install by upload endpoint. (8.15) -[%collapsible] -==== -*Details* + -Rate limiting was added to the upload `api/fleet/epm/packages` endpoint. For more information, refer to {kibana-pull}184036[#184036]. - -*Impact* + -If you do two or more requests in less than 10 seconds, the subsequent requests fail with `429 Too Many Requests`. -Wait 10 seconds before uploading again. -This change could potentially break automations for users that rely on frequent package uploads. -==== - -[discrete] -[[breaking-176879]] -.[Fleet]Removed conditional topics for Kafka outputs. (8.13) -[%collapsible] -==== -*Details* + -The Kafka output no longer supports conditional topics. For more information, refer to ({kibana-pull}176879[#176879]). -==== - -[discrete] -[[breaking-176443]] -.[Fleet]Most Fleet installed integrations are now read-only and labelled with a *Managed* tag in the Kibana UI. (8.13) -[%collapsible] -==== -*Details* + - -Integration content installed by {fleet} is no longer editable. This content is tagged with *Managed* in the {kib} UI, and is Elastic managed. This content cannot be edited or deleted. However, managed visualizations, dashboards, and saved searches can be cloned. The clones can be customized. - -When cloning a dashboard the cloned panels become entirely independent copies that are unlinked from the original configurations and dependencies. - -For managed content relating to specific visualization editors such as Lens, TSVB, and Maps, the clones retain the original reference configurations. The same applies to editing any saved searches in a managed visualization. - -For more information, refer to ({kibana-pull}172393[#172393]). -==== - -[discrete] -[[breaking-167085]] -.[Fleet] Improved config output validation for default output. (8.11) -[%collapsible] -==== -*Details* + -Improve config output validation to not allow to defining multiple default outputs in {kib} configuration. For more information, refer to ({kibana-pull}167085[#167085]). -==== - -[discrete] -[[breaking-138677]] -.[Fleet] Removed the `package_policies` field from the agent policy saved object. (8.5) -[%collapsible] -==== -*Details* + -The bidirectional foreign key between agent policy and package policy has been removed. For more information, refer to {kibana-pull}138677[#138677]. - -*Impact* + -The agent policy saved object no longer includes the `package_policies` field. -==== - -[discrete] -[[breaking-135669]] -.[Fleet] xpack.agents.* are now uneditable in UI when defined in kibana.yml. (8.4) -[%collapsible] -==== -*Details* + -When you configure `xpack.fleet.agents.fleet_server.hosts` and `xpack.fleet.agents.elasticsearch.hosts` in kibana.yml, you are unable to update the fields on the Fleet UI. - -For more information, refer to {kibana-pull}135669[#135669]. - -*Impact* + -To configure `xpack.fleet.agents.fleet_server.hosts` and `xpack.fleet.agents.elasticsearch.hosts` on the Fleet UI, avoid configuring the settings in kibana.yml. -==== - -[discrete] -[[breaking-118854]] -.[Fleet] Split package policy `upgrade` endpoint for Fleet. (8.0) -[%collapsible] -==== -*Details* + -For package policy upgrades, the packagePolicy `upgrade` endpoint format supports a mutative upgrade operation (when `dryRun: false`) and a read-only dry run operation (when `dryRun: true`): - -[source,text] --- - POST /package_policies/upgrade - { - packagePolicyIds: [...], - dryRun: false - } --- - -For more information, refer to {kibana-pull}118854[#118854]. - -*Impact* + -The endpoint is now split into two separate endpoints: - -[source,text] --- - POST /package_policies/upgrade - { - packagePolicyIds: [...] - } - - POST /package_policies/upgrade/dry_run - { - packagePolicyIds: [...] - } --- -==== - -// General settings - -[discrete] -[[breaking-180986]] -.[General settings] Updated request processing during shutdown. (8.16) -[%collapsible] -==== -*Details* + -During shutdown, {kib} now waits for all the ongoing requests to complete according to the `server.shutdownTimeout` setting. During that period, the incoming socket is closed and any new incoming requests are rejected. Before this update, new incoming requests received a response with the status code 503 and body `{"message": "Kibana is shutting down and not accepting new incoming requests"}`. For more information, refer to {kibana-pull}180986[#180986]. -==== - -[discrete] -[[breaking-111535]] -.[General settings] Removed `CONFIG_PATH` and `DATA_PATH` environment variables. (8.0) -[%collapsible] -==== -*Details* + -The `CONFIG_PATH` and `DATA_PATH` environment variables have been removed. For more information, refer to {kibana-pull}111535[#111535]. - -*Impact* + -Replace the `CONFIG_PATH` environment variable with `KBN_PATH_CONF`, and replace `DATA_PATH` with the `path.data` setting. -==== - -[discrete] -[[breaking-114379]] -.[General settings] Removed support for csp.rules configuration. (8.0) -[%collapsible] -==== -*Details* + -Support for the `csp.rules` configuration property has been removed. For more information, refer to {kibana-pull}114379[#114379]. - -*Impact* + -Configuring the default `csp.script_src`, `csp.workers_src`, and `csp.style_src` values is not required. -==== - -[discrete] -[[breaking-113653]] -.[General settings] Changed and removed deprecated core settings and deprecated settings from core plugins. (8.0) -[%collapsible] -==== -*Details* + -The deprecation notice for `server.cors` has changed from `level:critical` to `level:warning`. - -The following settings have changed: - -* The `xpack.banners.placement` value of `header` has been renamed to `top` - -Support for the following configuration settings has been removed: - -* `newsfeed.defaultLanguage` -* `cpu.cgroup.path.override` -* `cpuacct.cgroup.path.override` -* `server.xsrf.whitelist` -* `xpack.xpack_main.xpack_api_polling_frequency_millis` -* `KIBANA_PATH_CONF` - -For more information, refer to {kibana-pull}113653[#113653]. +=== Deprecation notices -*Impact* + -* The `header` value provided to the `xpack.banners.placement` configuration has been renamed to 'top' -* The `newsfeed.defaultLanguage` newsfeed items are retrieved based on the browser locale and default to English -* Replace `cpu.cgroup.path.override` with `ops.cGroupOverrides.cpuPath` -* Replace `cpuacct.cgroup.path.override` with `ops.cGroupOverrides.cpuAcctPath` -* Replace `server.xsrf.whitelist` with `server.xsrf.allowlist` -* Replace `xpack.xpack_main.xpack_api_polling_frequency_millis` with `xpack.licensing.api_polling_frequency` -* Replace `KIBANA_PATH_CONF` path to the {kib} configuration file using the `KBN_PATH_CONF` environment variable -==== - -[discrete] -[[breaking-113495]] -.[General settings] Removed `enabled` settings from plugins. (8.0) -[%collapsible] -==== -*Details* + -Using `{plugin_name}.enabled` to disable plugins has been removed. Some plugins, such as `telemetry`, `newsfeed`, `reporting`, and the various `vis_type` plugins will continue to support this setting. All other {kib} plugins will not support this setting. Any new plugin will support this setting only when specified in the `configSchema`. For more information, refer to {kibana-pull}113495[#113495]. - -The `xpack.security.enabled` setting has been removed. For more information, refer to {kibana-pull}111681[#111681]. - -*Impact* + -Before you upgrade to 8.0.0: - -* Remove `{plugin_name}.enabled` from kibana.yml. If you use the setting to control user access to {kib} applications, use <> instead. -* Replace `xpack.security.enabled` with {ref}/security-settings.html#general-security-settings[`xpack.security.enabled`] in elasticsearch.yml. -==== - -[discrete] -[[breaking-113367]] -.[General settings] Removed `--plugin-dir` cli option. (8.0) -[%collapsible] -==== -*Details* + -The `plugins.scanDirs` setting and `--plugin-dir` cli option have been removed. For more information, refer to {kibana-pull}113367[#113367]. - -*Impact* + -Before you upgrade to 8.0.0, remove `plugins.scanDirs` from kibana.yml. -==== - -[discrete] -[[breaking-113296]] -.[General settings] Removed support for `optimize.*` settings. (8.0) -[%collapsible] -==== -*Details* + -The legacy `optimize.*` settings have been removed. If your configuration uses the following legacy `optimize.*` settings, {kib} fails to start: - -* `optimize.lazy` -* `optimize.lazyPort` -* `optimize.lazyHost` -* `optimize.lazyPrebuild` -* `optimize.lazyProxyTimeout` -* `optimize.enabled` -* `optimize.bundleFilter` -* `optimize.bundleDir` -* `optimize.viewCaching` -* `optimize.watch` -* `optimize.watchPort` -* `optimize.watchHost` -* `optimize.watchPrebuild` -* `optimize.watchProxyTimeout` -* `optimize.useBundleCache` -* `optimize.sourceMaps` -* `optimize.workers` -* `optimize.profile` -* `optimize.validateSyntaxOfNodeModules` - -For more information, refer to {kibana-pull}113296[#113296]. - -*Impact* + -To run the `@kbn/optimizer` separately in development, pass `--no-optimizer` to `yarn start`. For more details, refer to {kibana-pull}73154[#73154]. -==== - -[discrete] -[[breaking-113173]] -.[General settings] Removed `so/server/es` settings. (8.0) -[%collapsible] -==== -*Details* + -Some of the `savedObjects`, `server`, and `elasticsearch` settings have been removed. If your configuration uses the following settings, {kib} fails to start: - -* `savedObjects.indexCheckTimeout` -* `server.xsrf.token` -* `elasticsearch.preserveHost` -* `elasticsearch.startupTimeout` - -For more information, refer to {kibana-pull}113173[#113173]. - -*Impact* + -Before you upgrade to 8.0.0., remove these settings from kibana.yml. -==== - -[discrete] -[[breaking-113068]] -.[General settings] Added requirement for inline scripting. (8.0) -[%collapsible] -==== -*Details* + -To start {kib}, you must enable inline scripting in {es}. For more information, refer to {kibana-pull}113068[#113068]. - -*Impact* + -Enable {ref}/modules-scripting-security.html[inline scripting]. -==== - -[discrete] -[[breaking-112773]] -.[General settings] Removed `kibana.index` settings. (8.0) -[%collapsible] -==== -*Details* + -The `kibana.index`, `xpack.reporting.index`, and `xpack.task_manager.index` settings have been removed. For more information, refer to {kibana-pull}112773[#112773]. - -*Impact* + -Use spaces, cross-cluster replication, or cross-cluster search. To migrate to <>, export your <> from a tenant into the default space. For more details, refer to link:https://github.com/elastic/kibana/issues/82020[#82020]. -==== - -[discrete] -[[breaking-112305]] -.[General settings] Removed legacy logging. (8.0) -[%collapsible] -==== -*Details* + -The logging configuration and log output format has changed. For more information, refer to {kibana-pull}112305[#112305]. - -*Impact* + -Use the new <>. -==== - -[discrete] -[[breaking-109798]] -.[General settings] Removed `kibana.defaultAppId` setting. (8.0) -[%collapsible] -==== -*Details* + -The deprecated `kibana.defaultAppId` setting in kibana.yml, which is also available as `kibana_legacy.defaultAppId`, has been removed. For more information, refer to {kibana-pull}109798[#109798]. - -*Impact* + -When you upgrade, remove `kibana.defaultAppId` from your kibana.yml file. To configure the default route for users when they enter a space, use the <> in *Advanced Settings*. -==== - -[discrete] -[[breaking-109350]] -.[General settings] Removed `courier:batchSearches` setting. (8.0) -[%collapsible] -==== -*Details* + -The deprecated `courier:batchSearches` setting in *Advanced Settings* has been removed. For more information, refer to {kibana-pull}109350[#109350]. - -*Impact* + -When you upgrade, the `courier:batchSearches` setting will no longer be available. -==== - - -[discrete] -[[breaking-106061]] -.[General settings] New session timeout defaults. (8.0) -[%collapsible] -==== -*Details* + -The default values for the session timeout `xpack.security.session.{lifespan|idleTimeout}` settings have changed. For more information, refer to {kibana-pull}106061[#106061] - -*Impact* + -The new default values are as follows: - -* `xpack.security.session.idleTimeout: 3d` -* `xpack.security.session.lifespan: 30d` -==== - -[discrete] -[[breaking-87114]] -.[General settings] Removed support for setting `server.host` to '0'. (8.0) -[%collapsible] -==== -*Details* + -Support for configuring {kib} with `0` as the `server.host` has been removed. Please use `0.0.0.0` instead. For more information, refer to {kibana-pull}87114[#87114] - -*Impact* + -You are now unable to use `0` as the `server.host`. -==== - -[discrete] -[[breaking-38657]] -.[General settings] Removed `xpack.security.public` and `xpack.security.authProviders` settings. (8.0) -[%collapsible] -==== -*Details* + -The `xpack.security.public` and `xpack.security.authProviders` settings have been removed. For more information, refer to {kibana-pull}38657[#38657] - -*Impact* + -Use the `xpack.security.authc.saml.realm` and `xpack.security.authc.providers` settings. -==== - -[discrete] -[[breaking-22696]] -.[General settings] Removed `logging.useUTC` setting. (8.0) -[%collapsible] -==== -*Details* + -The `logging.useUTC` setting has been removed. For more information, refer to {kibana-pull}22696[#22696] - -*Impact* + -The default timezone is UTC. To change the timezone, set `logging.timezone: false` in kibana.yml. Change the timezone when the system, such as a docker container, is configured for a nonlocal timezone. -==== - -// Index management - -[discrete] -[[breaking-35173]] -.[Index management] Removed support for time-based interval index patterns. (8.0) -[%collapsible] -==== -*Details* + -Time-based interval index patterns were deprecated in 5.x. In 6.x, you could no longer create time-based interval index patterns, but they continued to function as expected. Support for these index patterns has been removed in 8.0. For more information, refer to {kibana-pull}35173[#35173] - -*Impact* + -You must migrate your time_based index patterns to a wildcard pattern. For example, logstash-*. -==== - -// Logs - -[discrete] -[[breaking-115974]] -.[Logs] Removed deprecated alias config entries. (8.0) -[%collapsible] -==== -*Details* + -The deprecated `xpack.infra.sources.default.logAlias` and `xpack.infra.sources.default.logAlias` settings have been removed. For more information, refer to {kibana-pull}115974[#115974]. - -*Impact* + -Before you upgrade, remove the settings from kibana.yml, then configure the settings in <>. -==== - -[discrete] -[[breaking-61302]] -.[Logs] Removed configurable fields in settings. (8.0) -[%collapsible] -==== -*Details* + -The *Logs* and *Metrics* configurable fields settings have been removed. For more information, refer to {kibana-pull}61302[#61302]. - -*Impact* + -Configure the settings in https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[ECS]. -==== - -// Machine Learning - -[discrete] -[[breaking-119945]] -.[Machine learning] Removed APM jobs from Machine Learning. (8.0) -[%collapsible] -==== -*Details* + -APM Node.js and RUM JavaScript anomaly detection job modules have been removed. For more information, refer to {kibana-pull}119945[#119945]. - -*Impact* + -When you upgrade to 8.0.0, you are unable to create and view the APM Node.js and RUM JavaScript jobs in Machine Learning. -==== - -[discrete] -[[breaking-115444]] -.[Machine learning] Granted access to machine learning features when base privileges are used. (8.0) -[%collapsible] -==== -*Details* + -Machine learning features are included as base privileges. For more information, refer to {kibana-pull}115444[#115444]. - -*Impact* + -If you do not want to grant users privileges to machine learning features, update <>. -==== - -// Osquery - -[discrete] -[[breaking-134855]] -.[Osquery] "All" base privilege option now also applies to Osquery. (8.3) -[%collapsible] -==== -*Details* + -The Osquery {kib} privilege has been updated, so that when the *Privileges for all features level* is set to *All*, this now applies *All* to Osquery privileges as well. Previously, users had to choose the *Customize* option to grant any access to Osquery. For more information, refer to {kibana-pull}130523[#130523]. - -*Impact* + -This impacts user roles that have *Privileges for all features* set to *All*. After this update, users with this role will have access to the Osquery page in {kib}. However, to use the Osquery feature fully, these requirements remain the same: users also need Read access to the logs-osquery_manager.result* index and the Osquery Manager integration must be deployed to Elastic Agents. -==== - -// Saved objects - -[discrete] -[[breaking-118300]] -.[Saved objects] Fail migrations for saved objects with unknown types. (8.0) -[%collapsible] -==== -*Details* + -Unknown saved object types now cause {kib} migrations to fail. For more information, refer to {kibana-issue}107678[#107678]. - -*Impact* + -To complete the migration, re-enable plugins or delete documents from the index in the previous version. -==== - -[discrete] -[[breaking-110738]] -.[Saved objects] Removed support for legacy exports. (8.0) -[%collapsible] -==== -*Details* + -In {kib} 8.0.0 and later, the legacy format from {kib} 6.x is unsupported. For more information, refer to {kibana-pull}110738[#110738] - -*Impact* + -Using the user interface to import saved objects is restricted to `.ndjson` format imports. -==== - -// Security - -[discrete] -[[breaking-116191]] -.[Security] Removed legacy audit logger. (8.0) -[%collapsible] -==== -*Details* + -The legacy audit logger has been removed. For more information, refer to {kibana-pull}116191[#116191]. - -*Impact* + -Audit logs will be written to the default location in the new ECS format. To change the output file, filter events, and more, use the <>. -==== - -[discrete] -[[breaking-41700]] -.[Security] Legacy browsers rejected by default. (8.0) -[%collapsible] -==== -*Details* + -To provide the maximum level of protection for most installations, the csp.strict config is now enabled by default. Legacy browsers not supported by Kibana, such as Internet Explorer 11, are unable to access {kib} unless explicitly enabled. All browsers officially supported by Kibana do not have this issue. For more information, refer to {kibana-pull}41700[#41700] - -*Impact* + -To enable support for legacy browsers, set `csp.strict: false` in kibana.yml. To effectively enforce the security protocol, we strongly discourage disabling `csp.strict` unless it is critical that you support Internet Explorer 11. -==== - -// Setup - -[discrete] -[[breaking-93835]] -.[Setup] Removed platform from archive root directory. (8.0) -[%collapsible] -==== -*Details* + -After you extract an archive, the output directory no longer includes the target platform. For example, `kibana-8.0.0-linux-aarch64.tar.gz` produces a `kibana-8.0.0` folder. For more information, refer to {kibana-pull}93835[#93835]. - -*Impact* + -To use the new folder, update the configuration management tools and automation. -==== - -[discrete] -[[breaking-90511]] -.[Setup] Removed default support for TLS v1.0 and v1.1. (8.0) -[%collapsible] -==== -*Details* + -The default support for TLS v1.0 and v1.1 has been removed. For more information, refer to {kibana-pull}90511[#90511]. - -*Impact* + -To enable support, set `--tls-min-1.0` in the `node.options` configuration file. To locate the configuration file, go to the kibana/config folder or any other configuration with the `KBN_PATH_CONF` environment variable. For example, if you are using a Debian-based system, the configuration file is located in /etc/kibana. -==== - -[discrete] -[[breaking-74424]] -.[Setup] Removed support for sysv init. (8.0) -[%collapsible] -==== -*Details* + -All supported operating systems use systemd service files. Any system that doesn’t have `service` aliased to use kibana.service should use `systemctl start kibana.service` instead of `service start kibana`. For more information, refer to {kibana-pull}74424[#74424]. - -*Impact* + -If your installation uses .deb or .rpm packages with SysV, migrate to systemd. -==== - -[discrete] -[[breaking-42353]] -.[Setup] Disabled response logging as a default. (8.0) -[%collapsible] -==== -*Details* + -In previous versions, all events are logged in `json` when `logging.json:true`. With the new logging configuration, you can choose the `json` and pattern output formats with layouts. For more information, refer to {kibana-pull}42353[#42353]. - -*Impact* + -To restore the previous behavior, configure the logging format for each custom appender with the `appender.layout property` in kibana.yml. There is no default for custom appenders, and each appender must be configured explicitly. -//// -[source,yaml] ----- -logging: - appenders: - custom_console: - type: console - layout: - type: pattern - custom_json: - type: console - layout: - type: json - loggers: - - name: plugins.myPlugin - appenders: [custom_console] - root: - appenders: [default, custom_json] - level: warn ----- -//// -==== - -// Sharing and reporting - -[discrete] -[[breaking-162288]] -.[Sharing & Reporting] The Download CSV endpoint has changed. (8.10) -[%collapsible] -==== -*Details* + -The API endpoint for downloading a CSV file from a saved search in the Dashboard application has changed to reflect the fact that this is an internal API. The previous API path of -`/api/reporting/v1/generate/immediate/csv_searchsource` has been changed to `/internal/reporting/generate/immediate/csv_searchsource`. For more information, refer to {kibana-pull}162288[#162288]. -==== - -[discrete] -[[breaking-158338]] -.[Sharing & Reporting] CSV reports now use PIT instead of Scroll. (8.6) -[%collapsible] -==== -*Details* + -CSV reports now use PIT instead of Scroll. Previously generated CSV reports that used an index alias with alias-only privileges, but without privileges on the alias referenced-indices will no longer generate. For more information, refer to {kibana-pull}158338[#158338]. - -*Impact* + -To generate CSV reports, grant `read` privileges to the underlying indices. -==== - -[discrete] -[[breaking-121435]] -.[Sharing & Reporting] Removed legacy CSV export type. (8.1) -[%collapsible] -==== -*Details* + -The `/api/reporting/generate/csv` endpoint has been removed. For more information, refer to {kibana-pull}121435[#121435]. - -*Impact* + -If you are using 7.13.0 and earlier, {kibana-ref-all}/8.1/automating-report-generation.html[regenerate the POST URLs] that you use to automatically generate CSV reports. -==== - -[discrete] -[[breaking-121369]] -.[Sharing & Reporting]Removed legacy PDF shim. (8.1) -[%collapsible] -==== -*Details* + -The POST URLs that you generated in {kib} 6.2.0 no longer work. For more information, refer to {kibana-pull}121369[#121369]. - -*Impact* + -{kibana-ref-all}/8.1/automating-report-generation.html[Regenerate the POST URLs] that you use to automatatically generate PDF reports. -==== - -[discrete] -[[breaking-114216]] -.[Sharing & Reporting] Removed reporting settings. (8.0) -[%collapsible] -==== -*Details* + -The following settings have been removed: - -* `xpack.reporting.capture.concurrency` - -* `xpack.reporting.capture.settleTime` - -* `xpack.reporting.capture.timeout` - -* `xpack.reporting.kibanaApp` - -For more information, refer to {kibana-pull}114216[#114216]. - -*Impact* + -Before you upgrade to 8.0.0, remove the settings from kibana.yml. -==== - -[discrete] -[[breaking-52539]] -.[Sharing & Reporting] Legacy job parameters are no longer supported. (8.0) -[%collapsible] -==== -*Details* + -*Reporting* is no longer compatible with POST URL snippets generated with {kib} 6.2.0 and earlier. For more information, refer to {kibana-pull}52539[#52539] - -*Impact* + -If you use POST URL snippets to automatically generate PDF reports, regenerate the POST URL strings. -==== - -// User management - -[discrete] -[[breaking-122722]] -.[User management] Removed the ability to use `elasticsearch.username: elastic` in production. (8.0) -[%collapsible] -==== -*Details* + -In production, you are no longer able to use the `elastic` superuser to authenticate to {es}. For more information, refer to {kibana-pull}122722[#122722]. - -*Impact* + -When you configure `elasticsearch.username: elastic`, {kib} fails. -==== - -// Visualizations and dashboards - -[discrete] -[[breaking-149482]] -.[Visualizations] Removed the fields list sampling setting from Lens. (8.7) -[%collapsible] -==== -*Details* + -`lens:useFieldExistenceSampling` has been removed from *Advanced Settings*. The setting allowed you to enable document sampling to determine the fields that are displayed in *Lens*. For more information, refer to {kibana-pull}149482[#149482]. - -*Impact* + -In 8.1.0 and later, {kib} uses the field caps API, by default, to determine the fields that are displayed in *Lens*. -==== - -[discrete] -[[breaking-146990]] -.[Visualizations] Removed legacy pie chart visualization setting. (8.7) -[%collapsible] -==== -*Details* + -`visualization:visualize:legacyPieChartsLibrary` has been removed from *Advanced Settings*. The setting allowed you to create aggregation-based pie chart visualizations using the legacy charts library. For more information, refer to {kibana-pull}146990[#146990]. - -*Impact* + -In 7.14.0 and later, the new aggregation-based pie chart visualization is available by default. For more information, check <>. -==== - -[discrete] -[[breaking-143081]] -.[Visualizations] Changed the `histogram:maxBars` default setting. (8.6) -[%collapsible] -==== -*Details* + -To configure higher resolution data histogram aggregations without changing the *Advanced Settings*, the default histogram:maxBars setting is now 1000 instead of 100. For more information, refer to {kibana-pull}143081[#143081]. - -*Impact* + -For each {kibana-ref}/xpack-spaces.html[space], complete the following to change *histogram:maxBars* to the previous default setting: - -. Open the main menu, then click *Stack Management > Advanced Settings*. -. Scroll or search for *histogram:maxBars*. -. Enter `100`, then click *Save changes*. -==== - -[discrete] -[[breaking-134336]] -.[Visualizations] Removed the legacy Timelion charts library. (8.4) -[%collapsible] -==== -*Details* + -The legacy implementation of the *Timelion* visualization charts library has been removed. All *Timelion* visualizations now use the elastic-charts library, which was introduced in 7.15.0. - -For more information, refer to {kibana-pull}134336[#134336]. - -*Impact* + -In 8.4.0 and later, you are unable to configure the *Timelion* legacy charts library advanced setting. For information about visualization Advanced Settings, check link:https://www.elastic.co/guide/en/kibana/8.4/advanced-options.html#kibana-visualization-settings[Visualization]. -==== - -[discrete] -[[breaking-129581]] -.[Visualizations] Removed Quandl and Graphite integrations. (8.3) -[%collapsible] -==== -*Details* + -The experimental `.quandl` and `.graphite` functions and advanced settings are removed from *Timelion*. For more information, check {kibana-pull}129581[#129581]. - -*Impact* + -When you use the `vis_type_timelion.graphiteUrls` kibana.yml setting, {kib} successfully starts, but logs a `[WARN ][config.deprecation] You no longer need to configure "vis_type_timelion.graphiteUrls".` warning. - -To leave your feedback about the removal of `.quandl` and `.graphite`, go to the link:https://discuss.elastic.co/c/elastic-stack/kibana/7[discuss forum]. -==== - -[discrete] -[[breaking-113516]] -.[Visualizations] Removed display options from legacy gauge visualizations. (8.0) -[%collapsible] -==== -*Details* + -The *Display warnings* option has been removed from the aggregation-based gauge visualization. For more information, refer to {kibana-pull}113516[#113516]. - -*Impact* + -When you create aggregation-based gauge visualizations, the *Display warnings* option is no longer available in *Options > Labels*. -==== - -[discrete] -[[breaking-112643]] -.[Visualizations] Removed settings from visEditors plugins. (8.0) -[%collapsible] -==== -*Details* + -The following deprecated visEditors plugin settings have been removed: - -* `metric_vis.enabled` -* `table_vis.enabled` -* `tagcloud.enabled` -* `metrics.enabled` -* `metrics.chartResolution` -* `chartResolution` -* `metrics.minimumBucketSize` -* `minimumBucketSize` -* `vega.enabled` -* `vega.enableExternalUrls` -* `vis_type_table.legacyVisEnabled` -* `timelion_vis.enabled` -* `timelion.enabled` -* `timelion.graphiteUrls` -* `timelion.ui.enabled` - -For more information, refer to {kibana-pull}112643[#112643]. - -*Impact* + -Before you upgrade, make the following changes in kibana.yml: - -* Replace `metric_vis.enabled` with `vis_type_metric.enabled` -* Replace `table_vis.enabled` with `vis_type_table.enabled` -* Replace `tagcloud.enabled` with `vis_type_tagcloud.enabled` -* Replace `metrics.enabled` with `vis_type_timeseries.enabled` -* Replace `metrics.chartResolution` and `chartResolution` with `vis_type_timeseries.chartResolution` -* Replace `metrics.minimumBucketSize` and `minimumBucketSize` with `vis_type_timeseries.minimumBucketSize` -* Replace `vega.enabled` with `vis_type_vega.enabled` -* Replace `vega.enableExternalUrls` with `vis_type_vega.enableExternalUrls` -* Remove `vis_type_table.legacyVisEnabled` -* Replace `timelion_vis.enabled` with `vis_type_timelion.enabled` -* Replace `timelion.enabled` with `vis_type_timelion.enabled` -* Replace `timelion.graphiteUrls` with `vis_type_timelion.graphiteUrls` -* Remove `timelion.ui.enabled` - -==== - -[discrete] -[[breaking-111704]] -.[Visualizations] Removed dimming opacity setting. (8.0) -[%collapsible] -==== -*Details* + -The *Dimming opacity* setting in *Advanced Settings* has been removed. For more information, refer to {kibana-pull}111704[#111704]. - -*Impact* + -When you upgrade to 8.0.0, you are no longer able to configure the dimming opactiy for visualizations. -==== - -[discrete] -[[breaking-110985]] -.[Visualizations] Removes Less stylesheet support in TSVB. (8.0) -[%collapsible] -==== -*Details* + -In *TSVB*, custom Less stylesheets have been removed. For more information, refer to {kibana-pull}110985[#110985]. - -*Impact* + -Existing less stylesheets are automatically converted to CSS stylesheets. -==== - -[discrete] -[[breaking-110571]] -.[Visualizations] Disabled the input string mode in TSVB. (8.0) -[%collapsible] -==== -*Details* + -In *TSVB*, the *Index pattern selection mode* option has been removed. For more information, refer to {kibana-pull}110571[#110571]. - -*Impact* + -To use index patterns and {es} indices in *TSVB* visualizations: - -. Open the main menu, then click *Stack Management > Advanced Settings*. - -. Select *Allow string indices in TSVB*. - -. Click *Save changes*. -==== - -[discrete] -[[breaking-116184]] -.[Visualizations] Removed proxyElasticMapsServiceInMaps Maps setting. (8.0) -[%collapsible] -==== -*Details* + -The `map.proxyElasticMapsServiceInMaps` setting has been removed. For more information, refer to {kibana-pull}116184[#116184]. - -*Impact* + -Install the on-prem version of the <>, which is a Docker service that resides in the Elastic Docker registry, in an accessible location on your internal network. When you complete the installation, update kibana.yml to point to the service. -==== - -[discrete] -[[breaking-109896]] -.[Visualizations] Removed `map.regionmap.*`. (8.0) -[%collapsible] -==== -*Details* + -The deprecated `map.regionmap.*` setting in kibana.yml has been removed. For more information, refer to {kibana-pull}109896[#109896]. - -*Impact* + -If you have maps that use `map.regionmap` layers: - -. Remove the `map.regionmap` layer. - -. To recreate the choropleth layer, use <> to index your static vector data into {es}. - -. Create a choropleth layer from the indexed vector data. -==== - - -[discrete] -[[breaking-108103]] -.[Visualizations] Removed dashboard-only mode. (8.0) -[%collapsible] -==== -*Details* + -The legacy dashboard-only mode has been removed. For more information, refer to {kibana-pull}108103[#108103]. - -*Impact* + -To grant users access to only dashboards, create a new role, then assign only the *Dashboard* feature privilege. For more information, refer to <>. -==== - -[discrete] -[[breaking-105979]] -.[Visualizations] Removed `xpack.maps.showMapVisualizationTypes` setting. (8.0) -[%collapsible] -==== -*Details* + -The deprecated `xpack.maps.showMapVisualizationTypes` setting in kibana.yml has been removed. For more information, refer to {kibana-pull}105979[#105979] - -*Impact* + -When you upgrade, remove `xpack.maps.showMapVisualizationTypes` from your kibana.yml file. -==== - -[float] -==== Elastic Observability solution - -[discrete] -[[kibana-132790]] -.[APM] Removed `apm_user`. (8.3) -[%collapsible] -==== -*Details* + -Removes the `apm_user` role. For more information, check {kibana-pull}132790[#132790]. - -*Impact* + -The `apm_user` role is replaced with the `viewer` and `editor` built-in roles. -==== - -[discrete] -[[breaking-172224]] -.[SLOs]New SLO architecture. (8.12) -[%collapsible] -==== -*Details* + -We introduced a breaking change in the SLO features that will break any SLOs created before 8.12. These SLOs have to be manually reset through an API until we provide a UI for it. The data aggregated over time (rollup) is still available in the SLI v2 index, but won't be used for summary calculation when reset. - -The previous summary transforms summarizing every SLOs won't be used anymore and can be stopped and deleted: - -* slo-summary-occurrences-7d-rolling -* slo-summary-occurrences-30d-rolling -* slo-summary-occurrences-90d-rolling -* slo-summary-occurrences-monthly-aligned -* slo-summary-occurrences-weekly-aligned -* slo-summary-timeslices-7d-rolling -* slo-summary-timeslices-30d-rolling -* slo-summary-timeslices-90d-rolling -* slo-summary-timeslices-monthly-aligned -* slo-summary-timeslices-weekly-aligned - -Be aware that when installing a new SLO (or after resetting an SLO), we install two transforms (one for the rollup data and one that summarize the rollup data). Do not delete the new `slo-summary-{slo_id}-{slo_revision}` transforms. For more information, refer to ({kibana-pull}172224[#172224]). -==== - -[discrete] -[[breaking-162665]] -.[SLO] Introduced new summary search capabilities that will cause SLOs created before 8.10 to stop working. (8.10) -[%collapsible] -==== -*Details* + - -* SLO find API body parameters have changed. -* The index mapping used by the rollup data has changed, and we have added a summary index that becomes the new source of truth for search. -* The rollup transforms have been updated, but existing SLO with their transforms won't be updated. - -If some SLOs have been installed in a prior version at 8.10, they won't work after migrating to 8.10. There are two approaches to handle this breaking change. The recommended route is to delete all SLOs before migrating to 8.10. The alternative is to migrate to 8.10 and manually remove the SLOs. - -*Removing SLOs before migrating to 8.10* - -Use the SLO UI or the SLO delete API to delete all existing SLOs. This takes care of the saved object, transform and rollup data. When all SLOs have been deleted, then delete the residual rollup indices: `.slo-observability.sli-v1*`. Note that this is v1. - -*Removing SLOs after migrating to 8.10* - -After migrating to 8.10, the previously created SLOs won’t appear in the UI because the API is using a new index. The previously created SLOs still exist, and associated transforms are still rolling up data into the previous index `.slo-observability.sli-v1*`. The SLO delete API can't be used now, so remove the resources resources manually: - -. Find all existing transforms -All SLO related transforms start with the `slo-` prefix, this request returns them all: -+ -[source, bash] ----- -GET _transform/slo-* ----- -+ -Make a note of all the transforms IDs for later. - -. Stop all transforms -+ -[source, bash] ----- -POST _transform/slo-*/_stop?force=true ----- - -. Remove all transforms -+ -From the list of transforms returned during the first step, now delete them one by one: -+ -[source, bash] ----- -DELETE _transform/{transform_id}?force=true ----- - -. Find the SLO saved objects -+ -This request lists all the SLO saved objects. The SLO IDs and the saved object IDs are not the same. -+ -[source, bash] ----- -GET kbn:/api/saved_objects/_find?type=slo ----- -+ -Make a note of all the saved object IDs from the response. - -. Remove the SLO saved objects -+ -For each saved object ID, run the following: -+ -[source, bash] ----- -DELETE kbn:/api/saved_objects/slo/{Saved_Object_Id} ----- - -. Delete the rollup indices v1 -+ -Note that this is v1. -+ -[source, bash] ----- -DELETE .slo-observability.sli-v1* ----- -==== - -[discrete] -[[breaking-159118]] -.[Uptime] Uptime app now hidden when no data is available. (8.9) -[%collapsible] -==== -*Details* + -The Uptime app now gets hidden from the interface when it doesn't have any data for more than a week. If you have a standalone Heartbeat pushing data to Elasticsearch, the Uptime app is considered active. You can disable this automatic behavior from the advanced settings in Kibana using the **Always show legacy Uptime app** option. -For synthetic monitoring, we now recommend to use the new Synthetics app. For more information, refer to {kibana-pull}159118[#159118] -==== - -[discrete] -[[breaking-159012]] -.[Uptime] Removed synthetics pattern from Uptime settings. (8.9) -[%collapsible] -==== -*Details* + -Data from browser monitors and monitors of all types created within the Synthetics App or via the Elastic Synthetics Fleet Integration will no longer appear in Uptime. For more information, refer to {kibana-pull}159012[#159012] -==== - - - -[float] -==== Elastic Search solution - -[discrete] -[[breaking-106307]] -.Required security plugin. (8.0) -[%collapsible] -==== -*Details* + -Enterprise Search now requires that you enable X-Pack Security. For more information, refer to {kibana-pull}106307[#106307] - -*Impact* + -Enable X-Pack Security. -==== - - -[float] -==== Elastic Security solution - -NOTE: For the complete Elastic Security solution release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - -[discrete] -[[breaking-161806]] -.[Elastic Defend] Converted filterQuery to KQL.(8.11) -[%collapsible] -==== -*Details* + -Converts `filterQuery` to a KQL query string. For more information, refer to ({kibana-pull}161806[#161806]). -==== - - - -[float] -=== Deprecation notices - -The following functionality is deprecated and will be removed at a future date. Deprecated functionality -does not have an immediate impact on your application, but we strongly recommend you make the necessary -updates to avoid use of deprecated features. +The following functionality is deprecated and will be removed at a future date. Deprecated functionality +does not have an immediate impact on your application, but we strongly recommend you make the necessary +updates to avoid use of deprecated features. Use the **Kibana Upgrade Assistant** to prepare for your upgrade to the next version of the Elastic Stack. The assistant identifies deprecated settings in your configuration and guides you through the process of @@ -1425,399 +110,6 @@ resolving issues if any deprecated features are enabled. To access the assistant, go to **Stack Management** > **Upgrade Assistant**. -[float] -==== Kibana APIs - -[discrete] -[[kibana-152236]] -.Deprecated Agent reassign API PUT endpoint. (8.8) -[%collapsible] -==== -*Details* + -The PUT endpoint for the agent reassign API is deprecated. For more information, refer to {kibana-pull}152236[#152236]. - -*Impact* + -Use the POST endpoint for the agent reassign API. -==== - -[discrete] -[[kibana-151564]] -.Deprecated `total` in `/agent_status` Fleet API. (8.8) -[%collapsible] -==== -*Details* + -The `total` field in `/agent_status` Fleet API responses is deprecated. For more information, refer to {kibana-pull}151564[#151564]. - -*Impact* + -The `/agent_status` Fleet API now returns the following statuses: - -* `all` — All active and inactive -* `active` — All active -==== - -[discrete] -[[kibana-150267]] -.Deprecated Saved objects APIs. (8.7) -[%collapsible] -==== -*Details* + -The following saved objects APIs have been deprecated. - -[source,text] --- -/api/saved_objects/{type}/{id} -/api/saved_objects/resolve/{type}/{id} -/api/saved_objects/{type}/{id?} -/api/saved_objects/{type}/{id} -/api/saved_objects/_find -/api/saved_objects/{type}/{id} -/api/saved_objects/_bulk_get -/api/saved_objects/_bulk_create -/api/saved_objects/_bulk_resolve -/api/saved_objects/_bulk_update -/api/saved_objects/_bulk_delete --- - -For more information, refer to ({kibana-pull}150267[#150267]). - -*Impact* + -Use dedicated public APIs instead, for example use <> to manage Data Views. -==== - -[discrete] -[[deprecation-119494]] -.Updates Fleet API to improve consistency. (8.0) -[%collapsible] -==== -*Details* + -The Fleet API has been updated to improve consistency: - -* Hyphens are changed to underscores in some names. -* The `pkgkey` path parameter in the packages endpoint is split. -* The `response` and `list` properties are renamed to `items` or `item` in some -responses. - -For more information, refer to {kibana-pull}119494[#119494]. - -*Impact* + -When you upgrade to 8.0.0, use the following API changes: - -* Use `enrollment_api_keys` instead of `enrollment-api-keys`. - -* Use `agent_status` instead of `agent-status`. - -* Use `service_tokens` instead of `service-tokens`. - -* Use `/epm/packages/{packageName}/{version}` instead of `/epm/packages/{pkgkey}`. - -* Use `items[]` instead of `response[]` in: -+ -[source,text] --- -/api/fleet/enrollment_api_keys -/api/fleet/agents -/epm/packages/ -/epm/categories -/epm/packages/_bulk -/epm/packages/limited -/epm/packages/{packageName}/{version} <1> --- -<1> Use `items[]` when the verb is `POST` or `DELETE`. Use `item` when the verb -is `GET` or `PUT`. - -For more information, refer to {fleet-guide}/fleet-api-docs.html[Fleet APIs]. - -==== - -[float] -==== Kibana platform - -// Alerting - -[discrete] -[[kibana-161136]] -.[Alerting] Action variables in the UI and in tests that were no longer used have been replaced. (8.10) -[%collapsible] -==== -*Details* + -The following rule action variables have been deprecated. Use the recommended variables (in parentheses) instead: - -* alertActionGroup (alert.actionGroup) -* alertActionGroupName (alert.actionGroupName) -* alertActionSubgroup (alert.actionSubgroup) -* alertId (rule.id) -* alertInstanceId (alert.id) -* alertName (rule.name) -* params (rule.params) -* spaceId (rule.spaceId) -* tags (rule.tags) - -For more information, refer to ({kibana-pull}161136[#161136]). -==== - -// Discover - -[discrete] -[[deprecation-search-sessions]] -.[Discover] <> are deprecated in 8.15.0 and will be removed in a future version. (8.15) -[%collapsible] -==== -*Details* + -Search sessions are now deprecated and will be removed in a future version. By default, queries that take longer than 10 minutes (the default for the advanced setting `search:timeout`) will be canceled. To allow queries to run longer, consider increasing `search:timeout` or setting it to `0` which will allow queries to continue running as long as a user is waiting on-screen for results. -==== - - -// General settings - -[discrete] -[[kibana-154275]] -.[General settings] Deprecated ephemeral Task Manager settings (8.8) -[%collapsible] -==== -*Details* + -The following Task Manager settings are deprecated: - -* `xpack.task_manager.ephemeral_tasks.enabled` -* `xpack.task_manager.ephemeral_tasks.request_capacity` -* `xpack.alerting.maxEphemeralActionsPerAlert` - -For more information, refer to {kibana-pull}154275[#154275]. - -*Impact* + -To improve task execution resiliency, remove the deprecated settings from the `kibana.yml` file. For detailed information, check link:https://www.elastic.co/guide/en/kibana/current/task-manager-settings-kb.html[Task Manager settings in {kib}]. -==== - -[discrete] -[[kibana-122075]] -.[General settings] Deprecated `xpack.data_enhanced.*` setting. (8.3) -[%collapsible] -==== -*Details* + -In kibana.yml, the `xpack.data_enhanced.*` setting is deprecated. For more information, check {kibana-pull}122075[#122075]. - -*Impact* + -Use the `data.*` configuration parameters instead. -==== - -[discrete] -[[deprecation-33603]] -.[General settings] Removed `xpack:defaultAdminEmail` setting. (8.0) -[%collapsible] -==== -*Details* + -The `xpack:default_admin_email` setting for monitoring use has been removed. For more information, refer to {kibana-pull}33603[#33603] - -*Impact* + -Use the `xpack.monitoring.clusterAlertsEmail` in kibana.yml. -==== - -// Security - -[discrete] -[[kibana-136422]] -.[Security] Deprecated ApiKey authentication for interactive users. (8.4) -[%collapsible] -==== -*Details* + -The ability to authenticate interactive users with ApiKey via a web browser has been deprecated, and will be removed in a future version. - -For more information, refer to {kibana-pull}136422[#136422]. - -*Impact* + -To authenticate interactive users via a web browser, use <>. Use API keys only for programmatic access to {kib} and {es}. -==== - -[discrete] -[[kibana-131636]] -.[Security] Deprecated anonymous authentication credentials. (8.3) -[%collapsible] -==== -*Details* + -The apiKey, including key and ID/key pair, and `elasticsearch_anonymous_user` credential types for anonymous authentication providers are deprecated. For more information, check {kibana-pull}131636[#131636]. - -*Impact* + -If you have anonymous authentication provider configured with apiKey or `elasticsearch_anonymous_user` credential types, a deprecation warning appears, even when the provider is not enabled. -==== - -[discrete] -[[kibana-131166]] -.[Security] Deprecated v1 and v2 security_linux and security_windows jobs. (8.3) -[%collapsible] -==== -*Details* + -The v1 and v2 job configurations for security_linux and security_windows are deprecated. For more information, check {kibana-pull}131166[#131166]. - -*Impact* + -The following security_linux and security_windows job configurations are updated to v3: - -* security_linux: - -** v3_linux_anomalous_network_activity -** v3_linux_anomalous_network_port_activity_ecs -** v3_linux_anomalous_process_all_hosts_ecs -** v3_linux_anomalous_user_name_ecs -** v3_linux_network_configuration_discovery -** v3_linux_network_connection_discovery -** v3_linux_rare_metadata_process -** v3_linux_rare_metadata_user -** v3_linux_rare_sudo_user -** v3_linux_rare_user_compiler -** v3_linux_system_information_discovery -** v3_linux_system_process_discovery -** v3_linux_system_user_discovery -** v3_rare_process_by_host_linux_ecs - -* security_windows: - -** v3_rare_process_by_host_windows_ecs -** v3_windows_anomalous_network_activity_ecs -** v3_windows_anomalous_path_activity_ecs -** v3_windows_anomalous_process_all_hosts_ecs -** v3_windows_anomalous_process_creation -** v3_windows_anomalous_script -** v3_windows_anomalous_service -** v3_windows_anomalous_user_name_ecs -** v3_windows_rare_metadata_process -** v3_windows_rare_metadata_user -** v3_windows_rare_user_runas_event -** v3_windows_rare_user_type10_remote_login -==== - - -// Sharing & Reporting - -[discrete] -[[kibana-178159]] -.[Sharing & Reporting] Downloading a CSV file from a saved search panel in a dashboard has become deprecated in favor of generating a CSV report. (8.14) -[%collapsible] -==== -*Details* + -The mechanism of exporting CSV data from a saved search panel in a dashboard has been changed to generate a CSV report, rather than allowing the CSV data to be downloaded -without creating a report. To preserve the original behavior, it is necessary to update `kibana.yml` with the setting of `xpack.reporting.csv.enablePanelActionDownload: -true`. The scope of this breaking change is limited to downloading CSV files from saved search panels only; downloading CSV files from other types of dashboard panels is -unchanged. For more information, refer to {kibana-pull}178159[#178159]. -==== - - - -// Visualizations - -[discrete] -[[kibana-156455]] -.[Visualizations] The ability to create legacy input controls was hidden. (8.9) -[%collapsible] -==== -*Details* + -The option to create legacy input controls when creating a new visualization is hidden. For more information, refer to {kibana-pull}156455[#156455] -==== - -[discrete] -[[kibana-155503]] -.[Visualizations] Removed legacy field stats. (8.9) -[%collapsible] -==== -*Details* + -Legacy felid stats that were previously shown within a popover have been removed. For more information, refer to {kibana-pull}155503[#155503] -==== - -[discrete] -.[Visualizations] Deprecated input control panels in dashboards. (8.3) -[%collapsible] -==== -*Details* + -The input control panels, which allow you to add interactive filters to dashboards, are deprecated. For more information, check {kibana-pull}132562[#132562]. - -*Impact* + -To add interactive filters to your dashboards, use the link:https://www.elastic.co/guide/en/kibana/8.3/add-controls.html[new controls]. -==== - -[discrete] -[[kibana-130336]] -.[Visualizations] Deprecated the `Auto` default legend size in Lens. (8.3) -[%collapsible] -==== -*Details* + -In the *Lens* visualization editor, the *Auto* default for *Legend width* has been deprecated. For more information, check {kibana-pull}130336[#130336]. - -*Impact* + -When you create *Lens* visualization, the default for the *Legend width* is now *Medium*. -==== - -[float] -==== Elastic Observability solution - -[discrete] -[[deprecation-192003]] -.Deprecated the Observability AI Assistant specific advanced setting `observability:aiAssistantLogsIndexPattern`. (8.16) -[%collapsible] -==== -*Details* + -The Observability AI Assistant specific advanced setting for Logs index patterns `observability:aiAssistantLogsIndexPattern` is deprecated and no longer used. The AI Assistant will now use the existing **Log sources** setting `observability:logSources` instead. For more information, refer to ({kibana-pull}192003[#192003]). -==== - -[discrete] -[[deprecation-194519]] -.The Logs Stream was hidden by default in favor of the Logs Explorer app. (8.16) -[%collapsible] -==== -*Details* + -You can find the Logs Explorer app in the navigation menu under Logs > Explorer, or as a separate tab in Discover. For more information, refer to ({kibana-pull}194519[#194519]). - -*Impact* + -You can still show the Logs Stream app again by navigating to Stack Management > Advanced Settings and by enabling the `observability:enableLogsStream` setting. -==== - - -[discrete] -[[deprecation-120689]] -.[APM] Renamed the `autocreate` data view APM setting. (8.0) -[%collapsible] -==== -*Details* + -The `xpack.apm.autocreateApmIndexPattern` APM setting has been removed. For more information, refer to {kibana-pull}120689[#120689]. - -*Impact* + -To automatically create data views in APM, use `xpack.apm.autoCreateApmDataView`. -==== - -[discrete] -[[kibana-uptime-deprecation]] -.[Uptime] Uptime is deprecated in 8.15.0. (8.15) -[%collapsible] -==== -*Details* + -The Uptime app is already hidden from Kibana when there is no recent Heartbeat data. Migrate to Synthetics as an alternative. For more details, refer to the {observability-guide}/uptime-intro.html[Uptime documentation]. -==== - -[discrete] -[[kibana-154010]] -.[Uptime] Deprecated Synthetics and Uptime monitor schedules (8.8) -[%collapsible] -==== -*Details* + -Synthetics and Uptime monitor schedules and zip URL fields are deprecated. For more information, refer to {kibana-pull}154010[#154010] and {kibana-pull}154952[#154952]. - -*Impact* + -When you create monitors in Uptime Monitor Management and the Synthetics app, unsupported schedules are automatically transferred to the nearest supported schedule. To use zip URLs, use project monitors. -==== - -[discrete] -[[kibana-149506]] -.[Uptime] Deprecated Elastic Synthetics integration. (8.8) -[%collapsible] -==== -*Details* + -The Elastic Synthetics integration is deprecated. For more information, refer to {kibana-pull}149506[#149506]. - -*Impact* + -To monitor endpoints, pages, and user journeys, go to **{observability}** -> **Synthetics (beta)**. -==== - -[float] -==== Elastic Security solution - -NOTE: For the complete Elastic Security solution release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. - diff --git a/docs/user/whats-new.asciidoc b/docs/user/whats-new.asciidoc index 25568518ad2ec..32e7bbbc359b5 100644 --- a/docs/user/whats-new.asciidoc +++ b/docs/user/whats-new.asciidoc @@ -1,144 +1,10 @@ [[whats-new]] -== What's new in 8.16 +== What's new in 9.0 -Here are the highlights of what's new and improved in 8.16. +Here are the highlights of what's new and improved in 9.0. For detailed information about this release, check the <>. -Previous versions: {kibana-ref-all}/8.15/whats-new.html[8.15] | {kibana-ref-all}/8.14/whats-new.html[8.14] | {kibana-ref-all}/8.13/whats-new.html[8.13] | {kibana-ref-all}/8.12/whats-new.html[8.12] | {kibana-ref-all}/8.11/whats-new.html[8.11] | {kibana-ref-all}/8.10/whats-new.html[8.10] | {kibana-ref-all}/8.9/whats-new.html[8.9] | {kibana-ref-all}/8.8/whats-new.html[8.8] | {kibana-ref-all}/8.7/whats-new.html[8.7] | {kibana-ref-all}/8.6/whats-new.html[8.6] | {kibana-ref-all}/8.5/whats-new.html[8.5] | {kibana-ref-all}/8.4/whats-new.html[8.4] | {kibana-ref-all}/8.3/whats-new.html[8.3] | {kibana-ref-all}/8.2/whats-new.html[8.2] | {kibana-ref-all}/8.1/whats-new.html[8.1] | {kibana-ref-all}/8.0/whats-new.html[8.0] - -[discrete] -=== Solution-oriented navigation -On Elastic Cloud Hosted deployments running on version 8.16, you can now navigate Kibana using a lighter, solution-oriented left navigation menu, called **Solution view**. - -There are four selectable solution views: Search, Observability, Security, and Classic. Search, Observability, and Security are the new navigation menus. Each of those brings simplicity by focusing the left navigation menu on a relevant subset of features, scoped to its associated use cases, and offers a dedicated home page. Classic has the same navigation menu as 8.15 and before. - -Each space has its own solution view setting which determines the navigation experience for all users of that space. - -When creating a new deployment, you will now be asked to choose between one of the 3 new solution views for your default space. If you prefer to stick with the classic, multi-layered navigation, you can do so once the deployment is created by navigating to your space settings. - -Deployments upgrading from a previous version to 8.16 keep the classic navigation. Admins can enable one of the new solution views from the space settings. - -image::images/solution-view-obs.png[Example of observability solution view] -_The Observability solution view and its Home page._ - -[discrete] -=== Discover and ES|QL - -[discrete] -==== Contextual Data presentation - -In this release, Discover introduces enhanced contextual data presentation. Previously, you needed to manually select relevant fields and set up your workspace before diving into data exploration. Now, Discover automatically tailors the user experience based on the data being explored, powered by a scalable contextual architecture. For example, when analyzing logs, you'll see a *log.level* field rendered directly in the table, a custom Logs overview in the document viewer, and log.level indicators on individual rows. - -image::images/discover-log-level.png[Log level badge displaying in the Discover grid] - -[discrete] -==== Recommended ES|QL queries - -Writing ES|QL queries just got easier. Many users face challenges when authoring queries, and even more so when unfamiliar with the syntax or data structure. This can lead to inefficiencies in data analysis and visualization. We want to reduce the time it takes to create queries and to lower the learning curve for both new and existing users by suggesting recommended queries within the ES|QL Help menu and from the auto-complete. - -image::images/esql-suggestions.png[A list of suggestions to get started with an ES|QL query, width=30%] -_Recommended ES|QL queries from the ES|QL help menu_ - -image::images/esql-autocomplete-suggestions.png[A list of suggestions in the autocomplete menu of an ES|QL query, width=50%] -_Recommended ES|QL queries from auto-complete suggestions_ - - - -[discrete] -=== Dashboards - -[discrete] -==== Manage dashboards more easily and efficiently -As part of a series of improvements to help you find and manage your dashboards https://www.elastic.co/guide/en/kibana/8.15/whats-new.html#_view_dashboard_creator_and_last_editor[started in version 8.15], the new default way to sort your dashboards is by recently viewed, and we are adding an option to star your favorite dashboards, as well as some statistics to monitor the usage of your dashboards. - -You can find your favorite dashboards in the new **Starred** tab. - -image::images/dashboard-star.png[Viewing starred dashboards] - -By opening a dashboard's details using the “info” icon from the dashboard list view, you can now get a sense of the popularity of that dashboard with a histogram showing how many times the dashboard was viewed in the last 90 days. - -image::images/dashboard-usage.png[Dashboard usage chart] - -[discrete] -==== Log Pattern Analysis dashboard panels -Log Pattern Analysis panels are now available for you to add to your dashboards, making AIOps even more embedded in your workflows and where you need it. When filtering patterns, the dashboard’s data adjusts accordingly. You can also choose the filtering to transition you into Discover for further exploration. - -image:https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt8288e01386b5830c/67222fb0d2da223e27bc1e67/log_analysis_panel.gif[Log pattern analysis panel in dashboards] - - -[discrete] -==== Color text values in tables -Previously, you could only decide to color numeric values in tables. We're adding the ability to also color your string values. You can decide whether you want to color the whole cell, or only the text. - -image::images/table-coloring.png[Coloring table cells with string values] - - -[discrete] -==== Formatting options for your metrics -We've received a lot of feedback asking for more flexibility to customize the appearance of your metrics. In this version, we are adding the ability to customize the title and value alignment, as well as the font size. Selecting the *Fit* option will adjust the font size and make the metric value occupy the entire panel. - -image::images/metric-customization.png[Customization options for a metric panel] - - - -//[discrete] -//=== Alerting, cases, and connectors - - -[discrete] -=== Managing {kib} and data - -[discrete] -==== Edit space access from the space settings -As an admin, you can now assign roles to and edit role permissions on a given space directly from the settings of that space. - -Prior to 8.16, you could only do this from the role settings, which was counterintuitive. - -image::space-settings.png[Editing space settings with new options] - -[discrete] -==== New IP Location processor -Enhancing location information based on IP addresses just got easier with the new IP Location processor. In addition to the existing free GeoLite offerings from MaxMind, we have integrated with MaxMind’s premium GeoIP databases for users who have licensed MaxMind’s products. If you're an Enterprise Elastic customer, you now have an additional third-party product, IP Info, available for use as well. These additional data sources provide improved options for enriching data with location information associated with IP addresses to improve telemetry and insights. To utilize these features beyond the free MaxMind GeoIP database, you will need to have licensed premium MaxMind products and/or the IP Info database. - -image::images/ip-location-processor.png[The IP Location processor] - -[discrete] -==== File uploader PDF support -The file uploader provides a quick way to upload data and start using Elastic. In 8.16, we are improving it to allow you to upload data from PDF files. - -image:https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blte8f0b295330b7e68/67222fb0ca492a5044b51bd8/file_uploader_pdf.gif[File uploader with PDF support] - -[discrete] -=== Developer Tools Console redesign -We're excited to introduce a number of improvements to the overall user experience on one of our most popular features: **Console**. If you're new to Console, you will be welcomed by an onboarding tour that will help you get started quickly with your first requests. And if you're already a regular Console user, you will notice a variety of new features, including the ability to copy outputs to the clipboard, import and export request files, enjoy improved responsiveness, and other quality of life improvements. - -image::images/monaco-console.png[Console's redesign featuring the Monaco editor] - -[discrete] -=== Machine Learning - -[discrete] -==== The Inference API is now Generally Available - -Starting in 8.16, the {ref}/inference-apis.html[Inference API] is now GA, offering production-level stability, robustness and performance. Elastic’s Inference API integrates the state-of-the-art in AI inference, including ELSER, your Elastic hosted models and {ref}/put-inference-api.html#put-inference-api-desc[an increasing array of external models and tasks] in a unified, lean syntax. Used with {ref}/semantic-text.html[semantic_text] or the vector fields supported by the Elastic vector database, you can perform AI search, reranking, and completion with simplicity. In 8.16, we're also adding streamed completions for improved flows and real time interactions and GenAI experiences. - -[discrete] -==== ELSER and trained models adaptive resources and chunking strategies - -From 8.16, ELSER and the other AI search and NLP models you use in Elastic automatically adapt resource consumption according to the inference load, providing the performance you need during peak times and reducing the cost during slow periods, all the way down to zero cost during idle times. - -We're also improving the UX through which you deploy your models. You can provision search-optimized and ingest-optimized model deployments with a one-click selection. An optimized configuration is created without the need to specify parameters such as threads and allocations. Combined with the flexibility of ML auto-scaling on Elastic Cloud and the incredible elasticity of Elastic Cloud Serverless, you are in full control of both performance and cost. - -image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt429790e1de1b4f93/67222fb048ec8c73255ef4eb/trained_models.gif[Trained models and ELSER] - -In addition, from 8.16 you can choose between a word or sequence-based chunking strategy to use with your trained models, and you can also customize the maximum size and overlap parameters. A suitable chunking strategy can result in gains depending on the model you use, the length and nature of the texts and the length and complexity of the search queries. - - -[discrete] -==== Support for Daylight Saving Time changes in Anomaly Detection - -In 8.16, we are introducing support for DST changes in Anomaly Detection. Set up a DST calendar by selecting the right timezone and apply it to your anomaly detection jobs individually or in groups. This feature eliminates any false positives that you may have experienced previously due to Daylight Saving Time changes, and works without the need for your intervention for many years ahead. - -image::https://images.contentstack.io/v3/assets/bltefdd0b53724fa2ce/blt5fb82f18cde26710/67222fb086339971144a31e5/daylight_savings.gif[DST support in Anomaly Detection] +//Uncomment and edit from 9.1: +//Previous versions: {kibana-ref-all}/9.0/whats-new.html[9.0] | {kibana-ref-all}/8.18/whats-new.html[8.18] diff --git a/examples/grid_example/public/app.tsx b/examples/grid_example/public/app.tsx index 0e73a76d790fd..f144daa29f1ab 100644 --- a/examples/grid_example/public/app.tsx +++ b/examples/grid_example/public/app.tsx @@ -7,9 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { cloneDeep } from 'lodash'; -import React, { useRef, useState } from 'react'; +import deepEqual from 'fast-deep-equal'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import ReactDOM from 'react-dom'; +import { combineLatest, debounceTime } from 'rxjs'; import { v4 as uuidv4 } from 'uuid'; import { @@ -25,29 +26,77 @@ import { } from '@elastic/eui'; import { AppMountParameters } from '@kbn/core-application-browser'; import { CoreStart } from '@kbn/core-lifecycle-browser'; -import { GridLayout, GridLayoutData, isLayoutEqual, type GridLayoutApi } from '@kbn/grid-layout'; +import { GridLayout, GridLayoutData } from '@kbn/grid-layout'; import { i18n } from '@kbn/i18n'; import { getPanelId } from './get_panel_id'; import { - clearSerializedGridLayout, - getSerializedGridLayout, + clearSerializedDashboardState, + getSerializedDashboardState, setSerializedGridLayout, } from './serialized_grid_layout'; +import { MockSerializedDashboardState } from './types'; +import { useMockDashboardApi } from './use_mock_dashboard_api'; +import { dashboardInputToGridLayout, gridLayoutToDashboardPanelMap } from './utils'; const DASHBOARD_MARGIN_SIZE = 8; const DASHBOARD_GRID_HEIGHT = 20; const DASHBOARD_GRID_COLUMN_COUNT = 48; -const DEFAULT_PANEL_HEIGHT = 15; -const DEFAULT_PANEL_WIDTH = DASHBOARD_GRID_COLUMN_COUNT / 2; export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { + const savedState = useRef(getSerializedDashboardState()); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); + const [currentLayout, setCurrentLayout] = useState( + dashboardInputToGridLayout(savedState.current) + ); + + const mockDashboardApi = useMockDashboardApi({ savedState: savedState.current }); - const [layoutKey, setLayoutKey] = useState(uuidv4()); - const [gridLayoutApi, setGridLayoutApi] = useState(); - const savedLayout = useRef(getSerializedGridLayout()); - const currentLayout = useRef(savedLayout.current); + useEffect(() => { + combineLatest([mockDashboardApi.panels$, mockDashboardApi.rows$]) + .pipe(debounceTime(0)) // debounce to avoid subscribe being called twice when both panels$ and rows$ publish + .subscribe(([panels, rows]) => { + const hasChanges = !( + deepEqual(panels, savedState.current.panels) && deepEqual(rows, savedState.current.rows) + ); + setHasUnsavedChanges(hasChanges); + setCurrentLayout(dashboardInputToGridLayout({ panels, rows })); + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const renderBasicPanel = useCallback( + (id: string) => { + return ( + <> +
{id}
+ { + mockDashboardApi.removePanel(id); + }} + > + {i18n.translate('examples.gridExample.deletePanelButton', { + defaultMessage: 'Delete panel', + })} + + { + const newPanelId = await getPanelId({ + coreStart, + suggestion: id, + }); + if (newPanelId) mockDashboardApi.replacePanel(id, newPanelId); + }} + > + {i18n.translate('examples.gridExample.replacePanelButton', { + defaultMessage: 'Replace panel', + })} + + + ); + }, + [coreStart, mockDashboardApi] + ); return ( @@ -69,7 +118,7 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { color="accent" size="s" onClick={() => { - clearSerializedGridLayout(); + clearSerializedDashboardState(); window.location.reload(); }} > @@ -85,13 +134,9 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { onClick={async () => { const panelId = await getPanelId({ coreStart, - suggestion: `panel${(gridLayoutApi?.getPanelCount() ?? 0) + 1}`, + suggestion: uuidv4(), }); - if (panelId) - gridLayoutApi?.addPanel(panelId, { - width: DEFAULT_PANEL_WIDTH, - height: DEFAULT_PANEL_HEIGHT, - }); + if (panelId) mockDashboardApi.addNewPanel({ id: panelId }); }} > {i18n.translate('examples.gridExample.addPanelButton', { @@ -113,9 +158,9 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { { - currentLayout.current = cloneDeep(savedLayout.current); - setHasUnsavedChanges(false); - setLayoutKey(uuidv4()); // force remount of grid + const { panels, rows } = savedState.current; + mockDashboardApi.panels$.next(panels); + mockDashboardApi.rows$.next(rows); }} > {i18n.translate('examples.gridExample.resetLayoutButton', { @@ -126,12 +171,13 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { { - if (gridLayoutApi) { - const layoutToSave = gridLayoutApi.serializeState(); - setSerializedGridLayout(layoutToSave); - savedLayout.current = layoutToSave; - setHasUnsavedChanges(false); - } + const newSavedState = { + panels: mockDashboardApi.panels$.getValue(), + rows: mockDashboardApi.rows$.getValue(), + }; + savedState.current = newSavedState; + setHasUnsavedChanges(false); + setSerializedGridLayout(newSavedState); }} > {i18n.translate('examples.gridExample.saveLayoutButton', { @@ -144,50 +190,17 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => { { - currentLayout.current = cloneDeep(newLayout); - setHasUnsavedChanges(!isLayoutEqual(savedLayout.current, newLayout)); + layout={currentLayout} + gridSettings={{ + gutterSize: DASHBOARD_MARGIN_SIZE, + rowHeight: DASHBOARD_GRID_HEIGHT, + columnCount: DASHBOARD_GRID_COLUMN_COUNT, }} - ref={setGridLayoutApi} - renderPanelContents={(id) => { - return ( - <> -
{id}
- { - gridLayoutApi?.removePanel(id); - }} - > - {i18n.translate('examples.gridExample.deletePanelButton', { - defaultMessage: 'Delete panel', - })} - - { - const newPanelId = await getPanelId({ - coreStart, - suggestion: `panel${(gridLayoutApi?.getPanelCount() ?? 0) + 1}`, - }); - if (newPanelId) gridLayoutApi?.replacePanel(id, newPanelId); - }} - > - {i18n.translate('examples.gridExample.replacePanelButton', { - defaultMessage: 'Replace panel', - })} - - - ); - }} - getCreationOptions={() => { - return { - gridSettings: { - gutterSize: DASHBOARD_MARGIN_SIZE, - rowHeight: DASHBOARD_GRID_HEIGHT, - columnCount: DASHBOARD_GRID_COLUMN_COUNT, - }, - initialLayout: cloneDeep(currentLayout.current), - }; + renderPanelContents={renderBasicPanel} + onLayoutChange={(newLayout) => { + const { panels, rows } = gridLayoutToDashboardPanelMap(newLayout); + mockDashboardApi.panels$.next(panels); + mockDashboardApi.rows$.next(rows); }} /> diff --git a/examples/grid_example/public/serialized_grid_layout.ts b/examples/grid_example/public/serialized_grid_layout.ts index 2bb20052398f8..3e40380d91ac3 100644 --- a/examples/grid_example/public/serialized_grid_layout.ts +++ b/examples/grid_example/public/serialized_grid_layout.ts @@ -7,46 +7,39 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { type GridLayoutData } from '@kbn/grid-layout'; +import { MockSerializedDashboardState } from './types'; const STATE_SESSION_STORAGE_KEY = 'kibana.examples.gridExample.state'; -export function clearSerializedGridLayout() { +export function clearSerializedDashboardState() { sessionStorage.removeItem(STATE_SESSION_STORAGE_KEY); } -export function getSerializedGridLayout(): GridLayoutData { +export function getSerializedDashboardState(): MockSerializedDashboardState { const serializedStateJSON = sessionStorage.getItem(STATE_SESSION_STORAGE_KEY); - return serializedStateJSON ? JSON.parse(serializedStateJSON) : initialGridLayout; + return serializedStateJSON ? JSON.parse(serializedStateJSON) : initialState; } -export function setSerializedGridLayout(layout: GridLayoutData) { - sessionStorage.setItem(STATE_SESSION_STORAGE_KEY, JSON.stringify(layout)); +export function setSerializedGridLayout(state: MockSerializedDashboardState) { + sessionStorage.setItem(STATE_SESSION_STORAGE_KEY, JSON.stringify(state)); } -const initialGridLayout: GridLayoutData = [ - { - title: 'Large section', - isCollapsed: false, - panels: { - panel1: { column: 0, row: 0, width: 12, height: 6, id: 'panel1' }, - panel2: { column: 0, row: 6, width: 8, height: 4, id: 'panel2' }, - panel3: { column: 8, row: 6, width: 12, height: 4, id: 'panel3' }, - panel4: { column: 0, row: 10, width: 48, height: 4, id: 'panel4' }, - panel5: { column: 12, row: 0, width: 36, height: 6, id: 'panel5' }, - panel6: { column: 24, row: 6, width: 24, height: 4, id: 'panel6' }, - panel7: { column: 20, row: 6, width: 4, height: 2, id: 'panel7' }, - panel8: { column: 20, row: 8, width: 4, height: 2, id: 'panel8' }, - }, +const initialState: MockSerializedDashboardState = { + panels: { + panel1: { id: 'panel1', gridData: { i: 'panel1', x: 0, y: 0, w: 12, h: 6, row: 0 } }, + panel2: { id: 'panel2', gridData: { i: 'panel2', x: 0, y: 6, w: 8, h: 4, row: 0 } }, + panel3: { id: 'panel3', gridData: { i: 'panel3', x: 8, y: 6, w: 12, h: 4, row: 0 } }, + panel4: { id: 'panel4', gridData: { i: 'panel4', x: 0, y: 10, w: 48, h: 4, row: 0 } }, + panel5: { id: 'panel5', gridData: { i: 'panel5', x: 12, y: 0, w: 36, h: 6, row: 0 } }, + panel6: { id: 'panel6', gridData: { i: 'panel6', x: 24, y: 6, w: 24, h: 4, row: 0 } }, + panel7: { id: 'panel7', gridData: { i: 'panel7', x: 20, y: 6, w: 4, h: 2, row: 0 } }, + panel8: { id: 'panel8', gridData: { i: 'panel8', x: 20, y: 8, w: 4, h: 2, row: 0 } }, + panel9: { id: 'panel9', gridData: { i: 'panel9', x: 0, y: 0, w: 12, h: 16, row: 1 } }, + panel10: { id: 'panel10', gridData: { i: 'panel10', x: 24, y: 0, w: 12, h: 6, row: 2 } }, }, - { - title: 'Small section', - isCollapsed: false, - panels: { panel9: { column: 0, row: 0, width: 12, height: 16, id: 'panel9' } }, - }, - { - title: 'Another small section', - isCollapsed: false, - panels: { panel10: { column: 24, row: 0, width: 12, height: 6, id: 'panel10' } }, - }, -]; + rows: [ + { title: 'Large section', collapsed: false }, + { title: 'Small section', collapsed: false }, + { title: 'Another small section', collapsed: false }, + ], +}; diff --git a/src/plugins/charts/public/services/legacy_colors/mock.ts b/examples/grid_example/public/types.ts similarity index 51% rename from src/plugins/charts/public/services/legacy_colors/mock.ts rename to examples/grid_example/public/types.ts index 06d3a3934bd3c..39885e25e7153 100644 --- a/src/plugins/charts/public/services/legacy_colors/mock.ts +++ b/examples/grid_example/public/types.ts @@ -7,17 +7,21 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { coreMock } from '@kbn/core/public/mocks'; -import { LegacyColorsService } from './colors'; +export interface DashboardGridData { + w: number; + h: number; + x: number; + y: number; + i: string; +} -const colors = new LegacyColorsService(); -colors.init(coreMock.createSetup().uiSettings); +export interface MockedDashboardPanelMap { + [key: string]: { id: string; gridData: DashboardGridData & { row: number } }; +} -export const colorsServiceMock: LegacyColorsService = { - createColorLookupFunction: jest.fn(colors.createColorLookupFunction.bind(colors)), - mappedColors: { - mapKeys: jest.fn(), - get: jest.fn(), - getColorFromConfig: jest.fn(), - }, -} as any; +export type MockedDashboardRowMap = Array<{ title: string; collapsed: boolean }>; + +export interface MockSerializedDashboardState { + panels: MockedDashboardPanelMap; + rows: MockedDashboardRowMap; +} diff --git a/examples/grid_example/public/use_mock_dashboard_api.tsx b/examples/grid_example/public/use_mock_dashboard_api.tsx new file mode 100644 index 0000000000000..8388bd83f2645 --- /dev/null +++ b/examples/grid_example/public/use_mock_dashboard_api.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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { cloneDeep } from 'lodash'; +import { useMemo } from 'react'; +import { BehaviorSubject } from 'rxjs'; + +import { + MockSerializedDashboardState, + MockedDashboardPanelMap, + MockedDashboardRowMap, +} from './types'; + +const DASHBOARD_GRID_COLUMN_COUNT = 48; +const DEFAULT_PANEL_HEIGHT = 15; +const DEFAULT_PANEL_WIDTH = DASHBOARD_GRID_COLUMN_COUNT / 2; + +export const useMockDashboardApi = ({ + savedState, +}: { + savedState: MockSerializedDashboardState; +}) => { + const mockDashboardApi = useMemo(() => { + return { + viewMode: new BehaviorSubject('edit'), + panels$: new BehaviorSubject(savedState.panels), + rows$: new BehaviorSubject(savedState.rows), + removePanel: (id: string) => { + const panels = { ...mockDashboardApi.panels$.getValue() }; + delete panels[id]; // the grid layout component will handle compacting, if necessary + mockDashboardApi.panels$.next(panels); + }, + replacePanel: (oldId: string, newId: string) => { + const currentPanels = mockDashboardApi.panels$.getValue(); + const otherPanels = { ...currentPanels }; + const oldPanel = currentPanels[oldId]; + delete otherPanels[oldId]; + otherPanels[newId] = { id: newId, gridData: { ...oldPanel.gridData, i: newId } }; + mockDashboardApi.panels$.next(otherPanels); + }, + addNewPanel: ({ id: newId }: { id: string }) => { + // we are only implementing "place at top" here, for demo purposes + const currentPanels = mockDashboardApi.panels$.getValue(); + const otherPanels = { ...currentPanels }; + for (const [id, panel] of Object.entries(currentPanels)) { + const currentPanel = cloneDeep(panel); + currentPanel.gridData.y = currentPanel.gridData.y + DEFAULT_PANEL_HEIGHT; + otherPanels[id] = currentPanel; + } + mockDashboardApi.panels$.next({ + ...otherPanels, + [newId]: { + id: newId, + gridData: { + i: newId, + row: 0, + x: 0, + y: 0, + w: DEFAULT_PANEL_WIDTH, + h: DEFAULT_PANEL_HEIGHT, + }, + }, + }); + }, + canRemovePanels: () => true, + }; + // only run onMount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return mockDashboardApi; +}; diff --git a/examples/grid_example/public/utils.ts b/examples/grid_example/public/utils.ts new file mode 100644 index 0000000000000..5d2dfd0fa3002 --- /dev/null +++ b/examples/grid_example/public/utils.ts @@ -0,0 +1,62 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { GridLayoutData } from '@kbn/grid-layout'; +import { MockedDashboardPanelMap, MockedDashboardRowMap } from './types'; + +export const gridLayoutToDashboardPanelMap = ( + layout: GridLayoutData +): { panels: MockedDashboardPanelMap; rows: MockedDashboardRowMap } => { + const panels: MockedDashboardPanelMap = {}; + const rows: MockedDashboardRowMap = []; + layout.forEach((row, rowIndex) => { + rows.push({ title: row.title, collapsed: row.isCollapsed }); + Object.values(row.panels).forEach((panelGridData) => { + panels[panelGridData.id] = { + id: panelGridData.id, + gridData: { + i: panelGridData.id, + y: panelGridData.row, + x: panelGridData.column, + w: panelGridData.width, + h: panelGridData.height, + row: rowIndex, + }, + }; + }); + }); + return { panels, rows }; +}; + +export const dashboardInputToGridLayout = ({ + panels, + rows, +}: { + panels: MockedDashboardPanelMap; + rows: MockedDashboardRowMap; +}): GridLayoutData => { + const layout: GridLayoutData = []; + + rows.forEach((row) => { + layout.push({ title: row.title, isCollapsed: row.collapsed, panels: {} }); + }); + + Object.keys(panels).forEach((panelId) => { + const gridData = panels[panelId].gridData; + layout[gridData.row].panels[panelId] = { + id: panelId, + row: gridData.y, + column: gridData.x, + width: gridData.w, + height: gridData.h, + }; + }); + + return layout; +}; diff --git a/examples/resizable_layout_examples/public/application.tsx b/examples/resizable_layout_examples/public/application.tsx index b70e3642548b1..7637cf2a79c66 100644 --- a/examples/resizable_layout_examples/public/application.tsx +++ b/examples/resizable_layout_examples/public/application.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { CoreThemeProvider } from '@kbn/core-theme-browser-internal'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import type { AppMountParameters } from '@kbn/core/public'; import { I18nProvider } from '@kbn/i18n-react'; import React, { ReactNode, useState } from 'react'; @@ -101,7 +101,7 @@ const ResizableSection = ({ export const renderApp = ({ element, theme$ }: AppMountParameters) => { ReactDOM.render( - +
{ } />
-
+
, element ); diff --git a/examples/resizable_layout_examples/tsconfig.json b/examples/resizable_layout_examples/tsconfig.json index e998e2c117f45..ba9001547e7dc 100644 --- a/examples/resizable_layout_examples/tsconfig.json +++ b/examples/resizable_layout_examples/tsconfig.json @@ -6,10 +6,10 @@ "include": ["common/**/*", "public/**/*", "server/**/*", "../../typings/**/*"], "kbn_references": [ "@kbn/resizable-layout", - "@kbn/core-theme-browser-internal", "@kbn/core", "@kbn/i18n-react", "@kbn/developer-examples-plugin", + "@kbn/react-kibana-context-theme", ], "exclude": ["target/**/*"] } diff --git a/examples/search_examples/public/search_sessions/app.tsx b/examples/search_examples/public/search_sessions/app.tsx index d9fe9d454848e..5fcb0e326c8b8 100644 --- a/examples/search_examples/public/search_sessions/app.tsx +++ b/examples/search_examples/public/search_sessions/app.tsx @@ -32,7 +32,6 @@ import { lastValueFrom, of } from 'rxjs'; import { CoreStart } from '@kbn/core/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; import type { TimeRange } from '@kbn/es-query'; import { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; @@ -48,6 +47,7 @@ import { import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { createStateContainer, useContainerState } from '@kbn/kibana-utils-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { PLUGIN_ID } from '../../common'; import { getInitialStateFromUrl, SEARCH_SESSIONS_EXAMPLES_APP_LOCATOR } from './app_locator'; @@ -735,7 +735,7 @@ function doSearch( ); notifications.toasts.addSuccess({ title: 'Query result', - text: mountReactNode(message), + text: toMountPoint(message, startServices), }); } }), diff --git a/examples/search_examples/tsconfig.json b/examples/search_examples/tsconfig.json index 842a75b634918..eb4fb7b3de5c5 100644 --- a/examples/search_examples/tsconfig.json +++ b/examples/search_examples/tsconfig.json @@ -28,7 +28,6 @@ "@kbn/utility-types", "@kbn/es-query", "@kbn/i18n", - "@kbn/core-mount-utils-browser-internal", "@kbn/config-schema", "@kbn/shared-ux-router", "@kbn/search-types", diff --git a/examples/unified_field_list_examples/public/application.tsx b/examples/unified_field_list_examples/public/application.tsx index ca9e71f6ada95..6cbdc8242b6be 100644 --- a/examples/unified_field_list_examples/public/application.tsx +++ b/examples/unified_field_list_examples/public/application.tsx @@ -10,7 +10,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; -import { CoreThemeProvider } from '@kbn/core-theme-browser-internal'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import type { AppMountParameters, CoreStart } from '@kbn/core/public'; import { AppPluginStartDependencies } from './types'; import { UnifiedFieldListExampleApp } from './example_app'; @@ -22,14 +22,14 @@ export const renderApp = ( ) => { ReactDOM.render( - + - + , element ); diff --git a/examples/unified_field_list_examples/tsconfig.json b/examples/unified_field_list_examples/tsconfig.json index ae6e203d67707..cd91501d05bee 100644 --- a/examples/unified_field_list_examples/tsconfig.json +++ b/examples/unified_field_list_examples/tsconfig.json @@ -28,7 +28,7 @@ "@kbn/field-formats-plugin", "@kbn/data-view-field-editor-plugin", "@kbn/unified-field-list", - "@kbn/core-theme-browser-internal", "@kbn/ui-actions-plugin", + "@kbn/react-kibana-context-theme", ] } diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 0581d7a850c68..c858823e2ae0a 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -31617,13 +31617,6 @@ paths: required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data: - type: object description: Indicates the note was successfully deleted. summary: Delete a note tags: @@ -31685,9 +31678,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - $ref: '#/components/schemas/Security_Timeline_API_GetNotesResult' - - type: object + $ref: '#/components/schemas/Security_Timeline_API_GetNotesResult' description: Indicates the requested notes were returned. summary: Get notes tags: @@ -31731,17 +31722,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistNote: - $ref: '#/components/schemas/Security_Timeline_API_ResponseNote' - required: - - persistNote - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_ResponseNote' description: Indicates the note was successfully created. summary: Add or update a note tags: @@ -32094,17 +32075,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistPinnedEventOnTimeline: - $ref: '#/components/schemas/Security_Timeline_API_PersistPinnedEventResponse' - required: - - persistPinnedEventOnTimeline - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_PersistPinnedEventResponse' description: Indicates the event was successfully pinned to the Timeline. summary: Pin an event tags: @@ -33715,20 +33686,6 @@ paths: required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data: - type: object - properties: - deleteTimeline: - type: boolean - required: - - deleteTimeline - required: - - data description: Indicates the Timeline was successfully deleted. summary: Delete Timelines or Timeline templates tags: @@ -33753,20 +33710,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - type: object - properties: - data: - type: object - properties: - getOneTimeline: - $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' - required: - - getOneTimeline - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -34077,17 +34021,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistFavorite: - $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResponse' - required: - - persistFavorite - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResponse' description: Indicates the favorite status was successfully updated. '403': content: @@ -34244,15 +34178,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - type: object - properties: - data: - $ref: '#/components/schemas/Security_Timeline_API_ResolvedTimeline' - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/Security_Timeline_API_ResolvedTimeline' description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -47290,16 +47216,10 @@ components: Security_Timeline_API_FavoriteTimelineResponse: type: object properties: - code: - nullable: true - type: number favorite: items: $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResult' type: array - message: - nullable: true - type: string savedObjectId: type: string templateTimelineId: @@ -47468,28 +47388,15 @@ components: - version Security_Timeline_API_PersistPinnedEventResponse: oneOf: - - allOf: - - $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' - - $ref: '#/components/schemas/Security_Timeline_API_PinnedEventBaseResponseBody' - - nullable: true - type: object - Security_Timeline_API_PersistTimelineResponse: - type: object - properties: - data: - type: object + - $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + - type: object properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' - required: - - timeline + unpinned: + type: boolean required: - - persistTimeline - required: - - data + - unpinned + Security_Timeline_API_PersistTimelineResponse: + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' Security_Timeline_API_PinnedEvent: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BarePinnedEvent' @@ -47502,15 +47409,6 @@ components: required: - pinnedEventId - version - Security_Timeline_API_PinnedEventBaseResponseBody: - type: object - properties: - code: - type: number - message: - type: string - required: - - code Security_Timeline_API_QueryMatchResult: type: object properties: @@ -47551,15 +47449,9 @@ components: Security_Timeline_API_ResponseNote: type: object properties: - code: - type: number - message: - type: string note: $ref: '#/components/schemas/Security_Timeline_API_Note' required: - - code - - message - note Security_Timeline_API_RowRendererId: enum: diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 322160b6231cc..6780ef4926c73 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -34361,13 +34361,6 @@ paths: required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data: - type: object description: Indicates the note was successfully deleted. summary: Delete a note tags: @@ -34428,9 +34421,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - $ref: '#/components/schemas/Security_Timeline_API_GetNotesResult' - - type: object + $ref: '#/components/schemas/Security_Timeline_API_GetNotesResult' description: Indicates the requested notes were returned. summary: Get notes tags: @@ -34473,17 +34464,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistNote: - $ref: '#/components/schemas/Security_Timeline_API_ResponseNote' - required: - - persistNote - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_ResponseNote' description: Indicates the note was successfully created. summary: Add or update a note tags: @@ -34821,17 +34802,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistPinnedEventOnTimeline: - $ref: '#/components/schemas/Security_Timeline_API_PersistPinnedEventResponse' - required: - - persistPinnedEventOnTimeline - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_PersistPinnedEventResponse' description: Indicates the event was successfully pinned to the Timeline. summary: Pin an event tags: @@ -37370,20 +37341,6 @@ paths: required: true responses: '200': - content: - application/json; Elastic-Api-Version=2023-10-31: - schema: - type: object - properties: - data: - type: object - properties: - deleteTimeline: - type: boolean - required: - - deleteTimeline - required: - - data description: Indicates the Timeline was successfully deleted. summary: Delete Timelines or Timeline templates tags: @@ -37407,20 +37364,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - type: object - properties: - data: - type: object - properties: - getOneTimeline: - $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' - required: - - getOneTimeline - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -37724,17 +37668,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - type: object - properties: - data: - type: object - properties: - persistFavorite: - $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResponse' - required: - - persistFavorite - required: - - data + $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResponse' description: Indicates the favorite status was successfully updated. '403': content: @@ -37888,15 +37822,7 @@ paths: content: application/json; Elastic-Api-Version=2023-10-31: schema: - oneOf: - - type: object - properties: - data: - $ref: '#/components/schemas/Security_Timeline_API_ResolvedTimeline' - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/Security_Timeline_API_ResolvedTimeline' description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -55013,16 +54939,10 @@ components: Security_Timeline_API_FavoriteTimelineResponse: type: object properties: - code: - nullable: true - type: number favorite: items: $ref: '#/components/schemas/Security_Timeline_API_FavoriteTimelineResult' type: array - message: - nullable: true - type: string savedObjectId: type: string templateTimelineId: @@ -55191,28 +55111,15 @@ components: - version Security_Timeline_API_PersistPinnedEventResponse: oneOf: - - allOf: - - $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' - - $ref: '#/components/schemas/Security_Timeline_API_PinnedEventBaseResponseBody' - - nullable: true - type: object - Security_Timeline_API_PersistTimelineResponse: - type: object - properties: - data: - type: object + - $ref: '#/components/schemas/Security_Timeline_API_PinnedEvent' + - type: object properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' - required: - - timeline + unpinned: + type: boolean required: - - persistTimeline - required: - - data + - unpinned + Security_Timeline_API_PersistTimelineResponse: + $ref: '#/components/schemas/Security_Timeline_API_TimelineResponse' Security_Timeline_API_PinnedEvent: allOf: - $ref: '#/components/schemas/Security_Timeline_API_BarePinnedEvent' @@ -55225,15 +55132,6 @@ components: required: - pinnedEventId - version - Security_Timeline_API_PinnedEventBaseResponseBody: - type: object - properties: - code: - type: number - message: - type: string - required: - - code Security_Timeline_API_QueryMatchResult: type: object properties: @@ -55274,15 +55172,9 @@ components: Security_Timeline_API_ResponseNote: type: object properties: - code: - type: number - message: - type: string note: $ref: '#/components/schemas/Security_Timeline_API_Note' required: - - code - - message - note Security_Timeline_API_RowRendererId: enum: diff --git a/package.json b/package.json index 97b697d4bedf4..2d667eb6c8dc8 100644 --- a/package.json +++ b/package.json @@ -312,6 +312,7 @@ "@kbn/core-http-router-server-internal": "link:packages/core/http/core-http-router-server-internal", "@kbn/core-http-server": "link:packages/core/http/core-http-server", "@kbn/core-http-server-internal": "link:packages/core/http/core-http-server-internal", + "@kbn/core-http-server-utils": "link:packages/core/http/core-http-server-utils", "@kbn/core-i18n-browser": "link:packages/core/i18n/core-i18n-browser", "@kbn/core-i18n-browser-internal": "link:packages/core/i18n/core-i18n-browser-internal", "@kbn/core-i18n-server": "link:packages/core/i18n/core-i18n-server", @@ -640,7 +641,6 @@ "@kbn/management-settings-types": "link:packages/kbn-management/settings/types", "@kbn/management-settings-utilities": "link:packages/kbn-management/settings/utilities", "@kbn/management-test-plugin": "link:test/plugin_functional/plugins/management_test_plugin", - "@kbn/manifest": "link:packages/kbn-manifest", "@kbn/mapbox-gl": "link:packages/kbn-mapbox-gl", "@kbn/maps-custom-raster-source-plugin": "link:x-pack/examples/third_party_maps_source_example", "@kbn/maps-ems-plugin": "link:src/plugins/maps_ems", @@ -802,6 +802,7 @@ "@kbn/search-index-documents": "link:packages/kbn-search-index-documents", "@kbn/search-indices": "link:x-pack/plugins/search_indices", "@kbn/search-inference-endpoints": "link:x-pack/plugins/search_inference_endpoints", + "@kbn/search-navigation": "link:x-pack/plugins/search_solution/search_navigation", "@kbn/search-notebooks": "link:x-pack/plugins/search_notebooks", "@kbn/search-playground": "link:x-pack/plugins/search_playground", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", @@ -1460,6 +1461,7 @@ "@kbn/managed-vscode-config": "link:packages/kbn-managed-vscode-config", "@kbn/managed-vscode-config-cli": "link:packages/kbn-managed-vscode-config-cli", "@kbn/management-storybook-config": "link:packages/kbn-management/storybook/config", + "@kbn/manifest": "link:packages/kbn-manifest", "@kbn/mock-idp-plugin": "link:packages/kbn-mock-idp-plugin", "@kbn/mock-idp-utils": "link:packages/kbn-mock-idp-utils", "@kbn/observability-onboarding-e2e": "link:x-pack/plugins/observability_solution/observability_onboarding/e2e", diff --git a/packages/analytics/utils/analytics_collection_utils/kibana.jsonc b/packages/analytics/utils/analytics_collection_utils/kibana.jsonc index f909070bbe36f..2c7097a9fc5b3 100644 --- a/packages/analytics/utils/analytics_collection_utils/kibana.jsonc +++ b/packages/analytics/utils/analytics_collection_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/analytics-collection-utils", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/cloud/kibana.jsonc b/packages/cloud/kibana.jsonc index e39a0dbe40617..da8df46a19b69 100644 --- a/packages/cloud/kibana.jsonc +++ b/packages/cloud/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/cloud", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/content_editor/kibana.jsonc b/packages/content-management/content_editor/kibana.jsonc index 27bd7a53b1ee6..403c21b634dfa 100644 --- a/packages/content-management/content_editor/kibana.jsonc +++ b/packages/content-management/content_editor/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-content-editor", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/content_insights/content_insights_public/kibana.jsonc b/packages/content-management/content_insights/content_insights_public/kibana.jsonc index fc4e12374faf9..99b52889ed2a7 100644 --- a/packages/content-management/content_insights/content_insights_public/kibana.jsonc +++ b/packages/content-management/content_insights/content_insights_public/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-content-insights-public", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/content_insights/content_insights_server/kibana.jsonc b/packages/content-management/content_insights/content_insights_server/kibana.jsonc index 386c1a6bf1304..32bcff168489b 100644 --- a/packages/content-management/content_insights/content_insights_server/kibana.jsonc +++ b/packages/content-management/content_insights/content_insights_server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/content-management-content-insights-server", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/favorites/favorites_common/kibana.jsonc b/packages/content-management/favorites/favorites_common/kibana.jsonc index 69e13e656639b..46a8bdf6862b0 100644 --- a/packages/content-management/favorites/favorites_common/kibana.jsonc +++ b/packages/content-management/favorites/favorites_common/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/content-management-favorites-common", - "owner": "@elastic/appex-sharedux" + "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private" } diff --git a/packages/content-management/favorites/favorites_public/kibana.jsonc b/packages/content-management/favorites/favorites_public/kibana.jsonc index a6564f6a17407..bae7450fabeff 100644 --- a/packages/content-management/favorites/favorites_public/kibana.jsonc +++ b/packages/content-management/favorites/favorites_public/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-favorites-public", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/favorites/favorites_server/kibana.jsonc b/packages/content-management/favorites/favorites_server/kibana.jsonc index 8d3fe725d1e86..9ab55caadaf89 100644 --- a/packages/content-management/favorites/favorites_server/kibana.jsonc +++ b/packages/content-management/favorites/favorites_server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/content-management-favorites-server", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/tabbed_table_list_view/kibana.jsonc b/packages/content-management/tabbed_table_list_view/kibana.jsonc index 2a4926625e746..ec30f2315a464 100644 --- a/packages/content-management/tabbed_table_list_view/kibana.jsonc +++ b/packages/content-management/tabbed_table_list_view/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-tabbed-table-list-view", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/content-management/table_list_view/kibana.jsonc b/packages/content-management/table_list_view/kibana.jsonc index 5309f399ae13a..b1d38ab0e6ca6 100644 --- a/packages/content-management/table_list_view/kibana.jsonc +++ b/packages/content-management/table_list_view/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-table-list-view", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/table_list_view_common/kibana.jsonc b/packages/content-management/table_list_view_common/kibana.jsonc index d5a4bf3fbdec0..a0257d0c3966d 100644 --- a/packages/content-management/table_list_view_common/kibana.jsonc +++ b/packages/content-management/table_list_view_common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/content-management-table-list-view-common", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/table_list_view_table/kibana.jsonc b/packages/content-management/table_list_view_table/kibana.jsonc index d842e74a83a8b..defa356d8e613 100644 --- a/packages/content-management/table_list_view_table/kibana.jsonc +++ b/packages/content-management/table_list_view_table/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-table-list-view-table", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/content-management/user_profiles/kibana.jsonc b/packages/content-management/user_profiles/kibana.jsonc index 5b9c73619d771..1d5083a5a5f7a 100644 --- a/packages/content-management/user_profiles/kibana.jsonc +++ b/packages/content-management/user_profiles/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/content-management-user-profiles", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-browser-internal/kibana.jsonc b/packages/core/analytics/core-analytics-browser-internal/kibana.jsonc index b762d25410ad1..4032e0aaf53f5 100644 --- a/packages/core/analytics/core-analytics-browser-internal/kibana.jsonc +++ b/packages/core/analytics/core-analytics-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-analytics-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-browser-mocks/kibana.jsonc b/packages/core/analytics/core-analytics-browser-mocks/kibana.jsonc index b3012a5456fd0..2090fc6fe0da2 100644 --- a/packages/core/analytics/core-analytics-browser-mocks/kibana.jsonc +++ b/packages/core/analytics/core-analytics-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-analytics-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-browser/kibana.jsonc b/packages/core/analytics/core-analytics-browser/kibana.jsonc index 3b98d20b277f7..5b237dd4eed7a 100644 --- a/packages/core/analytics/core-analytics-browser/kibana.jsonc +++ b/packages/core/analytics/core-analytics-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-analytics-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-server-internal/kibana.jsonc b/packages/core/analytics/core-analytics-server-internal/kibana.jsonc index e9eaa029903b5..7483af13c418f 100644 --- a/packages/core/analytics/core-analytics-server-internal/kibana.jsonc +++ b/packages/core/analytics/core-analytics-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-analytics-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-server-mocks/kibana.jsonc b/packages/core/analytics/core-analytics-server-mocks/kibana.jsonc index 325f0216755ec..639127c69f44d 100644 --- a/packages/core/analytics/core-analytics-server-mocks/kibana.jsonc +++ b/packages/core/analytics/core-analytics-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-analytics-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/analytics/core-analytics-server/kibana.jsonc b/packages/core/analytics/core-analytics-server/kibana.jsonc index 8f56bff10b6c3..2a824d4accf15 100644 --- a/packages/core/analytics/core-analytics-server/kibana.jsonc +++ b/packages/core/analytics/core-analytics-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-analytics-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/application/core-application-browser-internal/kibana.jsonc b/packages/core/application/core-application-browser-internal/kibana.jsonc index 56bd06188558f..c2401090a40c3 100644 --- a/packages/core/application/core-application-browser-internal/kibana.jsonc +++ b/packages/core/application/core-application-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-application-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/application/core-application-browser-mocks/kibana.jsonc b/packages/core/application/core-application-browser-mocks/kibana.jsonc index f1f9ae3f1b6c5..15acb592c4801 100644 --- a/packages/core/application/core-application-browser-mocks/kibana.jsonc +++ b/packages/core/application/core-application-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-application-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/application/core-application-browser/kibana.jsonc b/packages/core/application/core-application-browser/kibana.jsonc index 11ff8b45731fd..c38a82f363765 100644 --- a/packages/core/application/core-application-browser/kibana.jsonc +++ b/packages/core/application/core-application-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-application-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/application/core-application-common/kibana.jsonc b/packages/core/application/core-application-common/kibana.jsonc index 762e4f62119e8..e9b95fd9d4de3 100644 --- a/packages/core/application/core-application-common/kibana.jsonc +++ b/packages/core/application/core-application-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-application-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/apps/core-apps-browser-internal/kibana.jsonc b/packages/core/apps/core-apps-browser-internal/kibana.jsonc index e271c86c9e972..e337aad22d1b6 100644 --- a/packages/core/apps/core-apps-browser-internal/kibana.jsonc +++ b/packages/core/apps/core-apps-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-apps-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/apps/core-apps-browser-mocks/kibana.jsonc b/packages/core/apps/core-apps-browser-mocks/kibana.jsonc index 9b6a0e45ce07b..48307ba77a64b 100644 --- a/packages/core/apps/core-apps-browser-mocks/kibana.jsonc +++ b/packages/core/apps/core-apps-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-apps-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/apps/core-apps-server-internal/kibana.jsonc b/packages/core/apps/core-apps-server-internal/kibana.jsonc index fd5224a191823..3e1006b1a61d7 100644 --- a/packages/core/apps/core-apps-server-internal/kibana.jsonc +++ b/packages/core/apps/core-apps-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-apps-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/base/core-base-browser-internal/kibana.jsonc b/packages/core/base/core-base-browser-internal/kibana.jsonc index bb1d4c322ca2e..a5d8aadb28502 100644 --- a/packages/core/base/core-base-browser-internal/kibana.jsonc +++ b/packages/core/base/core-base-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-base-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/base/core-base-browser-mocks/kibana.jsonc b/packages/core/base/core-base-browser-mocks/kibana.jsonc index 5d07dc98fb926..080f81e74f8b8 100644 --- a/packages/core/base/core-base-browser-mocks/kibana.jsonc +++ b/packages/core/base/core-base-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-base-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/base/core-base-common-internal/kibana.jsonc b/packages/core/base/core-base-common-internal/kibana.jsonc index 8f2083119d1ba..3c1d71177bd19 100644 --- a/packages/core/base/core-base-common-internal/kibana.jsonc +++ b/packages/core/base/core-base-common-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-base-common-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/base/core-base-common/kibana.jsonc b/packages/core/base/core-base-common/kibana.jsonc index 5a9691ad80c45..8ae6e6e0e15e0 100644 --- a/packages/core/base/core-base-common/kibana.jsonc +++ b/packages/core/base/core-base-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-base-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/base/core-base-server-internal/kibana.jsonc b/packages/core/base/core-base-server-internal/kibana.jsonc index 2bd0a2f910422..233d8d464552c 100644 --- a/packages/core/base/core-base-server-internal/kibana.jsonc +++ b/packages/core/base/core-base-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-base-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/base/core-base-server-mocks/kibana.jsonc b/packages/core/base/core-base-server-mocks/kibana.jsonc index f43820e330509..37ed4c146acc2 100644 --- a/packages/core/base/core-base-server-mocks/kibana.jsonc +++ b/packages/core/base/core-base-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-base-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-browser-internal/kibana.jsonc b/packages/core/capabilities/core-capabilities-browser-internal/kibana.jsonc index 3bf55481bf59d..736b1c7c8c7fc 100644 --- a/packages/core/capabilities/core-capabilities-browser-internal/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-capabilities-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-browser-mocks/kibana.jsonc b/packages/core/capabilities/core-capabilities-browser-mocks/kibana.jsonc index f418f2fe7a565..e5441f394d004 100644 --- a/packages/core/capabilities/core-capabilities-browser-mocks/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-capabilities-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-common/kibana.jsonc b/packages/core/capabilities/core-capabilities-common/kibana.jsonc index 87bb4d2977a33..9751a8d59e254 100644 --- a/packages/core/capabilities/core-capabilities-common/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-capabilities-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-server-internal/kibana.jsonc b/packages/core/capabilities/core-capabilities-server-internal/kibana.jsonc index e4ffc9a803292..3e6131c7e2230 100644 --- a/packages/core/capabilities/core-capabilities-server-internal/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-capabilities-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-server-mocks/kibana.jsonc b/packages/core/capabilities/core-capabilities-server-mocks/kibana.jsonc index e881e0f0de944..55a0ff6c9b105 100644 --- a/packages/core/capabilities/core-capabilities-server-mocks/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-capabilities-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/capabilities/core-capabilities-server/kibana.jsonc b/packages/core/capabilities/core-capabilities-server/kibana.jsonc index 5fb36e34a068d..7d1bdfe182738 100644 --- a/packages/core/capabilities/core-capabilities-server/kibana.jsonc +++ b/packages/core/capabilities/core-capabilities-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-capabilities-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/chrome/core-chrome-browser-internal/kibana.jsonc b/packages/core/chrome/core-chrome-browser-internal/kibana.jsonc index cfadc0fadeb80..2c04c62ee36d7 100644 --- a/packages/core/chrome/core-chrome-browser-internal/kibana.jsonc +++ b/packages/core/chrome/core-chrome-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-chrome-browser-internal", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/chrome/core-chrome-browser-mocks/kibana.jsonc b/packages/core/chrome/core-chrome-browser-mocks/kibana.jsonc index 7acd89dd4acf2..700a6909b6522 100644 --- a/packages/core/chrome/core-chrome-browser-mocks/kibana.jsonc +++ b/packages/core/chrome/core-chrome-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-chrome-browser-mocks", - "devOnly": true, - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/chrome/core-chrome-browser/kibana.jsonc b/packages/core/chrome/core-chrome-browser/kibana.jsonc index 257c3aea58746..3fa61785fa7a9 100644 --- a/packages/core/chrome/core-chrome-browser/kibana.jsonc +++ b/packages/core/chrome/core-chrome-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-chrome-browser", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/config/core-config-server-internal/kibana.jsonc b/packages/core/config/core-config-server-internal/kibana.jsonc index db0adc8629097..129486d0d37f9 100644 --- a/packages/core/config/core-config-server-internal/kibana.jsonc +++ b/packages/core/config/core-config-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-config-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-browser-internal/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-browser-internal/kibana.jsonc index a7934eead5934..d955e4c984042 100644 --- a/packages/core/custom-branding/core-custom-branding-browser-internal/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-custom-branding-browser-internal", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-browser-mocks/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-browser-mocks/kibana.jsonc index a38fb4e9ba04a..8051fadb04856 100644 --- a/packages/core/custom-branding/core-custom-branding-browser-mocks/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-browser-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-custom-branding-browser-mocks", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-browser/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-browser/kibana.jsonc index 506f5d23be4b6..65922ad38be12 100644 --- a/packages/core/custom-branding/core-custom-branding-browser/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-custom-branding-browser", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-common/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-common/kibana.jsonc index 7043dc5c81215..b3e9ab4cfea55 100644 --- a/packages/core/custom-branding/core-custom-branding-common/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-custom-branding-common", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-server-internal/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-server-internal/kibana.jsonc index 60370f95342fb..079b1cd465417 100644 --- a/packages/core/custom-branding/core-custom-branding-server-internal/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-custom-branding-server-internal", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-server-mocks/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-server-mocks/kibana.jsonc index 5ed605b18dd37..8ae2ffaccc789 100644 --- a/packages/core/custom-branding/core-custom-branding-server-mocks/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-server-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-custom-branding-server-mocks", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/custom-branding/core-custom-branding-server/kibana.jsonc b/packages/core/custom-branding/core-custom-branding-server/kibana.jsonc index e6a7c037d461e..90ca02c45b726 100644 --- a/packages/core/custom-branding/core-custom-branding-server/kibana.jsonc +++ b/packages/core/custom-branding/core-custom-branding-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-custom-branding-server", - "owner": "@elastic/appex-sharedux", -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-browser-internal/kibana.jsonc b/packages/core/deprecations/core-deprecations-browser-internal/kibana.jsonc index c4fd76e10bd88..e7af55ecb6e16 100644 --- a/packages/core/deprecations/core-deprecations-browser-internal/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-deprecations-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-browser-mocks/kibana.jsonc b/packages/core/deprecations/core-deprecations-browser-mocks/kibana.jsonc index f52fc09438249..8893b621ab074 100644 --- a/packages/core/deprecations/core-deprecations-browser-mocks/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-deprecations-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-browser/kibana.jsonc b/packages/core/deprecations/core-deprecations-browser/kibana.jsonc index d24e14cb049e7..81b3711802e6d 100644 --- a/packages/core/deprecations/core-deprecations-browser/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-deprecations-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-common/kibana.jsonc b/packages/core/deprecations/core-deprecations-common/kibana.jsonc index 81fc008124c78..0e857f88107ef 100644 --- a/packages/core/deprecations/core-deprecations-common/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-deprecations-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-server-internal/kibana.jsonc b/packages/core/deprecations/core-deprecations-server-internal/kibana.jsonc index 335b964f4b25c..4607178f9df04 100644 --- a/packages/core/deprecations/core-deprecations-server-internal/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-deprecations-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-server-mocks/kibana.jsonc b/packages/core/deprecations/core-deprecations-server-mocks/kibana.jsonc index 7d32dce1a9f7f..7d74d5aed9b69 100644 --- a/packages/core/deprecations/core-deprecations-server-mocks/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-deprecations-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/deprecations/core-deprecations-server/kibana.jsonc b/packages/core/deprecations/core-deprecations-server/kibana.jsonc index 8985ca948a65e..a3e5030516d4a 100644 --- a/packages/core/deprecations/core-deprecations-server/kibana.jsonc +++ b/packages/core/deprecations/core-deprecations-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-deprecations-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-browser-internal/kibana.jsonc b/packages/core/doc-links/core-doc-links-browser-internal/kibana.jsonc index 0a541080ce1a3..9f2a67b5b8a96 100644 --- a/packages/core/doc-links/core-doc-links-browser-internal/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-doc-links-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-browser-mocks/kibana.jsonc b/packages/core/doc-links/core-doc-links-browser-mocks/kibana.jsonc index 3d37d0652c5cc..f13fdab327fa5 100644 --- a/packages/core/doc-links/core-doc-links-browser-mocks/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-doc-links-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-browser/kibana.jsonc b/packages/core/doc-links/core-doc-links-browser/kibana.jsonc index 0386303378778..eb138cb6aa593 100644 --- a/packages/core/doc-links/core-doc-links-browser/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-doc-links-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-server-internal/kibana.jsonc b/packages/core/doc-links/core-doc-links-server-internal/kibana.jsonc index 9c42d96aa6f0d..fbefdc0d17d95 100644 --- a/packages/core/doc-links/core-doc-links-server-internal/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-doc-links-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-server-mocks/kibana.jsonc b/packages/core/doc-links/core-doc-links-server-mocks/kibana.jsonc index d7eabe4c4c502..2b01099137f52 100644 --- a/packages/core/doc-links/core-doc-links-server-mocks/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-doc-links-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/doc-links/core-doc-links-server/kibana.jsonc b/packages/core/doc-links/core-doc-links-server/kibana.jsonc index 2f514e6031ea8..4f26c69d35634 100644 --- a/packages/core/doc-links/core-doc-links-server/kibana.jsonc +++ b/packages/core/doc-links/core-doc-links-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-doc-links-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/kibana.jsonc b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/kibana.jsonc index 3591e6f14213f..02e47fb6aab08 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-internal/kibana.jsonc +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-elasticsearch-client-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/kibana.jsonc b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/kibana.jsonc index da7297ebef408..0ccfa6a330676 100644 --- a/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/kibana.jsonc +++ b/packages/core/elasticsearch/core-elasticsearch-client-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-elasticsearch-client-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/elasticsearch/core-elasticsearch-server-internal/kibana.jsonc b/packages/core/elasticsearch/core-elasticsearch-server-internal/kibana.jsonc index 9ac8f0e982fdf..14ae0d680bb6f 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-internal/kibana.jsonc +++ b/packages/core/elasticsearch/core-elasticsearch-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-elasticsearch-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/elasticsearch/core-elasticsearch-server-mocks/kibana.jsonc b/packages/core/elasticsearch/core-elasticsearch-server-mocks/kibana.jsonc index 77f9199a531e1..a8a344b9f0af2 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server-mocks/kibana.jsonc +++ b/packages/core/elasticsearch/core-elasticsearch-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-elasticsearch-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/elasticsearch/core-elasticsearch-server/kibana.jsonc b/packages/core/elasticsearch/core-elasticsearch-server/kibana.jsonc index e855f5d75a618..c073052946168 100644 --- a/packages/core/elasticsearch/core-elasticsearch-server/kibana.jsonc +++ b/packages/core/elasticsearch/core-elasticsearch-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-elasticsearch-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/environment/core-environment-server-internal/kibana.jsonc b/packages/core/environment/core-environment-server-internal/kibana.jsonc index 7e0d68e96d35f..252cb8876cac2 100644 --- a/packages/core/environment/core-environment-server-internal/kibana.jsonc +++ b/packages/core/environment/core-environment-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-environment-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/environment/core-environment-server-mocks/kibana.jsonc b/packages/core/environment/core-environment-server-mocks/kibana.jsonc index 6dbbc97b8ba6a..8b5cf42eef45f 100644 --- a/packages/core/environment/core-environment-server-mocks/kibana.jsonc +++ b/packages/core/environment/core-environment-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-environment-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-browser-internal/kibana.jsonc b/packages/core/execution-context/core-execution-context-browser-internal/kibana.jsonc index 58bc6361a167a..4b3c33afc0400 100644 --- a/packages/core/execution-context/core-execution-context-browser-internal/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-execution-context-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-browser-mocks/kibana.jsonc b/packages/core/execution-context/core-execution-context-browser-mocks/kibana.jsonc index 1aeb9063aaeda..2714ba0737e65 100644 --- a/packages/core/execution-context/core-execution-context-browser-mocks/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-execution-context-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-browser/kibana.jsonc b/packages/core/execution-context/core-execution-context-browser/kibana.jsonc index 570753b177b7c..46050ccd3a54b 100644 --- a/packages/core/execution-context/core-execution-context-browser/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-execution-context-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-common/kibana.jsonc b/packages/core/execution-context/core-execution-context-common/kibana.jsonc index 4775632a026b7..30c9d754f0763 100644 --- a/packages/core/execution-context/core-execution-context-common/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-execution-context-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-server-internal/kibana.jsonc b/packages/core/execution-context/core-execution-context-server-internal/kibana.jsonc index b7377b5cc8fc0..9299c36885912 100644 --- a/packages/core/execution-context/core-execution-context-server-internal/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-execution-context-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-server-mocks/kibana.jsonc b/packages/core/execution-context/core-execution-context-server-mocks/kibana.jsonc index db21d4a76c292..8652f3508c561 100644 --- a/packages/core/execution-context/core-execution-context-server-mocks/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-execution-context-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/execution-context/core-execution-context-server/kibana.jsonc b/packages/core/execution-context/core-execution-context-server/kibana.jsonc index 97a1236880656..b280813b06662 100644 --- a/packages/core/execution-context/core-execution-context-server/kibana.jsonc +++ b/packages/core/execution-context/core-execution-context-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-execution-context-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/fatal-errors/core-fatal-errors-browser-internal/kibana.jsonc b/packages/core/fatal-errors/core-fatal-errors-browser-internal/kibana.jsonc index a2abf8bdac3fc..946ee0b3fe97c 100644 --- a/packages/core/fatal-errors/core-fatal-errors-browser-internal/kibana.jsonc +++ b/packages/core/fatal-errors/core-fatal-errors-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-fatal-errors-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/fatal-errors/core-fatal-errors-browser-mocks/kibana.jsonc b/packages/core/fatal-errors/core-fatal-errors-browser-mocks/kibana.jsonc index fa9111fb12dad..f55fc60682663 100644 --- a/packages/core/fatal-errors/core-fatal-errors-browser-mocks/kibana.jsonc +++ b/packages/core/fatal-errors/core-fatal-errors-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-fatal-errors-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/fatal-errors/core-fatal-errors-browser/kibana.jsonc b/packages/core/fatal-errors/core-fatal-errors-browser/kibana.jsonc index ad3f9422482c7..593cbe8755345 100644 --- a/packages/core/fatal-errors/core-fatal-errors-browser/kibana.jsonc +++ b/packages/core/fatal-errors/core-fatal-errors-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-fatal-errors-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc index 150509b99f519..9f0b2a909d0d7 100644 --- a/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-feature-flags-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts index 3f14a2dd92269..cc11599d48d54 100644 --- a/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.test.ts @@ -8,10 +8,10 @@ */ import { firstValueFrom } from 'rxjs'; -import { apm } from '@elastic/apm-rum'; +import { Transaction, apm } from '@elastic/apm-rum'; import { type Client, OpenFeature, type Provider } from '@openfeature/web-sdk'; import { coreContextMock } from '@kbn/core-base-browser-mocks'; -import type { FeatureFlagsStart } from '@kbn/core-feature-flags-browser'; +import type { FeatureFlagsSetup, FeatureFlagsStart } from '@kbn/core-feature-flags-browser'; import { injectedMetadataServiceMock } from '@kbn/core-injected-metadata-browser-mocks'; import type { InternalInjectedMetadataSetup } from '@kbn/core-injected-metadata-browser-internal'; import { FeatureFlagsService } from '..'; @@ -63,7 +63,7 @@ describe('FeatureFlagsService Browser', () => { test('awaits initialization in the start context', async () => { const { setProvider } = featureFlagsService.setup({ injectedMetadata }); let externalResolve: Function = () => void 0; - const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementation(async () => { + const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementationOnce(async () => { await new Promise((resolve) => { externalResolve = resolve; }); @@ -80,7 +80,7 @@ describe('FeatureFlagsService Browser', () => { test('do not hold for too long during initialization', async () => { const { setProvider } = featureFlagsService.setup({ injectedMetadata }); - const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementation(async () => { + const spy = jest.spyOn(OpenFeature, 'setProviderAndWait').mockImplementationOnce(async () => { await new Promise(() => {}); // never resolves }); const apmCaptureErrorSpy = jest.spyOn(apm, 'captureError'); @@ -95,6 +95,60 @@ describe('FeatureFlagsService Browser', () => { expect.stringContaining('The feature flags provider took too long to initialize.') ); }); + + describe('APM instrumentation', () => { + const fakeProvider = { metadata: { name: 'fake provider' } } as Provider; + + let setProvider: FeatureFlagsSetup['setProvider']; + let apmSpy: jest.SpyInstance; + let setProviderSpy: jest.SpyInstance>; + + beforeEach(() => { + const setup = featureFlagsService.setup({ injectedMetadata }); + setProvider = setup.setProvider; + setProviderSpy = jest.spyOn(OpenFeature, 'setProviderAndWait'); + apmSpy = jest.spyOn(apm, 'startTransaction'); + }); + + test('starts an APM transaction to track the time it takes to set a provider', () => { + expect.assertions(1); + setProvider(fakeProvider); + expect(apmSpy).toHaveBeenCalledWith('set-provider', 'feature-flags'); + }); + + test('APM transaction tracks success', async () => { + expect.assertions(4); + + setProviderSpy.mockResolvedValueOnce(); + setProvider(fakeProvider); + + const transaction = apmSpy.mock.results[0].value; + const endTransactionSpy = jest.spyOn(transaction, 'end'); + expect(transaction.outcome).toBeUndefined(); + expect(endTransactionSpy).toHaveBeenCalledTimes(0); + await setProviderSpy.mock.results[0].value.catch(() => {}); + expect(transaction.outcome).toBe('success'); + expect(endTransactionSpy).toHaveBeenCalledTimes(1); + }); + + test('APM transaction tracks failures', async () => { + expect.assertions(5); + + const apmCaptureErrorSpy = jest.spyOn(apm, 'captureError'); + const error = new Error('Something went terribly wrong'); + setProviderSpy.mockRejectedValueOnce(error); + setProvider(fakeProvider); + + const transaction = apmSpy.mock.results[0].value; + const endTransactionSpy = jest.spyOn(transaction, 'end'); + expect(transaction.outcome).toBeUndefined(); + expect(endTransactionSpy).toHaveBeenCalledTimes(0); + await setProviderSpy.mock.results[0].value.catch(() => {}); + expect(apmCaptureErrorSpy).toHaveBeenCalledWith(error); + expect(transaction.outcome).toBe('failure'); + expect(endTransactionSpy).toHaveBeenCalledTimes(1); + }); + }); }); describe('context handling', () => { diff --git a/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts index afc32d93aee3c..388a4056e4a8e 100644 --- a/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts +++ b/packages/core/feature-flags/core-feature-flags-browser-internal/src/feature_flags_service.ts @@ -71,11 +71,21 @@ export class FeatureFlagsService { const transaction = apm.startTransaction('set-provider', 'feature-flags'); this.isProviderReadyPromise = OpenFeature.setProviderAndWait(provider); this.isProviderReadyPromise - .then(() => transaction?.end()) + .then(() => { + if (transaction) { + // @ts-expect-error RUM types are not correct + transaction.outcome = 'success'; + transaction.end(); + } + }) .catch((err) => { this.logger.error(err); apm.captureError(err); - transaction?.end(); + if (transaction) { + // @ts-expect-error RUM types are not correct + transaction.outcome = 'failure'; + transaction.end(); + } }); }, appendContext: (contextToAppend) => this.appendContext(contextToAppend), diff --git a/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc index 0917a098841c4..0ffae67255610 100644 --- a/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-browser-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-feature-flags-browser-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc index 56187119509b9..266c72a78bb48 100644 --- a/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-feature-flags-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc index 60a01597c0454..5f4a48b31a9d8 100644 --- a/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-feature-flags-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc index 69b03f0badbdc..3e7748721e7dc 100644 --- a/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-server-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-feature-flags-server-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc b/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc index dc896ed83b97b..b3488340c6c6e 100644 --- a/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc +++ b/packages/core/feature-flags/core-feature-flags-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-feature-flags-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/http/core-http-browser-internal/kibana.jsonc b/packages/core/http/core-http-browser-internal/kibana.jsonc index 628fabf38eb5b..d0f32e6b8a0a5 100644 --- a/packages/core/http/core-http-browser-internal/kibana.jsonc +++ b/packages/core/http/core-http-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-http-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-browser-mocks/kibana.jsonc b/packages/core/http/core-http-browser-mocks/kibana.jsonc index a97b6052fa0fd..533733bde9b9c 100644 --- a/packages/core/http/core-http-browser-mocks/kibana.jsonc +++ b/packages/core/http/core-http-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-http-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/http/core-http-browser/kibana.jsonc b/packages/core/http/core-http-browser/kibana.jsonc index ee7f45d35429d..3d91035bb062a 100644 --- a/packages/core/http/core-http-browser/kibana.jsonc +++ b/packages/core/http/core-http-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-http-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/http/core-http-common/kibana.jsonc b/packages/core/http/core-http-common/kibana.jsonc index 372eaf2d892a8..f027a0c0be890 100644 --- a/packages/core/http/core-http-common/kibana.jsonc +++ b/packages/core/http/core-http-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-http-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/http/core-http-context-server-internal/kibana.jsonc b/packages/core/http/core-http-context-server-internal/kibana.jsonc index 20d82599501f8..1552b646a347b 100644 --- a/packages/core/http/core-http-context-server-internal/kibana.jsonc +++ b/packages/core/http/core-http-context-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-context-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-context-server-mocks/kibana.jsonc b/packages/core/http/core-http-context-server-mocks/kibana.jsonc index 20778b8e10538..2460079ed5377 100644 --- a/packages/core/http/core-http-context-server-mocks/kibana.jsonc +++ b/packages/core/http/core-http-context-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-http-context-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/http/core-http-request-handler-context-server-internal/kibana.jsonc b/packages/core/http/core-http-request-handler-context-server-internal/kibana.jsonc index 8fc7abfabeeec..df616684d6ac0 100644 --- a/packages/core/http/core-http-request-handler-context-server-internal/kibana.jsonc +++ b/packages/core/http/core-http-request-handler-context-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-request-handler-context-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-request-handler-context-server/kibana.jsonc b/packages/core/http/core-http-request-handler-context-server/kibana.jsonc index 45786e53decbe..63754fc77b93b 100644 --- a/packages/core/http/core-http-request-handler-context-server/kibana.jsonc +++ b/packages/core/http/core-http-request-handler-context-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-request-handler-context-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/http/core-http-resources-server-internal/kibana.jsonc b/packages/core/http/core-http-resources-server-internal/kibana.jsonc index d9217be8446de..9c9a601ffd4e4 100644 --- a/packages/core/http/core-http-resources-server-internal/kibana.jsonc +++ b/packages/core/http/core-http-resources-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-resources-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-resources-server-mocks/kibana.jsonc b/packages/core/http/core-http-resources-server-mocks/kibana.jsonc index e6ec34b3b590d..3c227ea942e08 100644 --- a/packages/core/http/core-http-resources-server-mocks/kibana.jsonc +++ b/packages/core/http/core-http-resources-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-http-resources-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/http/core-http-resources-server/kibana.jsonc b/packages/core/http/core-http-resources-server/kibana.jsonc index 2b80c017c4d9d..37c9c516fc444 100644 --- a/packages/core/http/core-http-resources-server/kibana.jsonc +++ b/packages/core/http/core-http-resources-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-resources-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/http/core-http-router-server-internal/kibana.jsonc b/packages/core/http/core-http-router-server-internal/kibana.jsonc index 31b2f2dec88ad..5f724841f2acb 100644 --- a/packages/core/http/core-http-router-server-internal/kibana.jsonc +++ b/packages/core/http/core-http-router-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-router-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-router-server-mocks/kibana.jsonc b/packages/core/http/core-http-router-server-mocks/kibana.jsonc index 505cad6714c81..70d2412b9b0e0 100644 --- a/packages/core/http/core-http-router-server-mocks/kibana.jsonc +++ b/packages/core/http/core-http-router-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-http-router-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/http/core-http-router-server-mocks/src/router.mock.ts b/packages/core/http/core-http-router-server-mocks/src/router.mock.ts index 858c0753eeb2d..a9995ec887a8e 100644 --- a/packages/core/http/core-http-router-server-mocks/src/router.mock.ts +++ b/packages/core/http/core-http-router-server-mocks/src/router.mock.ts @@ -12,16 +12,16 @@ import { Socket } from 'net'; import { stringify } from 'query-string'; import { hapiMocks } from '@kbn/hapi-mocks'; import { schema } from '@kbn/config-schema'; -import type { - IRouter, - KibanaRequest, - RouteMethod, - RouteValidationSpec, - KibanaRouteOptions, - KibanaRequestState, - KibanaResponseFactory, +import { + type IRouter, + type KibanaRequest, + type RouteMethod, + type RouteValidationSpec, + type KibanaRouteOptions, + type KibanaRequestState, + type KibanaResponseFactory, } from '@kbn/core-http-server'; -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import { createVersionedRouterMock, type MockedVersionedRouter } from './versioned_router.mock'; export type RouterMock = jest.Mocked> & { versioned: MockedVersionedRouter }; @@ -84,7 +84,7 @@ function createKibanaRequestMock

({ const queryString = stringify(query, { sort: false }); const url = new URL(`${path}${queryString ? `?${queryString}` : ''}`, 'http://localhost'); - return CoreKibanaRequest.from( + return kibanaRequestFactory( hapiMocks.createRequest({ app: kibanaRequestState, auth, @@ -128,7 +128,7 @@ function createFakeKibanaRequestMock({ path: '/', }; - return CoreKibanaRequest.from(fakeRequest); + return kibanaRequestFactory(fakeRequest); } const createResponseFactoryMock = (): jest.Mocked => ({ diff --git a/packages/core/http/core-http-router-server-mocks/tsconfig.json b/packages/core/http/core-http-router-server-mocks/tsconfig.json index 4504850612bee..96ef422a65f66 100644 --- a/packages/core/http/core-http-router-server-mocks/tsconfig.json +++ b/packages/core/http/core-http-router-server-mocks/tsconfig.json @@ -14,7 +14,7 @@ "@kbn/hapi-mocks", "@kbn/config-schema", "@kbn/core-http-server", - "@kbn/core-http-router-server-internal" + "@kbn/core-http-server-utils", ], "exclude": [ "target/**/*", diff --git a/packages/core/http/core-http-server-internal/kibana.jsonc b/packages/core/http/core-http-server-internal/kibana.jsonc index b3c59759d39af..1b4876b72c1b8 100644 --- a/packages/core/http/core-http-server-internal/kibana.jsonc +++ b/packages/core/http/core-http-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/http/core-http-server-mocks/kibana.jsonc b/packages/core/http/core-http-server-mocks/kibana.jsonc index 9af9873c9bd5e..2e3a7104a0d80 100644 --- a/packages/core/http/core-http-server-mocks/kibana.jsonc +++ b/packages/core/http/core-http-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-http-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/http/core-http-server-utils/README.md b/packages/core/http/core-http-server-utils/README.md new file mode 100644 index 0000000000000..3954a4ff28478 --- /dev/null +++ b/packages/core/http/core-http-server-utils/README.md @@ -0,0 +1,3 @@ +# @kbn/core-http-server-utils + +This package contains public utilities for Core's server-side http service. diff --git a/src/plugins/charts/public/services/legacy_colors/index.ts b/packages/core/http/core-http-server-utils/index.ts similarity index 86% rename from src/plugins/charts/public/services/legacy_colors/index.ts rename to packages/core/http/core-http-server-utils/index.ts index da06062e1f8c5..4a1d623319735 100644 --- a/src/plugins/charts/public/services/legacy_colors/index.ts +++ b/packages/core/http/core-http-server-utils/index.ts @@ -7,4 +7,4 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export { LegacyColorsService } from './colors'; +export { kibanaRequestFactory, isCoreKibanaRequest } from './src/request'; diff --git a/src/plugins/unified_histogram/public/layout/helpers.ts b/packages/core/http/core-http-server-utils/jest.config.js similarity index 67% rename from src/plugins/unified_histogram/public/layout/helpers.ts rename to packages/core/http/core-http-server-utils/jest.config.js index 3ab7942c31c51..eff6f9ba0e4c6 100644 --- a/src/plugins/unified_histogram/public/layout/helpers.ts +++ b/packages/core/http/core-http-server-utils/jest.config.js @@ -7,9 +7,8 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { AggregateQuery } from '@kbn/es-query'; -import { hasTransformationalCommand } from '@kbn/esql-utils'; - -export const shouldDisplayHistogram = (query: AggregateQuery) => { - return !hasTransformationalCommand(query.esql); +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/http/core-http-server-utils'], }; diff --git a/packages/core/http/core-http-server-utils/kibana.jsonc b/packages/core/http/core-http-server-utils/kibana.jsonc new file mode 100644 index 0000000000000..0f4ec42aaaca5 --- /dev/null +++ b/packages/core/http/core-http-server-utils/kibana.jsonc @@ -0,0 +1,9 @@ +{ + "type": "shared-server", + "id": "@kbn/core-http-server-utils", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} diff --git a/packages/core/http/core-http-server-utils/package.json b/packages/core/http/core-http-server-utils/package.json new file mode 100644 index 0000000000000..380dac95dd05b --- /dev/null +++ b/packages/core/http/core-http-server-utils/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/core-http-server-utils", + "private": true, + "version": "1.0.0", + "author": "Kibana Core", + "license": "Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0" +} diff --git a/packages/core/http/core-http-server-utils/src/request.ts b/packages/core/http/core-http-server-utils/src/request.ts new file mode 100644 index 0000000000000..7ac797727a704 --- /dev/null +++ b/packages/core/http/core-http-server-utils/src/request.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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import type { + KibanaRequest, + RawRequest, + RouteValidator, + RouteValidatorFullConfigRequest, +} from '@kbn/core-http-server'; + +/** + * Allows building a KibanaRequest from a RawRequest, leveraging internal CoreKibanaRequest. + * @param req The raw request to build from + * @param routeSchemas The route schemas + * @param withoutSecretHeaders Whether we want to exclude secret headers + * @returns A KibanaRequest object + */ +export function kibanaRequestFactory( + req: RawRequest, + routeSchemas?: RouteValidator | RouteValidatorFullConfigRequest, + withoutSecretHeaders: boolean = true +): KibanaRequest { + return CoreKibanaRequest.from(req, routeSchemas, withoutSecretHeaders); +} + +export function isCoreKibanaRequest(req: KibanaRequest) { + return req instanceof CoreKibanaRequest; +} diff --git a/packages/core/http/core-http-server-utils/tsconfig.json b/packages/core/http/core-http-server-utils/tsconfig.json new file mode 100644 index 0000000000000..0a0e4516c8c5d --- /dev/null +++ b/packages/core/http/core-http-server-utils/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts" + ], + "kbn_references": [ + "@kbn/core-http-router-server-internal", + "@kbn/core-http-server", + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/packages/core/http/core-http-server/kibana.jsonc b/packages/core/http/core-http-server/kibana.jsonc index 3e1bc4b7b248a..d8b11db348811 100644 --- a/packages/core/http/core-http-server/kibana.jsonc +++ b/packages/core/http/core-http-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-http-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-browser-internal/kibana.jsonc b/packages/core/i18n/core-i18n-browser-internal/kibana.jsonc index 472c9906f8910..4712e8a4fcfc0 100644 --- a/packages/core/i18n/core-i18n-browser-internal/kibana.jsonc +++ b/packages/core/i18n/core-i18n-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-i18n-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-browser-mocks/kibana.jsonc b/packages/core/i18n/core-i18n-browser-mocks/kibana.jsonc index e1e06ed6fd62b..808f40e28d002 100644 --- a/packages/core/i18n/core-i18n-browser-mocks/kibana.jsonc +++ b/packages/core/i18n/core-i18n-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-i18n-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-browser/kibana.jsonc b/packages/core/i18n/core-i18n-browser/kibana.jsonc index 5d716dd511601..a550e894b8c65 100644 --- a/packages/core/i18n/core-i18n-browser/kibana.jsonc +++ b/packages/core/i18n/core-i18n-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-i18n-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-server-internal/kibana.jsonc b/packages/core/i18n/core-i18n-server-internal/kibana.jsonc index 267895c3f6910..5432b3ac2926f 100644 --- a/packages/core/i18n/core-i18n-server-internal/kibana.jsonc +++ b/packages/core/i18n/core-i18n-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-i18n-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-server-mocks/kibana.jsonc b/packages/core/i18n/core-i18n-server-mocks/kibana.jsonc index d5c3c4ae63629..a87032d41eb0b 100644 --- a/packages/core/i18n/core-i18n-server-mocks/kibana.jsonc +++ b/packages/core/i18n/core-i18n-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-i18n-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/i18n/core-i18n-server/kibana.jsonc b/packages/core/i18n/core-i18n-server/kibana.jsonc index 4502f90576967..a856c99e27ea8 100644 --- a/packages/core/i18n/core-i18n-server/kibana.jsonc +++ b/packages/core/i18n/core-i18n-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-i18n-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-internal/kibana.jsonc b/packages/core/injected-metadata/core-injected-metadata-browser-internal/kibana.jsonc index e899f3410c37f..2085640f35d84 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-internal/kibana.jsonc +++ b/packages/core/injected-metadata/core-injected-metadata-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-injected-metadata-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/kibana.jsonc b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/kibana.jsonc index 4dfed6e72d7fb..84e4c734b3ad8 100644 --- a/packages/core/injected-metadata/core-injected-metadata-browser-mocks/kibana.jsonc +++ b/packages/core/injected-metadata/core-injected-metadata-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-injected-metadata-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/injected-metadata/core-injected-metadata-common-internal/kibana.jsonc b/packages/core/injected-metadata/core-injected-metadata-common-internal/kibana.jsonc index c3dcd61159ae0..68a5c161e3db9 100644 --- a/packages/core/injected-metadata/core-injected-metadata-common-internal/kibana.jsonc +++ b/packages/core/injected-metadata/core-injected-metadata-common-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-injected-metadata-common-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/integrations/core-integrations-browser-internal/kibana.jsonc b/packages/core/integrations/core-integrations-browser-internal/kibana.jsonc index 6b51ef7e6ef89..543fcc446ea31 100644 --- a/packages/core/integrations/core-integrations-browser-internal/kibana.jsonc +++ b/packages/core/integrations/core-integrations-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-integrations-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/integrations/core-integrations-browser-mocks/kibana.jsonc b/packages/core/integrations/core-integrations-browser-mocks/kibana.jsonc index ee13f1e79a59d..fc3b7e5cfcf60 100644 --- a/packages/core/integrations/core-integrations-browser-mocks/kibana.jsonc +++ b/packages/core/integrations/core-integrations-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-integrations-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-browser-internal/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-browser-internal/kibana.jsonc index 4e7a537a6d138..b441b9bbcfc86 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-internal/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-lifecycle-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-browser-mocks/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-browser-mocks/kibana.jsonc index 2834401d929cb..b0b0df3c12d7f 100644 --- a/packages/core/lifecycle/core-lifecycle-browser-mocks/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-lifecycle-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-browser/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-browser/kibana.jsonc index c757e67b8ed3a..65d756876f5a3 100644 --- a/packages/core/lifecycle/core-lifecycle-browser/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-lifecycle-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-server-internal/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-server-internal/kibana.jsonc index 9cb8ad860034e..e7ac6d1c8a6ef 100644 --- a/packages/core/lifecycle/core-lifecycle-server-internal/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-lifecycle-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-server-mocks/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-server-mocks/kibana.jsonc index 93f8b8b8eb954..04e464a4e48ae 100644 --- a/packages/core/lifecycle/core-lifecycle-server-mocks/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-lifecycle-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/lifecycle/core-lifecycle-server/kibana.jsonc b/packages/core/lifecycle/core-lifecycle-server/kibana.jsonc index 6ee8465d66cfa..b7ad8f6df90f0 100644 --- a/packages/core/lifecycle/core-lifecycle-server/kibana.jsonc +++ b/packages/core/lifecycle/core-lifecycle-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-lifecycle-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-browser-internal/kibana.jsonc b/packages/core/logging/core-logging-browser-internal/kibana.jsonc index da41db7028f8c..d20ee0ef2e86a 100644 --- a/packages/core/logging/core-logging-browser-internal/kibana.jsonc +++ b/packages/core/logging/core-logging-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-logging-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-browser-mocks/kibana.jsonc b/packages/core/logging/core-logging-browser-mocks/kibana.jsonc index 97044b2219169..555833971e68c 100644 --- a/packages/core/logging/core-logging-browser-mocks/kibana.jsonc +++ b/packages/core/logging/core-logging-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-logging-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-common-internal/kibana.jsonc b/packages/core/logging/core-logging-common-internal/kibana.jsonc index 4e4f23a47c56a..8600b47c4eef9 100644 --- a/packages/core/logging/core-logging-common-internal/kibana.jsonc +++ b/packages/core/logging/core-logging-common-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-logging-common-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-server-internal/kibana.jsonc b/packages/core/logging/core-logging-server-internal/kibana.jsonc index 180b112fa0047..5519d9ae4d87f 100644 --- a/packages/core/logging/core-logging-server-internal/kibana.jsonc +++ b/packages/core/logging/core-logging-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-logging-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-server-mocks/kibana.jsonc b/packages/core/logging/core-logging-server-mocks/kibana.jsonc index b0457e357feff..c43f68ca10eec 100644 --- a/packages/core/logging/core-logging-server-mocks/kibana.jsonc +++ b/packages/core/logging/core-logging-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-logging-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/logging/core-logging-server/kibana.jsonc b/packages/core/logging/core-logging-server/kibana.jsonc index d522793fc7cb8..cde9189144e4b 100644 --- a/packages/core/logging/core-logging-server/kibana.jsonc +++ b/packages/core/logging/core-logging-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-logging-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/kibana.jsonc b/packages/core/metrics/core-metrics-collectors-server-internal/kibana.jsonc index a6e5c586df1c9..fdf04d8026740 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/kibana.jsonc +++ b/packages/core/metrics/core-metrics-collectors-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-metrics-collectors-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/metrics/core-metrics-collectors-server-mocks/kibana.jsonc b/packages/core/metrics/core-metrics-collectors-server-mocks/kibana.jsonc index 709f4fa7137fe..432c85d944287 100644 --- a/packages/core/metrics/core-metrics-collectors-server-mocks/kibana.jsonc +++ b/packages/core/metrics/core-metrics-collectors-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-metrics-collectors-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/metrics/core-metrics-server-internal/kibana.jsonc b/packages/core/metrics/core-metrics-server-internal/kibana.jsonc index 229e11fd697a5..1cc6156b0361a 100644 --- a/packages/core/metrics/core-metrics-server-internal/kibana.jsonc +++ b/packages/core/metrics/core-metrics-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-metrics-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/metrics/core-metrics-server-mocks/kibana.jsonc b/packages/core/metrics/core-metrics-server-mocks/kibana.jsonc index e04bb7a6a414c..a9ece36f0691e 100644 --- a/packages/core/metrics/core-metrics-server-mocks/kibana.jsonc +++ b/packages/core/metrics/core-metrics-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-metrics-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/metrics/core-metrics-server/kibana.jsonc b/packages/core/metrics/core-metrics-server/kibana.jsonc index 34654016db00d..403ec2391ac97 100644 --- a/packages/core/metrics/core-metrics-server/kibana.jsonc +++ b/packages/core/metrics/core-metrics-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-metrics-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/mount-utils/core-mount-utils-browser-internal/kibana.jsonc b/packages/core/mount-utils/core-mount-utils-browser-internal/kibana.jsonc index 886d309507490..75f8921e9b319 100644 --- a/packages/core/mount-utils/core-mount-utils-browser-internal/kibana.jsonc +++ b/packages/core/mount-utils/core-mount-utils-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-mount-utils-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/mount-utils/core-mount-utils-browser/kibana.jsonc b/packages/core/mount-utils/core-mount-utils-browser/kibana.jsonc index 733fbd5b374d3..bd3e8527dc384 100644 --- a/packages/core/mount-utils/core-mount-utils-browser/kibana.jsonc +++ b/packages/core/mount-utils/core-mount-utils-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-mount-utils-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/node/core-node-server-internal/kibana.jsonc b/packages/core/node/core-node-server-internal/kibana.jsonc index 23fe9ae5eeb7f..d2bcd84e7e9a7 100644 --- a/packages/core/node/core-node-server-internal/kibana.jsonc +++ b/packages/core/node/core-node-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-node-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/node/core-node-server-mocks/kibana.jsonc b/packages/core/node/core-node-server-mocks/kibana.jsonc index 095a3bd154cca..ed88d544a84f4 100644 --- a/packages/core/node/core-node-server-mocks/kibana.jsonc +++ b/packages/core/node/core-node-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-node-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/node/core-node-server/kibana.jsonc b/packages/core/node/core-node-server/kibana.jsonc index a0ae2183674f4..4b62731975453 100644 --- a/packages/core/node/core-node-server/kibana.jsonc +++ b/packages/core/node/core-node-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-node-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/notifications/core-notifications-browser-internal/kibana.jsonc b/packages/core/notifications/core-notifications-browser-internal/kibana.jsonc index 0fc1017568936..1db00b09999f7 100644 --- a/packages/core/notifications/core-notifications-browser-internal/kibana.jsonc +++ b/packages/core/notifications/core-notifications-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-notifications-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/notifications/core-notifications-browser-mocks/kibana.jsonc b/packages/core/notifications/core-notifications-browser-mocks/kibana.jsonc index a1a4166e5071e..41c6cf977b569 100644 --- a/packages/core/notifications/core-notifications-browser-mocks/kibana.jsonc +++ b/packages/core/notifications/core-notifications-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-notifications-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/notifications/core-notifications-browser/kibana.jsonc b/packages/core/notifications/core-notifications-browser/kibana.jsonc index 57f94b45d3b4e..96d95760641a4 100644 --- a/packages/core/notifications/core-notifications-browser/kibana.jsonc +++ b/packages/core/notifications/core-notifications-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-notifications-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/overlays/core-overlays-browser-internal/kibana.jsonc b/packages/core/overlays/core-overlays-browser-internal/kibana.jsonc index fd9cb866623da..fead7f3f868e1 100644 --- a/packages/core/overlays/core-overlays-browser-internal/kibana.jsonc +++ b/packages/core/overlays/core-overlays-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-overlays-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/overlays/core-overlays-browser-mocks/kibana.jsonc b/packages/core/overlays/core-overlays-browser-mocks/kibana.jsonc index dfaa8ee75a3e5..3794c6014eec5 100644 --- a/packages/core/overlays/core-overlays-browser-mocks/kibana.jsonc +++ b/packages/core/overlays/core-overlays-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-overlays-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/overlays/core-overlays-browser/kibana.jsonc b/packages/core/overlays/core-overlays-browser/kibana.jsonc index eb984476abc69..ad152f783e2f5 100644 --- a/packages/core/overlays/core-overlays-browser/kibana.jsonc +++ b/packages/core/overlays/core-overlays-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-overlays-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc b/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc index a4613a19a0797..179be4b6ed6b5 100644 --- a/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc +++ b/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-plugins-base-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-browser-internal/kibana.jsonc b/packages/core/plugins/core-plugins-browser-internal/kibana.jsonc index 69463787683bc..df72417ca34ed 100644 --- a/packages/core/plugins/core-plugins-browser-internal/kibana.jsonc +++ b/packages/core/plugins/core-plugins-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-plugins-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-browser-mocks/kibana.jsonc b/packages/core/plugins/core-plugins-browser-mocks/kibana.jsonc index ced5e9a156fdc..58a19d31de971 100644 --- a/packages/core/plugins/core-plugins-browser-mocks/kibana.jsonc +++ b/packages/core/plugins/core-plugins-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-plugins-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-browser/kibana.jsonc b/packages/core/plugins/core-plugins-browser/kibana.jsonc index 75ae0e37db655..23c08b494cb7b 100644 --- a/packages/core/plugins/core-plugins-browser/kibana.jsonc +++ b/packages/core/plugins/core-plugins-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-plugins-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc b/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc index 4363d5a4048b5..5a7508741a18f 100644 --- a/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc +++ b/packages/core/plugins/core-plugins-contracts-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-plugins-contracts-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc b/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc index dc29e2f6343b9..1889795a04ee6 100644 --- a/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc +++ b/packages/core/plugins/core-plugins-contracts-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-plugins-contracts-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-server-internal/kibana.jsonc b/packages/core/plugins/core-plugins-server-internal/kibana.jsonc index b9e0f861ef68d..a8a7613c48234 100644 --- a/packages/core/plugins/core-plugins-server-internal/kibana.jsonc +++ b/packages/core/plugins/core-plugins-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-plugins-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-server-mocks/kibana.jsonc b/packages/core/plugins/core-plugins-server-mocks/kibana.jsonc index 85cbd66366bdd..f6dd7689557ac 100644 --- a/packages/core/plugins/core-plugins-server-mocks/kibana.jsonc +++ b/packages/core/plugins/core-plugins-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-plugins-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/plugins/core-plugins-server/kibana.jsonc b/packages/core/plugins/core-plugins-server/kibana.jsonc index 3ecaaf32ee1c1..d40afd6b87420 100644 --- a/packages/core/plugins/core-plugins-server/kibana.jsonc +++ b/packages/core/plugins/core-plugins-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-plugins-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/preboot/core-preboot-server-internal/kibana.jsonc b/packages/core/preboot/core-preboot-server-internal/kibana.jsonc index 397670fdcb6f2..38b814f426acd 100644 --- a/packages/core/preboot/core-preboot-server-internal/kibana.jsonc +++ b/packages/core/preboot/core-preboot-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-preboot-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/preboot/core-preboot-server-mocks/kibana.jsonc b/packages/core/preboot/core-preboot-server-mocks/kibana.jsonc index 725c8917b5c89..bc880eecb00ed 100644 --- a/packages/core/preboot/core-preboot-server-mocks/kibana.jsonc +++ b/packages/core/preboot/core-preboot-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-preboot-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/preboot/core-preboot-server/kibana.jsonc b/packages/core/preboot/core-preboot-server/kibana.jsonc index efadbe758dda5..c7c1fd92d9195 100644 --- a/packages/core/preboot/core-preboot-server/kibana.jsonc +++ b/packages/core/preboot/core-preboot-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-preboot-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/rendering/core-rendering-browser-internal/kibana.jsonc b/packages/core/rendering/core-rendering-browser-internal/kibana.jsonc index c1fd6e01a8e4c..28e9165581d1e 100644 --- a/packages/core/rendering/core-rendering-browser-internal/kibana.jsonc +++ b/packages/core/rendering/core-rendering-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-rendering-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/rendering/core-rendering-browser-mocks/kibana.jsonc b/packages/core/rendering/core-rendering-browser-mocks/kibana.jsonc index 5d2d1b81e3684..55c27f146268f 100644 --- a/packages/core/rendering/core-rendering-browser-mocks/kibana.jsonc +++ b/packages/core/rendering/core-rendering-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-rendering-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/rendering/core-rendering-browser/kibana.jsonc b/packages/core/rendering/core-rendering-browser/kibana.jsonc index 4b43c11865134..e869c847c7157 100644 --- a/packages/core/rendering/core-rendering-browser/kibana.jsonc +++ b/packages/core/rendering/core-rendering-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-rendering-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/rendering/core-rendering-server-internal/kibana.jsonc b/packages/core/rendering/core-rendering-server-internal/kibana.jsonc index aed5dd9ca56c7..10ae7e41a2240 100644 --- a/packages/core/rendering/core-rendering-server-internal/kibana.jsonc +++ b/packages/core/rendering/core-rendering-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-rendering-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc b/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc index 4f21e2965c05a..d681c829848c3 100644 --- a/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc +++ b/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-rendering-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/root/core-root-browser-internal/kibana.jsonc b/packages/core/root/core-root-browser-internal/kibana.jsonc index 688f03f72f9a6..07b31493495b1 100644 --- a/packages/core/root/core-root-browser-internal/kibana.jsonc +++ b/packages/core/root/core-root-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-root-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/root/core-root-server-internal/kibana.jsonc b/packages/core/root/core-root-server-internal/kibana.jsonc index ce17c8da954d8..a9c8ea1061653 100644 --- a/packages/core/root/core-root-server-internal/kibana.jsonc +++ b/packages/core/root/core-root-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-root-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-api-browser/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-api-browser/kibana.jsonc index 03af10ac7574d..183bb16ffc2f0 100644 --- a/packages/core/saved-objects/core-saved-objects-api-browser/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-api-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-saved-objects-api-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-api-server-internal/kibana.jsonc index aa37176be967a..4c228264bf91b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-api-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-api-server-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-api-server-mocks/kibana.jsonc index 6861249ad218c..bf5e0073399a8 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-api-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-api-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-api-server/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-api-server/kibana.jsonc index f6c63453e8cdb..e8f9e7d472116 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-api-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-api-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-base-server-internal/kibana.jsonc index 54d1713159131..4d6555e965db1 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-base-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-base-server-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-base-server-mocks/kibana.jsonc index fe587abdc39ab..50e3300108d79 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-base-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-base-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-browser-internal/kibana.jsonc index 60e888d1b3b3c..1ae4d81606e8b 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-saved-objects-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-browser-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-browser-mocks/kibana.jsonc index 94359faaca959..e91e555e61582 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-saved-objects-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-browser/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-browser/kibana.jsonc index 57cb6bd12f1c4..f86a468762e47 100644 --- a/packages/core/saved-objects/core-saved-objects-browser/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-saved-objects-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-common/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-common/kibana.jsonc index 205503f731e74..927d99dd0eb1c 100644 --- a/packages/core/saved-objects/core-saved-objects-common/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-saved-objects-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/kibana.jsonc index fe57ff428f976..d8a43d0dbaa46 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-import-export-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-import-export-server-mocks/kibana.jsonc index 603d097e62565..02db65f6df464 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-import-export-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-migration-server-internal/kibana.jsonc index cb6444d2841ad..cf68424c10443 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-migration-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/kibana.jsonc index f892512e6564d..92a097b2c781f 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-migration-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-server-internal/kibana.jsonc index 5c6c74e11ac17..71871b7f5ee77 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-server-mocks/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-server-mocks/kibana.jsonc index 48db247796e90..5d2618ddc3522 100644 --- a/packages/core/saved-objects/core-saved-objects-server-mocks/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-server/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-server/kibana.jsonc index 5c463bd67b910..884e084e53852 100644 --- a/packages/core/saved-objects/core-saved-objects-server/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/saved-objects/core-saved-objects-utils-server/kibana.jsonc b/packages/core/saved-objects/core-saved-objects-utils-server/kibana.jsonc index 5a638dc512dd8..dccc15bc4741c 100644 --- a/packages/core/saved-objects/core-saved-objects-utils-server/kibana.jsonc +++ b/packages/core/saved-objects/core-saved-objects-utils-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-saved-objects-utils-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/security/core-security-browser-internal/kibana.jsonc b/packages/core/security/core-security-browser-internal/kibana.jsonc index 74eb1bc18dea8..3846992da2cf7 100644 --- a/packages/core/security/core-security-browser-internal/kibana.jsonc +++ b/packages/core/security/core-security-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-security-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/security/core-security-browser-mocks/kibana.jsonc b/packages/core/security/core-security-browser-mocks/kibana.jsonc index 33682e42a043d..881f31883b3bc 100644 --- a/packages/core/security/core-security-browser-mocks/kibana.jsonc +++ b/packages/core/security/core-security-browser-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-security-browser-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/security/core-security-browser/kibana.jsonc b/packages/core/security/core-security-browser/kibana.jsonc index d772272394270..2e4310f0b4445 100644 --- a/packages/core/security/core-security-browser/kibana.jsonc +++ b/packages/core/security/core-security-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-security-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/security/core-security-common/kibana.jsonc b/packages/core/security/core-security-common/kibana.jsonc index a72829d079241..602c9562bb04a 100644 --- a/packages/core/security/core-security-common/kibana.jsonc +++ b/packages/core/security/core-security-common/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/core-security-common", - "owner": ["@elastic/kibana-core", "@elastic/kibana-security"] -} + "owner": [ + "@elastic/kibana-core", + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/security/core-security-server-internal/kibana.jsonc b/packages/core/security/core-security-server-internal/kibana.jsonc index c361f06d57981..f07315187408e 100644 --- a/packages/core/security/core-security-server-internal/kibana.jsonc +++ b/packages/core/security/core-security-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-security-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/security/core-security-server-mocks/kibana.jsonc b/packages/core/security/core-security-server-mocks/kibana.jsonc index 2a523bfd2a715..0d10a0ec98318 100644 --- a/packages/core/security/core-security-server-mocks/kibana.jsonc +++ b/packages/core/security/core-security-server-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-security-server-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/security/core-security-server/kibana.jsonc b/packages/core/security/core-security-server/kibana.jsonc index bf89f90c64e7f..8c4586cb82c01 100644 --- a/packages/core/security/core-security-server/kibana.jsonc +++ b/packages/core/security/core-security-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-security-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/status/core-status-common/kibana.jsonc b/packages/core/status/core-status-common/kibana.jsonc index bb40934299c7c..da93f2ef012d2 100644 --- a/packages/core/status/core-status-common/kibana.jsonc +++ b/packages/core/status/core-status-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-status-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/status/core-status-server-internal/kibana.jsonc b/packages/core/status/core-status-server-internal/kibana.jsonc index ee806bea35cc8..1bdaf78df6e80 100644 --- a/packages/core/status/core-status-server-internal/kibana.jsonc +++ b/packages/core/status/core-status-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-status-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/status/core-status-server-mocks/kibana.jsonc b/packages/core/status/core-status-server-mocks/kibana.jsonc index 1b4ed5a6e7cd2..7793e4fee4ef8 100644 --- a/packages/core/status/core-status-server-mocks/kibana.jsonc +++ b/packages/core/status/core-status-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-status-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/status/core-status-server/kibana.jsonc b/packages/core/status/core-status-server/kibana.jsonc index dd7ab2ca731cd..febcca81eba3f 100644 --- a/packages/core/status/core-status-server/kibana.jsonc +++ b/packages/core/status/core-status-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-status-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-deprecations-getters/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-deprecations-getters/kibana.jsonc index 58b022edc2143..1a4725336043b 100644 --- a/packages/core/test-helpers/core-test-helpers-deprecations-getters/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-deprecations-getters/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-test-helpers-deprecations-getters", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-http-setup-browser/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-http-setup-browser/kibana.jsonc index ccb44bf669f6a..1c0b916281b83 100644 --- a/packages/core/test-helpers/core-test-helpers-http-setup-browser/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-http-setup-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-test-helpers-http-setup-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-kbn-server/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-kbn-server/kibana.jsonc index 38e166e1d42b6..7a9a6212710bd 100644 --- a/packages/core/test-helpers/core-test-helpers-kbn-server/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-kbn-server/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-test-helpers-kbn-server", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-model-versions/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-model-versions/kibana.jsonc index d6ea333ad06f7..dbd2f079e1e2d 100644 --- a/packages/core/test-helpers/core-test-helpers-model-versions/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-model-versions/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/core-test-helpers-model-versions", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-so-type-serializer/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-so-type-serializer/kibana.jsonc index 7c8c4da8c303d..a85594e9317ba 100644 --- a/packages/core/test-helpers/core-test-helpers-so-type-serializer/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-so-type-serializer/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-test-helpers-so-type-serializer", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/test-helpers/core-test-helpers-test-utils/kibana.jsonc b/packages/core/test-helpers/core-test-helpers-test-utils/kibana.jsonc index 3e4b11f13d95f..acac0e87986e4 100644 --- a/packages/core/test-helpers/core-test-helpers-test-utils/kibana.jsonc +++ b/packages/core/test-helpers/core-test-helpers-test-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-test-helpers-test-utils", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/theme/core-theme-browser-internal/kibana.jsonc b/packages/core/theme/core-theme-browser-internal/kibana.jsonc index b960ca19a1621..b93b1baee9dde 100644 --- a/packages/core/theme/core-theme-browser-internal/kibana.jsonc +++ b/packages/core/theme/core-theme-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-theme-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/theme/core-theme-browser-mocks/kibana.jsonc b/packages/core/theme/core-theme-browser-mocks/kibana.jsonc index 4abe096bf9526..d64c120c1013a 100644 --- a/packages/core/theme/core-theme-browser-mocks/kibana.jsonc +++ b/packages/core/theme/core-theme-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-theme-browser-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/theme/core-theme-browser/kibana.jsonc b/packages/core/theme/core-theme-browser/kibana.jsonc index a83f9d100e893..19b14c9f31419 100644 --- a/packages/core/theme/core-theme-browser/kibana.jsonc +++ b/packages/core/theme/core-theme-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-theme-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-browser-internal/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-browser-internal/kibana.jsonc index 3df21a50e4eed..0c59c532e67d0 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-internal/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-ui-settings-browser-internal", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-browser-mocks/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-browser-mocks/kibana.jsonc index 5bad0a8987f38..9db388859a88f 100644 --- a/packages/core/ui-settings/core-ui-settings-browser-mocks/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-browser-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/core-ui-settings-browser-mocks", - "devOnly": true, - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-browser/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-browser/kibana.jsonc index b659a8483b121..67cb268897ed4 100644 --- a/packages/core/ui-settings/core-ui-settings-browser/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-ui-settings-browser", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-common/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-common/kibana.jsonc index 6ecff8c3c5be2..8f44aa8f7feca 100644 --- a/packages/core/ui-settings/core-ui-settings-common/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-ui-settings-common", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-server-internal/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-server-internal/kibana.jsonc index 7d159eb886a9c..3a3b590177468 100644 --- a/packages/core/ui-settings/core-ui-settings-server-internal/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-ui-settings-server-internal", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-server-mocks/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-server-mocks/kibana.jsonc index 2db68ae26f2ce..4ba4ab62c519e 100644 --- a/packages/core/ui-settings/core-ui-settings-server-mocks/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-ui-settings-server-mocks", - "devOnly": true, - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/ui-settings/core-ui-settings-server/kibana.jsonc b/packages/core/ui-settings/core-ui-settings-server/kibana.jsonc index a060e4ed93ccd..282250e8f8d1d 100644 --- a/packages/core/ui-settings/core-ui-settings-server/kibana.jsonc +++ b/packages/core/ui-settings/core-ui-settings-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-ui-settings-server", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/usage-data/core-usage-data-base-server-internal/kibana.jsonc b/packages/core/usage-data/core-usage-data-base-server-internal/kibana.jsonc index f1dba28f7a822..97f83a41418b8 100644 --- a/packages/core/usage-data/core-usage-data-base-server-internal/kibana.jsonc +++ b/packages/core/usage-data/core-usage-data-base-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-usage-data-base-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/usage-data/core-usage-data-server-internal/kibana.jsonc b/packages/core/usage-data/core-usage-data-server-internal/kibana.jsonc index 005599f123507..0a870ac820d7b 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/kibana.jsonc +++ b/packages/core/usage-data/core-usage-data-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-usage-data-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/usage-data/core-usage-data-server-mocks/kibana.jsonc b/packages/core/usage-data/core-usage-data-server-mocks/kibana.jsonc index 02e9d1e3a5c34..9a19614e0dcea 100644 --- a/packages/core/usage-data/core-usage-data-server-mocks/kibana.jsonc +++ b/packages/core/usage-data/core-usage-data-server-mocks/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/core-usage-data-server-mocks", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/core/usage-data/core-usage-data-server/kibana.jsonc b/packages/core/usage-data/core-usage-data-server/kibana.jsonc index b90d5b3027b42..d1400215baee5 100644 --- a/packages/core/usage-data/core-usage-data-server/kibana.jsonc +++ b/packages/core/usage-data/core-usage-data-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-usage-data-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc index b3ffc7c2d1f7c..d8df09391b65e 100644 --- a/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-browser-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-user-profile-browser-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc index 557849cb6a39c..4b8c6005c983b 100644 --- a/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-browser-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-user-profile-browser-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-browser/kibana.jsonc b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc index 01bdb62b0fd0d..d93a75c531f7f 100644 --- a/packages/core/user-profile/core-user-profile-browser/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/core-user-profile-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-common/kibana.jsonc b/packages/core/user-profile/core-user-profile-common/kibana.jsonc index 1cc049fd41717..9a7d9aa06c228 100644 --- a/packages/core/user-profile/core-user-profile-common/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/core-user-profile-common", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc index 6d10f1f7b4b42..f17fc7023b258 100644 --- a/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-profile-server-internal", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc index 9a5fd404a673f..a9e76eb363350 100644 --- a/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-server-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-profile-server-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-profile/core-user-profile-server/kibana.jsonc b/packages/core/user-profile/core-user-profile-server/kibana.jsonc index 4a6f847fc5ee9..7c58fa07b7741 100644 --- a/packages/core/user-profile/core-user-profile-server/kibana.jsonc +++ b/packages/core/user-profile/core-user-profile-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-profile-server", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-settings/core-user-settings-server-internal/kibana.jsonc b/packages/core/user-settings/core-user-settings-server-internal/kibana.jsonc index c7716aa9b61f8..6ff34326cd0e8 100644 --- a/packages/core/user-settings/core-user-settings-server-internal/kibana.jsonc +++ b/packages/core/user-settings/core-user-settings-server-internal/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-settings-server-internal", - "owner": "@elastic/kibana-security", -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/core/user-settings/core-user-settings-server-mocks/kibana.jsonc b/packages/core/user-settings/core-user-settings-server-mocks/kibana.jsonc index 9860eb095122e..1660d7380393d 100644 --- a/packages/core/user-settings/core-user-settings-server-mocks/kibana.jsonc +++ b/packages/core/user-settings/core-user-settings-server-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-settings-server-mocks", - "owner": "@elastic/kibana-security", -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/core/user-settings/core-user-settings-server/kibana.jsonc b/packages/core/user-settings/core-user-settings-server/kibana.jsonc index eac6fde03c287..30b506dddd898 100644 --- a/packages/core/user-settings/core-user-settings-server/kibana.jsonc +++ b/packages/core/user-settings/core-user-settings-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/core-user-settings-server", - "owner": "@elastic/kibana-security", -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/analytics/kibana.jsonc b/packages/deeplinks/analytics/kibana.jsonc index a171c67d3ed4a..8c6a026f02cf1 100644 --- a/packages/deeplinks/analytics/kibana.jsonc +++ b/packages/deeplinks/analytics/kibana.jsonc @@ -5,5 +5,7 @@ "@elastic/kibana-data-discovery", "@elastic/kibana-presentation", "@elastic/kibana-visualizations" - ] -} + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/devtools/kibana.jsonc b/packages/deeplinks/devtools/kibana.jsonc index df03b80bca7dc..2ad324c7e8fe8 100644 --- a/packages/deeplinks/devtools/kibana.jsonc +++ b/packages/deeplinks/devtools/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-devtools", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/fleet/kibana.jsonc b/packages/deeplinks/fleet/kibana.jsonc index 2190110ac778c..1615a5476be5f 100644 --- a/packages/deeplinks/fleet/kibana.jsonc +++ b/packages/deeplinks/fleet/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-fleet", - "owner": "@elastic/fleet" -} + "owner": [ + "@elastic/fleet" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/management/kibana.jsonc b/packages/deeplinks/management/kibana.jsonc index d88dfb3df2340..7082fed4e18b4 100644 --- a/packages/deeplinks/management/kibana.jsonc +++ b/packages/deeplinks/management/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-management", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/ml/kibana.jsonc b/packages/deeplinks/ml/kibana.jsonc index 912c9026a6adb..87c97f1191d49 100644 --- a/packages/deeplinks/ml/kibana.jsonc +++ b/packages/deeplinks/ml/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-ml", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/observability/kibana.jsonc b/packages/deeplinks/observability/kibana.jsonc index da2c0505737a5..c7d0885edf597 100644 --- a/packages/deeplinks/observability/kibana.jsonc +++ b/packages/deeplinks/observability/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-observability", - "owner": "@elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/search/kibana.jsonc b/packages/deeplinks/search/kibana.jsonc index 668514b989122..28337dfceaeb6 100644 --- a/packages/deeplinks/search/kibana.jsonc +++ b/packages/deeplinks/search/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-search", - "owner": "@elastic/search-kibana" -} + "owner": [ + "@elastic/search-kibana" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/security/kibana.jsonc b/packages/deeplinks/security/kibana.jsonc index 42aefc7fdc3a0..334d67a2fedaa 100644 --- a/packages/deeplinks/security/kibana.jsonc +++ b/packages/deeplinks/security/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-security", - "owner": "@elastic/security-solution" -} + "owner": [ + "@elastic/security-solution" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/deeplinks/shared/kibana.jsonc b/packages/deeplinks/shared/kibana.jsonc index c223a88e907fd..9fa040345bcc5 100644 --- a/packages/deeplinks/shared/kibana.jsonc +++ b/packages/deeplinks/shared/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/deeplinks-shared", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/default-nav/analytics/kibana.jsonc b/packages/default-nav/analytics/kibana.jsonc index 5974f0872d6f6..16614bc609cf8 100644 --- a/packages/default-nav/analytics/kibana.jsonc +++ b/packages/default-nav/analytics/kibana.jsonc @@ -5,5 +5,7 @@ "@elastic/kibana-data-discovery", "@elastic/kibana-presentation", "@elastic/kibana-visualizations" - ] -} + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/default-nav/devtools/kibana.jsonc b/packages/default-nav/devtools/kibana.jsonc index 7ed8bd537b28d..8f88eaa36ad41 100644 --- a/packages/default-nav/devtools/kibana.jsonc +++ b/packages/default-nav/devtools/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/default-nav-devtools", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/default-nav/management/kibana.jsonc b/packages/default-nav/management/kibana.jsonc index f5d49d9029829..0582900e98949 100644 --- a/packages/default-nav/management/kibana.jsonc +++ b/packages/default-nav/management/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/default-nav-management", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/default-nav/ml/kibana.jsonc b/packages/default-nav/ml/kibana.jsonc index a9d0a2fe4b1d3..157ca0fe96111 100644 --- a/packages/default-nav/ml/kibana.jsonc +++ b/packages/default-nav/ml/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/default-nav-ml", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/home/sample_data_card/kibana.jsonc b/packages/home/sample_data_card/kibana.jsonc index 330df0f2b7cb8..8fc2dc9784d1d 100644 --- a/packages/home/sample_data_card/kibana.jsonc +++ b/packages/home/sample_data_card/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/home-sample-data-card", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/home/sample_data_tab/kibana.jsonc b/packages/home/sample_data_tab/kibana.jsonc index a44c2f7446c7e..68d427291e60e 100644 --- a/packages/home/sample_data_tab/kibana.jsonc +++ b/packages/home/sample_data_tab/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/home-sample-data-tab", - "owner": "@elastic/appex-sharedux" + "owner": [ + "@elastic/appex-sharedux" + ], + // 'home' plugin depends on it + "group": "platform", + "visibility": "shared" } diff --git a/packages/home/sample_data_types/kibana.jsonc b/packages/home/sample_data_types/kibana.jsonc index 0297a131db3b8..688cd31ffd261 100644 --- a/packages/home/sample_data_types/kibana.jsonc +++ b/packages/home/sample_data_types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/home-sample-data-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-actions-types/kibana.jsonc b/packages/kbn-actions-types/kibana.jsonc index 873c4c08c09f4..f73c81bad789c 100644 --- a/packages/kbn-actions-types/kibana.jsonc +++ b/packages/kbn-actions-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/actions-types", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-alerting-types/kibana.jsonc b/packages/kbn-alerting-types/kibana.jsonc index 9828c7cc38f3c..08dd252c70cce 100644 --- a/packages/kbn-alerting-types/kibana.jsonc +++ b/packages/kbn-alerting-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/alerting-types", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-alerts-as-data-utils/kibana.jsonc b/packages/kbn-alerts-as-data-utils/kibana.jsonc index 07e8490dde7b5..711e5edadbea1 100644 --- a/packages/kbn-alerts-as-data-utils/kibana.jsonc +++ b/packages/kbn-alerts-as-data-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/alerts-as-data-utils", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-alerts-grouping/kibana.jsonc b/packages/kbn-alerts-grouping/kibana.jsonc index b98a1f0779eb3..1b9c259992eb6 100644 --- a/packages/kbn-alerts-grouping/kibana.jsonc +++ b/packages/kbn-alerts-grouping/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/alerts-grouping", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-alerts-ui-shared/kibana.jsonc b/packages/kbn-alerts-ui-shared/kibana.jsonc index a4cfc39e987f9..a0912c56f55a0 100644 --- a/packages/kbn-alerts-ui-shared/kibana.jsonc +++ b/packages/kbn-alerts-ui-shared/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/alerts-ui-shared", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-analytics/kibana.jsonc b/packages/kbn-analytics/kibana.jsonc index b10ca7bb960f6..446bce1fcb541 100644 --- a/packages/kbn-analytics/kibana.jsonc +++ b/packages/kbn-analytics/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/analytics", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-apm-config-loader/kibana.jsonc b/packages/kbn-apm-config-loader/kibana.jsonc index 32c994307eb6f..6994fd195e102 100644 --- a/packages/kbn-apm-config-loader/kibana.jsonc +++ b/packages/kbn-apm-config-loader/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-server", "id": "@kbn/apm-config-loader", - "owner": ["@elastic/kibana-core", "@vigneshshanmugam"] -} + "owner": [ + "@elastic/kibana-core", + "@vigneshshanmugam" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-apm-data-view/kibana.jsonc b/packages/kbn-apm-data-view/kibana.jsonc index 3cbeed3811d74..6608a32e123ac 100644 --- a/packages/kbn-apm-data-view/kibana.jsonc +++ b/packages/kbn-apm-data-view/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/apm-data-view", - "owner": "@elastic/obs-ux-infra_services-team" -} + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-apm-synthtrace-client/kibana.jsonc b/packages/kbn-apm-synthtrace-client/kibana.jsonc index a50ec2be221d0..e4c868911ef43 100644 --- a/packages/kbn-apm-synthtrace-client/kibana.jsonc +++ b/packages/kbn-apm-synthtrace-client/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/apm-synthtrace-client", - "devOnly": true, - "owner": ["@elastic/obs-ux-infra_services-team", "@elastic/obs-ux-logs-team"] -} + "owner": [ + "@elastic/obs-ux-infra_services-team", + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-apm-synthtrace/kibana.jsonc b/packages/kbn-apm-synthtrace/kibana.jsonc index 9c85fa210bdd9..42f6c3ed1cf77 100644 --- a/packages/kbn-apm-synthtrace/kibana.jsonc +++ b/packages/kbn-apm-synthtrace/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-server", "id": "@kbn/apm-synthtrace", - "devOnly": true, - "owner": ["@elastic/obs-ux-infra_services-team", "@elastic/obs-ux-logs-team"] -} + "owner": [ + "@elastic/obs-ux-infra_services-team", + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-apm-types/kibana.jsonc b/packages/kbn-apm-types/kibana.jsonc index 26b4ec0b1cf75..d93053a79eed2 100644 --- a/packages/kbn-apm-types/kibana.jsonc +++ b/packages/kbn-apm-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/apm-types", - "owner": "@elastic/obs-ux-infra_services-team" -} + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-apm-utils/kibana.jsonc b/packages/kbn-apm-utils/kibana.jsonc index 2ee2a3b45335a..26ac6576006b2 100644 --- a/packages/kbn-apm-utils/kibana.jsonc +++ b/packages/kbn-apm-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/apm-utils", - "owner": "@elastic/obs-ux-infra_services-team" -} + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-avc-banner/kibana.jsonc b/packages/kbn-avc-banner/kibana.jsonc index 51269b1b2e76b..ae9baa80fb924 100644 --- a/packages/kbn-avc-banner/kibana.jsonc +++ b/packages/kbn-avc-banner/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/avc-banner", - "owner": "@elastic/security-defend-workflows" -} + "owner": [ + "@elastic/security-defend-workflows" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-babel-register/kibana.jsonc b/packages/kbn-babel-register/kibana.jsonc index 33dd730bc10b9..7dc99b1386eda 100644 --- a/packages/kbn-babel-register/kibana.jsonc +++ b/packages/kbn-babel-register/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/babel-register", - "owner": "@elastic/kibana-operations", + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-babel-transform/kibana.jsonc b/packages/kbn-babel-transform/kibana.jsonc index 72b7cf1a9cc82..85fb2734581f2 100644 --- a/packages/kbn-babel-transform/kibana.jsonc +++ b/packages/kbn-babel-transform/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/babel-transform", - "owner": "@elastic/kibana-operations", + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-bfetch-error/kibana.jsonc b/packages/kbn-bfetch-error/kibana.jsonc index 2cde90d13d99c..c5f0f63bc8b13 100644 --- a/packages/kbn-bfetch-error/kibana.jsonc +++ b/packages/kbn-bfetch-error/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/bfetch-error", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-calculate-width-from-char-count/kibana.jsonc b/packages/kbn-calculate-width-from-char-count/kibana.jsonc index 216b12ddeac89..61005be7ed3bb 100644 --- a/packages/kbn-calculate-width-from-char-count/kibana.jsonc +++ b/packages/kbn-calculate-width-from-char-count/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/calculate-width-from-char-count", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-cases-components/kibana.jsonc b/packages/kbn-cases-components/kibana.jsonc index 8fa02ddd80ebb..0e144928125da 100644 --- a/packages/kbn-cases-components/kibana.jsonc +++ b/packages/kbn-cases-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/cases-components", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-cbor/kibana.jsonc b/packages/kbn-cbor/kibana.jsonc index 91ecbb2d27def..ed10c6b91c6e0 100644 --- a/packages/kbn-cbor/kibana.jsonc +++ b/packages/kbn-cbor/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/cbor", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-cell-actions/kibana.jsonc b/packages/kbn-cell-actions/kibana.jsonc index e1ce1385436b3..08d74e045d609 100644 --- a/packages/kbn-cell-actions/kibana.jsonc +++ b/packages/kbn-cell-actions/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/cell-actions", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-chart-icons/kibana.jsonc b/packages/kbn-chart-icons/kibana.jsonc index 95089968838f1..4e81d688be8e6 100644 --- a/packages/kbn-chart-icons/kibana.jsonc +++ b/packages/kbn-chart-icons/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/chart-icons", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ci-stats-core/kibana.jsonc b/packages/kbn-ci-stats-core/kibana.jsonc index f25ef3ae32e9c..6d33547cf2fc3 100644 --- a/packages/kbn-ci-stats-core/kibana.jsonc +++ b/packages/kbn-ci-stats-core/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/ci-stats-core", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-ci-stats-reporter/kibana.jsonc b/packages/kbn-ci-stats-reporter/kibana.jsonc index 71eff10133dd3..773911cc5b66a 100644 --- a/packages/kbn-ci-stats-reporter/kibana.jsonc +++ b/packages/kbn-ci-stats-reporter/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/ci-stats-reporter", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-code-owners/kibana.jsonc b/packages/kbn-code-owners/kibana.jsonc index 66d2e57ca15c1..004515ce1c14d 100644 --- a/packages/kbn-code-owners/kibana.jsonc +++ b/packages/kbn-code-owners/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/code-owners", - "owner": "@elastic/appex-qa", + "owner": [ + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-coloring/kibana.jsonc b/packages/kbn-coloring/kibana.jsonc index 54d8787c964f5..44a9b9b36aa3c 100644 --- a/packages/kbn-coloring/kibana.jsonc +++ b/packages/kbn-coloring/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/coloring", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-config-mocks/kibana.jsonc b/packages/kbn-config-mocks/kibana.jsonc index db330e90a69f1..8ea9b31d03e50 100644 --- a/packages/kbn-config-mocks/kibana.jsonc +++ b/packages/kbn-config-mocks/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/config-mocks", - "owner": "@elastic/kibana-core" + "owner": "@elastic/kibana-core", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-config-schema/kibana.jsonc b/packages/kbn-config-schema/kibana.jsonc index 9c936a1e3fa7f..b2466516f9d63 100644 --- a/packages/kbn-config-schema/kibana.jsonc +++ b/packages/kbn-config-schema/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/config-schema", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-config/kibana.jsonc b/packages/kbn-config/kibana.jsonc index f16969225e90c..c365d45cc3f78 100644 --- a/packages/kbn-config/kibana.jsonc +++ b/packages/kbn-config/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/config", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-content-management-utils/kibana.jsonc b/packages/kbn-content-management-utils/kibana.jsonc index 0b0fa95451cd2..3125cc30da6a0 100644 --- a/packages/kbn-content-management-utils/kibana.jsonc +++ b/packages/kbn-content-management-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/content-management-utils", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-crypto-browser/kibana.jsonc b/packages/kbn-crypto-browser/kibana.jsonc index 7bcbc106f23aa..024e573ad474d 100644 --- a/packages/kbn-crypto-browser/kibana.jsonc +++ b/packages/kbn-crypto-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/crypto-browser", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-crypto/kibana.jsonc b/packages/kbn-crypto/kibana.jsonc index c5f3a3e89edcb..3f7ca7916d560 100644 --- a/packages/kbn-crypto/kibana.jsonc +++ b/packages/kbn-crypto/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/crypto", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-custom-icons/kibana.jsonc b/packages/kbn-custom-icons/kibana.jsonc index 7bd9eaa57e871..5daa04304bafb 100644 --- a/packages/kbn-custom-icons/kibana.jsonc +++ b/packages/kbn-custom-icons/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/custom-icons", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-custom-integrations/kibana.jsonc b/packages/kbn-custom-integrations/kibana.jsonc index b354b8e51cfe1..0cfcf40aa13b5 100644 --- a/packages/kbn-custom-integrations/kibana.jsonc +++ b/packages/kbn-custom-integrations/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/custom-integrations", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-cypress-config/kibana.jsonc b/packages/kbn-cypress-config/kibana.jsonc index ff6bf9e11adec..116561218e065 100644 --- a/packages/kbn-cypress-config/kibana.jsonc +++ b/packages/kbn-cypress-config/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/cypress-config", - "owner": "@elastic/kibana-operations", + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-data-service/kibana.jsonc b/packages/kbn-data-service/kibana.jsonc index 2d7bd21970857..4122ea6f04a0c 100644 --- a/packages/kbn-data-service/kibana.jsonc +++ b/packages/kbn-data-service/kibana.jsonc @@ -4,5 +4,7 @@ "owner": [ "@elastic/kibana-visualizations", "@elastic/kibana-data-discovery" - ] -} + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-data-stream-adapter/kibana.jsonc b/packages/kbn-data-stream-adapter/kibana.jsonc index 43317dca0b91e..655f6671200f2 100644 --- a/packages/kbn-data-stream-adapter/kibana.jsonc +++ b/packages/kbn-data-stream-adapter/kibana.jsonc @@ -1,6 +1,9 @@ { "type": "shared-server", "id": "@kbn/data-stream-adapter", - "owner": "@elastic/security-threat-hunting", - "visibility": "shared" + "owner": [ + "@elastic/security-threat-hunting" + ], + "group": "security", + "visibility": "private" } diff --git a/packages/kbn-data-view-utils/kibana.jsonc b/packages/kbn-data-view-utils/kibana.jsonc index a5bd7b958e272..259845a585501 100644 --- a/packages/kbn-data-view-utils/kibana.jsonc +++ b/packages/kbn-data-view-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/data-view-utils", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-datemath/kibana.jsonc b/packages/kbn-datemath/kibana.jsonc index 43bbf53a816e3..950c06e1fcd4f 100644 --- a/packages/kbn-datemath/kibana.jsonc +++ b/packages/kbn-datemath/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/datemath", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-dev-cli-errors/kibana.jsonc b/packages/kbn-dev-cli-errors/kibana.jsonc index 86fb72d378b19..d986ae83effa2 100644 --- a/packages/kbn-dev-cli-errors/kibana.jsonc +++ b/packages/kbn-dev-cli-errors/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/dev-cli-errors", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-dev-cli-runner/kibana.jsonc b/packages/kbn-dev-cli-runner/kibana.jsonc index 0be99cae70fba..3877e9d959da8 100644 --- a/packages/kbn-dev-cli-runner/kibana.jsonc +++ b/packages/kbn-dev-cli-runner/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/dev-cli-runner", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-dev-proc-runner/kibana.jsonc b/packages/kbn-dev-proc-runner/kibana.jsonc index 8f7a5ec071667..8353789db48f6 100644 --- a/packages/kbn-dev-proc-runner/kibana.jsonc +++ b/packages/kbn-dev-proc-runner/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/dev-proc-runner", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-dev-utils/kibana.jsonc b/packages/kbn-dev-utils/kibana.jsonc index 7cb93b0f5a1d4..d3beef7639ad4 100644 --- a/packages/kbn-dev-utils/kibana.jsonc +++ b/packages/kbn-dev-utils/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/dev-utils", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-discover-contextual-components/kibana.jsonc b/packages/kbn-discover-contextual-components/kibana.jsonc index cfb9b1d5431ef..1de6488bbd6bb 100644 --- a/packages/kbn-discover-contextual-components/kibana.jsonc +++ b/packages/kbn-discover-contextual-components/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-browser", "id": "@kbn/discover-contextual-components", - "owner": ["@elastic/obs-ux-logs-team", "@elastic/kibana-data-discovery"] -} + "owner": [ + "@elastic/obs-ux-logs-team", + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-discover-utils/kibana.jsonc b/packages/kbn-discover-utils/kibana.jsonc index bf77a20bdb863..cbc57999c306c 100644 --- a/packages/kbn-discover-utils/kibana.jsonc +++ b/packages/kbn-discover-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/discover-utils", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-discover-utils/src/hooks/use_pager.test.tsx b/packages/kbn-discover-utils/src/hooks/use_pager.test.tsx index 9e3b450e89cfa..5eee2b760759a 100644 --- a/packages/kbn-discover-utils/src/hooks/use_pager.test.tsx +++ b/packages/kbn-discover-utils/src/hooks/use_pager.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { usePager } from './use_pager'; describe('usePager', () => { diff --git a/packages/kbn-doc-links/kibana.jsonc b/packages/kbn-doc-links/kibana.jsonc index 6e4b13d060d2c..adc558ab919b5 100644 --- a/packages/kbn-doc-links/kibana.jsonc +++ b/packages/kbn-doc-links/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/doc-links", - "owner": "@elastic/docs" -} + "owner": [ + "@elastic/docs" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-dom-drag-drop/kibana.jsonc b/packages/kbn-dom-drag-drop/kibana.jsonc index 6e54fddc2b751..c3108a22d6336 100644 --- a/packages/kbn-dom-drag-drop/kibana.jsonc +++ b/packages/kbn-dom-drag-drop/kibana.jsonc @@ -4,5 +4,7 @@ "owner": [ "@elastic/kibana-visualizations", "@elastic/kibana-data-discovery" - ] -} + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ebt-tools/kibana.jsonc b/packages/kbn-ebt-tools/kibana.jsonc index 8c063d20246e8..e8280fd6e80ad 100644 --- a/packages/kbn-ebt-tools/kibana.jsonc +++ b/packages/kbn-ebt-tools/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ebt-tools", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-elastic-agent-utils/kibana.jsonc b/packages/kbn-elastic-agent-utils/kibana.jsonc index cf8dc4c03f59d..b954c36dffc89 100644 --- a/packages/kbn-elastic-agent-utils/kibana.jsonc +++ b/packages/kbn-elastic-agent-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/elastic-agent-utils", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-es-archiver/kibana.jsonc b/packages/kbn-es-archiver/kibana.jsonc index ae651e3873d0b..86049b70ab79a 100644 --- a/packages/kbn-es-archiver/kibana.jsonc +++ b/packages/kbn-es-archiver/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "test-helper", "id": "@kbn/es-archiver", - "devOnly": true, - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], -} + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-es-errors/kibana.jsonc b/packages/kbn-es-errors/kibana.jsonc index aacc61f02c28d..2adafb2fb3afa 100644 --- a/packages/kbn-es-errors/kibana.jsonc +++ b/packages/kbn-es-errors/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/es-errors", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-es-query/kibana.jsonc b/packages/kbn-es-query/kibana.jsonc index 896ea93fe1f65..7bb7da8721d48 100644 --- a/packages/kbn-es-query/kibana.jsonc +++ b/packages/kbn-es-query/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/es-query", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-es-types/kibana.jsonc b/packages/kbn-es-types/kibana.jsonc index 2435d7666cf9a..08dbeb9d1d88f 100644 --- a/packages/kbn-es-types/kibana.jsonc +++ b/packages/kbn-es-types/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/es-types", - "owner": ["@elastic/kibana-core", "@elastic/obs-knowledge-team"] -} + "owner": [ + "@elastic/kibana-core", + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-es/kibana.jsonc b/packages/kbn-es/kibana.jsonc index d575c727ef33e..8c82b16952c03 100644 --- a/packages/kbn-es/kibana.jsonc +++ b/packages/kbn-es/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/es", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts b/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts index a76251f028389..3800788689882 100644 --- a/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts +++ b/packages/kbn-eslint-plugin-imports/src/helpers/groups.ts @@ -8,18 +8,38 @@ */ import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleId } from '@kbn/repo-source-classifier'; /** * Checks whether a given ModuleGroup can import from another one - * @param importerGroup The group of the module that we are checking + * @param from The ModuleId object that defines the "import" statement * @param importedGroup The group of the imported module * @param importedVisibility The visibility of the imported module - * @returns true if importerGroup is allowed to import from importedGroup/Visibiliy + * @returns true if "from" is allowed to import from importedGroup/Visibility */ export function isImportableFrom( - importerGroup: ModuleGroup, + from: ModuleId, importedGroup: ModuleGroup, importedVisibility: ModuleVisibility ): boolean { - return importerGroup === importedGroup || importedVisibility === 'shared'; + return ( + (isDevOnly(from) && importedGroup === 'platform') || + from.group === importedGroup || + importedVisibility === 'shared' + ); +} + +/** + * Checks whether the given module is supposed to be used at dev/build/test time only + * @param module The module to check + * @returns true if the module is a dev-only module, false otherwise + * @see Package#isDevOnly (packages/kbn-repo-packages/modern/package.js) + */ +function isDevOnly(module: ModuleId) { + return ( + !module.manifest || + !!module.manifest?.devOnly || + module.manifest?.type === 'functional-tests' || + module.manifest?.type === 'test-helper' + ); } diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts index dc4828603f73f..73decfb9d8659 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.test.ts @@ -11,18 +11,22 @@ import { RuleTester } from 'eslint'; import dedent from 'dedent'; import { NoGroupCrossingImportsRule } from './no_group_crossing_imports'; import { formatSuggestions } from '../helpers/report'; -import { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { ModuleGroup, ModuleVisibility } from '@kbn/repo-info/types'; +import type { KibanaPackageManifest } from '@kbn/repo-packages'; -const make = ( - fromGroup: ModuleGroup, - fromVisibility: ModuleVisibility, - toGroup: ModuleGroup, - toVisibility: ModuleVisibility, - imp = 'import' -) => ({ - filename: `${fromGroup}.${fromVisibility}.ts`, +interface ModuleInfo { + group: ModuleGroup; + visibility: ModuleVisibility; + type?: KibanaPackageManifest['type']; + devOnly?: boolean; +} + +const make = (from: ModuleInfo, to: ModuleInfo, imp = 'import') => ({ + filename: `${from.group}.${from.visibility}.${from.type ?? 'shared-common'}.${ + from.devOnly ?? 'false' + }.ts`, code: dedent` - ${imp} '${toGroup}.${toVisibility}' + ${imp} '${to.group}.${to.visibility}.${to.type ?? 'shared-common'}.${to.devOnly ?? 'false'}' `, }); @@ -46,12 +50,16 @@ jest.mock('../helpers/repo_source_classifier', () => { getRepoSourceClassifier() { return { classify(r: string | [string, string]) { - const [group, visibility] = + const [group, visibility, type, devOnly] = typeof r === 'string' ? (r.endsWith('.ts') ? r.slice(0, -3) : r).split('.') : r; return { pkgInfo: { pkgId: 'aPackage', }, + manifest: { + type, + devOnly: devOnly !== 'false', + }, group, visibility, }; @@ -94,19 +102,59 @@ for (const [name, tester] of [tsTester, babelTester]) { describe(name, () => { tester.run('@kbn/imports/no_group_crossing_imports', NoGroupCrossingImportsRule, { valid: [ - make('observability', 'private', 'observability', 'private'), - make('security', 'private', 'security', 'private'), - make('search', 'private', 'search', 'private'), - make('observability', 'private', 'platform', 'shared'), - make('security', 'private', 'common', 'shared'), - make('platform', 'shared', 'platform', 'shared'), - make('platform', 'shared', 'platform', 'private'), - make('common', 'shared', 'common', 'shared'), + make( + { group: 'observability', visibility: 'private' }, + { group: 'observability', visibility: 'private' } + ), + make( + { group: 'security', visibility: 'private' }, + { group: 'security', visibility: 'private' } + ), + make( + { group: 'search', visibility: 'private' }, + { group: 'search', visibility: 'private' } + ), + make( + { group: 'observability', visibility: 'private' }, + { group: 'platform', visibility: 'shared' } + ), + make( + { group: 'security', visibility: 'private' }, + { group: 'common', visibility: 'shared' } + ), + make( + { group: 'platform', visibility: 'shared' }, + { group: 'platform', visibility: 'shared' } + ), + make( + { group: 'platform', visibility: 'shared' }, + { group: 'platform', visibility: 'private' } + ), + make( + { group: 'security', visibility: 'private' }, + { group: 'platform', visibility: 'shared' } + ), + make( + { group: 'common', visibility: 'shared', devOnly: true }, + { group: 'platform', visibility: 'private' } + ), + make( + { group: 'common', visibility: 'shared', type: 'functional-tests' }, + { group: 'platform', visibility: 'private' } + ), + make( + { group: 'common', visibility: 'shared', type: 'test-helper' }, + { group: 'platform', visibility: 'private' } + ), + make({ group: 'common', visibility: 'shared' }, { group: 'common', visibility: 'shared' }), ], invalid: [ { - ...make('observability', 'private', 'security', 'private'), + ...make( + { group: 'observability', visibility: 'private' }, + { group: 'security', visibility: 'private' } + ), errors: [ { line: 1, @@ -117,7 +165,7 @@ for (const [name, tester] of [tsTester, babelTester]) { importedPackage: 'aPackage', importedGroup: 'security', importedVisibility: 'private', - sourcePath: 'observability.private.ts', + sourcePath: 'observability.private.shared-common.false.ts', suggestion: formatSuggestions([ `Please review the dependencies in your module's manifest (kibana.jsonc).`, `Relocate this module to a different group, and/or make sure it has the right 'visibility'.`, @@ -128,7 +176,10 @@ for (const [name, tester] of [tsTester, babelTester]) { ], }, { - ...make('security', 'private', 'platform', 'private'), + ...make( + { group: 'security', visibility: 'private' }, + { group: 'platform', visibility: 'private' } + ), errors: [ { line: 1, @@ -139,7 +190,7 @@ for (const [name, tester] of [tsTester, babelTester]) { importedPackage: 'aPackage', importedGroup: 'platform', importedVisibility: 'private', - sourcePath: 'security.private.ts', + sourcePath: 'security.private.shared-common.false.ts', suggestion: formatSuggestions([ `Please review the dependencies in your module's manifest (kibana.jsonc).`, `Relocate this module to a different group, and/or make sure it has the right 'visibility'.`, diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.ts index 255973ab7460a..fb262e88a02ac 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_imports.ts @@ -52,7 +52,7 @@ export const NoGroupCrossingImportsRule: Rule.RuleModule = { const imported = classifier.classify(result.absolute); - if (!isImportableFrom(self.group, imported.group, imported.visibility)) { + if (!isImportableFrom(self, imported.group, imported.visibility)) { context.report({ node: node as Node, messageId: 'ILLEGAL_IMPORT', diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts index e68f7217905a5..918412725cd26 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_group_crossing_manifests.ts @@ -71,7 +71,7 @@ export const NoGroupCrossingManifestsRule: Rule.RuleModule = { if (dependency) { // at this point, we know the dependency is a plugin const { id, group, visibility } = dependency; - if (!isImportableFrom(moduleId.group, group, visibility)) { + if (!isImportableFrom(moduleId, group, visibility)) { offendingDependencies.push({ id, pluginId, group, visibility }); } } diff --git a/packages/kbn-esql-ast/kibana.jsonc b/packages/kbn-esql-ast/kibana.jsonc index 18ab1197119e7..825235daef485 100644 --- a/packages/kbn-esql-ast/kibana.jsonc +++ b/packages/kbn-esql-ast/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-common", - "id": "@kbn/esql-ast", - "owner": "@elastic/kibana-esql" - } \ No newline at end of file + "type": "shared-common", + "id": "@kbn/esql-ast", + "owner": [ + "@elastic/kibana-esql" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-esql-editor/kibana.jsonc b/packages/kbn-esql-editor/kibana.jsonc index 005fdb2e6e358..369a2c5b0821f 100644 --- a/packages/kbn-esql-editor/kibana.jsonc +++ b/packages/kbn-esql-editor/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/esql-editor", - "owner": "@elastic/kibana-esql", + "owner": [ + "@elastic/kibana-esql" + ], + "group": "platform", + "visibility": "private" } \ No newline at end of file diff --git a/packages/kbn-esql-utils/kibana.jsonc b/packages/kbn-esql-utils/kibana.jsonc index 959a5d947b2b8..32404726c90ff 100644 --- a/packages/kbn-esql-utils/kibana.jsonc +++ b/packages/kbn-esql-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/esql-utils", - "owner": "@elastic/kibana-esql" -} + "owner": [ + "@elastic/kibana-esql" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-esql-validation-autocomplete/kibana.jsonc b/packages/kbn-esql-validation-autocomplete/kibana.jsonc index b7c1d12d48cd1..b0aa37e719377 100644 --- a/packages/kbn-esql-validation-autocomplete/kibana.jsonc +++ b/packages/kbn-esql-validation-autocomplete/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-common", - "id": "@kbn/esql-validation-autocomplete", - "owner": "@elastic/kibana-esql" - } \ No newline at end of file + "type": "shared-common", + "id": "@kbn/esql-validation-autocomplete", + "owner": [ + "@elastic/kibana-esql" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts index 8462f9e2a050b..3a810cac3ad75 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts @@ -218,7 +218,7 @@ const functionEnrichments: Record> ], }, mv_sort: { - signatures: new Array(9).fill({ + signatures: new Array(10).fill({ params: [{}, { acceptedValues: ['asc', 'desc'] }], }), }, diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.stats.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.stats.test.ts index 829c12f7dabba..5234e93c159e2 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.stats.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.command.stats.test.ts @@ -150,6 +150,7 @@ describe('autocomplete.suggest', () => { ...getFieldNamesByType([ ...ESQL_COMMON_NUMERIC_TYPES, 'date', + 'date_nanos', 'boolean', 'ip', 'version', @@ -158,7 +159,16 @@ describe('autocomplete.suggest', () => { ]), ...getFunctionSignaturesByReturnType( 'stats', - [...ESQL_COMMON_NUMERIC_TYPES, 'date', 'boolean', 'ip', 'version', 'text', 'keyword'], + [ + ...ESQL_COMMON_NUMERIC_TYPES, + 'date', + 'boolean', + 'ip', + 'version', + 'text', + 'keyword', + 'date_nanos', + ], { scalar: true, } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts index aae715ee66749..e81e74427b721 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts @@ -370,8 +370,12 @@ describe('autocomplete.suggest', () => { // // Test suggestions for each possible param, within each signature variation, for each function for (const fn of scalarFunctionDefinitions) { // skip this fn for the moment as it's quite hard to test - // Add match in the text when the autocomplete is ready https://github.com/elastic/kibana/issues/196995 - if (!['bucket', 'date_extract', 'date_diff', 'case', 'match', 'qstr'].includes(fn.name)) { + // Add match in the test when the autocomplete is ready https://github.com/elastic/kibana/issues/196995 + if ( + !['bucket', 'date_extract', 'date_diff', 'case', 'match', 'qstr', 'date_trunc'].includes( + fn.name + ) + ) { test(`${fn.name}`, async () => { const testedCases = new Set(); @@ -539,9 +543,9 @@ describe('autocomplete.suggest', () => { 'from a | eval var0=date_trunc(/)', [ ...getLiteralsByType('time_literal').map((t) => `${t}, `), - ...getFunctionSignaturesByReturnType('eval', 'time_duration', { scalar: true }).map( - (t) => `${t.text},` - ), + ...getFunctionSignaturesByReturnType('eval', ['time_duration', 'date_period'], { + scalar: true, + }).map((t) => `${t.text},`), ], { triggerCharacter: '(' } ); diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts index 6a429f2288f94..37dfe8de5822f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts @@ -216,7 +216,7 @@ const countDefinition: FunctionDefinition = { validate: undefined, examples: [ 'FROM employees\n| STATS COUNT(height)', - 'FROM employees \n| STATS count = COUNT(*) BY languages \n| SORT languages DESC', + 'FROM employees\n| STATS count = COUNT(*) BY languages\n| SORT languages DESC', 'ROW words="foo;bar;baz;qux;quux;foo"\n| STATS word_count = COUNT(SPLIT(words, ";"))', 'ROW n=1\n| WHERE n < 0\n| STATS COUNT(n)', 'ROW n=1\n| STATS COUNT(n > 0 OR NULL), COUNT(n < 0 OR NULL)', @@ -343,6 +343,61 @@ const countDistinctDefinition: FunctionDefinition = { ], returnType: 'long', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'long', + }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + { + name: 'precision', + type: 'integer', + optional: true, + }, + ], + returnType: 'long', + }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + { + name: 'precision', + type: 'long', + optional: true, + }, + ], + returnType: 'long', + }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + { + name: 'precision', + type: 'unsigned_long', + optional: true, + }, + ], + returnType: 'long', + }, { params: [ { @@ -769,6 +824,16 @@ const maxDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -984,6 +1049,16 @@ const minDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -1544,6 +1619,16 @@ const valuesDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts index fb98d7cb4b212..d45271b189915 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts @@ -892,6 +892,22 @@ const coalesceDefinition: FunctionDefinition = { returnType: 'date', minParams: 1, }, + { + params: [ + { + name: 'first', + type: 'date_nanos', + optional: false, + }, + { + name: 'rest', + type: 'date_nanos', + optional: true, + }, + ], + returnType: 'date_nanos', + minParams: 1, + }, { params: [ { @@ -1624,6 +1640,21 @@ const dateTruncDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'interval', + type: 'date_period', + optional: false, + }, + { + name: 'date', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -1639,6 +1670,21 @@ const dateTruncDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'interval', + type: 'time_duration', + optional: false, + }, + { + name: 'date', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], @@ -1954,6 +2000,22 @@ const greatestDefinition: FunctionDefinition = { returnType: 'date', minParams: 1, }, + { + params: [ + { + name: 'first', + type: 'date_nanos', + optional: false, + }, + { + name: 'rest', + type: 'date_nanos', + optional: true, + }, + ], + returnType: 'date_nanos', + minParams: 1, + }, { params: [ { @@ -2468,6 +2530,22 @@ const leastDefinition: FunctionDefinition = { returnType: 'date', minParams: 1, }, + { + params: [ + { + name: 'first', + type: 'date_nanos', + optional: false, + }, + { + name: 'rest', + type: 'date_nanos', + optional: true, + }, + ], + returnType: 'date_nanos', + minParams: 1, + }, { params: [ { @@ -3402,7 +3480,7 @@ const matchDefinition: FunctionDefinition = { supportedOptions: [], validate: undefined, examples: [ - 'from books \n| where match(author, "Faulkner")\n| keep book_no, author \n| sort book_no \n| limit 5;', + 'FROM books \n| WHERE MATCH(author, "Faulkner")\n| KEEP book_no, author \n| SORT book_no \n| LIMIT 5;', ], }; @@ -3808,6 +3886,16 @@ const mvCountDefinition: FunctionDefinition = { ], returnType: 'integer', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'integer', + }, { params: [ { @@ -3965,6 +4053,16 @@ const mvDedupeDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -4113,6 +4211,16 @@ const mvFirstDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -4271,6 +4379,16 @@ const mvLastDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -4409,6 +4527,16 @@ const mvMaxDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -4654,6 +4782,16 @@ const mvMinDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -5028,6 +5166,26 @@ const mvSliceDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + { + name: 'start', + type: 'integer', + optional: false, + }, + { + name: 'end', + type: 'integer', + optional: true, + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -5260,6 +5418,22 @@ const mvSortDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + { + name: 'order', + type: 'keyword', + optional: true, + acceptedValues: ['asc', 'desc'], + }, + ], + returnType: 'date_nanos', + }, { params: [ { @@ -6017,7 +6191,7 @@ const qstrDefinition: FunctionDefinition = { supportedOptions: [], validate: undefined, examples: [ - 'from books \n| where qstr("author: Faulkner")\n| keep book_no, author \n| sort book_no \n| limit 5;', + 'FROM books \n| WHERE QSTR("author: Faulkner")\n| KEEP book_no, author \n| SORT book_no \n| LIMIT 5;', ], }; @@ -8030,7 +8204,78 @@ const toDateNanosDefinition: FunctionDefinition = { }), preview: true, alias: undefined, - signatures: [], + signatures: [ + { + params: [ + { + name: 'field', + type: 'date', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'double', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'keyword', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'long', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'text', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + { + params: [ + { + name: 'field', + type: 'unsigned_long', + optional: false, + }, + ], + returnType: 'date_nanos', + }, + ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, @@ -8107,6 +8352,16 @@ const toDatetimeDefinition: FunctionDefinition = { ], returnType: 'date', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'date', + }, { params: [ { @@ -8680,6 +8935,16 @@ const toLongDefinition: FunctionDefinition = { ], returnType: 'long', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'long', + }, { params: [ { @@ -8893,6 +9158,16 @@ const toStringDefinition: FunctionDefinition = { ], returnType: 'keyword', }, + { + params: [ + { + name: 'field', + type: 'date_nanos', + optional: false, + }, + ], + returnType: 'keyword', + }, { params: [ { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 68d8ebb233f5e..03102474f6314 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -429,7 +429,6 @@ describe('validation logic', () => { [], ['Invalid option ["bogus"] for mv_sort. Supported options: ["asc", "desc"].'] ); - testErrorsAndWarnings(`row var = mv_sort(["a", "b"], "ASC")`, []); testErrorsAndWarnings(`row var = mv_sort(["a", "b"], "DESC")`, []); diff --git a/packages/kbn-event-annotation-common/kibana.jsonc b/packages/kbn-event-annotation-common/kibana.jsonc index cdf2a346730ee..161e6bb8f22ba 100644 --- a/packages/kbn-event-annotation-common/kibana.jsonc +++ b/packages/kbn-event-annotation-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/event-annotation-common", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-event-annotation-components/kibana.jsonc b/packages/kbn-event-annotation-components/kibana.jsonc index af30ffe6d3277..7454473a94833 100644 --- a/packages/kbn-event-annotation-components/kibana.jsonc +++ b/packages/kbn-event-annotation-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/event-annotation-components", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-expandable-flyout/kibana.jsonc b/packages/kbn-expandable-flyout/kibana.jsonc index ae15fc604a1d8..5a8bf3183968d 100644 --- a/packages/kbn-expandable-flyout/kibana.jsonc +++ b/packages/kbn-expandable-flyout/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/expandable-flyout", - "owner": "@elastic/security-threat-hunting-investigations" -} + "owner": [ + "@elastic/security-threat-hunting-investigations" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts index 26b3daf8161db..cc3623f9238c6 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts +++ b/packages/kbn-expandable-flyout/src/hooks/use_initialize_from_local_storage.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useInitializeFromLocalStorage } from './use_initialize_from_local_storage'; import { localStorageMock } from '../../__mocks__'; import { diff --git a/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx b/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx index 4526f128affd3..8dc4aacaefbcf 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx +++ b/packages/kbn-expandable-flyout/src/hooks/use_sections.test.tsx @@ -8,8 +8,7 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; -import type { RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook, RenderHookResult } from '@testing-library/react'; import type { UseSectionsParams, UseSectionsResult } from './use_sections'; import { useSections } from './use_sections'; import { useExpandableFlyoutState } from '../..'; @@ -17,7 +16,7 @@ import { useExpandableFlyoutState } from '../..'; jest.mock('../..'); describe('useSections', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return undefined for all values if no registeredPanels', () => { (useExpandableFlyoutState as jest.Mock).mockReturnValue({ diff --git a/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts b/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts index 72ab9148743db..696191e7fbdf6 100644 --- a/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts +++ b/packages/kbn-expandable-flyout/src/hooks/use_window_width.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { FULL_WIDTH_PADDING, MAX_RESOLUTION_BREAKPOINT, diff --git a/packages/kbn-expect/kibana.jsonc b/packages/kbn-expect/kibana.jsonc index 6f2732af83e64..8b32dc829a865 100644 --- a/packages/kbn-expect/kibana.jsonc +++ b/packages/kbn-expect/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/expect", - "devOnly": true, - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], -} + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-field-types/kibana.jsonc b/packages/kbn-field-types/kibana.jsonc index e19eebb3a3a9f..ee1d33c31da08 100644 --- a/packages/kbn-field-types/kibana.jsonc +++ b/packages/kbn-field-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/field-types", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-field-utils/kibana.jsonc b/packages/kbn-field-utils/kibana.jsonc index 891f5f962f9e3..16efdbb4ffd4a 100644 --- a/packages/kbn-field-utils/kibana.jsonc +++ b/packages/kbn-field-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/field-utils", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-flot-charts/kibana.jsonc b/packages/kbn-flot-charts/kibana.jsonc index f2ebe8d27999e..a027dbd460ab9 100644 --- a/packages/kbn-flot-charts/kibana.jsonc +++ b/packages/kbn-flot-charts/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/flot-charts", - "owner": ["@elastic/kibana-presentation", "@elastic/stack-monitoring"] -} + "owner": [ + "@elastic/kibana-presentation", + "@elastic/stack-monitoring" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ftr-common-functional-services/kibana.jsonc b/packages/kbn-ftr-common-functional-services/kibana.jsonc index c82496f10987b..cd87612fe9817 100644 --- a/packages/kbn-ftr-common-functional-services/kibana.jsonc +++ b/packages/kbn-ftr-common-functional-services/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "test-helper", "id": "@kbn/ftr-common-functional-services", - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-ftr-common-functional-ui-services/kibana.jsonc b/packages/kbn-ftr-common-functional-ui-services/kibana.jsonc index a92a8cd4c4a9b..16b19f3a7e203 100644 --- a/packages/kbn-ftr-common-functional-ui-services/kibana.jsonc +++ b/packages/kbn-ftr-common-functional-ui-services/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "test-helper", "id": "@kbn/ftr-common-functional-ui-services", - "owner": "@elastic/appex-qa", + "owner": [ + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-ftr-screenshot-filename/kibana.jsonc b/packages/kbn-ftr-screenshot-filename/kibana.jsonc index c4d6004ed83db..b1534ddf0bc10 100644 --- a/packages/kbn-ftr-screenshot-filename/kibana.jsonc +++ b/packages/kbn-ftr-screenshot-filename/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/ftr-screenshot-filename", - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-generate-csv/kibana.jsonc b/packages/kbn-generate-csv/kibana.jsonc index d29b33047007c..bcd72c4e8499a 100644 --- a/packages/kbn-generate-csv/kibana.jsonc +++ b/packages/kbn-generate-csv/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/generate-csv", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-get-repo-files/kibana.jsonc b/packages/kbn-get-repo-files/kibana.jsonc index 9bf339cc5c321..9268d6b7a70c8 100644 --- a/packages/kbn-get-repo-files/kibana.jsonc +++ b/packages/kbn-get-repo-files/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/get-repo-files", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-grid-layout/grid/grid_layout.tsx b/packages/kbn-grid-layout/grid/grid_layout.tsx index c3f9521503107..fc67c5b134606 100644 --- a/packages/kbn-grid-layout/grid/grid_layout.tsx +++ b/packages/kbn-grid-layout/grid/grid_layout.tsx @@ -8,109 +8,139 @@ */ import { cloneDeep } from 'lodash'; -import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { combineLatest, distinctUntilChanged, filter, map, pairwise, skip } from 'rxjs'; import { GridHeightSmoother } from './grid_height_smoother'; import { GridRow } from './grid_row'; -import { GridLayoutApi, GridLayoutData, GridSettings } from './types'; -import { useGridLayoutApi } from './use_grid_layout_api'; +import { GridLayoutData, GridSettings } from './types'; import { useGridLayoutEvents } from './use_grid_layout_events'; import { useGridLayoutState } from './use_grid_layout_state'; import { isLayoutEqual } from './utils/equality_checks'; +import { compactGridRow } from './utils/resolve_grid_row'; interface GridLayoutProps { - getCreationOptions: () => { initialLayout: GridLayoutData; gridSettings: GridSettings }; + layout: GridLayoutData; + gridSettings: GridSettings; renderPanelContents: (panelId: string) => React.ReactNode; onLayoutChange: (newLayout: GridLayoutData) => void; } -export const GridLayout = forwardRef( - ({ getCreationOptions, renderPanelContents, onLayoutChange }, ref) => { - const { gridLayoutStateManager, setDimensionsRef } = useGridLayoutState({ - getCreationOptions, - }); - useGridLayoutEvents({ gridLayoutStateManager }); - - const gridLayoutApi = useGridLayoutApi({ gridLayoutStateManager }); - useImperativeHandle(ref, () => gridLayoutApi, [gridLayoutApi]); +export const GridLayout = ({ + layout, + gridSettings, + renderPanelContents, + onLayoutChange, +}: GridLayoutProps) => { + const { gridLayoutStateManager, setDimensionsRef } = useGridLayoutState({ + layout, + gridSettings, + }); + useGridLayoutEvents({ gridLayoutStateManager }); - const [rowCount, setRowCount] = useState( - gridLayoutStateManager.gridLayout$.getValue().length - ); + const [rowCount, setRowCount] = useState( + gridLayoutStateManager.gridLayout$.getValue().length + ); - useEffect(() => { + /** + * Update the `gridLayout$` behaviour subject in response to the `layout` prop changing + */ + useEffect(() => { + if (!isLayoutEqual(layout, gridLayoutStateManager.gridLayout$.getValue())) { + const newLayout = cloneDeep(layout); /** - * The only thing that should cause the entire layout to re-render is adding a new row; - * this subscription ensures this by updating the `rowCount` state when it changes. + * the layout sent in as a prop is not guaranteed to be valid (i.e it may have floating panels) - + * so, we need to loop through each row and ensure it is compacted */ - const rowCountSubscription = gridLayoutStateManager.gridLayout$ - .pipe( - skip(1), // we initialized `rowCount` above, so skip the initial emit - map((newLayout) => newLayout.length), - distinctUntilChanged() - ) - .subscribe((newRowCount) => { - setRowCount(newRowCount); - }); + newLayout.forEach((row, rowIndex) => { + newLayout[rowIndex] = compactGridRow(row); + }); + gridLayoutStateManager.gridLayout$.next(newLayout); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [layout]); - const onLayoutChangeSubscription = combineLatest([ - gridLayoutStateManager.gridLayout$, - gridLayoutStateManager.interactionEvent$, - ]) - .pipe( - // if an interaction event is happening, then ignore any "draft" layout changes - filter(([_, event]) => !Boolean(event)), - // once no interaction event, create pairs of "old" and "new" layouts for comparison - map(([layout]) => layout), - pairwise() - ) - .subscribe(([layoutBefore, layoutAfter]) => { - if (!isLayoutEqual(layoutBefore, layoutAfter)) { - onLayoutChange(layoutAfter); - } - }); + /** + * Set up subscriptions + */ + useEffect(() => { + /** + * The only thing that should cause the entire layout to re-render is adding a new row; + * this subscription ensures this by updating the `rowCount` state when it changes. + */ + const rowCountSubscription = gridLayoutStateManager.gridLayout$ + .pipe( + skip(1), // we initialized `rowCount` above, so skip the initial emit + map((newLayout) => newLayout.length), + distinctUntilChanged() + ) + .subscribe((newRowCount) => { + setRowCount(newRowCount); + }); + + const onLayoutChangeSubscription = combineLatest([ + gridLayoutStateManager.gridLayout$, + gridLayoutStateManager.interactionEvent$, + ]) + .pipe( + // if an interaction event is happening, then ignore any "draft" layout changes + filter(([_, event]) => !Boolean(event)), + // once no interaction event, create pairs of "old" and "new" layouts for comparison + map(([newLayout]) => newLayout), + pairwise() + ) + .subscribe(([layoutBefore, layoutAfter]) => { + if (!isLayoutEqual(layoutBefore, layoutAfter)) { + onLayoutChange(layoutAfter); + } + }); - return () => { - rowCountSubscription.unsubscribe(); - onLayoutChangeSubscription.unsubscribe(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + return () => { + rowCountSubscription.unsubscribe(); + onLayoutChangeSubscription.unsubscribe(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + /** + * Memoize row children components to prevent unnecessary re-renders + */ + const children = useMemo(() => { + return Array.from({ length: rowCount }, (_, rowIndex) => { + return ( + { + const newLayout = cloneDeep(gridLayoutStateManager.gridLayout$.value); + newLayout[rowIndex].isCollapsed = !newLayout[rowIndex].isCollapsed; + gridLayoutStateManager.gridLayout$.next(newLayout); + }} + setInteractionEvent={(nextInteractionEvent) => { + if (!nextInteractionEvent) { + gridLayoutStateManager.activePanel$.next(undefined); + } + gridLayoutStateManager.interactionEvent$.next(nextInteractionEvent); + }} + ref={(element: HTMLDivElement | null) => + (gridLayoutStateManager.rowRefs.current[rowIndex] = element) + } + /> + ); + }); + }, [rowCount, gridLayoutStateManager, renderPanelContents]); - return ( - <> - -

{ - setDimensionsRef(divElement); - }} - > - {Array.from({ length: rowCount }, (_, rowIndex) => { - return ( - { - const newLayout = cloneDeep(gridLayoutStateManager.gridLayout$.value); - newLayout[rowIndex].isCollapsed = !newLayout[rowIndex].isCollapsed; - gridLayoutStateManager.gridLayout$.next(newLayout); - }} - setInteractionEvent={(nextInteractionEvent) => { - if (!nextInteractionEvent) { - gridLayoutStateManager.activePanel$.next(undefined); - } - gridLayoutStateManager.interactionEvent$.next(nextInteractionEvent); - }} - ref={(element) => (gridLayoutStateManager.rowRefs.current[rowIndex] = element)} - /> - ); - })} -
- - - ); - } -); + return ( + +
{ + setDimensionsRef(divElement); + }} + > + {children} +
+
+ ); +}; diff --git a/packages/kbn-grid-layout/grid/grid_panel.tsx b/packages/kbn-grid-layout/grid/grid_panel.tsx index 822cb2328c4a5..a44a321a7b18d 100644 --- a/packages/kbn-grid-layout/grid/grid_panel.tsx +++ b/packages/kbn-grid-layout/grid/grid_panel.tsx @@ -129,84 +129,93 @@ export const GridPanel = forwardRef< [] ); + /** + * Memoize panel contents to prevent unnecessary re-renders + */ + const panelContents = useMemo(() => { + return renderPanelContents(panelId); + }, [panelId, renderPanelContents]); + return ( -
- - {/* drag handle */} -
+
+ interactionStart('drag', e)} - onMouseUp={(e) => interactionStart('drop', e)} > - -
- {/* Resize handle */} -
interactionStart('resize', e)} - onMouseUp={(e) => interactionStart('drop', e)} - css={css` - right: 0; - bottom: 0; - opacity: 0; - margin: -2px; - position: absolute; - width: ${euiThemeVars.euiSizeL}; - height: ${euiThemeVars.euiSizeL}; - transition: opacity 0.2s, border 0.2s; - border-radius: 7px 0 7px 0; - border-bottom: 2px solid ${euiThemeVars.euiColorSuccess}; - border-right: 2px solid ${euiThemeVars.euiColorSuccess}; - :hover { - opacity: 1; - background-color: ${transparentize(euiThemeVars.euiColorSuccess, 0.05)}; - cursor: se-resize; - } - `} - /> -
interactionStart('drag', e)} + onMouseUp={(e) => interactionStart('drop', e)} + > + +
+ {/* Resize handle */} +
interactionStart('resize', e)} + onMouseUp={(e) => interactionStart('drop', e)} + css={css` + right: 0; + bottom: 0; + opacity: 0; + margin: -2px; + position: absolute; + width: ${euiThemeVars.euiSizeL}; + height: ${euiThemeVars.euiSizeL}; + transition: opacity 0.2s, border 0.2s; + border-radius: 7px 0 7px 0; + border-bottom: 2px solid ${euiThemeVars.euiColorSuccess}; + border-right: 2px solid ${euiThemeVars.euiColorSuccess}; + :hover { + opacity: 1; + background-color: ${transparentize(euiThemeVars.euiColorSuccess, 0.05)}; + cursor: se-resize; + } + `} + /> +
- {renderPanelContents(panelId)} -
- -
+ `} + > + {panelContents} +
+ +
+ ); } ); diff --git a/packages/kbn-grid-layout/grid/grid_row.tsx b/packages/kbn-grid-layout/grid/grid_row.tsx index ff97b32efcdbc..01466a440b4cd 100644 --- a/packages/kbn-grid-layout/grid/grid_row.tsx +++ b/packages/kbn-grid-layout/grid/grid_row.tsx @@ -155,6 +155,51 @@ export const GridRow = forwardRef< [rowIndex] ); + /** + * Memoize panel children components to prevent unnecessary re-renders + */ + const children = useMemo(() => { + return panelIds.map((panelId) => ( + { + e.preventDefault(); + e.stopPropagation(); + const panelRef = gridLayoutStateManager.panelRefs.current[rowIndex][panelId]; + if (!panelRef) return; + + const panelRect = panelRef.getBoundingClientRect(); + if (type === 'drop') { + setInteractionEvent(undefined); + } else { + setInteractionEvent({ + type, + id: panelId, + panelDiv: panelRef, + targetRowIndex: rowIndex, + mouseOffsets: { + top: e.clientY - panelRect.top, + left: e.clientX - panelRect.left, + right: e.clientX - panelRect.right, + bottom: e.clientY - panelRect.bottom, + }, + }); + } + }} + ref={(element) => { + if (!gridLayoutStateManager.panelRefs.current[rowIndex]) { + gridLayoutStateManager.panelRefs.current[rowIndex] = {}; + } + gridLayoutStateManager.panelRefs.current[rowIndex][panelId] = element; + }} + /> + )); + }, [panelIds, rowIndex, gridLayoutStateManager, renderPanelContents, setInteractionEvent]); + return ( <> {rowIndex !== 0 && ( @@ -186,46 +231,7 @@ export const GridRow = forwardRef< ${initialStyles}; `} > - {panelIds.map((panelId) => ( - { - e.preventDefault(); - e.stopPropagation(); - const panelRef = gridLayoutStateManager.panelRefs.current[rowIndex][panelId]; - if (!panelRef) return; - - const panelRect = panelRef.getBoundingClientRect(); - if (type === 'drop') { - setInteractionEvent(undefined); - } else { - setInteractionEvent({ - type, - id: panelId, - panelDiv: panelRef, - targetRowIndex: rowIndex, - mouseOffsets: { - top: e.clientY - panelRect.top, - left: e.clientX - panelRect.left, - right: e.clientX - panelRect.right, - bottom: e.clientY - panelRect.bottom, - }, - }); - } - }} - ref={(element) => { - if (!gridLayoutStateManager.panelRefs.current[rowIndex]) { - gridLayoutStateManager.panelRefs.current[rowIndex] = {}; - } - gridLayoutStateManager.panelRefs.current[rowIndex][panelId] = element; - }} - /> - ))} - + {children}
)} diff --git a/packages/kbn-grid-layout/grid/types.ts b/packages/kbn-grid-layout/grid/types.ts index 004669e69b186..3979b86f05a09 100644 --- a/packages/kbn-grid-layout/grid/types.ts +++ b/packages/kbn-grid-layout/grid/types.ts @@ -10,8 +10,6 @@ import { BehaviorSubject } from 'rxjs'; import type { ObservedSize } from 'use-resize-observer/polyfilled'; -import { SerializableRecord } from '@kbn/utility-types'; - export interface GridCoordinate { column: number; row: number; @@ -106,18 +104,6 @@ export interface PanelInteractionEvent { }; } -/** - * The external API provided through the GridLayout component - */ -export interface GridLayoutApi { - addPanel: (panelId: string, placementSettings: PanelPlacementSettings) => void; - removePanel: (panelId: string) => void; - replacePanel: (oldPanelId: string, newPanelId: string) => void; - - getPanelCount: () => number; - serializeState: () => GridLayoutData & SerializableRecord; -} - // TODO: Remove from Dashboard plugin as part of https://github.com/elastic/kibana/issues/190446 export enum PanelPlacementStrategy { /** Place on the very top of the grid layout, add the height of this panel to all other panels. */ diff --git a/packages/kbn-grid-layout/grid/use_grid_layout_api.ts b/packages/kbn-grid-layout/grid/use_grid_layout_api.ts deleted file mode 100644 index 1a950ee934174..0000000000000 --- a/packages/kbn-grid-layout/grid/use_grid_layout_api.ts +++ /dev/null @@ -1,109 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { useMemo } from 'react'; -import { cloneDeep } from 'lodash'; - -import { SerializableRecord } from '@kbn/utility-types'; - -import { GridLayoutApi, GridLayoutData, GridLayoutStateManager } from './types'; -import { compactGridRow } from './utils/resolve_grid_row'; -import { runPanelPlacementStrategy } from './utils/run_panel_placement'; - -export const useGridLayoutApi = ({ - gridLayoutStateManager, -}: { - gridLayoutStateManager: GridLayoutStateManager; -}): GridLayoutApi => { - const api: GridLayoutApi = useMemo(() => { - return { - addPanel: (panelId, placementSettings) => { - const currentLayout = gridLayoutStateManager.gridLayout$.getValue(); - const [firstRow, ...rest] = currentLayout; // currently, only adding panels to the first row is supported - const { columnCount: gridColumnCount } = gridLayoutStateManager.runtimeSettings$.getValue(); - const nextRow = runPanelPlacementStrategy( - firstRow, - { - id: panelId, - width: placementSettings.width, - height: placementSettings.height, - }, - gridColumnCount, - placementSettings?.strategy - ); - gridLayoutStateManager.gridLayout$.next([nextRow, ...rest]); - }, - - removePanel: (panelId) => { - const currentLayout = gridLayoutStateManager.gridLayout$.getValue(); - - // find the row where the panel exists and delete it from the corresponding panels object - let rowIndex = 0; - let updatedPanels; - for (rowIndex; rowIndex < currentLayout.length; rowIndex++) { - const row = currentLayout[rowIndex]; - if (Object.keys(row.panels).includes(panelId)) { - updatedPanels = { ...row.panels }; // prevent mutation of original panel object - delete updatedPanels[panelId]; - break; - } - } - - // if the panels were updated (i.e. the panel was successfully found and deleted), update the layout - if (updatedPanels) { - const newLayout = cloneDeep(currentLayout); - newLayout[rowIndex] = compactGridRow({ - ...newLayout[rowIndex], - panels: updatedPanels, - }); - gridLayoutStateManager.gridLayout$.next(newLayout); - } - }, - - replacePanel: (oldPanelId, newPanelId) => { - const currentLayout = gridLayoutStateManager.gridLayout$.getValue(); - - // find the row where the panel exists and update its ID to trigger a re-render - let rowIndex = 0; - let updatedPanels; - for (rowIndex; rowIndex < currentLayout.length; rowIndex++) { - const row = { ...currentLayout[rowIndex] }; - if (Object.keys(row.panels).includes(oldPanelId)) { - updatedPanels = { ...row.panels }; // prevent mutation of original panel object - const oldPanel = updatedPanels[oldPanelId]; - delete updatedPanels[oldPanelId]; - updatedPanels[newPanelId] = { ...oldPanel, id: newPanelId }; - break; - } - } - - // if the panels were updated (i.e. the panel was successfully found and replaced), update the layout - if (updatedPanels) { - const newLayout = cloneDeep(currentLayout); - newLayout[rowIndex].panels = updatedPanels; - gridLayoutStateManager.gridLayout$.next(newLayout); - } - }, - - getPanelCount: () => { - return gridLayoutStateManager.gridLayout$.getValue().reduce((prev, row) => { - return prev + Object.keys(row.panels).length; - }, 0); - }, - - serializeState: () => { - const currentLayout = gridLayoutStateManager.gridLayout$.getValue(); - return cloneDeep(currentLayout) as GridLayoutData & SerializableRecord; - }, - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return api; -}; diff --git a/packages/kbn-grid-layout/grid/use_grid_layout_state.ts b/packages/kbn-grid-layout/grid/use_grid_layout_state.ts index fe657ae253107..a107cbacef2f2 100644 --- a/packages/kbn-grid-layout/grid/use_grid_layout_state.ts +++ b/packages/kbn-grid-layout/grid/use_grid_layout_state.ts @@ -22,9 +22,11 @@ import { } from './types'; export const useGridLayoutState = ({ - getCreationOptions, + layout, + gridSettings, }: { - getCreationOptions: () => { initialLayout: GridLayoutData; gridSettings: GridSettings }; + layout: GridLayoutData; + gridSettings: GridSettings; }): { gridLayoutStateManager: GridLayoutStateManager; setDimensionsRef: (instance: HTMLDivElement | null) => void; @@ -32,11 +34,8 @@ export const useGridLayoutState = ({ const rowRefs = useRef>([]); const panelRefs = useRef>([]); - // eslint-disable-next-line react-hooks/exhaustive-deps - const { initialLayout, gridSettings } = useMemo(() => getCreationOptions(), []); - const gridLayoutStateManager = useMemo(() => { - const gridLayout$ = new BehaviorSubject(initialLayout); + const gridLayout$ = new BehaviorSubject(layout); const gridDimensions$ = new BehaviorSubject({ width: 0, height: 0 }); const interactionEvent$ = new BehaviorSubject(undefined); const activePanel$ = new BehaviorSubject(undefined); @@ -45,7 +44,7 @@ export const useGridLayoutState = ({ columnPixelWidth: 0, }); const panelIds$ = new BehaviorSubject( - initialLayout.map(({ panels }) => Object.keys(panels)) + layout.map(({ panels }) => Object.keys(panels)) ); return { diff --git a/packages/kbn-grid-layout/index.ts b/packages/kbn-grid-layout/index.ts index 924369fe5ab4c..be46f9d5a7b88 100644 --- a/packages/kbn-grid-layout/index.ts +++ b/packages/kbn-grid-layout/index.ts @@ -8,12 +8,6 @@ */ export { GridLayout } from './grid/grid_layout'; -export type { - GridLayoutApi, - GridLayoutData, - GridPanelData, - GridRowData, - GridSettings, -} from './grid/types'; +export type { GridLayoutData, GridPanelData, GridRowData, GridSettings } from './grid/types'; export { isLayoutEqual } from './grid/utils/equality_checks'; diff --git a/packages/kbn-grid-layout/tsconfig.json b/packages/kbn-grid-layout/tsconfig.json index 14ab38ba76ba9..f0dd3232a42d5 100644 --- a/packages/kbn-grid-layout/tsconfig.json +++ b/packages/kbn-grid-layout/tsconfig.json @@ -19,6 +19,5 @@ "kbn_references": [ "@kbn/ui-theme", "@kbn/i18n", - "@kbn/utility-types", ] } diff --git a/packages/kbn-grouping/kibana.jsonc b/packages/kbn-grouping/kibana.jsonc index ce91c91cefcda..36e06aaaca56d 100644 --- a/packages/kbn-grouping/kibana.jsonc +++ b/packages/kbn-grouping/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/grouping", - "owner": "@elastic/response-ops" + "owner": "@elastic/response-ops", + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-guided-onboarding/kibana.jsonc b/packages/kbn-guided-onboarding/kibana.jsonc index 6b7815910f2f5..8a3ec04df9f38 100644 --- a/packages/kbn-guided-onboarding/kibana.jsonc +++ b/packages/kbn-guided-onboarding/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/guided-onboarding", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-handlebars/kibana.jsonc b/packages/kbn-handlebars/kibana.jsonc index 59b3c28ddb391..52c2290705f32 100644 --- a/packages/kbn-handlebars/kibana.jsonc +++ b/packages/kbn-handlebars/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/handlebars", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-hapi-mocks/kibana.jsonc b/packages/kbn-hapi-mocks/kibana.jsonc index f88e6e29df493..2938ef8711acc 100644 --- a/packages/kbn-hapi-mocks/kibana.jsonc +++ b/packages/kbn-hapi-mocks/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/hapi-mocks", - "owner": "@elastic/kibana-core" + "owner": "@elastic/kibana-core", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-health-gateway-server/kibana.jsonc b/packages/kbn-health-gateway-server/kibana.jsonc index 6f9470fac54e5..befe8f806bb50 100644 --- a/packages/kbn-health-gateway-server/kibana.jsonc +++ b/packages/kbn-health-gateway-server/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-server", "id": "@kbn/health-gateway-server", - "owner": "@elastic/kibana-core" + "owner": "@elastic/kibana-core", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-i18n-react/kibana.jsonc b/packages/kbn-i18n-react/kibana.jsonc index 090a4f0fa61be..f4eb824a88f79 100644 --- a/packages/kbn-i18n-react/kibana.jsonc +++ b/packages/kbn-i18n-react/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/i18n-react", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-i18n/kibana.jsonc b/packages/kbn-i18n/kibana.jsonc index 8d4bdf6f003c9..c0d9b8067d9ca 100644 --- a/packages/kbn-i18n/kibana.jsonc +++ b/packages/kbn-i18n/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/i18n", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-import-resolver/kibana.jsonc b/packages/kbn-import-resolver/kibana.jsonc index 6b7ae00f9da8d..10ddd61b4344b 100644 --- a/packages/kbn-import-resolver/kibana.jsonc +++ b/packages/kbn-import-resolver/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/import-resolver", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-index-adapter/kibana.jsonc b/packages/kbn-index-adapter/kibana.jsonc index 575d95f5a3e39..94b33ec7774b2 100644 --- a/packages/kbn-index-adapter/kibana.jsonc +++ b/packages/kbn-index-adapter/kibana.jsonc @@ -2,5 +2,6 @@ "type": "shared-server", "id": "@kbn/index-adapter", "owner": "@elastic/security-threat-hunting", - "visibility": "shared" + "group": "security", + "visibility": "private" } diff --git a/packages/kbn-interpreter/kibana.jsonc b/packages/kbn-interpreter/kibana.jsonc index 9f11015263cf0..b92d389c38ae4 100644 --- a/packages/kbn-interpreter/kibana.jsonc +++ b/packages/kbn-interpreter/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/interpreter", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-investigation-shared/kibana.jsonc b/packages/kbn-investigation-shared/kibana.jsonc index ffc2802ff3af9..5c10ef56f3b0c 100644 --- a/packages/kbn-investigation-shared/kibana.jsonc +++ b/packages/kbn-investigation-shared/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/investigation-shared", - "owner": "@elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-io-ts-utils/kibana.jsonc b/packages/kbn-io-ts-utils/kibana.jsonc index ea3032a472dc6..7bb571ab335e8 100644 --- a/packages/kbn-io-ts-utils/kibana.jsonc +++ b/packages/kbn-io-ts-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/io-ts-utils", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ipynb/kibana.jsonc b/packages/kbn-ipynb/kibana.jsonc index 74aa3e338fb65..1c6b0245c66e6 100644 --- a/packages/kbn-ipynb/kibana.jsonc +++ b/packages/kbn-ipynb/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ipynb", - "owner": "@elastic/search-kibana" -} + "owner": [ + "@elastic/search-kibana" + ], + "group": "search", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-item-buffer/kibana.jsonc b/packages/kbn-item-buffer/kibana.jsonc index 624939e78dbf9..ce47802b7f4bf 100644 --- a/packages/kbn-item-buffer/kibana.jsonc +++ b/packages/kbn-item-buffer/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/item-buffer", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-jest-serializers/kibana.jsonc b/packages/kbn-jest-serializers/kibana.jsonc index b10e323733573..2eafbc3f93cd8 100644 --- a/packages/kbn-jest-serializers/kibana.jsonc +++ b/packages/kbn-jest-serializers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/jest-serializers", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-journeys/kibana.jsonc b/packages/kbn-journeys/kibana.jsonc index 227c4b20cf080..7c9bc16442b61 100644 --- a/packages/kbn-journeys/kibana.jsonc +++ b/packages/kbn-journeys/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "test-helper", "id": "@kbn/journeys", - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-language-documentation/kibana.jsonc b/packages/kbn-language-documentation/kibana.jsonc index 5bd04503e6397..a4b7d35aec964 100644 --- a/packages/kbn-language-documentation/kibana.jsonc +++ b/packages/kbn-language-documentation/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/language-documentation", - "owner": "@elastic/kibana-esql" -} + "owner": [ + "@elastic/kibana-esql" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx b/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx index 8444ae16b644a..55eadf85a09f6 100644 --- a/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx +++ b/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx @@ -1280,11 +1280,11 @@ export const functions = { Performs a match query on the specified field. Returns true if the provided query matches the row. \`\`\` - from books - | where match(author, "Faulkner") - | keep book_no, author - | sort book_no - | limit 5; + FROM books + | WHERE MATCH(author, "Faulkner") + | KEEP book_no, author + | SORT book_no + | LIMIT 5; \`\`\` `, description: @@ -1996,11 +1996,11 @@ export const functions = { Performs a query string query. Returns true if the provided query string matches the row. \`\`\` - from books - | where qstr("author: Faulkner") - | keep book_no, author - | sort book_no - | limit 5; + FROM books + | WHERE QSTR("author: Faulkner") + | KEEP book_no, author + | SORT book_no + | LIMIT 5; \`\`\` `, description: diff --git a/packages/kbn-lens-embeddable-utils/kibana.jsonc b/packages/kbn-lens-embeddable-utils/kibana.jsonc index 6889324eefad3..f3bd7abbc88b9 100644 --- a/packages/kbn-lens-embeddable-utils/kibana.jsonc +++ b/packages/kbn-lens-embeddable-utils/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/lens-embeddable-utils", - "owner": ["@elastic/obs-ux-infra_services-team", "@elastic/kibana-visualizations"] -} + "owner": [ + "@elastic/obs-ux-infra_services-team", + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-lens-formula-docs/kibana.jsonc b/packages/kbn-lens-formula-docs/kibana.jsonc index 11135fcff7d7e..ae66fff0b3b8f 100644 --- a/packages/kbn-lens-formula-docs/kibana.jsonc +++ b/packages/kbn-lens-formula-docs/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/lens-formula-docs", - "owner": ["@elastic/kibana-visualizations"] -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-logging-mocks/kibana.jsonc b/packages/kbn-logging-mocks/kibana.jsonc index 78fdda54a8a9b..962665f7369a9 100644 --- a/packages/kbn-logging-mocks/kibana.jsonc +++ b/packages/kbn-logging-mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/logging-mocks", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-logging/kibana.jsonc b/packages/kbn-logging/kibana.jsonc index 77e12786e908b..314c64b0aa86e 100644 --- a/packages/kbn-logging/kibana.jsonc +++ b/packages/kbn-logging/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/logging", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-managed-content-badge/kibana.jsonc b/packages/kbn-managed-content-badge/kibana.jsonc index e679a5e83d36f..784bff1465afc 100644 --- a/packages/kbn-managed-content-badge/kibana.jsonc +++ b/packages/kbn-managed-content-badge/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/managed-content-badge", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-management/cards_navigation/kibana.jsonc b/packages/kbn-management/cards_navigation/kibana.jsonc index 3c43395c3e055..b5dcdfe3bca5d 100644 --- a/packages/kbn-management/cards_navigation/kibana.jsonc +++ b/packages/kbn-management/cards_navigation/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/management-cards-navigation", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/application/kibana.jsonc b/packages/kbn-management/settings/application/kibana.jsonc index 5ae6bb5132b2e..566c99ddfa4a6 100644 --- a/packages/kbn-management/settings/application/kibana.jsonc +++ b/packages/kbn-management/settings/application/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-application", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_category/kibana.jsonc b/packages/kbn-management/settings/components/field_category/kibana.jsonc index 7161a8c75f49e..734757a519876 100644 --- a/packages/kbn-management/settings/components/field_category/kibana.jsonc +++ b/packages/kbn-management/settings/components/field_category/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-components-field-category", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_input/kibana.jsonc b/packages/kbn-management/settings/components/field_input/kibana.jsonc index ce990d2955950..95f3fc2fc75a2 100644 --- a/packages/kbn-management/settings/components/field_input/kibana.jsonc +++ b/packages/kbn-management/settings/components/field_input/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-components-field-input", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/field_row/kibana.jsonc b/packages/kbn-management/settings/components/field_row/kibana.jsonc index e39c157f53252..7a0da59a74af4 100644 --- a/packages/kbn-management/settings/components/field_row/kibana.jsonc +++ b/packages/kbn-management/settings/components/field_row/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-components-field-row", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/components/form/kibana.jsonc b/packages/kbn-management/settings/components/form/kibana.jsonc index 58daacd2622a4..5297d8a292ee9 100644 --- a/packages/kbn-management/settings/components/form/kibana.jsonc +++ b/packages/kbn-management/settings/components/form/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-components-form", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/field_definition/kibana.jsonc b/packages/kbn-management/settings/field_definition/kibana.jsonc index 23459871d7882..f56c69ad47661 100644 --- a/packages/kbn-management/settings/field_definition/kibana.jsonc +++ b/packages/kbn-management/settings/field_definition/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-field-definition", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/section_registry/kibana.jsonc b/packages/kbn-management/settings/section_registry/kibana.jsonc index 53a9aea666df3..2c367093133ad 100644 --- a/packages/kbn-management/settings/section_registry/kibana.jsonc +++ b/packages/kbn-management/settings/section_registry/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-browser", "id": "@kbn/management-settings-section-registry", - "owner": "@elastic/appex-sharedux @elastic/kibana-management" -} + "owner": [ + "@elastic/appex-sharedux", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/setting_ids/kibana.jsonc b/packages/kbn-management/settings/setting_ids/kibana.jsonc index 62b1f89566d58..e47caf903a14a 100644 --- a/packages/kbn-management/settings/setting_ids/kibana.jsonc +++ b/packages/kbn-management/settings/setting_ids/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/management-settings-ids", - "owner": "@elastic/appex-sharedux @elastic/kibana-management" -} + "owner": [ + "@elastic/appex-sharedux", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/types/kibana.jsonc b/packages/kbn-management/settings/types/kibana.jsonc index 54a3836a48380..994e4ba3bbeed 100644 --- a/packages/kbn-management/settings/types/kibana.jsonc +++ b/packages/kbn-management/settings/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-types", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-management/settings/utilities/kibana.jsonc b/packages/kbn-management/settings/utilities/kibana.jsonc index a32f319da8f66..cecf1ee6537d4 100644 --- a/packages/kbn-management/settings/utilities/kibana.jsonc +++ b/packages/kbn-management/settings/utilities/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/management-settings-utilities", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-manifest/kibana.jsonc b/packages/kbn-manifest/kibana.jsonc index 27f2d95e65501..b6ce7ae0c2862 100644 --- a/packages/kbn-manifest/kibana.jsonc +++ b/packages/kbn-manifest/kibana.jsonc @@ -1,5 +1,6 @@ { "type": "shared-server", "id": "@kbn/manifest", - "owner": "@elastic/kibana-core" + "owner": "@elastic/kibana-core", + "devOnly": true } diff --git a/packages/kbn-mapbox-gl/kibana.jsonc b/packages/kbn-mapbox-gl/kibana.jsonc index 6cc7e1f7b2b30..c0174f25e37e8 100644 --- a/packages/kbn-mapbox-gl/kibana.jsonc +++ b/packages/kbn-mapbox-gl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/mapbox-gl", - "owner": "@elastic/kibana-presentation" -} + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-mock-idp-utils/kibana.jsonc b/packages/kbn-mock-idp-utils/kibana.jsonc index 443dd39d1e6d6..e88f8a1fa4bb9 100644 --- a/packages/kbn-mock-idp-utils/kibana.jsonc +++ b/packages/kbn-mock-idp-utils/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/mock-idp-utils", - "owner": "@elastic/kibana-security", - "devOnly": true, + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private", + "devOnly": true } \ No newline at end of file diff --git a/packages/kbn-monaco/kibana.jsonc b/packages/kbn-monaco/kibana.jsonc index 32e962e27ca3b..1f04833d036b8 100644 --- a/packages/kbn-monaco/kibana.jsonc +++ b/packages/kbn-monaco/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/monaco", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-object-versioning-utils/kibana.jsonc b/packages/kbn-object-versioning-utils/kibana.jsonc index deba859afd364..b80f4dc13beca 100644 --- a/packages/kbn-object-versioning-utils/kibana.jsonc +++ b/packages/kbn-object-versioning-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/object-versioning-utils", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-object-versioning/kibana.jsonc b/packages/kbn-object-versioning/kibana.jsonc index 00f87ac804f47..5d20eefe37bd8 100644 --- a/packages/kbn-object-versioning/kibana.jsonc +++ b/packages/kbn-object-versioning/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/object-versioning", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-openapi-common/kibana.jsonc b/packages/kbn-openapi-common/kibana.jsonc index 4254feb1b8a73..1c8f5a009dfca 100644 --- a/packages/kbn-openapi-common/kibana.jsonc +++ b/packages/kbn-openapi-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/openapi-common", - "owner": "@elastic/security-detection-rule-management" -} + "owner": [ + "@elastic/security-detection-rule-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-optimizer-webpack-helpers/kibana.jsonc b/packages/kbn-optimizer-webpack-helpers/kibana.jsonc index 1fa8375008f26..f4f1607d7b9ec 100644 --- a/packages/kbn-optimizer-webpack-helpers/kibana.jsonc +++ b/packages/kbn-optimizer-webpack-helpers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/optimizer-webpack-helpers", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index e1e9b6aa81898..c7189dc1598d2 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -143,6 +143,7 @@ pageLoadAssetSize: searchHomepage: 19831 searchIndices: 20519 searchInferenceEndpoints: 20470 + searchNavigation: 19233 searchNotebooks: 18942 searchPlayground: 19325 searchprofiler: 67080 diff --git a/packages/kbn-osquery-io-ts-types/kibana.jsonc b/packages/kbn-osquery-io-ts-types/kibana.jsonc index d989501855da2..261ffcf60a1d9 100644 --- a/packages/kbn-osquery-io-ts-types/kibana.jsonc +++ b/packages/kbn-osquery-io-ts-types/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/osquery-io-ts-types", - "owner": "@elastic/security-asset-management" + "owner": "@elastic/security-asset-management", + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-panel-loader/kibana.jsonc b/packages/kbn-panel-loader/kibana.jsonc index 5fc518a8983ca..381e86db160af 100644 --- a/packages/kbn-panel-loader/kibana.jsonc +++ b/packages/kbn-panel-loader/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/panel-loader", - "owner": "@elastic/kibana-presentation" -} + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-peggy/kibana.jsonc b/packages/kbn-peggy/kibana.jsonc index a1cdcc8f802aa..f3a821456e4a1 100644 --- a/packages/kbn-peggy/kibana.jsonc +++ b/packages/kbn-peggy/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/peggy", - "owner": "@elastic/kibana-operations", + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-profiling-utils/kibana.jsonc b/packages/kbn-profiling-utils/kibana.jsonc index d41a4db71299d..36840c5274ca9 100644 --- a/packages/kbn-profiling-utils/kibana.jsonc +++ b/packages/kbn-profiling-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/profiling-utils", - "owner": "@elastic/obs-ux-infra_services-team" -} + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-react-field/kibana.jsonc b/packages/kbn-react-field/kibana.jsonc index 5b65d59d4dbbd..7a8158adf1401 100644 --- a/packages/kbn-react-field/kibana.jsonc +++ b/packages/kbn-react-field/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-field", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-react-hooks/kibana.jsonc b/packages/kbn-react-hooks/kibana.jsonc index d968b4340b356..3c5d2e78d0ed6 100644 --- a/packages/kbn-react-hooks/kibana.jsonc +++ b/packages/kbn-react-hooks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-hooks", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-recently-accessed/kibana.jsonc b/packages/kbn-recently-accessed/kibana.jsonc index 0ec9917dc6b77..48b007b3e99be 100644 --- a/packages/kbn-recently-accessed/kibana.jsonc +++ b/packages/kbn-recently-accessed/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/recently-accessed", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-repo-info/kibana.jsonc b/packages/kbn-repo-info/kibana.jsonc index ab12583890dfd..bf7f4bc9bacc1 100644 --- a/packages/kbn-repo-info/kibana.jsonc +++ b/packages/kbn-repo-info/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/repo-info", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-repo-packages/kibana.jsonc b/packages/kbn-repo-packages/kibana.jsonc index 868735cc2c1a3..2bb82ef6495cd 100644 --- a/packages/kbn-repo-packages/kibana.jsonc +++ b/packages/kbn-repo-packages/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/repo-packages", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-repo-path/kibana.jsonc b/packages/kbn-repo-path/kibana.jsonc index 2c0bc6368ff67..b32e21e3fdd6a 100644 --- a/packages/kbn-repo-path/kibana.jsonc +++ b/packages/kbn-repo-path/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/repo-path", - "owner": "@elastic/kibana-operations", + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/packages/kbn-repo-source-classifier/index.ts b/packages/kbn-repo-source-classifier/index.ts index f82499bfd6405..8a9d652466012 100644 --- a/packages/kbn-repo-source-classifier/index.ts +++ b/packages/kbn-repo-source-classifier/index.ts @@ -7,5 +7,6 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +export type { ModuleId } from './src/module_id'; export type { ModuleType } from './src/module_type'; export { RepoSourceClassifier } from './src/repo_source_classifier'; diff --git a/packages/kbn-reporting/common/kibana.jsonc b/packages/kbn-reporting/common/kibana.jsonc index 9b03854836915..198147ed5a90f 100644 --- a/packages/kbn-reporting/common/kibana.jsonc +++ b/packages/kbn-reporting/common/kibana.jsonc @@ -2,4 +2,6 @@ "type": "shared-common", "id": "@kbn/reporting-common", "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-reporting/export_types/csv/kibana.jsonc b/packages/kbn-reporting/export_types/csv/kibana.jsonc index e638d40ede567..417605c641a1d 100644 --- a/packages/kbn-reporting/export_types/csv/kibana.jsonc +++ b/packages/kbn-reporting/export_types/csv/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-server", - "id": "@kbn/reporting-export-types-csv", - "owner": "@elastic/appex-sharedux" - } \ No newline at end of file + "type": "shared-server", + "id": "@kbn/reporting-export-types-csv", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-reporting/export_types/csv_common/kibana.jsonc b/packages/kbn-reporting/export_types/csv_common/kibana.jsonc index 10e347c55ab5e..a12125b4da075 100644 --- a/packages/kbn-reporting/export_types/csv_common/kibana.jsonc +++ b/packages/kbn-reporting/export_types/csv_common/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/reporting-export-types-csv-common", - "owner": "@elastic/appex-sharedux" + "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-reporting/export_types/pdf/kibana.jsonc b/packages/kbn-reporting/export_types/pdf/kibana.jsonc index 1cc83f4395e21..716c3bbb84737 100644 --- a/packages/kbn-reporting/export_types/pdf/kibana.jsonc +++ b/packages/kbn-reporting/export_types/pdf/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-server", - "id": "@kbn/reporting-export-types-pdf", - "owner": "@elastic/appex-sharedux" - } \ No newline at end of file + "type": "shared-server", + "id": "@kbn/reporting-export-types-pdf", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-reporting/export_types/pdf_common/kibana.jsonc b/packages/kbn-reporting/export_types/pdf_common/kibana.jsonc index a9aecce082861..1785e8f062eb0 100644 --- a/packages/kbn-reporting/export_types/pdf_common/kibana.jsonc +++ b/packages/kbn-reporting/export_types/pdf_common/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/reporting-export-types-pdf-common", - "owner": "@elastic/appex-sharedux" + "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-reporting/export_types/png/kibana.jsonc b/packages/kbn-reporting/export_types/png/kibana.jsonc index b8923806260fb..db64ceb40fb9d 100644 --- a/packages/kbn-reporting/export_types/png/kibana.jsonc +++ b/packages/kbn-reporting/export_types/png/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-server", - "id": "@kbn/reporting-export-types-png", - "owner": "@elastic/appex-sharedux" - } \ No newline at end of file + "type": "shared-server", + "id": "@kbn/reporting-export-types-png", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-reporting/export_types/png_common/kibana.jsonc b/packages/kbn-reporting/export_types/png_common/kibana.jsonc index 0c0b7259864ce..8b041ebc1bae9 100644 --- a/packages/kbn-reporting/export_types/png_common/kibana.jsonc +++ b/packages/kbn-reporting/export_types/png_common/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/reporting-export-types-png-common", - "owner": "@elastic/appex-sharedux" + "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-reporting/get_csv_panel_actions/kibana.jsonc b/packages/kbn-reporting/get_csv_panel_actions/kibana.jsonc index a37c3dbc2d61b..1548edc6488d5 100644 --- a/packages/kbn-reporting/get_csv_panel_actions/kibana.jsonc +++ b/packages/kbn-reporting/get_csv_panel_actions/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/reporting-csv-share-panel", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-reporting/mocks_server/kibana.jsonc b/packages/kbn-reporting/mocks_server/kibana.jsonc index e9c9707b67a2a..ce43a094b6990 100644 --- a/packages/kbn-reporting/mocks_server/kibana.jsonc +++ b/packages/kbn-reporting/mocks_server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/reporting-mocks-server", - "owner": "@elastic/appex-sharedux" + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" } diff --git a/packages/kbn-reporting/public/kibana.jsonc b/packages/kbn-reporting/public/kibana.jsonc index c813e18f70e8e..16b3330e2fb23 100644 --- a/packages/kbn-reporting/public/kibana.jsonc +++ b/packages/kbn-reporting/public/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/reporting-public", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-reporting/server/export_type.ts b/packages/kbn-reporting/server/export_type.ts index 2ddd69b826b60..32be67ddad3fc 100644 --- a/packages/kbn-reporting/server/export_type.ts +++ b/packages/kbn-reporting/server/export_type.ts @@ -8,7 +8,6 @@ */ import type { IClusterClient } from '@kbn/core-elasticsearch-server'; -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; import type { FakeRawRequest, Headers, @@ -28,6 +27,7 @@ import type { ScreenshottingStart } from '@kbn/screenshotting-plugin/server'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import type { SpacesPluginSetup } from '@kbn/spaces-plugin/server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import type { CreateJobFn, RunTaskFn } from './types'; import type { ReportingConfigType } from '.'; @@ -126,7 +126,7 @@ export abstract class ExportType< headers, path: '/', }; - const fakeRequest = CoreKibanaRequest.from(rawRequest); + const fakeRequest = kibanaRequestFactory(rawRequest); const spacesService = this.setupDeps.spaces?.spacesService; if (spacesService) { diff --git a/packages/kbn-reporting/server/kibana.jsonc b/packages/kbn-reporting/server/kibana.jsonc index a2440596bd9dd..e4c95256bc2f5 100644 --- a/packages/kbn-reporting/server/kibana.jsonc +++ b/packages/kbn-reporting/server/kibana.jsonc @@ -2,9 +2,10 @@ "type": "shared-server", "id": "@kbn/reporting-server", "owner": "@elastic/appex-sharedux", + "group": "platform", + "visibility": "private", "plugin": { "server": true, "browser": false, } } - diff --git a/packages/kbn-reporting/server/tsconfig.json b/packages/kbn-reporting/server/tsconfig.json index 7981ce1c3f995..94b082afdc2ee 100644 --- a/packages/kbn-reporting/server/tsconfig.json +++ b/packages/kbn-reporting/server/tsconfig.json @@ -31,8 +31,8 @@ "@kbn/licensing-plugin", "@kbn/spaces-plugin", "@kbn/core-elasticsearch-server", - "@kbn/core-http-router-server-internal", "@kbn/core-http-request-handler-context-server", "@kbn/config-schema", + "@kbn/core-http-server-utils", ] } diff --git a/packages/kbn-resizable-layout/kibana.jsonc b/packages/kbn-resizable-layout/kibana.jsonc index abc49ac47ffbf..e02d6599bba9c 100644 --- a/packages/kbn-resizable-layout/kibana.jsonc +++ b/packages/kbn-resizable-layout/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/resizable-layout", - "description": "A component for creating resizable layouts containing a fixed width panel and a flexible panel, with support for horizontal and vertical layouts.", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", + "description": "A component for creating resizable layouts containing a fixed width panel and a flexible panel, with support for horizontal and vertical layouts." +} \ No newline at end of file diff --git a/packages/kbn-rison/kibana.jsonc b/packages/kbn-rison/kibana.jsonc index c0e6145d04a7d..0962a3a02987f 100644 --- a/packages/kbn-rison/kibana.jsonc +++ b/packages/kbn-rison/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/rison", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-router-to-openapispec/kibana.jsonc b/packages/kbn-router-to-openapispec/kibana.jsonc index a14f443ce27ec..800f12d331590 100644 --- a/packages/kbn-router-to-openapispec/kibana.jsonc +++ b/packages/kbn-router-to-openapispec/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/router-to-openapispec", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-router-utils/kibana.jsonc b/packages/kbn-router-utils/kibana.jsonc index c255dacb11c70..18b5c54a9c786 100644 --- a/packages/kbn-router-utils/kibana.jsonc +++ b/packages/kbn-router-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/router-utils", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-rrule/kibana.jsonc b/packages/kbn-rrule/kibana.jsonc index 08878a6cfb1e9..5b5374ff6a1ab 100644 --- a/packages/kbn-rrule/kibana.jsonc +++ b/packages/kbn-rrule/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/rrule", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-rule-data-utils/kibana.jsonc b/packages/kbn-rule-data-utils/kibana.jsonc index 4d9d77fbeeb72..733ffbdfa67f3 100644 --- a/packages/kbn-rule-data-utils/kibana.jsonc +++ b/packages/kbn-rule-data-utils/kibana.jsonc @@ -5,5 +5,7 @@ "@elastic/security-detections-response", "@elastic/response-ops", "@elastic/obs-ux-management-team" - ] -} + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-safer-lodash-set/kibana.jsonc b/packages/kbn-safer-lodash-set/kibana.jsonc index d01d41b9a6219..5f4ad3f4395da 100644 --- a/packages/kbn-safer-lodash-set/kibana.jsonc +++ b/packages/kbn-safer-lodash-set/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/safer-lodash-set", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-saved-objects-settings/kibana.jsonc b/packages/kbn-saved-objects-settings/kibana.jsonc index 40486e1ef0cf1..c03224f017a21 100644 --- a/packages/kbn-saved-objects-settings/kibana.jsonc +++ b/packages/kbn-saved-objects-settings/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/saved-objects-settings", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-screenshotting-server/kibana.jsonc b/packages/kbn-screenshotting-server/kibana.jsonc index 1f2aa1c0f5794..a71e7b15d2b8a 100644 --- a/packages/kbn-screenshotting-server/kibana.jsonc +++ b/packages/kbn-screenshotting-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/screenshotting-server", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-search-api-keys-components/kibana.jsonc b/packages/kbn-search-api-keys-components/kibana.jsonc index bedd4c213760f..54160e8576569 100644 --- a/packages/kbn-search-api-keys-components/kibana.jsonc +++ b/packages/kbn-search-api-keys-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/search-api-keys-components", - "owner": "@elastic/search-kibana" + "owner": [ + "@elastic/search-kibana" + ], + "group": "search", + "visibility": "private" } \ No newline at end of file diff --git a/packages/kbn-search-api-keys-server/kibana.jsonc b/packages/kbn-search-api-keys-server/kibana.jsonc index 52c6cd9653968..5102ebdeda7f4 100644 --- a/packages/kbn-search-api-keys-server/kibana.jsonc +++ b/packages/kbn-search-api-keys-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/search-api-keys-server", - "owner": "@elastic/search-kibana" + "owner": [ + "@elastic/search-kibana" + ], + "group": "search", + "visibility": "private" } \ No newline at end of file diff --git a/packages/kbn-search-api-panels/kibana.jsonc b/packages/kbn-search-api-panels/kibana.jsonc index 3e346c91d5554..98b03521b6248 100644 --- a/packages/kbn-search-api-panels/kibana.jsonc +++ b/packages/kbn-search-api-panels/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/search-api-panels", - "owner": "@elastic/search-kibana" + "owner": [ + "@elastic/search-kibana" + ], + // FIXME? @kbn/index-management-plugin depends on it + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-search-connectors/kibana.jsonc b/packages/kbn-search-connectors/kibana.jsonc index d5254ac9b68c7..d784b6c15c679 100644 --- a/packages/kbn-search-connectors/kibana.jsonc +++ b/packages/kbn-search-connectors/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/search-connectors", - "owner": "@elastic/search-kibana" + "owner": [ + "@elastic/search-kibana" + ], + // FIXME? search-connectors-plugin depends on it + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-search-errors/kibana.jsonc b/packages/kbn-search-errors/kibana.jsonc index 9d4e7e2472b9d..208da0ca92221 100644 --- a/packages/kbn-search-errors/kibana.jsonc +++ b/packages/kbn-search-errors/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/search-errors", - "owner": "@elastic/kibana-data-discovery" + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-search-index-documents/kibana.jsonc b/packages/kbn-search-index-documents/kibana.jsonc index a0a69aff312c3..f28c08c525775 100644 --- a/packages/kbn-search-index-documents/kibana.jsonc +++ b/packages/kbn-search-index-documents/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/search-index-documents", - "owner": "@elastic/search-kibana" + "owner": "@elastic/search-kibana", + "group": "search", + "visibility": "private" } diff --git a/packages/kbn-search-response-warnings/kibana.jsonc b/packages/kbn-search-response-warnings/kibana.jsonc index 5c8127c27319e..530a97c7e3bba 100644 --- a/packages/kbn-search-response-warnings/kibana.jsonc +++ b/packages/kbn-search-response-warnings/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/search-response-warnings", - "owner": "@elastic/kibana-data-discovery" + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-search-types/kibana.jsonc b/packages/kbn-search-types/kibana.jsonc index 2f61b7444a0d8..f2b5a43ad63fa 100644 --- a/packages/kbn-search-types/kibana.jsonc +++ b/packages/kbn-search-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/search-types", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-security-hardening/kibana.jsonc b/packages/kbn-security-hardening/kibana.jsonc index 42b778b24fcc6..b434a95e70985 100644 --- a/packages/kbn-security-hardening/kibana.jsonc +++ b/packages/kbn-security-hardening/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-hardening", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-autocomplete/kibana.jsonc b/packages/kbn-securitysolution-autocomplete/kibana.jsonc index 0446d8bc04ed2..42e6564593c84 100644 --- a/packages/kbn-securitysolution-autocomplete/kibana.jsonc +++ b/packages/kbn-securitysolution-autocomplete/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-autocomplete", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-ecs/kibana.jsonc b/packages/kbn-securitysolution-ecs/kibana.jsonc index f288e4b2951ce..8a5b40f54fcb1 100644 --- a/packages/kbn-securitysolution-ecs/kibana.jsonc +++ b/packages/kbn-securitysolution-ecs/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-ecs", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-endpoint-exceptions-common/kibana.jsonc b/packages/kbn-securitysolution-endpoint-exceptions-common/kibana.jsonc index 76a63cc5ac561..3351c559d0823 100644 --- a/packages/kbn-securitysolution-endpoint-exceptions-common/kibana.jsonc +++ b/packages/kbn-securitysolution-endpoint-exceptions-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-endpoint-exceptions-common", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-es-utils/kibana.jsonc b/packages/kbn-securitysolution-es-utils/kibana.jsonc index 6cc0af9e25de4..c7befc64d8881 100644 --- a/packages/kbn-securitysolution-es-utils/kibana.jsonc +++ b/packages/kbn-securitysolution-es-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-es-utils", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-exception-list-components/kibana.jsonc b/packages/kbn-securitysolution-exception-list-components/kibana.jsonc index 9d280a7c5098f..e616d5d8d9419 100644 --- a/packages/kbn-securitysolution-exception-list-components/kibana.jsonc +++ b/packages/kbn-securitysolution-exception-list-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-exception-list-components", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-exceptions-common/kibana.jsonc b/packages/kbn-securitysolution-exceptions-common/kibana.jsonc index ff47bd8f5a585..4ca98e71a9256 100644 --- a/packages/kbn-securitysolution-exceptions-common/kibana.jsonc +++ b/packages/kbn-securitysolution-exceptions-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-exceptions-common", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-hook-utils/kibana.jsonc b/packages/kbn-securitysolution-hook-utils/kibana.jsonc index abea333eaf081..e05c4329e8c36 100644 --- a/packages/kbn-securitysolution-hook-utils/kibana.jsonc +++ b/packages/kbn-securitysolution-hook-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-hook-utils", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/kibana.jsonc b/packages/kbn-securitysolution-io-ts-alerting-types/kibana.jsonc index 6749cb99ac474..813f13d89ff99 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/kibana.jsonc +++ b/packages/kbn-securitysolution-io-ts-alerting-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-io-ts-alerting-types", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-io-ts-list-types/kibana.jsonc b/packages/kbn-securitysolution-io-ts-list-types/kibana.jsonc index ce40047794dfa..7c835b05d02e2 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/kibana.jsonc +++ b/packages/kbn-securitysolution-io-ts-list-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-io-ts-list-types", - "owner": "@elastic/security-detection-engine" + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" } diff --git a/packages/kbn-securitysolution-io-ts-types/kibana.jsonc b/packages/kbn-securitysolution-io-ts-types/kibana.jsonc index c099c55f08a01..0eff2e1ce9023 100644 --- a/packages/kbn-securitysolution-io-ts-types/kibana.jsonc +++ b/packages/kbn-securitysolution-io-ts-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-io-ts-types", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-io-ts-utils/kibana.jsonc b/packages/kbn-securitysolution-io-ts-utils/kibana.jsonc index 3628e51de2c95..f0b84ddb6c7e7 100644 --- a/packages/kbn-securitysolution-io-ts-utils/kibana.jsonc +++ b/packages/kbn-securitysolution-io-ts-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-io-ts-utils", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-list-api/kibana.jsonc b/packages/kbn-securitysolution-list-api/kibana.jsonc index 70a32bbf8c318..e3408f02a5aba 100644 --- a/packages/kbn-securitysolution-list-api/kibana.jsonc +++ b/packages/kbn-securitysolution-list-api/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-list-api", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-list-constants/kibana.jsonc b/packages/kbn-securitysolution-list-constants/kibana.jsonc index 9185bef63b5c6..38cc48cd87107 100644 --- a/packages/kbn-securitysolution-list-constants/kibana.jsonc +++ b/packages/kbn-securitysolution-list-constants/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-list-constants", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-list-hooks/kibana.jsonc b/packages/kbn-securitysolution-list-hooks/kibana.jsonc index f0d26c1e126e6..fc5331b309606 100644 --- a/packages/kbn-securitysolution-list-hooks/kibana.jsonc +++ b/packages/kbn-securitysolution-list-hooks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-list-hooks", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-list-utils/kibana.jsonc b/packages/kbn-securitysolution-list-utils/kibana.jsonc index ee3b8f0e45100..bbf6b24499695 100644 --- a/packages/kbn-securitysolution-list-utils/kibana.jsonc +++ b/packages/kbn-securitysolution-list-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-list-utils", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-lists-common/kibana.jsonc b/packages/kbn-securitysolution-lists-common/kibana.jsonc index 614314f10e8b4..4e00ce7b91d93 100644 --- a/packages/kbn-securitysolution-lists-common/kibana.jsonc +++ b/packages/kbn-securitysolution-lists-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-lists-common", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-rules/kibana.jsonc b/packages/kbn-securitysolution-rules/kibana.jsonc index 1bb40e4eada67..1c4bb22857b50 100644 --- a/packages/kbn-securitysolution-rules/kibana.jsonc +++ b/packages/kbn-securitysolution-rules/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-rules", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-t-grid/kibana.jsonc b/packages/kbn-securitysolution-t-grid/kibana.jsonc index 4e08fb6804664..81f74a1116e11 100644 --- a/packages/kbn-securitysolution-t-grid/kibana.jsonc +++ b/packages/kbn-securitysolution-t-grid/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-t-grid", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-securitysolution-utils/index.ts b/packages/kbn-securitysolution-utils/index.ts index d29b356f31783..8769a281e2201 100644 --- a/packages/kbn-securitysolution-utils/index.ts +++ b/packages/kbn-securitysolution-utils/index.ts @@ -12,3 +12,4 @@ export * from './src/axios'; export * from './src/transform_data_to_ndjson'; export * from './src/path_validations'; export * from './src/esql'; +export * from './src/debounce_async/debounce_async'; diff --git a/packages/kbn-securitysolution-utils/kibana.jsonc b/packages/kbn-securitysolution-utils/kibana.jsonc index 53dec9673e495..5e6ccf9096ea3 100644 --- a/packages/kbn-securitysolution-utils/kibana.jsonc +++ b/packages/kbn-securitysolution-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-utils", - "owner": "@elastic/security-detection-engine" -} + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.test.ts b/packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.test.ts similarity index 64% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.test.ts rename to packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.test.ts index 6c5cadf41a7a6..d7e1201e44e8d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.test.ts +++ b/packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.test.ts @@ -1,22 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". */ -import { debounceAsync } from './validators'; +import { debounceAsync } from './debounce_async'; jest.useFakeTimers({ legacyFakeTimers: true }); describe('debounceAsync', () => { - let fn: jest.Mock; - - beforeEach(() => { - fn = jest.fn().mockResolvedValueOnce('first'); - }); - it('resolves with the underlying invocation result', async () => { + const fn = jest.fn().mockResolvedValueOnce('first'); + const debounced = debounceAsync(fn, 0); const promise = debounced(); jest.runOnlyPendingTimers(); @@ -25,6 +23,8 @@ describe('debounceAsync', () => { }); it('resolves intermediate calls when the next invocation resolves', async () => { + const fn = jest.fn().mockResolvedValueOnce('first'); + const debounced = debounceAsync(fn, 200); fn.mockResolvedValueOnce('second'); @@ -39,6 +39,8 @@ describe('debounceAsync', () => { }); it('debounces the function', async () => { + const fn = jest.fn().mockResolvedValueOnce('first'); + const debounced = debounceAsync(fn, 200); debounced(); diff --git a/packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.ts b/packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.ts new file mode 100644 index 0000000000000..99fe653b0e21e --- /dev/null +++ b/packages/kbn-securitysolution-utils/src/debounce_async/debounce_async.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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +/** + * Unlike lodash's debounce, which resolves intermediate calls with the most + * recent value, this implementation waits to resolve intermediate calls until + * the next invocation resolves. + * + * @param fn an async function + * + * @returns A debounced async function that resolves on the next invocation + */ +export function debounceAsync( + fn: (...args: Args) => Result, + intervalMs: number +): (...args: Args) => Promise> { + let timeoutId: ReturnType | undefined; + let resolve: (value: Awaited) => void; + let promise = new Promise>((_resolve) => { + resolve = _resolve; + }); + + return (...args) => { + if (timeoutId) { + clearTimeout(timeoutId); + } + + timeoutId = setTimeout(async () => { + resolve(await fn(...args)); + promise = new Promise((_resolve) => { + resolve = _resolve; + }); + }, intervalMs); + + return promise; + }; +} diff --git a/packages/kbn-server-http-tools/kibana.jsonc b/packages/kbn-server-http-tools/kibana.jsonc index f540a5be09123..30c15aa7f7324 100644 --- a/packages/kbn-server-http-tools/kibana.jsonc +++ b/packages/kbn-server-http-tools/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/server-http-tools", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-server-route-repository-client/kibana.jsonc b/packages/kbn-server-route-repository-client/kibana.jsonc index 5a3974d7ab3ca..cdb59a56ca04f 100644 --- a/packages/kbn-server-route-repository-client/kibana.jsonc +++ b/packages/kbn-server-route-repository-client/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/server-route-repository-client", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-server-route-repository-utils/kibana.jsonc b/packages/kbn-server-route-repository-utils/kibana.jsonc index 3a7e69d98a060..d536b152126f0 100644 --- a/packages/kbn-server-route-repository-utils/kibana.jsonc +++ b/packages/kbn-server-route-repository-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/server-route-repository-utils", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-server-route-repository/kibana.jsonc b/packages/kbn-server-route-repository/kibana.jsonc index 5137b5593cfd5..22da9d601081a 100644 --- a/packages/kbn-server-route-repository/kibana.jsonc +++ b/packages/kbn-server-route-repository/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/server-route-repository", - "owner": ["@elastic/obs-knowledge-team"] -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-shared-svg/kibana.jsonc b/packages/kbn-shared-svg/kibana.jsonc index 89949f5b7d276..709dce31f58ae 100644 --- a/packages/kbn-shared-svg/kibana.jsonc +++ b/packages/kbn-shared-svg/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/shared-svg", - "owner": "@elastic/obs-ux-infra_services-team" + "owner": "@elastic/obs-ux-infra_services-team", + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-shared-ux-utility/kibana.jsonc b/packages/kbn-shared-ux-utility/kibana.jsonc index 23205fc09e20c..8fc1bc88c27fa 100644 --- a/packages/kbn-shared-ux-utility/kibana.jsonc +++ b/packages/kbn-shared-ux-utility/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-utility", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-some-dev-log/kibana.jsonc b/packages/kbn-some-dev-log/kibana.jsonc index d83704903bdfb..3163f7a887c5d 100644 --- a/packages/kbn-some-dev-log/kibana.jsonc +++ b/packages/kbn-some-dev-log/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/some-dev-log", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-sort-predicates/kibana.jsonc b/packages/kbn-sort-predicates/kibana.jsonc index c07088597a01e..2f25996de7482 100644 --- a/packages/kbn-sort-predicates/kibana.jsonc +++ b/packages/kbn-sort-predicates/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/sort-predicates", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-sse-utils-client/kibana.jsonc b/packages/kbn-sse-utils-client/kibana.jsonc index eda99336320f3..60f2a2dc02527 100644 --- a/packages/kbn-sse-utils-client/kibana.jsonc +++ b/packages/kbn-sse-utils-client/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/sse-utils-client", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-sse-utils-server/kibana.jsonc b/packages/kbn-sse-utils-server/kibana.jsonc index 9e06e575b7989..8c533af1953e9 100644 --- a/packages/kbn-sse-utils-server/kibana.jsonc +++ b/packages/kbn-sse-utils-server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/sse-utils-server", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-sse-utils/kibana.jsonc b/packages/kbn-sse-utils/kibana.jsonc index 3bd583763b4d8..fa3beec29fe86 100644 --- a/packages/kbn-sse-utils/kibana.jsonc +++ b/packages/kbn-sse-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/sse-utils", - "owner": "@elastic/obs-knowledge-team" -} + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-std/kibana.jsonc b/packages/kbn-std/kibana.jsonc index 062ba5970f539..4b42cb289bf64 100644 --- a/packages/kbn-std/kibana.jsonc +++ b/packages/kbn-std/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/std", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-stdio-dev-helpers/kibana.jsonc b/packages/kbn-stdio-dev-helpers/kibana.jsonc index 4cb58f510906c..b7181e0f30675 100644 --- a/packages/kbn-stdio-dev-helpers/kibana.jsonc +++ b/packages/kbn-stdio-dev-helpers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/stdio-dev-helpers", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-storybook/kibana.jsonc b/packages/kbn-storybook/kibana.jsonc index 4faf58c309267..c1db579312fcb 100644 --- a/packages/kbn-storybook/kibana.jsonc +++ b/packages/kbn-storybook/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/storybook", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-telemetry-tools/kibana.jsonc b/packages/kbn-telemetry-tools/kibana.jsonc index cf1d0def824e4..d1168b66d69f6 100644 --- a/packages/kbn-telemetry-tools/kibana.jsonc +++ b/packages/kbn-telemetry-tools/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-server", "id": "@kbn/telemetry-tools", - "devOnly": true, - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-test-eui-helpers/kibana.jsonc b/packages/kbn-test-eui-helpers/kibana.jsonc index fc97c720f827d..029240a418615 100644 --- a/packages/kbn-test-eui-helpers/kibana.jsonc +++ b/packages/kbn-test-eui-helpers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/test-eui-helpers", - "devOnly": true, - "owner": ["@elastic/kibana-visualizations"], -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-test-jest-helpers/kibana.jsonc b/packages/kbn-test-jest-helpers/kibana.jsonc index fdabbb9780d6c..5f98c5273338d 100644 --- a/packages/kbn-test-jest-helpers/kibana.jsonc +++ b/packages/kbn-test-jest-helpers/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/test-jest-helpers", - "devOnly": true, - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], -} + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-test-subj-selector/kibana.jsonc b/packages/kbn-test-subj-selector/kibana.jsonc index 8026708a83e3b..b88ad46dd17c1 100644 --- a/packages/kbn-test-subj-selector/kibana.jsonc +++ b/packages/kbn-test-subj-selector/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/test-subj-selector", - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", "devOnly": true } diff --git a/packages/kbn-test/kibana.jsonc b/packages/kbn-test/kibana.jsonc index c39f82b52a113..c99b14a03bfa0 100644 --- a/packages/kbn-test/kibana.jsonc +++ b/packages/kbn-test/kibana.jsonc @@ -1,6 +1,11 @@ { "type": "shared-common", "id": "@kbn/test", - "devOnly": true, - "owner": ["@elastic/kibana-operations", "@elastic/appex-qa"], -} + "owner": [ + "@elastic/kibana-operations", + "@elastic/appex-qa" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-test/src/functional_test_runner/lib/mocha/load_tests.ts b/packages/kbn-test/src/functional_test_runner/lib/mocha/load_tests.ts index c84d78fe1d20a..2303704ea43fa 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/mocha/load_tests.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/mocha/load_tests.ts @@ -57,7 +57,11 @@ export const loadTests = ({ updateBaselines, }; - decorateSnapshotUi({ lifecycle, updateSnapshots, isCi: !!process.env.CI }); + decorateSnapshotUi({ + lifecycle, + updateSnapshots, + isCi: !!process.env.CI, + }); function loadTestFile(path: string) { if (typeof path !== 'string' || !isAbsolute(path)) { diff --git a/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.ts b/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.ts index 78e2b8d7e680c..3d00eae7f22ff 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.ts @@ -33,11 +33,13 @@ const globalState: { registered: boolean; currentTest: Test | null; snapshotStates: Record; + deploymentAgnostic: boolean; } = { updateSnapshot: 'none', registered: false, currentTest: null, snapshotStates: {}, + deploymentAgnostic: false, }; const modifyStackTracePrepareOnce = once(() => { @@ -125,7 +127,7 @@ export function decorateSnapshotUi({ const snapshotState = globalState.snapshotStates[file]; if (snapshotState && !test.isPassed()) { - snapshotState.markSnapshotsAsCheckedForTest(test.fullTitle()); + snapshotState.markSnapshotsAsCheckedForTest(getTestTitle(test)); } }); @@ -194,7 +196,7 @@ export function expectSnapshot(received: any) { const context: SnapshotContext = { snapshotState, - currentTestName: test.fullTitle(), + currentTestName: getTestTitle(test), }; return { @@ -204,6 +206,18 @@ export function expectSnapshot(received: any) { }; } +function getTestTitle(test: Test) { + return ( + test + .fullTitle() + // remove deployment type from test title so that a single snapshot can be used for all deployment types + .replace( + /^(Serverless|Stateful)\s+([^\-]+)\s*-?\s*Deployment-agnostic/g, + 'Deployment-agnostic' + ) + ); +} + function expectToMatchSnapshot(snapshotContext: SnapshotContext, received: any) { const matcher = toMatchSnapshot.bind(snapshotContext as any); const result = matcher(received) as SyncExpectationResult; diff --git a/packages/kbn-timelion-grammar/kibana.jsonc b/packages/kbn-timelion-grammar/kibana.jsonc index 88b61e0c15872..a7d321fd99a1b 100644 --- a/packages/kbn-timelion-grammar/kibana.jsonc +++ b/packages/kbn-timelion-grammar/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/timelion-grammar", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-timerange/kibana.jsonc b/packages/kbn-timerange/kibana.jsonc index e3f2e74f771a6..dc2e47f2a9c6c 100644 --- a/packages/kbn-timerange/kibana.jsonc +++ b/packages/kbn-timerange/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/timerange", - "owner": "@elastic/obs-ux-logs-team" -} + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-tinymath/kibana.jsonc b/packages/kbn-tinymath/kibana.jsonc index dd790aee9fe9b..149662a6beb77 100644 --- a/packages/kbn-tinymath/kibana.jsonc +++ b/packages/kbn-tinymath/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/tinymath", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-tooling-log/kibana.jsonc b/packages/kbn-tooling-log/kibana.jsonc index d855a7dc46c72..c942e6d37594f 100644 --- a/packages/kbn-tooling-log/kibana.jsonc +++ b/packages/kbn-tooling-log/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/tooling-log", - "devOnly": true, - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared", + "devOnly": true +} \ No newline at end of file diff --git a/packages/kbn-transpose-utils/kibana.jsonc b/packages/kbn-transpose-utils/kibana.jsonc index d891291d0720a..1b79c9189ba57 100644 --- a/packages/kbn-transpose-utils/kibana.jsonc +++ b/packages/kbn-transpose-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/transpose-utils", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-triggers-actions-ui-types/kibana.jsonc b/packages/kbn-triggers-actions-ui-types/kibana.jsonc index cb14c1d7fdf44..964233667ea2a 100644 --- a/packages/kbn-triggers-actions-ui-types/kibana.jsonc +++ b/packages/kbn-triggers-actions-ui-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/triggers-actions-ui-types", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-try-in-console/kibana.jsonc b/packages/kbn-try-in-console/kibana.jsonc index c5988280943db..77ac2de3095f4 100644 --- a/packages/kbn-try-in-console/kibana.jsonc +++ b/packages/kbn-try-in-console/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/try-in-console", - "owner": "@elastic/search-kibana" -} + "owner": [ + "@elastic/search-kibana" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-typed-react-router-config/kibana.jsonc b/packages/kbn-typed-react-router-config/kibana.jsonc index c004d263a6046..37c95108427ee 100644 --- a/packages/kbn-typed-react-router-config/kibana.jsonc +++ b/packages/kbn-typed-react-router-config/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/typed-react-router-config", - "owner": ["@elastic/obs-knowledge-team", "@elastic/obs-ux-infra_services-team"] -} + "owner": [ + "@elastic/obs-knowledge-team", + "@elastic/obs-ux-infra_services-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ui-actions-browser/kibana.jsonc b/packages/kbn-ui-actions-browser/kibana.jsonc index 3fbdc46e64b16..d7133132af334 100644 --- a/packages/kbn-ui-actions-browser/kibana.jsonc +++ b/packages/kbn-ui-actions-browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ui-actions-browser", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-ui-shared-deps-npm/kibana.jsonc b/packages/kbn-ui-shared-deps-npm/kibana.jsonc index 91ab8cdfc2b13..6dad4bd9bde4c 100644 --- a/packages/kbn-ui-shared-deps-npm/kibana.jsonc +++ b/packages/kbn-ui-shared-deps-npm/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ui-shared-deps-npm", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-ui-shared-deps-src/kibana.jsonc b/packages/kbn-ui-shared-deps-src/kibana.jsonc index 39b71b0bd00e1..5626d0a010465 100644 --- a/packages/kbn-ui-shared-deps-src/kibana.jsonc +++ b/packages/kbn-ui-shared-deps-src/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ui-shared-deps-src", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-ui-theme/kibana.jsonc b/packages/kbn-ui-theme/kibana.jsonc index db8230d520c0a..e49ac0435f91e 100644 --- a/packages/kbn-ui-theme/kibana.jsonc +++ b/packages/kbn-ui-theme/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ui-theme", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-unified-data-table/kibana.jsonc b/packages/kbn-unified-data-table/kibana.jsonc index b80f8b6a55596..c7af5075e95c9 100644 --- a/packages/kbn-unified-data-table/kibana.jsonc +++ b/packages/kbn-unified-data-table/kibana.jsonc @@ -1,9 +1,11 @@ { "type": "shared-browser", "id": "@kbn/unified-data-table", - "description": "Contains functionality for the unified data table which can be integrated into apps", "owner": [ "@elastic/kibana-data-discovery", "@elastic/security-threat-hunting-investigations" - ] -} + ], + "group": "platform", + "visibility": "shared", + "description": "Contains functionality for the unified data table which can be integrated into apps" +} \ No newline at end of file diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_cell_value.test.tsx b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_cell_value.test.tsx index ff2b7c46616f0..bbbf1ddcbb309 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_cell_value.test.tsx +++ b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_cell_value.test.tsx @@ -11,8 +11,7 @@ import { EuiDataGridCellValueElementProps, EuiDataGridSetCellProps } from '@elas import { buildDataTableRecord } from '@kbn/discover-utils'; import { generateEsHits, additionalFieldGroups } from '@kbn/discover-utils/src/__mocks__'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; -import { render, screen } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, screen, renderHook } from '@testing-library/react'; import React from 'react'; import { ReactNode, useState } from 'react'; import { dataViewWithTimefieldMock } from '../../../../__mocks__/data_view_with_timefield'; diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_columns.test.tsx b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_columns.test.tsx index ccf8368c95270..716db2f052277 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_columns.test.tsx +++ b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_columns.test.tsx @@ -13,9 +13,8 @@ import { FIELD_COLUMN_WIDTH, useComparisonColumns, } from './use_comparison_columns'; -import { renderHook } from '@testing-library/react-hooks'; import type { EuiDataGridColumn, EuiDataGridColumnActions } from '@elastic/eui'; -import { render, screen } from '@testing-library/react'; +import { render, screen, renderHook } from '@testing-library/react'; import React from 'react'; import userEvent from '@testing-library/user-event'; import { generateEsHits } from '@kbn/discover-utils/src/__mocks__'; diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_css.test.ts b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_css.test.ts index 36abc40a8d1cf..010edbecd8cfd 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_css.test.ts +++ b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_css.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useComparisonCss } from './use_comparison_css'; describe('useComparisonCss', () => { diff --git a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.test.ts b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.test.ts index 7a73402ad6552..c92b15f6ce6be 100644 --- a/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.test.ts +++ b/packages/kbn-unified-data-table/src/components/compare_documents/hooks/use_comparison_fields.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { buildDataTableRecord } from '@kbn/discover-utils'; import { MAX_COMPARISON_FIELDS, diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_columns.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_data_grid_columns.test.tsx index f034cb63287c8..31b1b42b7c6d0 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_columns.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_columns.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useColumns } from './use_data_grid_columns'; import { dataViewMock } from '@kbn/discover-utils/src/__mocks__'; import { configMock } from '../../__mocks__/config'; diff --git a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx index b0563d0d33ea8..e105581b6d4cb 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_data_grid_density.test.tsx @@ -8,7 +8,7 @@ */ import type { Storage } from '@kbn/kibana-utils-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useDataGridDensity } from './use_data_grid_density'; import { DATA_GRID_STYLE_EXPANDED, DataGridDensity } from '../constants'; diff --git a/packages/kbn-unified-data-table/src/hooks/use_full_screen_watcher.test.ts b/packages/kbn-unified-data-table/src/hooks/use_full_screen_watcher.test.ts index 3a7d94283ba0d..3736cdbd03f14 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_full_screen_watcher.test.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_full_screen_watcher.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { EUI_DATA_GRID_FULL_SCREEN_CLASS, UNIFIED_DATA_TABLE_FULL_SCREEN_CLASS, @@ -40,7 +40,7 @@ const nextTick = () => { return act(() => { return new Promise((resolve) => requestAnimationFrame(() => { - resolve(); + resolve(null); }) ); }); diff --git a/packages/kbn-unified-data-table/src/hooks/use_row_height.test.tsx b/packages/kbn-unified-data-table/src/hooks/use_row_height.test.tsx index ac8b6257aa14b..48c4ee4484e64 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_row_height.test.tsx +++ b/packages/kbn-unified-data-table/src/hooks/use_row_height.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { createLocalStorageMock } from '../../__mocks__/local_storage_mock'; import { useRowHeight } from './use_row_height'; import { RowHeightMode } from '../components/row_height_settings'; diff --git a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.ts b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.ts index 33a7e98c4b8c4..052dc15c09a89 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_row_heights_options.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useRowHeightsOptions } from './use_row_heights_options'; describe('useRowHeightsOptions', () => { diff --git a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts index 3865e412bdcd2..f49c4f7f7b328 100644 --- a/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts +++ b/packages/kbn-unified-data-table/src/hooks/use_selected_docs.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { buildDataTableRecord } from '@kbn/discover-utils'; import { useSelectedDocs } from './use_selected_docs'; import { generateEsHits } from '@kbn/discover-utils/src/__mocks__'; diff --git a/packages/kbn-unified-doc-viewer/kibana.jsonc b/packages/kbn-unified-doc-viewer/kibana.jsonc index 272c2ec69ce82..15c968fadf09e 100644 --- a/packages/kbn-unified-doc-viewer/kibana.jsonc +++ b/packages/kbn-unified-doc-viewer/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/unified-doc-viewer", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-unified-field-list/kibana.jsonc b/packages/kbn-unified-field-list/kibana.jsonc index 4c3201f503f8a..65147718f539b 100644 --- a/packages/kbn-unified-field-list/kibana.jsonc +++ b/packages/kbn-unified-field-list/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-browser", "id": "@kbn/unified-field-list", - "description": "Contains functionality for the field list and field stats which can be integrated into apps", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", + "description": "Contains functionality for the field list and field stats which can be integrated into apps" +} \ No newline at end of file diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/get_sidebar_visibility.test.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/get_sidebar_visibility.test.tsx index 85f223e4b1cfb..01c3bb2677e3c 100644 --- a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/get_sidebar_visibility.test.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/get_sidebar_visibility.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act } from '@testing-library/react-hooks'; +import { act } from '@testing-library/react'; import { getSidebarVisibility } from './get_sidebar_visibility'; const localStorageKey = 'test-sidebar-visibility'; diff --git a/packages/kbn-unified-field-list/src/hooks/use_existing_fields.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_existing_fields.test.tsx index 06b043014c2fd..c3b77ad72f5ac 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_existing_fields.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_existing_fields.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/data_view.stub'; import { createStubDataView, stubFieldSpecMap } from '@kbn/data-plugin/public/stubs'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; @@ -94,7 +94,7 @@ describe('UnifiedFieldList useExistingFields', () => { }; }); - const hookFetcher = renderHook(useExistingFieldsFetcher, { + renderHook(useExistingFieldsFetcher, { initialProps: { dataViews: [dataView], services: mockedServices, @@ -107,7 +107,7 @@ describe('UnifiedFieldList useExistingFields', () => { const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( expect.objectContaining({ @@ -167,7 +167,7 @@ describe('UnifiedFieldList useExistingFields', () => { const hookReader1 = renderHook(useExistingFieldsReader); const hookReader2 = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalled(); @@ -199,7 +199,7 @@ describe('UnifiedFieldList useExistingFields', () => { throw new Error('test'); }); - const hookFetcher = renderHook(useExistingFieldsFetcher, { + renderHook(useExistingFieldsFetcher, { initialProps: { dataViews: [dataView], services: mockedServices, @@ -212,7 +212,7 @@ describe('UnifiedFieldList useExistingFields', () => { const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalled(); @@ -232,7 +232,7 @@ describe('UnifiedFieldList useExistingFields', () => { } ); - const hookFetcher = renderHook(useExistingFieldsFetcher, { + renderHook(useExistingFieldsFetcher, { initialProps: { dataViews: [dataView, anotherDataView, dataViewWithRestrictions], services: mockedServices, @@ -244,7 +244,7 @@ describe('UnifiedFieldList useExistingFields', () => { }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const currentResult = hookReader.result.current; @@ -310,8 +310,7 @@ describe('UnifiedFieldList useExistingFields', () => { }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); - await hookFetcher.waitFor(() => !hookFetcher.result.current.isProcessing); + await waitFor(() => () => !hookFetcher.result.current.isProcessing); expect(dataViewWithRestrictions.getAggregationRestrictions).toHaveBeenCalled(); expect(ExistingFieldsServiceApi.loadFieldExisting).not.toHaveBeenCalled(); @@ -346,7 +345,7 @@ describe('UnifiedFieldList useExistingFields', () => { }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( expect.objectContaining({ @@ -370,7 +369,7 @@ describe('UnifiedFieldList useExistingFields', () => { dataViews: [dataView, anotherDataView], }); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenNthCalledWith( 2, @@ -424,7 +423,7 @@ describe('UnifiedFieldList useExistingFields', () => { }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( expect.objectContaining({ @@ -447,32 +446,32 @@ describe('UnifiedFieldList useExistingFields', () => { query: { query: 'test', language: 'kuery' }, }); - await hookFetcher.waitForNextUpdate(); - - expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ - fromDate: '2021-01-01', - toDate: '2022-01-01', - dslQuery: { - bool: { - filter: [ - { - multi_match: { - lenient: true, - query: 'test', - type: 'best_fields', + await waitFor(() => + expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + fromDate: '2021-01-01', + toDate: '2022-01-01', + dslQuery: { + bool: { + filter: [ + { + multi_match: { + lenient: true, + query: 'test', + type: 'best_fields', + }, }, - }, - ], - must: [], - must_not: [], - should: [], + ], + must: [], + must_not: [], + should: [], + }, }, - }, - dataView, - timeFieldName: dataView.timeFieldName, - }) + dataView, + timeFieldName: dataView.timeFieldName, + }) + ) ); }); @@ -497,7 +496,7 @@ describe('UnifiedFieldList useExistingFields', () => { }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( expect.objectContaining({ @@ -522,7 +521,7 @@ describe('UnifiedFieldList useExistingFields', () => { toDate: '2022-01-01', }); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenNthCalledWith( 2, @@ -558,12 +557,12 @@ describe('UnifiedFieldList useExistingFields', () => { query: { query: '', language: 'lucene' }, filters: [], }; - const hookFetcher = renderHook(useExistingFieldsFetcher, { + renderHook(useExistingFieldsFetcher, { initialProps: params, }); const hookReader = renderHook(useExistingFieldsReader); - await hookFetcher.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx index d0adb4125ab3d..60f84e9cdf2c1 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx @@ -7,8 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; -import { act } from 'react-test-renderer'; +import { act, renderHook } from '@testing-library/react'; import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/data_view.stub'; import type { DataViewField } from '@kbn/data-views-plugin/common'; import { coreMock } from '@kbn/core/public/mocks'; diff --git a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.test.tsx index a0a8e055e6d62..946396c83f2d3 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { stubDataViewWithoutTimeField, stubLogstashDataView as dataView, @@ -56,11 +56,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { allFields: null, services: mockedServices, }; - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldListGroupedProps = result.current.fieldListGroupedProps; expect(fieldListGroupedProps.fieldGroups).toMatchSnapshot(); @@ -101,11 +101,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { }) ); - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldListGroupedProps = result.current.fieldListGroupedProps; const fieldGroups = fieldListGroupedProps.fieldGroups; @@ -163,11 +163,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { }) ); - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldListGroupedProps = result.current.fieldListGroupedProps; const fieldGroups = fieldListGroupedProps.fieldGroups; @@ -235,11 +235,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { }) ); - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldListGroupedProps = result.current.fieldListGroupedProps; const fieldGroups = fieldListGroupedProps.fieldGroups; @@ -292,11 +292,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { allFields: allFieldsIncludingUnmapped, services: mockedServices, }; - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -373,11 +373,11 @@ describe('UnifiedFieldList useGroupedFields()', () => { allFields, services: mockedServices, }; - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const scrollToTopResetCounter1 = result.current.fieldListGroupedProps.scrollToTopResetCounter; @@ -392,7 +392,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }); it('should work correctly when custom unsupported fields are skipped', async () => { - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -401,7 +401,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -422,7 +422,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }); it('should work correctly when selected fields are present', async () => { - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -432,7 +432,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -531,7 +531,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }; } }); - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -540,7 +540,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -572,10 +572,10 @@ describe('UnifiedFieldList useGroupedFields()', () => { }) ); - const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + const { result, rerender } = renderHook(useGroupedFields, { initialProps: props, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); let fieldListGroupedProps = result.current.fieldListGroupedProps; fieldGroups = fieldListGroupedProps.fieldGroups; @@ -604,7 +604,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { allFields: anotherDataView.fields, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); fieldListGroupedProps = result.current.fieldListGroupedProps; fieldGroups = fieldListGroupedProps.fieldGroups; @@ -633,7 +633,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { // `bytes` is popular, but we are skipping it here to test that it would not be shown under Popular and Available const onSupportedFieldFilter = jest.fn((field) => field.name !== 'bytes'); - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -643,7 +643,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -668,7 +668,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }); it('should work correctly when global filters are set', async () => { - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields: [], @@ -677,14 +677,14 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; expect(fieldGroups).toMatchSnapshot(); }); it('should work correctly and show unmapped fields separately', async () => { - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields: allFieldsIncludingUnmapped, @@ -692,7 +692,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -718,7 +718,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { allFields[2], allFields[0], ]; - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -727,7 +727,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldGroups = result.current.fieldListGroupedProps.fieldGroups; @@ -750,7 +750,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }); it('should include filters props', async () => { - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -758,7 +758,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const { fieldListFiltersProps, fieldListGroupedProps } = result.current; const fieldGroups = fieldListGroupedProps.fieldGroups; @@ -806,7 +806,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { const additionalFieldGroups = { smartFields, }; - const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + const { result } = renderHook(useGroupedFields, { initialProps: { dataViewId: dataView.id!, allFields, @@ -815,7 +815,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { }, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const fieldListGroupedProps = result.current.fieldListGroupedProps; const fieldGroups = fieldListGroupedProps.fieldGroups; expect(fieldGroups.SmartFields?.fields?.length).toBe(1); diff --git a/packages/kbn-unified-field-list/src/hooks/use_new_fields.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_new_fields.test.tsx index b091ed015e312..4f34f5d16dc51 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_new_fields.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_new_fields.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/data_view.stub'; import { DataViewField } from '@kbn/data-views-plugin/common'; import { useNewFields, type UseNewFieldsParams } from './use_new_fields'; diff --git a/packages/kbn-unsaved-changes-badge/kibana.jsonc b/packages/kbn-unsaved-changes-badge/kibana.jsonc index 0f64c4d4143fd..d52497ccc81e8 100644 --- a/packages/kbn-unsaved-changes-badge/kibana.jsonc +++ b/packages/kbn-unsaved-changes-badge/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/unsaved-changes-badge", - "owner": "@elastic/kibana-data-discovery" -} + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/kbn-unsaved-changes-prompt/kibana.jsonc b/packages/kbn-unsaved-changes-prompt/kibana.jsonc index d41be0d07af30..e186e2cf51176 100644 --- a/packages/kbn-unsaved-changes-prompt/kibana.jsonc +++ b/packages/kbn-unsaved-changes-prompt/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/unsaved-changes-prompt", - "owner": "@elastic/kibana-management" + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" } diff --git a/packages/kbn-user-profile-components/kibana.jsonc b/packages/kbn-user-profile-components/kibana.jsonc index ecd571c98781f..78a445a4d63d0 100644 --- a/packages/kbn-user-profile-components/kibana.jsonc +++ b/packages/kbn-user-profile-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/user-profile-components", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-utility-types-jest/kibana.jsonc b/packages/kbn-utility-types-jest/kibana.jsonc index 1eea6e6c96a67..73a5701184157 100644 --- a/packages/kbn-utility-types-jest/kibana.jsonc +++ b/packages/kbn-utility-types-jest/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/utility-types-jest", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-utility-types/kibana.jsonc b/packages/kbn-utility-types/kibana.jsonc index 4a6528d2ac652..f4c6c948e9fc6 100644 --- a/packages/kbn-utility-types/kibana.jsonc +++ b/packages/kbn-utility-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/utility-types", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-utils/kibana.jsonc b/packages/kbn-utils/kibana.jsonc index 516d42bb2e8ba..1fc67d63c1e32 100644 --- a/packages/kbn-utils/kibana.jsonc +++ b/packages/kbn-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/utils", - "owner": "@elastic/kibana-operations" -} + "owner": [ + "@elastic/kibana-operations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-visualization-ui-components/kibana.jsonc b/packages/kbn-visualization-ui-components/kibana.jsonc index c17c88cb88ad8..e0015f90f747f 100644 --- a/packages/kbn-visualization-ui-components/kibana.jsonc +++ b/packages/kbn-visualization-ui-components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/visualization-ui-components", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-visualization-utils/kibana.jsonc b/packages/kbn-visualization-utils/kibana.jsonc index 6589338ddb579..fef0661ec4021 100644 --- a/packages/kbn-visualization-utils/kibana.jsonc +++ b/packages/kbn-visualization-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/visualization-utils", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/kbn-xstate-utils/kibana.jsonc b/packages/kbn-xstate-utils/kibana.jsonc index 1fb3507854b98..3b1bcf6bf8d76 100644 --- a/packages/kbn-xstate-utils/kibana.jsonc +++ b/packages/kbn-xstate-utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/xstate-utils", - "owner": "@elastic/obs-ux-logs-team" + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private" } diff --git a/packages/kbn-zod-helpers/kibana.jsonc b/packages/kbn-zod-helpers/kibana.jsonc index 9f7ad63233d33..905c0f02caa61 100644 --- a/packages/kbn-zod-helpers/kibana.jsonc +++ b/packages/kbn-zod-helpers/kibana.jsonc @@ -1,6 +1,10 @@ { - "devOnly": false, + "type": "shared-common", "id": "@kbn/zod-helpers", - "owner": "@elastic/security-detection-rule-management", - "type": "shared-common" -} + "owner": [ + "@elastic/security-detection-rule-management" + ], + "group": "platform", + "visibility": "shared", + "devOnly": false +} \ No newline at end of file diff --git a/packages/kbn-zod/kibana.jsonc b/packages/kbn-zod/kibana.jsonc index 1e85fceb5528c..1594934b9c28a 100644 --- a/packages/kbn-zod/kibana.jsonc +++ b/packages/kbn-zod/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/zod", - "owner": "@elastic/kibana-core" -} + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/presentation/presentation_containers/kibana.jsonc b/packages/presentation/presentation_containers/kibana.jsonc index 4e16421b36204..e123312e55c75 100644 --- a/packages/presentation/presentation_containers/kibana.jsonc +++ b/packages/presentation/presentation_containers/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/presentation-containers", - "owner": "@elastic/kibana-presentation" -} + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/presentation/presentation_publishing/kibana.jsonc b/packages/presentation/presentation_publishing/kibana.jsonc index 6063d383c3f97..524ad06a07222 100644 --- a/packages/presentation/presentation_publishing/kibana.jsonc +++ b/packages/presentation/presentation_publishing/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/presentation-publishing", - "owner": "@elastic/kibana-presentation" -} + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/react/kibana_context/common/kibana.jsonc b/packages/react/kibana_context/common/kibana.jsonc index b52bc6a40d0cc..e7254c3e22966 100644 --- a/packages/react/kibana_context/common/kibana.jsonc +++ b/packages/react/kibana_context/common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-context-common", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/react/kibana_context/render/kibana.jsonc b/packages/react/kibana_context/render/kibana.jsonc index ffcc5c826cdfa..1349ec47c9c05 100644 --- a/packages/react/kibana_context/render/kibana.jsonc +++ b/packages/react/kibana_context/render/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-context-render", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/react/kibana_context/root/kibana.jsonc b/packages/react/kibana_context/root/kibana.jsonc index 740d92da927c9..1dc0779f86f0d 100644 --- a/packages/react/kibana_context/root/kibana.jsonc +++ b/packages/react/kibana_context/root/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-context-root", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/react/kibana_context/styled/kibana.jsonc b/packages/react/kibana_context/styled/kibana.jsonc index 5974cd3a50a66..32b7917f5b090 100644 --- a/packages/react/kibana_context/styled/kibana.jsonc +++ b/packages/react/kibana_context/styled/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-context-styled", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/react/kibana_context/theme/kibana.jsonc b/packages/react/kibana_context/theme/kibana.jsonc index 56ae8b57a6682..96f255cb467a5 100644 --- a/packages/react/kibana_context/theme/kibana.jsonc +++ b/packages/react/kibana_context/theme/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-context-theme", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/react/kibana_mount/kibana.jsonc b/packages/react/kibana_mount/kibana.jsonc index 2c554ac7acb91..9072cc0f51816 100644 --- a/packages/react/kibana_mount/kibana.jsonc +++ b/packages/react/kibana_mount/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/react-kibana-mount", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/response-ops/rule_params/kibana.jsonc b/packages/response-ops/rule_params/kibana.jsonc index 6a6744a58c4a1..1315303258949 100644 --- a/packages/response-ops/rule_params/kibana.jsonc +++ b/packages/response-ops/rule_params/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/response-ops-rule-params", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/serverless/project_switcher/kibana.jsonc b/packages/serverless/project_switcher/kibana.jsonc index 6e37bb95cafda..a0722bf662a4e 100644 --- a/packages/serverless/project_switcher/kibana.jsonc +++ b/packages/serverless/project_switcher/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/serverless-project-switcher", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/serverless/settings/common/kibana.jsonc b/packages/serverless/settings/common/kibana.jsonc index 57e57b4a5d828..89a0efe2937d8 100644 --- a/packages/serverless/settings/common/kibana.jsonc +++ b/packages/serverless/settings/common/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/serverless-common-settings", - "owner": "@elastic/appex-sharedux @elastic/kibana-management" -} + "owner": [ + "@elastic/appex-sharedux", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/serverless/settings/observability_project/kibana.jsonc b/packages/serverless/settings/observability_project/kibana.jsonc index 316786b21dc67..1535ff08de872 100644 --- a/packages/serverless/settings/observability_project/kibana.jsonc +++ b/packages/serverless/settings/observability_project/kibana.jsonc @@ -1,5 +1,11 @@ { "type": "shared-common", "id": "@kbn/serverless-observability-settings", - "owner": "@elastic/appex-sharedux @elastic/kibana-management @elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/appex-sharedux", + "@elastic/kibana-management", + "@elastic/obs-ux-management-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/serverless/settings/search_project/kibana.jsonc b/packages/serverless/settings/search_project/kibana.jsonc index db71259a8ea6d..b1b1171e929c6 100644 --- a/packages/serverless/settings/search_project/kibana.jsonc +++ b/packages/serverless/settings/search_project/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/serverless-search-settings", - "owner": "@elastic/search-kibana @elastic/kibana-management" -} + "owner": [ + "@elastic/search-kibana", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/serverless/settings/security_project/kibana.jsonc b/packages/serverless/settings/security_project/kibana.jsonc index fdf4f2d206f0d..55cc4ee537d7c 100644 --- a/packages/serverless/settings/security_project/kibana.jsonc +++ b/packages/serverless/settings/security_project/kibana.jsonc @@ -1,5 +1,10 @@ { "type": "shared-common", "id": "@kbn/serverless-security-settings", - "owner": "@elastic/security-solution @elastic/kibana-management" -} + "owner": [ + "@elastic/security-solution", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/serverless/types/kibana.jsonc b/packages/serverless/types/kibana.jsonc index 0b5a8fffe84be..89901c4c56d4f 100644 --- a/packages/serverless/types/kibana.jsonc +++ b/packages/serverless/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/serverless-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/avatar/solution/kibana.jsonc b/packages/shared-ux/avatar/solution/kibana.jsonc index bec67862823b3..a93d1f7e200c1 100644 --- a/packages/shared-ux/avatar/solution/kibana.jsonc +++ b/packages/shared-ux/avatar/solution/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-avatar-solution", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/button/exit_full_screen/kibana.jsonc b/packages/shared-ux/button/exit_full_screen/kibana.jsonc index 8cd27723b051f..c1878fd3ddc0a 100644 --- a/packages/shared-ux/button/exit_full_screen/kibana.jsonc +++ b/packages/shared-ux/button/exit_full_screen/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-button-exit-full-screen", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/button_toolbar/kibana.jsonc b/packages/shared-ux/button_toolbar/kibana.jsonc index 8e5d78dff0e53..1a61c5ffc3d4d 100644 --- a/packages/shared-ux/button_toolbar/kibana.jsonc +++ b/packages/shared-ux/button_toolbar/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-button-toolbar", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/card/no_data/impl/kibana.jsonc b/packages/shared-ux/card/no_data/impl/kibana.jsonc index 0dc1330988ccf..f96d65188e703 100644 --- a/packages/shared-ux/card/no_data/impl/kibana.jsonc +++ b/packages/shared-ux/card/no_data/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-card-no-data", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/card/no_data/mocks/kibana.jsonc b/packages/shared-ux/card/no_data/mocks/kibana.jsonc index e332bfd1da0b4..a7d83ef725ebf 100644 --- a/packages/shared-ux/card/no_data/mocks/kibana.jsonc +++ b/packages/shared-ux/card/no_data/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-card-no-data-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/card/no_data/types/kibana.jsonc b/packages/shared-ux/card/no_data/types/kibana.jsonc index b78a1a7b9b993..b35e72493bbc1 100644 --- a/packages/shared-ux/card/no_data/types/kibana.jsonc +++ b/packages/shared-ux/card/no_data/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-card-no-data-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/chrome/navigation/kibana.jsonc b/packages/shared-ux/chrome/navigation/kibana.jsonc index 60bfed4d5796f..ea7ed68c19dfa 100644 --- a/packages/shared-ux/chrome/navigation/kibana.jsonc +++ b/packages/shared-ux/chrome/navigation/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-chrome-navigation", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/code_editor/impl/kibana.jsonc b/packages/shared-ux/code_editor/impl/kibana.jsonc index d66e88d40710e..f94d8229514be 100644 --- a/packages/shared-ux/code_editor/impl/kibana.jsonc +++ b/packages/shared-ux/code_editor/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/code-editor", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/code_editor/mocks/kibana.jsonc b/packages/shared-ux/code_editor/mocks/kibana.jsonc index c8e8a8e8e54e3..f977d535067c3 100644 --- a/packages/shared-ux/code_editor/mocks/kibana.jsonc +++ b/packages/shared-ux/code_editor/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/code-editor-mock", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/error_boundary/kibana.jsonc b/packages/shared-ux/error_boundary/kibana.jsonc index c7e6f9b517962..d23469ef11801 100644 --- a/packages/shared-ux/error_boundary/kibana.jsonc +++ b/packages/shared-ux/error_boundary/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-error-boundary", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/context/kibana.jsonc b/packages/shared-ux/file/context/kibana.jsonc index c4b2a631f0c9f..9612a47c01f6a 100644 --- a/packages/shared-ux/file/context/kibana.jsonc +++ b/packages/shared-ux/file/context/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-context", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/file_picker/impl/kibana.jsonc b/packages/shared-ux/file/file_picker/impl/kibana.jsonc index 733d78bcd3037..9d7bc72bb634d 100644 --- a/packages/shared-ux/file/file_picker/impl/kibana.jsonc +++ b/packages/shared-ux/file/file_picker/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-picker", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/file_upload/impl/kibana.jsonc b/packages/shared-ux/file/file_upload/impl/kibana.jsonc index 0ebcd24bf98ea..ed5b6366e2a73 100644 --- a/packages/shared-ux/file/file_upload/impl/kibana.jsonc +++ b/packages/shared-ux/file/file_upload/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-upload", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/image/impl/kibana.jsonc b/packages/shared-ux/file/image/impl/kibana.jsonc index e7bc1629fe4f1..3153d4e3d0174 100644 --- a/packages/shared-ux/file/image/impl/kibana.jsonc +++ b/packages/shared-ux/file/image/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-image", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/image/mocks/kibana.jsonc b/packages/shared-ux/file/image/mocks/kibana.jsonc index abf9037fe0497..8c80fd88b9625 100644 --- a/packages/shared-ux/file/image/mocks/kibana.jsonc +++ b/packages/shared-ux/file/image/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-image-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/mocks/kibana.jsonc b/packages/shared-ux/file/mocks/kibana.jsonc index ea930e806051a..820c83e5383af 100644 --- a/packages/shared-ux/file/mocks/kibana.jsonc +++ b/packages/shared-ux/file/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/file/types/kibana.jsonc b/packages/shared-ux/file/types/kibana.jsonc index 5d97907473384..ce351a0152f2b 100644 --- a/packages/shared-ux/file/types/kibana.jsonc +++ b/packages/shared-ux/file/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-types", - "owner": "@elastic/appex-sharedux" + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" } diff --git a/packages/shared-ux/file/util/kibana.jsonc b/packages/shared-ux/file/util/kibana.jsonc index 80c644db509e3..eb884e2708678 100644 --- a/packages/shared-ux/file/util/kibana.jsonc +++ b/packages/shared-ux/file/util/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-file-util", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/link/redirect_app/impl/kibana.jsonc b/packages/shared-ux/link/redirect_app/impl/kibana.jsonc index 9521500eae23e..4f0ae057cdbc1 100644 --- a/packages/shared-ux/link/redirect_app/impl/kibana.jsonc +++ b/packages/shared-ux/link/redirect_app/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-link-redirect-app", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/link/redirect_app/mocks/kibana.jsonc b/packages/shared-ux/link/redirect_app/mocks/kibana.jsonc index 1c070c1998633..7e8c763f12d0f 100644 --- a/packages/shared-ux/link/redirect_app/mocks/kibana.jsonc +++ b/packages/shared-ux/link/redirect_app/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-link-redirect-app-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/link/redirect_app/types/kibana.jsonc b/packages/shared-ux/link/redirect_app/types/kibana.jsonc index ca657f445f43d..c9cfba6aef0af 100644 --- a/packages/shared-ux/link/redirect_app/types/kibana.jsonc +++ b/packages/shared-ux/link/redirect_app/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-link-redirect-app-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/markdown/impl/kibana.jsonc b/packages/shared-ux/markdown/impl/kibana.jsonc index a6a615abb33ea..3ae0b724fc2f0 100644 --- a/packages/shared-ux/markdown/impl/kibana.jsonc +++ b/packages/shared-ux/markdown/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-markdown", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/markdown/mocks/kibana.jsonc b/packages/shared-ux/markdown/mocks/kibana.jsonc index c1183a70ceda7..17764e5ed0133 100644 --- a/packages/shared-ux/markdown/mocks/kibana.jsonc +++ b/packages/shared-ux/markdown/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-markdown-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/markdown/types/kibana.jsonc b/packages/shared-ux/markdown/types/kibana.jsonc index 18412b08bd7af..8ec1ceba818f6 100644 --- a/packages/shared-ux/markdown/types/kibana.jsonc +++ b/packages/shared-ux/markdown/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-markdown-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/modal/tabbed/kibana.jsonc b/packages/shared-ux/modal/tabbed/kibana.jsonc index 4abd1fe7543ed..a81399f0f8a2e 100644 --- a/packages/shared-ux/modal/tabbed/kibana.jsonc +++ b/packages/shared-ux/modal/tabbed/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-common", - "id": "@kbn/shared-ux-tabbed-modal", - "owner": "@elastic/appex-sharedux" - } \ No newline at end of file + "type": "shared-common", + "id": "@kbn/shared-ux-tabbed-modal", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/modal/tabbed/src/context/index.test.tsx b/packages/shared-ux/modal/tabbed/src/context/index.test.tsx index a25504421b330..8c42dea9080c2 100644 --- a/packages/shared-ux/modal/tabbed/src/context/index.test.tsx +++ b/packages/shared-ux/modal/tabbed/src/context/index.test.tsx @@ -8,7 +8,7 @@ */ import React, { type ComponentProps, type ComponentType } from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useModalContext, ModalContextProvider } from '.'; type ModalContextProviderProps = ComponentProps; diff --git a/packages/shared-ux/page/kibana_no_data/impl/kibana.jsonc b/packages/shared-ux/page/kibana_no_data/impl/kibana.jsonc index ed790a80bf249..ac9eb2478184d 100644 --- a/packages/shared-ux/page/kibana_no_data/impl/kibana.jsonc +++ b/packages/shared-ux/page/kibana_no_data/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-kibana-no-data", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/page/kibana_no_data/mocks/kibana.jsonc b/packages/shared-ux/page/kibana_no_data/mocks/kibana.jsonc index 6d757ebb856b4..115afdaf9cd13 100644 --- a/packages/shared-ux/page/kibana_no_data/mocks/kibana.jsonc +++ b/packages/shared-ux/page/kibana_no_data/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-page-kibana-no-data-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/page/kibana_no_data/types/kibana.jsonc b/packages/shared-ux/page/kibana_no_data/types/kibana.jsonc index 6cae33b2ae21c..8f181a7f5e69a 100644 --- a/packages/shared-ux/page/kibana_no_data/types/kibana.jsonc +++ b/packages/shared-ux/page/kibana_no_data/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-kibana-no-data-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/page/kibana_template/impl/kibana.jsonc b/packages/shared-ux/page/kibana_template/impl/kibana.jsonc index b87289883e693..2c030cb8b6667 100644 --- a/packages/shared-ux/page/kibana_template/impl/kibana.jsonc +++ b/packages/shared-ux/page/kibana_template/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-kibana-template", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/kibana_template/mocks/kibana.jsonc b/packages/shared-ux/page/kibana_template/mocks/kibana.jsonc index 2ced9b0086512..d786f5d945acd 100644 --- a/packages/shared-ux/page/kibana_template/mocks/kibana.jsonc +++ b/packages/shared-ux/page/kibana_template/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-kibana-template-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/kibana_template/types/kibana.jsonc b/packages/shared-ux/page/kibana_template/types/kibana.jsonc index cd8d55e4993b2..af638ab37d1f8 100644 --- a/packages/shared-ux/page/kibana_template/types/kibana.jsonc +++ b/packages/shared-ux/page/kibana_template/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-kibana-template-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data/impl/kibana.jsonc b/packages/shared-ux/page/no_data/impl/kibana.jsonc index 811b1371037c7..2b73286e43fb0 100644 --- a/packages/shared-ux/page/no_data/impl/kibana.jsonc +++ b/packages/shared-ux/page/no_data/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-no-data", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data/mocks/kibana.jsonc b/packages/shared-ux/page/no_data/mocks/kibana.jsonc index 78d4d58d477e3..556789fff4dee 100644 --- a/packages/shared-ux/page/no_data/mocks/kibana.jsonc +++ b/packages/shared-ux/page/no_data/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-page-no-data-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data/types/kibana.jsonc b/packages/shared-ux/page/no_data/types/kibana.jsonc index d4de4b00fbc52..0881756f39753 100644 --- a/packages/shared-ux/page/no_data/types/kibana.jsonc +++ b/packages/shared-ux/page/no_data/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-no-data-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data_config/impl/kibana.jsonc b/packages/shared-ux/page/no_data_config/impl/kibana.jsonc index e6c838b061329..2668487c0f89c 100644 --- a/packages/shared-ux/page/no_data_config/impl/kibana.jsonc +++ b/packages/shared-ux/page/no_data_config/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-page-no-data-config", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data_config/mocks/kibana.jsonc b/packages/shared-ux/page/no_data_config/mocks/kibana.jsonc index 19341c81182a0..0fbbdb79a737c 100644 --- a/packages/shared-ux/page/no_data_config/mocks/kibana.jsonc +++ b/packages/shared-ux/page/no_data_config/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-page-no-data-config-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/no_data_config/types/kibana.jsonc b/packages/shared-ux/page/no_data_config/types/kibana.jsonc index f2e1ed111e2c4..18ed5f19579f6 100644 --- a/packages/shared-ux/page/no_data_config/types/kibana.jsonc +++ b/packages/shared-ux/page/no_data_config/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-page-no-data-config-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/page/solution_nav/kibana.jsonc b/packages/shared-ux/page/solution_nav/kibana.jsonc index e8aa313b0f600..a25a8801bc543 100644 --- a/packages/shared-ux/page/solution_nav/kibana.jsonc +++ b/packages/shared-ux/page/solution_nav/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-page-solution-nav", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/prompt/no_data_views/impl/kibana.jsonc b/packages/shared-ux/prompt/no_data_views/impl/kibana.jsonc index 963fc95624f2e..8f2ad49cf2d7c 100644 --- a/packages/shared-ux/prompt/no_data_views/impl/kibana.jsonc +++ b/packages/shared-ux/prompt/no_data_views/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-prompt-no-data-views", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/prompt/no_data_views/mocks/kibana.jsonc b/packages/shared-ux/prompt/no_data_views/mocks/kibana.jsonc index a962fd080e86b..2fdec6e9814c8 100644 --- a/packages/shared-ux/prompt/no_data_views/mocks/kibana.jsonc +++ b/packages/shared-ux/prompt/no_data_views/mocks/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-prompt-no-data-views-mocks", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/prompt/no_data_views/types/kibana.jsonc b/packages/shared-ux/prompt/no_data_views/types/kibana.jsonc index 3ea8eacae3409..ff1f00dec660a 100644 --- a/packages/shared-ux/prompt/no_data_views/types/kibana.jsonc +++ b/packages/shared-ux/prompt/no_data_views/types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/shared-ux-prompt-no-data-views-types", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/prompt/not_found/kibana.jsonc b/packages/shared-ux/prompt/not_found/kibana.jsonc index fe3ad23f35c85..183c6f9330537 100644 --- a/packages/shared-ux/prompt/not_found/kibana.jsonc +++ b/packages/shared-ux/prompt/not_found/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-prompt-not-found", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/router/impl/kibana.jsonc b/packages/shared-ux/router/impl/kibana.jsonc index 57433ea556f5c..0f0222f7f7010 100644 --- a/packages/shared-ux/router/impl/kibana.jsonc +++ b/packages/shared-ux/router/impl/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-router", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/storybook/mock/kibana.jsonc b/packages/shared-ux/storybook/mock/kibana.jsonc index ac21cf1df4b22..7d6451c4d2e6d 100644 --- a/packages/shared-ux/storybook/mock/kibana.jsonc +++ b/packages/shared-ux/storybook/mock/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-storybook-mock", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/packages/shared-ux/table_persist/kibana.jsonc b/packages/shared-ux/table_persist/kibana.jsonc index 4a29533855f99..1885d24038200 100644 --- a/packages/shared-ux/table_persist/kibana.jsonc +++ b/packages/shared-ux/table_persist/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/shared-ux-table-persist", - "owner": "@elastic/appex-sharedux" -} + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/packages/shared-ux/table_persist/src/use_table_persist.test.ts b/packages/shared-ux/table_persist/src/use_table_persist.test.ts index 51fbd93f7a214..9c88c97b8244a 100644 --- a/packages/shared-ux/table_persist/src/use_table_persist.test.ts +++ b/packages/shared-ux/table_persist/src/use_table_persist.test.ts @@ -8,7 +8,7 @@ */ import { CriteriaWithPagination } from '@elastic/eui'; -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useEuiTablePersist } from './use_table_persist'; import { createStorage } from './storage'; // Mock this if it's external diff --git a/renovate.json b/renovate.json index 08c842400d671..96af2c90b498d 100644 --- a/renovate.json +++ b/renovate.json @@ -260,6 +260,53 @@ ], "enabled": true }, + { + "groupName": "@elastic/fleet dependencies", + "matchDepNames": [ + "exponential-backoff", + "@paralleldrive/cuid2", + "isbinaryfile", + "js-search", + "openpgp", + "remark-gfm", + "@types/js-search" + ], + "reviewers": [ + "team:fleet" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Fleet", + "release_note:skip", + "backport:all-open" + ], + "enabled": true + }, + { + "groupName": "@elastic/kibana-cloud-security-posture dependencies", + "matchDepNames": [ + "@mswjs/http-middleware", + "@types/byte-size", + "byte-size", + "msw", + "xterm" + ], + "reviewers": [ + "team:kibana-cloud-security-posture" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Cloud Security", + "release_note:skip", + "backport:all-open" + ], + "enabled": true, + "minimumReleaseAge": "7 days" + }, { "groupName": "@elastic/charts", "matchDepNames": [ @@ -1013,27 +1060,6 @@ "minimumReleaseAge": "7 days", "enabled": true }, - { - "groupName": "TTY Output", - "matchDepNames": [ - "xterm", - "byte-size", - "@types/byte-size" - ], - "reviewers": [ - "team:sec-cloudnative-integrations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team: AWP: Visualization", - "release_note:skip", - "backport:skip" - ], - "minimumReleaseAge": "7 days", - "enabled": true - }, { "groupName": "Cloud Defend", "matchDepNames": [ @@ -1166,25 +1192,6 @@ "minimumReleaseAge": "7 days", "enabled": true }, - { - "groupName": "MSW", - "matchPackageNames": [ - "msw" - ], - "reviewers": [ - "team:kibana-cloud-security-posture" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Cloud Security", - "release_note:skip", - "backport:skip" - ], - "minimumReleaseAge": "7 days", - "enabled": true - }, { "groupName": "re2js", "matchDepNames": [ @@ -1245,9 +1252,9 @@ "enabled": true }, { - "groupName": "@mswjs/http-middleware", + "groupName": "@xyflow/react", "matchPackageNames": [ - "@mswjs/http-middleware" + "@xyflow/react" ], "reviewers": [ "team:kibana-cloud-security-posture" @@ -1258,15 +1265,15 @@ "labels": [ "Team:Cloud Security", "release_note:skip", - "backport:skip" + "backport:all-open" ], "minimumReleaseAge": "7 days", "enabled": true }, { - "groupName": "@xyflow/react", + "groupName": "@dagrejs/dagre", "matchPackageNames": [ - "@xyflow/react" + "@dagrejs/dagre" ], "reviewers": [ "team:kibana-cloud-security-posture" @@ -1277,36 +1284,28 @@ "labels": [ "Team:Cloud Security", "release_note:skip", - "backport:skip" + "backport:all-open" ], "minimumReleaseAge": "7 days", "enabled": true }, { - "groupName": "@dagrejs/dagre", - "matchPackageNames": [ - "@dagrejs/dagre" + "groupName": "@elastic/request-converter", + "matchDepNames": [ + "@elastic/request-converter" ], "reviewers": [ - "team:kibana-cloud-security-posture" + "team:kibana-management" ], "matchBaseBranches": [ "main" ], "labels": [ - "Team:Cloud Security", "release_note:skip", - "backport:skip" + "backport:skip", + "Team:Kibana Management", + "Feature:Console" ], - "minimumReleaseAge": "7 days", - "enabled": true - }, - { - "groupName": "@elastic/request-converter", - "matchDepNames": ["@elastic/request-converter"], - "reviewers": ["team:kibana-management"], - "matchBaseBranches": ["main"], - "labels": ["release_note:skip", "backport:skip", "Team:Kibana Management", "Feature:Console"], "enabled": true } ], diff --git a/src/core/kibana.jsonc b/src/core/kibana.jsonc index 40487ceb89e41..60cca7e819e2d 100644 --- a/src/core/kibana.jsonc +++ b/src/core/kibana.jsonc @@ -2,6 +2,8 @@ "type": "core", "id": "@kbn/core", "owner": "@elastic/kibana-core", + "group": "platform", + "visibility": "shared", "description": "The core plugin has core functionality", "serviceFolders": ["http", "saved_objects", "chrome", "application"] } diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 52149cd611be3..e222f2db927b9 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -157,7 +157,7 @@ export type { } from '@kbn/core-user-profile-server'; export { CspConfig } from '@kbn/core-http-server-internal'; -export { CoreKibanaRequest, kibanaResponseFactory } from '@kbn/core-http-router-server-internal'; +export { kibanaResponseFactory } from '@kbn/core-http-router-server-internal'; export type { AuthenticationHandler, @@ -200,7 +200,6 @@ export type { KibanaRequestRoute, KibanaRequestRouteOptions, IKibanaResponse, - LifecycleResponseFactory, KnownHeaders, ErrorHttpResponseOptions, IKibanaSocket, diff --git a/src/plugins/charts/public/mocks.ts b/src/plugins/charts/public/mocks.ts index be8abb0dec22f..aa7518d1df9f1 100644 --- a/src/plugins/charts/public/mocks.ts +++ b/src/plugins/charts/public/mocks.ts @@ -10,7 +10,6 @@ import { ChartsPlugin } from './plugin'; import { themeServiceMock } from './services/theme/mock'; import { activeCursorMock } from './services/active_cursor/mock'; -import { colorsServiceMock } from './services/legacy_colors/mock'; import { getPaletteRegistry, paletteServiceMock } from './services/palettes/mock'; export { MOCK_SPARKLINE_THEME } from './services/theme/mock'; @@ -19,16 +18,14 @@ export type Setup = jest.Mocked>; export type Start = jest.Mocked>; const createSetupContract = (): Setup => ({ - legacyColors: colorsServiceMock, theme: themeServiceMock, - palettes: paletteServiceMock.setup({} as any), + palettes: paletteServiceMock.setup(), }); const createStartContract = (): Start => ({ - legacyColors: colorsServiceMock, theme: themeServiceMock, activeCursor: activeCursorMock, - palettes: paletteServiceMock.setup({} as any), + palettes: paletteServiceMock.setup(), }); export const chartPluginMock = { diff --git a/src/plugins/charts/public/plugin.ts b/src/plugins/charts/public/plugin.ts index f376a1664a514..4d058c3beea32 100644 --- a/src/plugins/charts/public/plugin.ts +++ b/src/plugins/charts/public/plugin.ts @@ -11,7 +11,7 @@ import { Plugin, CoreSetup } from '@kbn/core/public'; import { ExpressionsSetup } from '@kbn/expressions-plugin/public'; import { palette, systemPalette } from '../common'; -import { ThemeService, LegacyColorsService } from './services'; +import { ThemeService } from './services'; import { PaletteService } from './services/palettes/service'; import { ActiveCursor } from './services/active_cursor'; @@ -21,7 +21,6 @@ interface SetupDependencies { /** @public */ export interface ChartsPluginSetup { - legacyColors: Omit; theme: Omit; palettes: ReturnType; } @@ -34,7 +33,6 @@ export type ChartsPluginStart = ChartsPluginSetup & { /** @public */ export class ChartsPlugin implements Plugin { private readonly themeService = new ThemeService(); - private readonly legacyColorsService = new LegacyColorsService(); private readonly paletteService = new PaletteService(); private readonly activeCursor = new ActiveCursor(); @@ -44,13 +42,11 @@ export class ChartsPlugin implements Plugin(); - -describe('Vislib Color Service', () => { - const colors = new LegacyColorsService(); - const mockUiSettings = coreMock.createSetup().uiSettings; - mockUiSettings.get.mockImplementation((a) => config.get(a)); - mockUiSettings.set.mockImplementation((...a) => config.set(...a) as any); - colors.init(mockUiSettings); - - let color: any; - let previousConfig: any; - - const arr = ['good', 'better', 'best', 'never', 'let', 'it', 'rest']; - const arrayOfNumbers = [1, 2, 3, 4, 5]; - const arrayOfUndefinedValues = [undefined, undefined, undefined]; - const arrayOfObjects = [{}, {}, {}]; - const arrayOfBooleans = [true, false, true]; - const arrayOfNullValues = [null, null, null]; - const emptyObject = {}; - const nullValue = null; - - beforeEach(() => { - previousConfig = config.get(COLOR_MAPPING_SETTING); - config.set(COLOR_MAPPING_SETTING, {}); - color = colors.createColorLookupFunction(arr, {}); - }); - - afterEach(() => { - config.set(COLOR_MAPPING_SETTING, previousConfig); - }); - - it('should throw error if not initialized', () => { - const colorsBad = new LegacyColorsService(); - - expect(() => colorsBad.createColorLookupFunction(arr, {})).toThrowError(); - }); - - it('should throw an error if input is not an array', () => { - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(200); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction('help'); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(true); - }).toThrowError(); - - expect(() => { - colors.createColorLookupFunction(); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(nullValue); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(emptyObject); - }).toThrowError(); - }); - - describe('when array is not composed of numbers, strings, or undefined values', () => { - it('should throw an error', () => { - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(arrayOfObjects); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(arrayOfBooleans); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(arrayOfNullValues); - }).toThrowError(); - }); - }); - - describe('when input is an array of strings, numbers, or undefined values', () => { - it('should not throw an error', () => { - expect(() => { - colors.createColorLookupFunction(arr); - }).not.toThrowError(); - - expect(() => { - colors.createColorLookupFunction(arrayOfNumbers); - }).not.toThrowError(); - - expect(() => { - // @ts-expect-error - colors.createColorLookupFunction(arrayOfUndefinedValues); - }).not.toThrowError(); - }); - }); - - it('should be a function', () => { - expect(typeof colors.createColorLookupFunction).toBe('function'); - }); - - it('should return a function', () => { - expect(typeof color).toBe('function'); - }); - - it('should return the first hex color in the seed colors array', () => { - expect(color(arr[0])).toBe(seedColors[0]); - }); - - it('should return the value from the mapped colors', () => { - expect(color(arr[1])).toBe(colors.mappedColors.get(arr[1])); - }); - - it('should return the value from the specified color mapping overrides', () => { - const colorFn = colors.createColorLookupFunction(arr, { good: 'red' }); - expect(colorFn('good')).toBe('red'); - }); -}); diff --git a/src/plugins/charts/public/services/legacy_colors/colors.ts b/src/plugins/charts/public/services/legacy_colors/colors.ts deleted file mode 100644 index b2369dfdc7ebc..0000000000000 --- a/src/plugins/charts/public/services/legacy_colors/colors.ts +++ /dev/null @@ -1,64 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import _ from 'lodash'; - -import { CoreSetup } from '@kbn/core/public'; - -import { MappedColors } from '../mapped_colors'; -import { seedColors } from '../../static/colors'; - -/** - * Accepts an array of strings or numbers that are used to create a - * a lookup table that associates the values (key) with a hex color (value). - * Returns a function that accepts a value (i.e. a string or number) - * and returns a hex color associated with that value. - */ -export class LegacyColorsService { - private _mappedColors?: MappedColors; - - public readonly seedColors = seedColors; - - public get mappedColors() { - if (!this._mappedColors) { - throw new Error('ColorService not yet initialized'); - } - - return this._mappedColors; - } - - init(uiSettings: CoreSetup['uiSettings']) { - this._mappedColors = new MappedColors(uiSettings); - } - - createColorLookupFunction( - arrayOfStringsOrNumbers?: Array, - colorMapping: Partial> = {} - ) { - if (!Array.isArray(arrayOfStringsOrNumbers)) { - throw new Error( - `createColorLookupFunction expects an array but recived: ${typeof arrayOfStringsOrNumbers}` - ); - } - - arrayOfStringsOrNumbers.forEach(function (val) { - if (!_.isString(val) && !_.isNumber(val) && !_.isUndefined(val)) { - throw new TypeError( - 'createColorLookupFunction expects an array of strings, numbers, or undefined values' - ); - } - }); - - this.mappedColors.mapKeys(arrayOfStringsOrNumbers); - - return (value: string | number) => { - return colorMapping[value] || this.mappedColors.get(value); - }; - } -} diff --git a/src/plugins/charts/public/services/legacy_colors/colors_palette.test.ts b/src/plugins/charts/public/services/legacy_colors/colors_palette.test.ts deleted file mode 100644 index b055256ca8b2d..0000000000000 --- a/src/plugins/charts/public/services/legacy_colors/colors_palette.test.ts +++ /dev/null @@ -1,87 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { seedColors } from '../../static/colors'; -import { createColorPalette } from '../../static/colors'; - -describe('Color Palette', () => { - const num1 = 45; - const num2 = 72; - const num3 = 90; - const string = 'Welcome'; - const bool = true; - const nullValue = null; - const emptyArr: [] = []; - const emptyObject = {}; - let colorPalette: string[]; - - beforeEach(() => { - colorPalette = createColorPalette(num1); - }); - - it('should throw an error if input is not a number', () => { - expect(() => { - // @ts-expect-error - createColorPalette(string); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - createColorPalette(bool); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - createColorPalette(nullValue); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - createColorPalette(emptyArr); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - createColorPalette(emptyObject); - }).toThrowError(); - - expect(() => { - // @ts-expect-error - createColorPalette(); - }).toThrowError(); - }); - - it('should be a function', () => { - expect(typeof createColorPalette).toBe('function'); - }); - - it('should return an array', () => { - expect(colorPalette).toBeInstanceOf(Array); - }); - - it('should return an array of the same length as the input', () => { - expect(colorPalette.length).toBe(num1); - }); - - it('should return the seed color array when input length is 72', () => { - expect(createColorPalette(num2)[71]).toBe(seedColors[71]); - }); - - it('should return an array of the same length as the input when input is greater than 72', () => { - expect(createColorPalette(num3).length).toBe(num3); - }); - - it('should create new darker colors when input is greater than 72', () => { - expect(createColorPalette(num3)[72]).not.toEqual(seedColors[0]); - }); - - it('should create new colors and convert them correctly', () => { - expect(createColorPalette(num3)[72]).toEqual('#404ABF'); - }); -}); diff --git a/src/plugins/charts/public/services/mapped_colors/mapped_colors.test.ts b/src/plugins/charts/public/services/mapped_colors/mapped_colors.test.ts index 9ca3d62758248..bee3ac2006f63 100644 --- a/src/plugins/charts/public/services/mapped_colors/mapped_colors.test.ts +++ b/src/plugins/charts/public/services/mapped_colors/mapped_colors.test.ts @@ -8,128 +8,33 @@ */ import _ from 'lodash'; -import Color from 'color'; - -import { coreMock } from '@kbn/core/public/mocks'; -import { COLOR_MAPPING_SETTING } from '../../../common'; -import { seedColors } from '../../static/colors'; import { MappedColors } from './mapped_colors'; -// Local state for config -const config = new Map(); - describe('Mapped Colors', () => { - const mockUiSettings = coreMock.createSetup().uiSettings; - mockUiSettings.get.mockImplementation((a) => config.get(a)); - mockUiSettings.set.mockImplementation((...a) => config.set(...a) as any); - - const mappedColors = new MappedColors(mockUiSettings); - let previousConfig: any; - - beforeEach(() => { - previousConfig = config.get(COLOR_MAPPING_SETTING); - mappedColors.purge(); - }); - - afterEach(() => { - config.set(COLOR_MAPPING_SETTING, previousConfig); - }); - it('should properly map keys to unique colors', () => { - config.set(COLOR_MAPPING_SETTING, {}); - - const arr = [1, 2, 3, 4, 5]; - mappedColors.mapKeys(arr); - expect(_(mappedColors.mapping).values().uniq().size()).toBe(arr.length); - }); - - it('should not include colors used by the config', () => { - const newConfig = { bar: seedColors[0] }; - config.set(COLOR_MAPPING_SETTING, newConfig); - - const arr = ['foo', 'baz', 'qux']; - mappedColors.mapKeys(arr); - - const colorValues = _(mappedColors.mapping).values(); - expect(colorValues).not.toContain(seedColors[0]); - expect(colorValues.uniq().size()).toBe(arr.length); - }); - - it('should create a unique array of colors even when config is set', () => { - const newConfig = { bar: seedColors[0] }; - config.set(COLOR_MAPPING_SETTING, newConfig); - - const arr = ['foo', 'bar', 'baz', 'qux']; - mappedColors.mapKeys(arr); - - const expectedSize = _(arr).difference(_.keys(newConfig)).size(); - expect(_(mappedColors.mapping).values().uniq().size()).toBe(expectedSize); - expect(mappedColors.get(arr[0])).not.toBe(seedColors[0]); - }); - - it('should treat different formats of colors as equal', () => { - const color = new Color(seedColors[0]); - const rgb = `rgb(${color.red()}, ${color.green()}, ${color.blue()})`; - const newConfig = { bar: rgb }; - config.set(COLOR_MAPPING_SETTING, newConfig); - - const arr = ['foo', 'bar', 'baz', 'qux']; - mappedColors.mapKeys(arr); - - const expectedSize = _(arr).difference(_.keys(newConfig)).size(); - expect(_(mappedColors.mapping).values().uniq().size()).toBe(expectedSize); - expect(mappedColors.get(arr[0])).not.toBe(seedColors[0]); - expect(mappedColors.get('bar')).toBe(seedColors[0]); - }); - - it('should have a flush method that moves the current map to the old map', function () { + const mappedColors = new MappedColors(); const arr = [1, 2, 3, 4, 5]; mappedColors.mapKeys(arr); - expect(_.keys(mappedColors.mapping).length).toBe(5); - expect(_.keys(mappedColors.oldMap).length).toBe(0); - - mappedColors.flush(); - - expect(_.keys(mappedColors.oldMap).length).toBe(5); - expect(_.keys(mappedColors.mapping).length).toBe(0); - - mappedColors.flush(); - - expect(_.keys(mappedColors.oldMap).length).toBe(0); - expect(_.keys(mappedColors.mapping).length).toBe(0); - }); - it('should use colors in the oldMap if they are available', function () { - const arr = [1, 2, 3, 4, 5]; - mappedColors.mapKeys(arr); + expect(_(mappedColors.mapping).values().uniq().size()).toBe(arr.length); expect(_.keys(mappedColors.mapping).length).toBe(5); - expect(_.keys(mappedColors.oldMap).length).toBe(0); - - mappedColors.flush(); - - mappedColors.mapKeys([3, 4, 5]); - expect(_.keys(mappedColors.oldMap).length).toBe(5); - expect(_.keys(mappedColors.mapping).length).toBe(3); - - expect(mappedColors.mapping[1]).toBe(undefined); - expect(mappedColors.mapping[2]).toBe(undefined); - expect(mappedColors.mapping[3]).toEqual(mappedColors.oldMap[3]); - expect(mappedColors.mapping[4]).toEqual(mappedColors.oldMap[4]); - expect(mappedColors.mapping[5]).toEqual(mappedColors.oldMap[5]); }); - it('should have a purge method that clears both maps', function () { + it('should allow to map keys multiple times and add new colors when doing so', function () { + const mappedColors = new MappedColors(); const arr = [1, 2, 3, 4, 5]; mappedColors.mapKeys(arr); - mappedColors.flush(); - mappedColors.mapKeys(arr); - - expect(_.keys(mappedColors.mapping).length).toBe(5); - expect(_.keys(mappedColors.oldMap).length).toBe(5); - - mappedColors.purge(); - - expect(_.keys(mappedColors.mapping).length).toBe(0); - expect(_.keys(mappedColors.oldMap).length).toBe(0); + mappedColors.mapKeys([6, 7]); + + expect(_.keys(mappedColors.mapping).length).toBe(7); + expect(mappedColors.mapping).toEqual({ + '1': '#00a69b', + '2': '#57c17b', + '3': '#6f87d8', + '4': '#663db8', + '5': '#bc52bc', + '6': '#9e3533', + '7': '#daa05d', + }); }); }); diff --git a/src/plugins/charts/public/services/mapped_colors/mapped_colors.ts b/src/plugins/charts/public/services/mapped_colors/mapped_colors.ts index 9295d7642c97d..a1342ff076c42 100644 --- a/src/plugins/charts/public/services/mapped_colors/mapped_colors.ts +++ b/src/plugins/charts/public/services/mapped_colors/mapped_colors.ts @@ -8,84 +8,37 @@ */ import _ from 'lodash'; -import Color from 'color'; - -import { CoreSetup } from '@kbn/core/public'; - -import { COLOR_MAPPING_SETTING } from '../../../common'; import { createColorPalette } from '../../static/colors'; -const standardizeColor = (color: string) => new Color(color).hex().toLowerCase(); - /** * Maintains a lookup table that associates the value (key) with a hex color (value) * across the visualizations. * Provides functions to interact with the lookup table */ export class MappedColors { - private _oldMap: any; private _mapping: any; - constructor( - private uiSettings?: CoreSetup['uiSettings'], - private colorPaletteFn: (num: number) => string[] = createColorPalette - ) { - this._oldMap = {}; + constructor(private colorPaletteFn: (num: number) => string[] = createColorPalette) { this._mapping = {}; } - private getConfigColorMapping(): Record { - return _.mapValues(this.uiSettings?.get(COLOR_MAPPING_SETTING) || {}, standardizeColor); - } - - public get oldMap(): any { - return this._oldMap; - } - public get mapping(): any { return this._mapping; } get(key: string | number) { - return this.getConfigColorMapping()[key as any] || this._mapping[key]; - } - - getColorFromConfig(key: string | number) { - return this.getConfigColorMapping()[key as any]; - } - - flush() { - this._oldMap = _.clone(this._mapping); - this._mapping = {}; - } - - purge() { - this._oldMap = {}; - this._mapping = {}; + return this._mapping[key]; } mapKeys(keys: Array) { - const configMapping = this.getConfigColorMapping(); - const configColors = _.values(configMapping); - const oldColors = _.values(this._oldMap); - const keysToMap: Array = []; _.each(keys, (key) => { - // If this key is mapped in the config, it's unnecessary to have it mapped here - if (configMapping[key as any]) delete this._mapping[key]; - - // If this key is mapped to a color used by the config color mapping, we need to remap it - if (_.includes(configColors, this._mapping[key])) keysToMap.push(key); - - // if key exist in oldMap, move it to mapping - if (this._oldMap[key]) this._mapping[key] = this._oldMap[key]; - // If this key isn't mapped, we need to map it if (this.get(key) == null) keysToMap.push(key); }); // Generate a color palette big enough that all new keys can have unique color values - const allColors = _(this._mapping).values().union(configColors).union(oldColors).value(); + const allColors = _(this._mapping).values().value(); const colorPalette = this.colorPaletteFn(allColors.length + keysToMap.length); let newColors = _.difference(colorPalette, allColors); diff --git a/src/plugins/charts/public/services/palettes/palettes.test.tsx b/src/plugins/charts/public/services/palettes/palettes.test.tsx index ead33f6d099b6..a9567b0c12179 100644 --- a/src/plugins/charts/public/services/palettes/palettes.test.tsx +++ b/src/plugins/charts/public/services/palettes/palettes.test.tsx @@ -7,14 +7,12 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { PaletteDefinition } from '@kbn/coloring'; -import { createColorPalette as createLegacyColorPalette } from '../..'; import { buildPalettes } from './palettes'; -import { colorsServiceMock } from '../legacy_colors/mock'; import { euiPaletteColorBlind, euiPaletteColorBlindBehindText } from '@elastic/eui'; describe('palettes', () => { - const palettes: Record = buildPalettes(colorsServiceMock); + const palettes = buildPalettes(); + describe('default palette', () => { describe('syncColors: false', () => { it('should return different colors based on behind text flag', () => { @@ -294,147 +292,6 @@ describe('palettes', () => { }); }); - describe('legacy palette', () => { - const palette = palettes.kibana_palette; - - beforeEach(() => { - (colorsServiceMock.mappedColors.mapKeys as jest.Mock).mockClear(); - (colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock).mockReset(); - (colorsServiceMock.mappedColors.get as jest.Mock).mockClear(); - }); - - describe('syncColors: false', () => { - it('should not query legacy color service', () => { - palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: false, - } - ); - expect(colorsServiceMock.mappedColors.mapKeys).not.toHaveBeenCalled(); - expect(colorsServiceMock.mappedColors.get).not.toHaveBeenCalled(); - }); - - it('should respect the advanced settings color mapping', () => { - const configColorGetter = colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock; - configColorGetter.mockImplementation(() => 'blue'); - const result = palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 2, - totalSeriesAtDepth: 10, - }, - { - name: 'def', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: false, - } - ); - expect(result).toEqual('blue'); - expect(configColorGetter).toHaveBeenCalledWith('abc'); - }); - - it('should return a color from the legacy palette based on position of first series', () => { - const result = palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 2, - totalSeriesAtDepth: 10, - }, - { - name: 'def', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: false, - } - ); - expect(result).toEqual(createLegacyColorPalette(20)[2]); - }); - }); - - describe('syncColors: true', () => { - it('should query legacy color service', () => { - palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: true, - } - ); - expect(colorsServiceMock.mappedColors.mapKeys).toHaveBeenCalledWith(['abc']); - expect(colorsServiceMock.mappedColors.get).toHaveBeenCalledWith('abc'); - }); - - it('should respect the advanced settings color mapping', () => { - const configColorGetter = colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock; - configColorGetter.mockImplementation(() => 'blue'); - const result = palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 2, - totalSeriesAtDepth: 10, - }, - { - name: 'def', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: false, - } - ); - expect(result).toEqual('blue'); - expect(configColorGetter).toHaveBeenCalledWith('abc'); - }); - - it('should always use root series', () => { - palette.getCategoricalColor( - [ - { - name: 'abc', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - { - name: 'def', - rankAtDepth: 0, - totalSeriesAtDepth: 10, - }, - ], - { - syncColors: true, - } - ); - expect(colorsServiceMock.mappedColors.mapKeys).toHaveBeenCalledTimes(1); - expect(colorsServiceMock.mappedColors.mapKeys).toHaveBeenCalledWith(['abc']); - expect(colorsServiceMock.mappedColors.get).toHaveBeenCalledTimes(1); - expect(colorsServiceMock.mappedColors.get).toHaveBeenCalledWith('abc'); - }); - }); - }); - describe('custom palette', () => { const palette = palettes.custom; it('should return different colors based on rank at current series', () => { diff --git a/src/plugins/charts/public/services/palettes/palettes.tsx b/src/plugins/charts/public/services/palettes/palettes.tsx index 512606762d536..fc9d2370694bf 100644 --- a/src/plugins/charts/public/services/palettes/palettes.tsx +++ b/src/plugins/charts/public/services/palettes/palettes.tsx @@ -23,19 +23,20 @@ import { } from '@elastic/eui'; import type { ChartColorConfiguration, PaletteDefinition, SeriesLayer } from '@kbn/coloring'; import { flatten, zip } from 'lodash'; -import { ChartsPluginSetup, createColorPalette as createLegacyColorPalette } from '../..'; +import { createColorPalette as createLegacyColorPalette } from '../..'; import { lightenColor } from './lighten_color'; -import { LegacyColorsService } from '../legacy_colors'; import { MappedColors } from '../mapped_colors'; import { workoutColorForValue } from './helpers'; -function buildRoundRobinCategoricalWithMappedColors(): Omit { - const colors = euiPaletteColorBlind({ rotations: 2 }); - const behindTextColors = euiPaletteColorBlindBehindText({ rotations: 2 }); +function buildRoundRobinCategoricalWithMappedColors( + id = 'default', + colors = euiPaletteColorBlind({ rotations: 2 }), + behindTextColors = euiPaletteColorBlindBehindText({ rotations: 2 }) +): Omit { const behindTextColorMap: Record = Object.fromEntries( zip(colors, behindTextColors) ); - const mappedColors = new MappedColors(undefined, (num: number) => { + const mappedColors = new MappedColors((num: number) => { return flatten(new Array(Math.ceil(num / 10)).fill(colors)).map((color) => color.toLowerCase()); }); function getColor( @@ -61,9 +62,9 @@ function buildRoundRobinCategoricalWithMappedColors(): Omit euiPaletteColorBlind(), + getCategoricalColors: () => colors.slice(0, 10), toExpression: () => ({ type: 'expression', chain: [ @@ -71,7 +72,7 @@ function buildRoundRobinCategoricalWithMappedColors(): Omit { - const staticColors = createLegacyColorPalette(20); - function getColor(series: SeriesLayer[], chartConfiguration: ChartColorConfiguration = {}) { - let outputColor: string; - if (chartConfiguration.syncColors) { - colors.mappedColors.mapKeys([series[0].name]); - outputColor = colors.mappedColors.get(series[0].name); - } else { - const configColor = colors.mappedColors.getColorFromConfig(series[0].name); - outputColor = configColor || staticColors[series[0].rankAtDepth % staticColors.length]; - } - - if (!chartConfiguration.maxDepth || chartConfiguration.maxDepth === 1) { - return outputColor; - } - - return lightenColor(outputColor, series.length, chartConfiguration.maxDepth); - } - return { - id: 'kibana_palette', - getCategoricalColor: getColor, - getCategoricalColors: () => colors.seedColors.slice(0, 10), - toExpression: () => ({ - type: 'expression', - chain: [ - { - type: 'function', - function: 'system_palette', - arguments: { - name: ['kibana_palette'], - }, - }, - ], - }), - }; -} - function buildCustomPalette(): PaletteDefinition { return { id: 'custom', @@ -258,54 +220,50 @@ function buildCustomPalette(): PaletteDefinition { } as PaletteDefinition; } -export const buildPalettes: ( - legacyColorsService: LegacyColorsService -) => Record = (legacyColorsService) => { - return { - default: { - title: i18n.translate('charts.palettes.defaultPaletteLabel', { defaultMessage: 'Default' }), - ...buildRoundRobinCategoricalWithMappedColors(), - }, - status: { - title: i18n.translate('charts.palettes.statusLabel', { defaultMessage: 'Status' }), - ...buildGradient('status', euiPaletteForStatus), - }, - temperature: { - title: i18n.translate('charts.palettes.temperatureLabel', { defaultMessage: 'Temperature' }), - ...buildGradient('temperature', euiPaletteForTemperature), - }, - complementary: { - title: i18n.translate('charts.palettes.complementaryLabel', { - defaultMessage: 'Complementary', - }), - ...buildGradient('complementary', euiPaletteComplementary), - }, - negative: { - title: i18n.translate('charts.palettes.negativeLabel', { defaultMessage: 'Negative' }), - ...buildGradient('negative', euiPaletteRed), - }, - positive: { - title: i18n.translate('charts.palettes.positiveLabel', { defaultMessage: 'Positive' }), - ...buildGradient('positive', euiPaletteGreen), - }, - cool: { - title: i18n.translate('charts.palettes.coolLabel', { defaultMessage: 'Cool' }), - ...buildGradient('cool', euiPaletteCool), - }, - warm: { - title: i18n.translate('charts.palettes.warmLabel', { defaultMessage: 'Warm' }), - ...buildGradient('warm', euiPaletteWarm), - }, - gray: { - title: i18n.translate('charts.palettes.grayLabel', { defaultMessage: 'Gray' }), - ...buildGradient('gray', euiPaletteGray), - }, - kibana_palette: { - title: i18n.translate('charts.palettes.kibanaPaletteLabel', { - defaultMessage: 'Compatibility', - }), - ...buildSyncedKibanaPalette(legacyColorsService), - }, - custom: buildCustomPalette() as PaletteDefinition, - }; -}; +export const buildPalettes = (): Record => ({ + default: { + title: i18n.translate('charts.palettes.defaultPaletteLabel', { defaultMessage: 'Default' }), + ...buildRoundRobinCategoricalWithMappedColors(), + }, + status: { + title: i18n.translate('charts.palettes.statusLabel', { defaultMessage: 'Status' }), + ...buildGradient('status', euiPaletteForStatus), + }, + temperature: { + title: i18n.translate('charts.palettes.temperatureLabel', { defaultMessage: 'Temperature' }), + ...buildGradient('temperature', euiPaletteForTemperature), + }, + complementary: { + title: i18n.translate('charts.palettes.complementaryLabel', { + defaultMessage: 'Complementary', + }), + ...buildGradient('complementary', euiPaletteComplementary), + }, + negative: { + title: i18n.translate('charts.palettes.negativeLabel', { defaultMessage: 'Negative' }), + ...buildGradient('negative', euiPaletteRed), + }, + positive: { + title: i18n.translate('charts.palettes.positiveLabel', { defaultMessage: 'Positive' }), + ...buildGradient('positive', euiPaletteGreen), + }, + cool: { + title: i18n.translate('charts.palettes.coolLabel', { defaultMessage: 'Cool' }), + ...buildGradient('cool', euiPaletteCool), + }, + warm: { + title: i18n.translate('charts.palettes.warmLabel', { defaultMessage: 'Warm' }), + ...buildGradient('warm', euiPaletteWarm), + }, + gray: { + title: i18n.translate('charts.palettes.grayLabel', { defaultMessage: 'Gray' }), + ...buildGradient('gray', euiPaletteGray), + }, + kibana_palette: { + title: i18n.translate('charts.palettes.kibanaPaletteLabel', { + defaultMessage: 'Compatibility', + }), + ...buildRoundRobinCategoricalWithMappedColors('kibana_palette', createLegacyColorPalette(20)), + }, + custom: buildCustomPalette() as PaletteDefinition, +}); diff --git a/src/plugins/charts/public/services/palettes/service.ts b/src/plugins/charts/public/services/palettes/service.ts index 920486c9dcbb5..30c58172ad429 100644 --- a/src/plugins/charts/public/services/palettes/service.ts +++ b/src/plugins/charts/public/services/palettes/service.ts @@ -11,7 +11,6 @@ import type { PaletteRegistry, PaletteDefinition } from '@kbn/coloring'; import { getActivePaletteName } from '@kbn/coloring'; import type { ExpressionsSetup } from '@kbn/expressions-plugin/public'; import type { ChartsPluginSetup } from '../..'; -import type { LegacyColorsService } from '../legacy_colors'; export interface PaletteSetupPlugins { expressions: ExpressionsSetup; @@ -22,12 +21,12 @@ export class PaletteService { private palettes: Record> | undefined = undefined; constructor() {} - public setup(colorsService: LegacyColorsService) { + public setup() { return { getPalettes: async (): Promise => { if (!this.palettes) { const { buildPalettes } = await import('./palettes'); - this.palettes = buildPalettes(colorsService); + this.palettes = buildPalettes(); } return { get: (name: string) => { diff --git a/src/plugins/charts/server/plugin.ts b/src/plugins/charts/server/plugin.ts index 9be0b9172c153..9859cc72edd0f 100644 --- a/src/plugins/charts/server/plugin.ts +++ b/src/plugins/charts/server/plugin.ts @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; import { CoreSetup, Plugin } from '@kbn/core/server'; import { ExpressionsServerSetup } from '@kbn/expressions-plugin/server'; -import { COLOR_MAPPING_SETTING, LEGACY_TIME_AXIS, palette, systemPalette } from '../common'; +import { LEGACY_TIME_AXIS, palette, systemPalette } from '../common'; interface SetupDependencies { expressions: ExpressionsServerSetup; @@ -22,32 +22,6 @@ export class ChartsServerPlugin implements Plugin { dependencies.expressions.registerFunction(palette); dependencies.expressions.registerFunction(systemPalette); core.uiSettings.register({ - [COLOR_MAPPING_SETTING]: { - name: i18n.translate('charts.advancedSettings.visualization.colorMappingTitle', { - defaultMessage: 'Color mapping', - }), - value: JSON.stringify({ - Count: '#00A69B', - }), - type: 'json', - description: i18n.translate('charts.advancedSettings.visualization.colorMappingText', { - defaultMessage: - 'Maps values to specific colors in charts using the Compatibility palette.', - values: { strong: (chunks) => `${chunks}` }, - }), - deprecation: { - message: i18n.translate( - 'charts.advancedSettings.visualization.colorMappingTextDeprecation', - { - defaultMessage: - 'This setting is deprecated and will not be supported in a future version.', - } - ), - docLinksKey: 'visualizationSettings', - }, - category: ['visualization'], - schema: schema.string(), - }, [LEGACY_TIME_AXIS]: { name: i18n.translate('charts.advancedSettings.visualization.useLegacyTimeAxis.name', { defaultMessage: 'Legacy chart time axis', diff --git a/src/plugins/console/public/application/containers/editor/utils/requests_utils.test.ts b/src/plugins/console/public/application/containers/editor/utils/requests_utils.test.ts index 29c975300db6b..504afdadb6038 100644 --- a/src/plugins/console/public/application/containers/editor/utils/requests_utils.test.ts +++ b/src/plugins/console/public/application/containers/editor/utils/requests_utils.test.ts @@ -426,6 +426,17 @@ describe('requests_utils', () => { expect(request).toEqual({ method: 'GET', url: '_search', data: ['{\n "query": {}\n}'] }); }); + it('correctly handles nested braces', () => { + const content = ['GET _search', '{', ' "query": "{a} {b}"', '}', '{', ' "query": {}', '}']; + const model = getMockModel(content); + const request = getRequestFromEditor(model, 1, 7); + expect(request).toEqual({ + method: 'GET', + url: '_search', + data: ['{\n "query": "{a} {b}"\n}', '{\n "query": {}\n}'], + }); + }); + it('works for several request bodies', () => { const content = ['GET _search', '{', ' "query": {}', '}', '{', ' "query": {}', '}']; const model = getMockModel(content); diff --git a/src/plugins/console/public/application/containers/editor/utils/requests_utils.ts b/src/plugins/console/public/application/containers/editor/utils/requests_utils.ts index 123daf919cf22..628e111df7836 100644 --- a/src/plugins/console/public/application/containers/editor/utils/requests_utils.ts +++ b/src/plugins/console/public/application/containers/editor/utils/requests_utils.ts @@ -271,23 +271,61 @@ const replaceVariables = ( return text; }; +/** + * Splits a concatenated string of JSON objects into individual JSON objects. + * + * This function takes a string containing one or more JSON objects concatenated together, + * separated by optional whitespace, and splits them into an array of individual JSON strings. + * It ensures that nested objects and strings containing braces do not interfere with the splitting logic. + * + * Example inputs: + * - '{ "query": "test"} { "query": "test" }' -> ['{ "query": "test"}', '{ "query": "test" }'] + * - '{ "query": "test"}' -> ['{ "query": "test"}'] + * - '{ "query": "{a} {b}"}' -> ['{ "query": "{a} {b}"}'] + * + */ const splitDataIntoJsonObjects = (dataString: string): string[] => { - const jsonSplitRegex = /}\s*{/; - if (dataString.match(jsonSplitRegex)) { - return dataString.split(jsonSplitRegex).map((part, index, parts) => { - let restoredBracketsString = part; - // add an opening bracket to all parts except the 1st - if (index > 0) { - restoredBracketsString = `{${restoredBracketsString}`; + const jsonObjects = []; + // Tracks the depth of nested braces + let depth = 0; + // Holds the current JSON object as we iterate + let currentObject = ''; + // Tracks whether the current position is inside a string + let insideString = false; + + // Iterate through each character in the input string + for (let i = 0; i < dataString.length; i++) { + const char = dataString[i]; + // Append the character to the current JSON object string + currentObject += char; + + // If the character is a double quote and it is not escaped, toggle the `insideString` state + if (char === '"' && dataString[i - 1] !== '\\') { + insideString = !insideString; + } else if (!insideString) { + // Only modify depth if not inside a string + + if (char === '{') { + depth++; + } else if (char === '}') { + depth--; } - // add a closing bracket to all parts except the last - if (index < parts.length - 1) { - restoredBracketsString = `${restoredBracketsString}}`; + + // If depth is zero, we have completed a JSON object + if (depth === 0) { + jsonObjects.push(currentObject.trim()); + currentObject = ''; } - return restoredBracketsString; - }); + } } - return [dataString]; + + // If there's remaining data in currentObject, add it as the last JSON object + if (currentObject.trim()) { + jsonObjects.push(currentObject.trim()); + } + + // Filter out any empty strings from the result array + return jsonObjects.filter((obj) => obj !== ''); }; const cleanUpWhitespaces = (line: string): string => { diff --git a/src/plugins/content_management/public/content_client/content_client_mutation_hooks.test.tsx b/src/plugins/content_management/public/content_client/content_client_mutation_hooks.test.tsx index d2ad215f46e4c..6e77a6c9c47da 100644 --- a/src/plugins/content_management/public/content_client/content_client_mutation_hooks.test.tsx +++ b/src/plugins/content_management/public/content_client/content_client_mutation_hooks.test.tsx @@ -8,7 +8,7 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { ContentClientProvider } from './content_client_context'; import { ContentClient } from './content_client'; import { createCrudClientMock } from '../crud_client/crud_client.mock'; @@ -46,12 +46,10 @@ describe('useCreateContentMutation', () => { const input: CreateIn = { contentTypeId: 'testType', data: { foo: 'bar' }, version: 2 }; const output = { test: 'test' }; crudClient.create.mockResolvedValueOnce(output); - const { result, waitFor } = renderHook(() => useCreateContentMutation(), { wrapper: Wrapper }); + const { result } = renderHook(() => useCreateContentMutation(), { wrapper: Wrapper }); result.current.mutate(input); - await waitFor(() => result.current.isSuccess); - - expect(result.current.data).toEqual(output); + await waitFor(() => expect(result.current.data).toEqual(output)); }); }); @@ -66,12 +64,10 @@ describe('useUpdateContentMutation', () => { }; const output = { test: 'test' }; crudClient.update.mockResolvedValueOnce(output); - const { result, waitFor } = renderHook(() => useUpdateContentMutation(), { wrapper: Wrapper }); + const { result } = renderHook(() => useUpdateContentMutation(), { wrapper: Wrapper }); result.current.mutate(input); - await waitFor(() => result.current.isSuccess); - - expect(result.current.data).toEqual(output); + await waitFor(() => expect(result.current.data).toEqual(output)); }); }); @@ -81,11 +77,9 @@ describe('useDeleteContentMutation', () => { const input: DeleteIn = { contentTypeId: 'testType', id: 'test', version: 2 }; const output = { test: 'test' }; crudClient.delete.mockResolvedValueOnce(output); - const { result, waitFor } = renderHook(() => useDeleteContentMutation(), { wrapper: Wrapper }); + const { result } = renderHook(() => useDeleteContentMutation(), { wrapper: Wrapper }); result.current.mutate(input); - await waitFor(() => result.current.isSuccess); - - expect(result.current.data).toEqual(output); + await waitFor(() => expect(result.current.data).toEqual(output)); }); }); diff --git a/src/plugins/content_management/public/content_client/content_client_query_hooks.test.tsx b/src/plugins/content_management/public/content_client/content_client_query_hooks.test.tsx index 8cffde7ebd051..266e94641936e 100644 --- a/src/plugins/content_management/public/content_client/content_client_query_hooks.test.tsx +++ b/src/plugins/content_management/public/content_client/content_client_query_hooks.test.tsx @@ -8,7 +8,7 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { ContentClientProvider } from './content_client_context'; import { ContentClient } from './content_client'; import { createCrudClientMock } from '../crud_client/crud_client.mock'; @@ -42,9 +42,8 @@ describe('useGetContentQuery', () => { const input: GetIn = { id: 'test', contentTypeId: 'testType', version: 2 }; const output = { test: 'test' }; crudClient.get.mockResolvedValueOnce(output); - const { result, waitFor } = renderHook(() => useGetContentQuery(input), { wrapper: Wrapper }); - await waitFor(() => result.current.isSuccess); - expect(result.current.data).toEqual(output); + const { result } = renderHook(() => useGetContentQuery(input), { wrapper: Wrapper }); + await waitFor(() => expect(result.current.data).toEqual(output)); }); }); @@ -54,10 +53,9 @@ describe('useSearchContentQuery', () => { const input: SearchIn = { contentTypeId: 'testType', query: {}, version: 2 }; const output = { hits: [{ id: 'test' }] }; crudClient.search.mockResolvedValueOnce(output); - const { result, waitFor } = renderHook(() => useSearchContentQuery(input), { + const { result } = renderHook(() => useSearchContentQuery(input), { wrapper: Wrapper, }); - await waitFor(() => result.current.isSuccess); - expect(result.current.data).toEqual(output); + await waitFor(() => expect(result.current.data).toEqual(output)); }); }); diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/add_new_panel/use_get_dashboard_panels.test.ts b/src/plugins/dashboard/public/dashboard_app/top_nav/add_new_panel/use_get_dashboard_panels.test.ts index 7a5a77bfc14fe..0bd8d95dc7916 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/add_new_panel/use_get_dashboard_panels.test.ts +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/add_new_panel/use_get_dashboard_panels.test.ts @@ -17,7 +17,7 @@ import { VisualizationsStart, type BaseVisType, } from '@kbn/visualizations-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { uiActionsService, visualizationsService } from '../../../services/kibana_services'; import { useGetDashboardPanels } from './use_get_dashboard_panels'; diff --git a/src/plugins/dashboard/public/dashboard_listing/hooks/use_dashboard_listing_table.test.tsx b/src/plugins/dashboard/public/dashboard_listing/hooks/use_dashboard_listing_table.test.tsx index 61b7bf402bc13..3c4388903992d 100644 --- a/src/plugins/dashboard/public/dashboard_listing/hooks/use_dashboard_listing_table.test.tsx +++ b/src/plugins/dashboard/public/dashboard_listing/hooks/use_dashboard_listing_table.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { getDashboardBackupService } from '../../services/dashboard_backup_service'; import { getDashboardContentManagementService } from '../../services/dashboard_content_management_service'; diff --git a/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.test.tsx b/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.test.tsx index acfaaf7daba3e..edffaa1c32530 100644 --- a/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.test.tsx +++ b/src/plugins/discover/public/application/context/hooks/use_context_app_fetch.test.tsx @@ -8,7 +8,7 @@ */ import React from 'react'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { createFilterManagerMock } from '@kbn/data-plugin/public/query/filter_manager/filter_manager.mock'; import { CONTEXT_TIE_BREAKER_FIELDS_SETTING } from '@kbn/discover-utils'; import { DiscoverServices } from '../../../build_services'; @@ -106,7 +106,7 @@ const initDefaults = (tieBreakerFields: string[], dataViewId = 'the-data-view-id return { result: renderHook(() => useContextAppFetch(props.props), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + wrapper: ({ children }: React.PropsWithChildren) => ( {children} ), }).result, diff --git a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx index e14b5afc30d04..287b5a60386f4 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx @@ -9,7 +9,7 @@ import React, { ReactElement } from 'react'; import { AggregateQuery, Query } from '@kbn/es-query'; -import { act, renderHook, WrapperComponent } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { BehaviorSubject, Subject } from 'rxjs'; import { FetchStatus } from '../../../types'; import type { DiscoverStateContainer } from '../../state_management/discover_state'; @@ -121,9 +121,7 @@ describe('useDiscoverHistogram', () => { hideChart, }; - const Wrapper: WrapperComponent> = ({ - children, - }) => ( + const Wrapper = ({ children }: React.PropsWithChildren) => ( {children as ReactElement} ); diff --git a/src/plugins/discover/public/application/main/components/layout/use_fetch_more_records.test.tsx b/src/plugins/discover/public/application/main/components/layout/use_fetch_more_records.test.tsx index 4bab0f75e87e6..eeb0cd8ccb1b4 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_fetch_more_records.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/use_fetch_more_records.test.tsx @@ -8,10 +8,10 @@ */ import { BehaviorSubject } from 'rxjs'; -import { renderHook, WrapperComponent } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { buildDataTableRecord } from '@kbn/discover-utils'; import { dataViewMock, esHitsMockWithSort } from '@kbn/discover-utils/src/__mocks__'; -import { useFetchMoreRecords, UseFetchMoreRecordsParams } from './use_fetch_more_records'; +import { useFetchMoreRecords } from './use_fetch_more_records'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; import { DataDocuments$, @@ -47,10 +47,8 @@ describe('useFetchMoreRecords', () => { return stateContainer; }; - const getWrapper = ( - stateContainer: DiscoverStateContainer - ): WrapperComponent> => { - return ({ children }) => ( + const getWrapper = (stateContainer: DiscoverStateContainer) => { + return ({ children }: React.PropsWithChildren) => ( <>{children} diff --git a/src/plugins/discover/public/application/main/components/top_nav/use_top_nav_links.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/use_top_nav_links.test.tsx index 2c51d57a32615..a70b200a74346 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/use_top_nav_links.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/use_top_nav_links.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { dataViewMock } from '@kbn/discover-utils/src/__mocks__'; import { useTopNavLinks } from './use_top_nav_links'; import { DiscoverServices } from '../../../../build_services'; diff --git a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx index 9f3fe7004f5f6..486c477c8833e 100644 --- a/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx +++ b/src/plugins/discover/public/application/main/hooks/use_esql_mode.test.tsx @@ -8,8 +8,7 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; -import { waitFor } from '@testing-library/react'; +import { waitFor, renderHook } from '@testing-library/react'; import { DataViewsContract } from '@kbn/data-plugin/public'; import { discoverServiceMock } from '../../../__mocks__/services'; import { useEsqlMode } from './use_esql_mode'; @@ -76,8 +75,10 @@ const getDataViewsService = () => { }; const getHookContext = (stateContainer: DiscoverStateContainer) => { - return ({ children }: { children: JSX.Element }) => ( - {children} + return ({ children }: React.PropsWithChildren) => ( + + <>{children} + ); }; const renderHookWithContext = ( diff --git a/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts b/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts index 53d66419cabac..ccade68ff2c8d 100644 --- a/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { discoverServiceMock } from '../../../__mocks__/services'; import { useInspector } from './use_inspector'; import { Adapters, RequestAdapter } from '@kbn/inspector-plugin/common'; diff --git a/src/plugins/discover/public/application/main/hooks/use_url.test.ts b/src/plugins/discover/public/application/main/hooks/use_url.test.ts index 427765eac1325..24c6fe6af303d 100644 --- a/src/plugins/discover/public/application/main/hooks/use_url.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_url.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { createSearchSessionMock } from '../../../__mocks__/search_session'; import { useUrl } from './use_url'; import { diff --git a/src/plugins/discover/public/application/main/state_management/discover_state_provider.tsx b/src/plugins/discover/public/application/main/state_management/discover_state_provider.tsx index d5bbbd0b7c39b..2266a7d5276f7 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_state_provider.tsx +++ b/src/plugins/discover/public/application/main/state_management/discover_state_provider.tsx @@ -57,10 +57,9 @@ export const { export const DiscoverMainProvider = ({ value, children, -}: { +}: React.PropsWithChildren<{ value: DiscoverStateContainer; - children: React.ReactElement; -}) => { +}>) => { return ( diff --git a/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx b/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx index 88dffdfa1ce6a..df96e4ee57a37 100644 --- a/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx +++ b/src/plugins/discover/public/context_awareness/hooks/use_additional_cell_actions.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { DISCOVER_CELL_ACTION_TYPE, createCellAction, @@ -76,7 +76,7 @@ describe('useAdditionalCellActions', () => { }; const render = () => { - return renderHook((props) => useAdditionalCellActions(props), { + return renderHook(useAdditionalCellActions, { initialProps, wrapper: ({ children }) => ( {children} @@ -90,6 +90,7 @@ describe('useAdditionalCellActions', () => { afterEach(() => { mockUuid = 0; + jest.clearAllMocks(); }); it('should return metadata', async () => { @@ -108,7 +109,7 @@ describe('useAdditionalCellActions', () => { expect(mockActions).toHaveLength(1); expect(mockTriggerActions[DISCOVER_CELL_ACTIONS_TRIGGER.id]).toEqual(['root-action-2']); await act(() => discoverServiceMock.profilesManager.resolveDataSourceProfile({})); - rerender(); + rerender(initialProps); expect(result.current.instanceId).toEqual('3'); expect(mockActions).toHaveLength(2); expect(mockTriggerActions[DISCOVER_CELL_ACTIONS_TRIGGER.id]).toEqual([ diff --git a/src/plugins/discover/public/context_awareness/hooks/use_profile_accessor.test.ts b/src/plugins/discover/public/context_awareness/hooks/use_profile_accessor.test.ts index 65f6f7fb3f30a..b079115d69288 100644 --- a/src/plugins/discover/public/context_awareness/hooks/use_profile_accessor.test.ts +++ b/src/plugins/discover/public/context_awareness/hooks/use_profile_accessor.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { AppliedProfile, getMergedAccessor } from '../composable_profile'; import { useProfileAccessor } from './use_profile_accessor'; import { getDataTableRecords } from '../../__fixtures__/real_hits'; diff --git a/src/plugins/discover/public/context_awareness/hooks/use_profiles.test.tsx b/src/plugins/discover/public/context_awareness/hooks/use_profiles.test.tsx index b42fc1c4b3c49..ad142371aebb5 100644 --- a/src/plugins/discover/public/context_awareness/hooks/use_profiles.test.tsx +++ b/src/plugins/discover/public/context_awareness/hooks/use_profiles.test.tsx @@ -8,7 +8,7 @@ */ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import React from 'react'; import { discoverServiceMock } from '../../__mocks__/services'; import type { GetProfilesOptions } from '../profiles_manager'; diff --git a/src/plugins/discover/public/context_awareness/hooks/use_root_profile.test.tsx b/src/plugins/discover/public/context_awareness/hooks/use_root_profile.test.tsx index 26c3aa2df3f15..d6984eb94cb42 100644 --- a/src/plugins/discover/public/context_awareness/hooks/use_root_profile.test.tsx +++ b/src/plugins/discover/public/context_awareness/hooks/use_root_profile.test.tsx @@ -8,7 +8,7 @@ */ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, act, renderHook } from '@testing-library/react'; import React from 'react'; import { discoverServiceMock } from '../../__mocks__/services'; import { useRootProfile } from './use_root_profile'; @@ -37,31 +37,34 @@ describe('useRootProfile', () => { }); it('should return rootProfileLoading as true', async () => { - const { result, waitForNextUpdate } = render(); + const { result } = render(); expect(result.current.rootProfileLoading).toBe(true); expect((result.current as Record).AppWrapper).toBeUndefined(); // avoid act warning - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); }); it('should return rootProfileLoading as false', async () => { - const { result, waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(result.current.rootProfileLoading).toBe(false); - expect((result.current as Record).AppWrapper).toBeDefined(); + const { result } = render(); + await waitFor(() => { + expect(result.current.rootProfileLoading).toBe(false); + expect((result.current as Record).AppWrapper).toBeDefined(); + }); }); it('should return rootProfileLoading as true when solutionNavId changes', async () => { - const { result, rerender, waitForNextUpdate } = render(); - await waitForNextUpdate(); - expect(result.current.rootProfileLoading).toBe(false); - expect((result.current as Record).AppWrapper).toBeDefined(); + const { result, rerender } = render(); + await waitFor(() => { + expect(result.current.rootProfileLoading).toBe(false); + expect((result.current as Record).AppWrapper).toBeDefined(); + }); act(() => mockSolutionNavId$.next('newSolutionNavId')); rerender(); expect(result.current.rootProfileLoading).toBe(true); expect((result.current as Record).AppWrapper).toBeUndefined(); - await waitForNextUpdate(); - expect(result.current.rootProfileLoading).toBe(false); - expect((result.current as Record).AppWrapper).toBeDefined(); + await waitFor(() => { + expect(result.current.rootProfileLoading).toBe(false); + expect((result.current as Record).AppWrapper).toBeDefined(); + }); }); }); diff --git a/src/plugins/discover/public/customizations/customization_provider.test.tsx b/src/plugins/discover/public/customizations/customization_provider.test.tsx index 7dbdc9e3c3475..4b871c4ae8b7b 100644 --- a/src/plugins/discover/public/customizations/customization_provider.test.tsx +++ b/src/plugins/discover/public/customizations/customization_provider.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import React from 'react'; import { getDiscoverStateMock } from '../__mocks__/discover_state.mock'; import { diff --git a/src/plugins/discover/public/embeddable/get_search_embeddable_factory.test.tsx b/src/plugins/discover/public/embeddable/get_search_embeddable_factory.test.tsx index b1c589f3e1d84..621703ad3991b 100644 --- a/src/plugins/discover/public/embeddable/get_search_embeddable_factory.test.tsx +++ b/src/plugins/discover/public/embeddable/get_search_embeddable_factory.test.tsx @@ -18,7 +18,7 @@ import { BuildReactEmbeddableApiRegistration } from '@kbn/embeddable-plugin/publ import { PresentationContainer } from '@kbn/presentation-containers'; import { PhaseEvent, PublishesUnifiedSearch, StateComparators } from '@kbn/presentation-publishing'; import { VIEW_MODE } from '@kbn/saved-search-plugin/common'; -import { act, render } from '@testing-library/react'; +import { act, render, waitFor } from '@testing-library/react'; import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { createDataViewDataSource } from '../../common/data_sources'; @@ -143,8 +143,10 @@ describe('saved search embeddable', () => { expect(api.dataLoading.getValue()).toBe(false); expect(discoverComponent.queryByTestId('embeddedSavedSearchDocTable')).toBeInTheDocument(); - expect(discoverComponent.getByTestId('embeddedSavedSearchDocTable').textContent).toEqual( - 'No results found' + await waitFor(() => + expect(discoverComponent.getByTestId('embeddedSavedSearchDocTable').textContent).toEqual( + 'No results found' + ) ); }); diff --git a/src/plugins/discover/public/hooks/saved_search_alias_match_redirect.test.ts b/src/plugins/discover/public/hooks/saved_search_alias_match_redirect.test.ts index c1c6c4ac0e963..4e4469188d0b8 100644 --- a/src/plugins/discover/public/hooks/saved_search_alias_match_redirect.test.ts +++ b/src/plugins/discover/public/hooks/saved_search_alias_match_redirect.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { History } from 'history'; import { useSavedSearchAliasMatchRedirect } from './saved_search_alias_match_redirect'; diff --git a/src/plugins/discover/public/hooks/use_data_view.test.tsx b/src/plugins/discover/public/hooks/use_data_view.test.tsx index 5ef2194ab8db1..9e8a1c8a1fd44 100644 --- a/src/plugins/discover/public/hooks/use_data_view.test.tsx +++ b/src/plugins/discover/public/hooks/use_data_view.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useDataView } from './use_data_view'; const adhocDataView = { @@ -38,11 +38,11 @@ const mockServices = { const render = async ({ dataViewId }: { dataViewId: string }) => { const hookResult = renderHook(() => useDataView({ index: dataViewId }), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + wrapper: ({ children }: React.PropsWithChildren) => ( {children} ), }); - await hookResult.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); return hookResult; }; diff --git a/src/plugins/discover/public/hooks/use_navigation_props.test.tsx b/src/plugins/discover/public/hooks/use_navigation_props.test.tsx index 36c86e01a9bb9..16b02b44d4340 100644 --- a/src/plugins/discover/public/hooks/use_navigation_props.test.tsx +++ b/src/plugins/discover/public/hooks/use_navigation_props.test.tsx @@ -8,7 +8,7 @@ */ import React, { MouseEvent } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useNavigationProps } from './use_navigation_props'; import type { DataView } from '@kbn/data-views-plugin/public'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -65,7 +65,7 @@ const render = async () => { ), } ); - await renderResult.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); return renderResult; }; diff --git a/src/plugins/discover_shared/kibana.jsonc b/src/plugins/discover_shared/kibana.jsonc index 88d67ab96bd65..84729ad8f5fdb 100644 --- a/src/plugins/discover_shared/kibana.jsonc +++ b/src/plugins/discover_shared/kibana.jsonc @@ -2,6 +2,8 @@ "type": "plugin", "id": "@kbn/discover-shared-plugin", "owner": ["@elastic/kibana-data-discovery", "@elastic/obs-ux-logs-team"], + "group": "platform", + "visibility": "shared", "description": "A stateful layer to register shared features and provide an access point to discover without a direct dependency", "plugin": { "id": "discoverShared", diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx index 6457f721ddd16..a7a6fab89973c 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.test.tsx @@ -9,8 +9,7 @@ import React from 'react'; import { waitFor } from '@testing-library/react'; -import { render } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, renderHook } from '@testing-library/react'; import { HelloWorldEmbeddable, HelloWorldEmbeddableFactoryDefinition, @@ -28,7 +27,7 @@ describe('useEmbeddableFactory', () => { ); doStart(); - const { result, waitForNextUpdate } = renderHook(() => + const { result } = renderHook(() => useEmbeddableFactory({ factory: getFactory(), input: { id: 'hello' } }) ); @@ -36,10 +35,10 @@ describe('useEmbeddableFactory', () => { expect(loading).toBe(true); - await waitForNextUpdate(); - - const [embeddable] = result.current; - expect(embeddable).toBeDefined(); + await waitFor(() => { + const [embeddable] = result.current; + expect(embeddable).toBeDefined(); + }); }); }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index c4202cf6f92e2..0a3aeb2eaa1c8 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -62,10 +62,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'long', _meta: { description: 'Non-default value of setting.' }, }, - 'visualization:colorMapping': { - type: 'text', - _meta: { description: 'Non-default value of setting.' }, - }, 'visualization:useLegacyTimeAxis': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.test.ts index 9a9ae9b57f591..164b7a7e319b5 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.test.ts @@ -54,10 +54,15 @@ describe('telemetry_application_usage_collector', () => { test('fetch()', async () => { uiSettingsClient.getUserProvided.mockImplementationOnce(async () => ({ - 'visualization:colorMapping': { userValue: 'red' }, + 'timepicker:timeDefaults': { + userValue: { + from: 'now-7d', + to: 'now-6d', + }, + }, })); await expect(collector.fetch(mockedFetchContext)).resolves.toEqual({ - 'visualization:colorMapping': 'red', + 'timepicker:timeDefaults': { from: 'now-7d', to: 'now-6d' }, }); }); diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index e4b10f038a75a..9796436007357 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -58,7 +58,6 @@ export interface UsageStats { 'observability:aiAssistantSimulatedFunctionCalling': boolean; 'observability:aiAssistantSearchConnectorIndexPattern': string; 'visualization:heatmap:maxBuckets': number; - 'visualization:colorMapping': string; 'visualization:useLegacyTimeAxis': boolean; 'visualization:regionmap:showWarnings': boolean; 'visualization:tileMap:maxPrecision': number; diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.test.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.test.tsx index 298dd98d9a2b1..3f06b154fdb55 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.test.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.test.tsx @@ -8,8 +8,7 @@ */ import React, { useEffect, useState } from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, screen, fireEvent, renderHook } from '@testing-library/react'; import { usePresentationPanelTitleClickHandler } from './presentation_panel_title'; describe('usePresentationPanelTitleClickHandler', () => { diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 78f8b4f2f7b38..511ab4cf89bfc 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -9960,12 +9960,6 @@ "description": "Non-default value of setting." } }, - "visualization:colorMapping": { - "type": "text", - "_meta": { - "description": "Non-default value of setting." - } - }, "visualization:useLegacyTimeAxis": { "type": "boolean", "_meta": { diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts index 6d0a8c5dfc96c..7bcfb2d7aa071 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/test_filters.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { useTableFilters, diff --git a/src/plugins/unified_doc_viewer/public/hooks/use_es_doc_search.test.tsx b/src/plugins/unified_doc_viewer/public/hooks/use_es_doc_search.test.tsx index f86cd00f14ce1..dac1f46e4b424 100644 --- a/src/plugins/unified_doc_viewer/public/hooks/use_es_doc_search.test.tsx +++ b/src/plugins/unified_doc_viewer/public/hooks/use_es_doc_search.test.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { type EsDocSearchProps, buildSearchBody, useEsDocSearch } from './use_es_doc_search'; import { Subject } from 'rxjs'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -281,13 +281,14 @@ describe('Test of helper / hook', () => { }, }); mockSearchResult.complete(); - await hook.waitForNextUpdate(); }); - expect(hook.result.current.slice(0, 2)).toEqual([ - ElasticRequestState.Found, - buildDataTableRecord(record), - ]); + await waitFor(() => + expect(hook.result.current.slice(0, 2)).toEqual([ + ElasticRequestState.Found, + buildDataTableRecord(record), + ]) + ); }); test('useEsDocSearch for text based languages', async () => { diff --git a/src/plugins/unified_histogram/public/__mocks__/lens_vis.ts b/src/plugins/unified_histogram/public/__mocks__/lens_vis.ts index b27b654a88f22..9b59403e569b3 100644 --- a/src/plugins/unified_histogram/public/__mocks__/lens_vis.ts +++ b/src/plugins/unified_histogram/public/__mocks__/lens_vis.ts @@ -32,7 +32,7 @@ export const getLensVisMock = async ({ breakdownField, dataView, allSuggestions, - hasHistogramSuggestionForESQL, + isTransformationalESQL, table, }: { filters: QueryParams['filters']; @@ -44,7 +44,7 @@ export const getLensVisMock = async ({ timeRange?: TimeRange | null; breakdownField: DataViewField | undefined; allSuggestions?: Suggestion[]; - hasHistogramSuggestionForESQL?: boolean; + isTransformationalESQL?: boolean; table?: Datatable; }): Promise<{ lensService: LensVisService; @@ -60,7 +60,9 @@ export const getLensVisMock = async ({ if ('query' in context && context.query === query) { return allSuggestions; } - return hasHistogramSuggestionForESQL ? [histogramESQLSuggestionMock] : []; + return !isTransformationalESQL && dataView.isTimeBased() + ? [histogramESQLSuggestionMock] + : []; } : lensApi.suggestions, }); diff --git a/src/plugins/unified_histogram/public/chart/chart.test.tsx b/src/plugins/unified_histogram/public/chart/chart.test.tsx index ed00c05f6f179..e127e1a4ab41c 100644 --- a/src/plugins/unified_histogram/public/chart/chart.test.tsx +++ b/src/plugins/unified_histogram/public/chart/chart.test.tsx @@ -44,7 +44,7 @@ async function mountComponent({ isPlainRecord, hasDashboardPermissions, isChartLoading, - hasHistogramSuggestionForESQL, + isTransformationalESQL, }: { customToggle?: ReactElement; noChart?: boolean; @@ -57,7 +57,7 @@ async function mountComponent({ isPlainRecord?: boolean; hasDashboardPermissions?: boolean; isChartLoading?: boolean; - hasHistogramSuggestionForESQL?: boolean; + isTransformationalESQL?: boolean; } = {}) { (searchSourceInstanceMock.fetch$ as jest.Mock).mockImplementation( jest.fn().mockReturnValue(of({ rawResponse: { hits: { total: noHits ? 0 : 2 } } })) @@ -87,7 +87,9 @@ async function mountComponent({ const requestParams = { query: isPlainRecord - ? { esql: 'from logs | limit 10' } + ? isTransformationalESQL + ? { esql: 'from logs | limit 10 | stats var0 = avg(bytes) by extension' } + : { esql: 'from logs | limit 10' } : { language: 'kuery', query: '', @@ -108,7 +110,7 @@ async function mountComponent({ breakdownField: undefined, columns: [], allSuggestions, - hasHistogramSuggestionForESQL, + isTransformationalESQL, }) ).lensService; @@ -211,12 +213,111 @@ describe('Chart', () => { expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); }); - test('render when is text based and not timebased', async () => { - const component = await mountComponent({ isPlainRecord: true, dataView: dataViewMock }); + test('should render when is text based, transformational and non-time-based', async () => { + const component = await mountComponent({ + isPlainRecord: true, + dataView: dataViewMock, + isTransformationalESQL: true, + }); expect( component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() ).toBeTruthy(); expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeTruthy(); + }); + + test('should not render when is text based, non-transformational and non-time-based', async () => { + const component = await mountComponent({ + isPlainRecord: true, + dataView: dataViewMock, + isTransformationalESQL: false, + }); + expect( + component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() + ).toBeTruthy(); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeFalsy(); + }); + + test('should not render when is text based, non-transformational, non-time-based and suggestions are available', async () => { + const component = await mountComponent({ + allSuggestions: allSuggestionsMock, + isPlainRecord: true, + dataView: dataViewMock, + isTransformationalESQL: false, + }); + expect( + component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() + ).toBeTruthy(); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeFalsy(); + }); + + test('should render when is text based, non-transformational and time-based', async () => { + const component = await mountComponent({ + isPlainRecord: true, + isTransformationalESQL: false, + }); + expect( + component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() + ).toBeTruthy(); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeTruthy(); + }); + + test('should render when is text based, transformational and time-based', async () => { + const component = await mountComponent({ + isPlainRecord: true, + isTransformationalESQL: true, + }); + expect( + component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() + ).toBeTruthy(); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeTruthy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeTruthy(); + }); + + test('should not render when is text based, transformational and no suggestions available', async () => { + const component = await mountComponent({ + allSuggestions: [], + isPlainRecord: true, + isTransformationalESQL: true, + }); + expect( + component.find('[data-test-subj="unifiedHistogramToggleChartButton"]').exists() + ).toBeTruthy(); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() + ).toBeFalsy(); + expect( + component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() + ).toBeFalsy(); }); test('render progress bar when text based and request is loading', async () => { @@ -267,35 +368,17 @@ describe('Chart', () => { expect(component.find(BreakdownFieldSelector).exists()).toBeFalsy(); }); - it('should render the edit on the fly button when chart is visible and suggestions exist', async () => { - const component = await mountComponent({ - allSuggestions: allSuggestionsMock, - isPlainRecord: true, - }); - expect( - component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() - ).toBeTruthy(); - }); - - it('should not render the edit on the fly button when chart is visible and suggestions dont exist', async () => { + it('should not render the save button when text-based and the dashboard save by value permissions are false', async () => { const component = await mountComponent({ allSuggestions: [], - hasHistogramSuggestionForESQL: false, - isPlainRecord: true, - }); - expect( - component.find('[data-test-subj="unifiedHistogramEditFlyoutVisualization"]').exists() - ).toBeFalsy(); - }); - - it('should render the save button when chart is visible and suggestions exist', async () => { - const component = await mountComponent({ - allSuggestions: allSuggestionsMock, + isTransformationalESQL: false, isPlainRecord: true, + hasDashboardPermissions: false, }); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); expect( component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() - ).toBeTruthy(); + ).toBeFalsy(); }); it('should not render the save button when the dashboard save by value permissions are false', async () => { @@ -303,6 +386,7 @@ describe('Chart', () => { allSuggestions: allSuggestionsMock, hasDashboardPermissions: false, }); + expect(component.find('[data-test-subj="unifiedHistogramChart"]').exists()).toBeTruthy(); expect( component.find('[data-test-subj="unifiedHistogramSaveVisualization"]').exists() ).toBeFalsy(); diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_chart_actions.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_chart_actions.test.ts index ab8acc7b694fe..94c7c88005f71 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_chart_actions.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_chart_actions.test.ts @@ -7,8 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; -import { act } from 'react-test-renderer'; +import { act, renderHook } from '@testing-library/react'; import { UnifiedHistogramChartContext } from '../../types'; import { useChartActions } from './use_chart_actions'; diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_edit_visualization.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_edit_visualization.test.ts index e64b41e40e547..626950e535616 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_edit_visualization.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_edit_visualization.test.ts @@ -9,9 +9,7 @@ import type { DataView } from '@kbn/data-views-plugin/common'; import type { TypedLensByValueInput } from '@kbn/lens-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; -import { act } from 'react-test-renderer'; -import { setTimeout } from 'timers/promises'; +import { waitFor, renderHook } from '@testing-library/react'; import { dataViewMock } from '../../__mocks__/data_view'; import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; import { unifiedHistogramServicesMock } from '../../__mocks__/services'; @@ -44,8 +42,7 @@ describe('useEditVisualization', () => { lensAttributes, }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeDefined(); + await waitFor(() => expect(hook.result.current).toBeDefined()); hook.result.current!(); expect(navigateToPrefilledEditor).toHaveBeenCalledWith({ id: '', @@ -64,8 +61,7 @@ describe('useEditVisualization', () => { lensAttributes: {} as unknown as TypedLensByValueInput['attributes'], }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeUndefined(); + await waitFor(() => expect(hook.result.current).toBeUndefined()); }); it('should return undefined if the data view is not time based', async () => { @@ -78,8 +74,7 @@ describe('useEditVisualization', () => { lensAttributes: {} as unknown as TypedLensByValueInput['attributes'], }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeUndefined(); + await waitFor(() => expect(hook.result.current).toBeUndefined()); }); it('should return undefined if is on text based mode', async () => { @@ -93,8 +88,7 @@ describe('useEditVisualization', () => { isPlainRecord: true, }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeUndefined(); + await waitFor(() => expect(hook.result.current).toBeUndefined()); }); it('should return undefined if the time field is not visualizable', async () => { @@ -113,8 +107,7 @@ describe('useEditVisualization', () => { lensAttributes: {} as unknown as TypedLensByValueInput['attributes'], }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeUndefined(); + await waitFor(() => expect(hook.result.current).toBeUndefined()); }); it('should return undefined if there are no compatible actions', async () => { @@ -127,7 +120,6 @@ describe('useEditVisualization', () => { lensAttributes: {} as unknown as TypedLensByValueInput['attributes'], }) ); - await act(() => setTimeout(0)); - expect(hook.result.current).toBeUndefined(); + await waitFor(() => expect(hook.result.current).toBeUndefined()); }); }); diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts index 9d1522398b018..d66856bdb4f0d 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts @@ -7,8 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; -import { act } from 'react-test-renderer'; +import { act, renderHook } from '@testing-library/react'; import { Subject } from 'rxjs'; import type { UnifiedHistogramInputMessage } from '../../types'; import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_refetch.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_refetch.test.ts index 3695e08337610..cf8590009062b 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_refetch.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_refetch.test.ts @@ -10,7 +10,7 @@ import { useRefetch } from './use_refetch'; import { DataView } from '@kbn/data-views-plugin/common'; import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { UnifiedHistogramBreakdownContext, UnifiedHistogramChartContext, diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_time_range.test.tsx b/src/plugins/unified_histogram/public/chart/hooks/use_time_range.test.tsx index 0daa6ca6be066..7341dbe451c81 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_time_range.test.tsx +++ b/src/plugins/unified_histogram/public/chart/hooks/use_time_range.test.tsx @@ -9,7 +9,7 @@ import { uiSettingsServiceMock } from '@kbn/core-ui-settings-browser-mocks'; import { TimeRange } from '@kbn/data-plugin/common'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { UnifiedHistogramBucketInterval } from '../../types'; import { useTimeRange } from './use_time_range'; diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_total_hits.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_total_hits.test.ts index 1a6146e6a4c31..4ba57d490db6f 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_total_hits.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_total_hits.test.ts @@ -12,11 +12,10 @@ import { UnifiedHistogramFetchStatus, UnifiedHistogramInput$ } from '../../types import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; import { useTotalHits } from './use_total_hits'; import { useEffect as mockUseEffect } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { searchSourceInstanceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { of, Subject, throwError } from 'rxjs'; -import { waitFor } from '@testing-library/react'; +import { waitFor, renderHook } from '@testing-library/react'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { DataViewType, SearchSourceSearchOptions } from '@kbn/data-plugin/common'; import { expressionsPluginMock } from '@kbn/expressions-plugin/public/mocks'; diff --git a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts index 44a36be34d1ab..5a3356ba9e038 100644 --- a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts +++ b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts @@ -9,8 +9,7 @@ import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/common'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { renderHook } from '@testing-library/react-hooks'; -import { act } from 'react-test-renderer'; +import { waitFor, renderHook, act } from '@testing-library/react'; import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import { convertDatatableColumnToDataViewFieldSpec } from '@kbn/data-view-utils'; import { UnifiedHistogramFetchStatus, UnifiedHistogramSuggestionContext } from '../../types'; @@ -491,7 +490,7 @@ describe('useStateProps', () => { `); }); - it('should execute callbacks correctly', () => { + it('should execute callbacks correctly', async () => { const stateService = getStateService({ initialState }); const { result } = renderHook(() => useStateProps({ @@ -503,6 +502,21 @@ describe('useStateProps', () => { columns: undefined, }) ); + + await waitFor(() => + expect(result.current).toEqual( + expect.objectContaining({ + onTopPanelHeightChange: expect.any(Function), + onTimeIntervalChange: expect.any(Function), + onTotalHitsChange: expect.any(Function), + onChartHiddenChange: expect.any(Function), + onChartLoad: expect.any(Function), + onBreakdownFieldChange: expect.any(Function), + onSuggestionContextChange: expect.any(Function), + }) + ) + ); + const { onTopPanelHeightChange, onTimeIntervalChange, diff --git a/src/plugins/unified_histogram/public/hooks/use_request_params.test.ts b/src/plugins/unified_histogram/public/hooks/use_request_params.test.ts index 33df774f20a33..44624252041f9 100644 --- a/src/plugins/unified_histogram/public/hooks/use_request_params.test.ts +++ b/src/plugins/unified_histogram/public/hooks/use_request_params.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { unifiedHistogramServicesMock } from '../__mocks__/services'; const getUseRequestParams = async () => { diff --git a/src/plugins/unified_histogram/public/hooks/use_stable_callback.test.ts b/src/plugins/unified_histogram/public/hooks/use_stable_callback.test.ts index 7e13f153bc626..db498930c98f8 100644 --- a/src/plugins/unified_histogram/public/hooks/use_stable_callback.test.ts +++ b/src/plugins/unified_histogram/public/hooks/use_stable_callback.test.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useStableCallback } from './use_stable_callback'; describe('useStableCallback', () => { diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts index 75734387a9368..babea0335e1c3 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.attributes.test.ts @@ -765,7 +765,7 @@ describe('LensVisService attributes', () => { columns: [], isPlainRecord: true, allSuggestions: [], // none available - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.visContext?.attributes.state.query).toStrictEqual(histogramQuery); }); diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts index 09ee2a68ec248..baeb330180ab8 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.suggestions.test.ts @@ -86,7 +86,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: false, + isTransformationalESQL: true, }); expect(lensVis.currentSuggestionContext?.type).toBe(UnifiedHistogramSuggestionType.unsupported); @@ -115,7 +115,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.currentSuggestionContext?.type).toBe( @@ -153,7 +153,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.currentSuggestionContext?.type).toBe( @@ -191,7 +191,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: true, }); expect(lensVis.currentSuggestionContext?.type).toBe(UnifiedHistogramSuggestionType.unsupported); @@ -225,7 +225,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.currentSuggestionContext?.type).toBe( @@ -276,7 +276,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: allSuggestionsMock, - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.currentSuggestionContext?.type).toBe( @@ -307,7 +307,7 @@ describe('LensVisService suggestions', () => { ], isPlainRecord: true, allSuggestions: [], - hasHistogramSuggestionForESQL: true, + isTransformationalESQL: false, }); expect(lensVis.currentSuggestionContext?.type).toBe( diff --git a/src/plugins/unified_histogram/public/services/lens_vis_service.ts b/src/plugins/unified_histogram/public/services/lens_vis_service.ts index 04bf810848f29..1f119ee5b1c92 100644 --- a/src/plugins/unified_histogram/public/services/lens_vis_service.ts +++ b/src/plugins/unified_histogram/public/services/lens_vis_service.ts @@ -13,6 +13,7 @@ import { removeDropCommandsFromESQLQuery, appendToESQLQuery, isESQLColumnSortable, + hasTransformationalCommand, } from '@kbn/esql-utils'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import type { @@ -50,7 +51,6 @@ import { injectESQLQueryIntoLensLayers, } from '../utils/external_vis_context'; import { computeInterval } from '../utils/compute_interval'; -import { shouldDisplayHistogram } from '../layout/helpers'; import { enrichLensAttributesWithTablesData } from '../utils/lens_vis_from_table'; const UNIFIED_HISTOGRAM_LAYER_ID = 'unifiedHistogram'; @@ -67,7 +67,6 @@ export enum LensVisServiceStatus { interface LensVisServiceState { status: LensVisServiceStatus; - allSuggestions: Suggestion[] | undefined; currentSuggestionContext: UnifiedHistogramSuggestionContext; visContext: UnifiedHistogramVisContext | undefined; } @@ -87,7 +86,6 @@ export class LensVisService { private lensSuggestionsApi: LensSuggestionsApi; status$: Observable; currentSuggestionContext$: Observable; - allSuggestions$: Observable; visContext$: Observable; prevUpdateContext: | { @@ -111,7 +109,6 @@ export class LensVisService { this.state$ = new BehaviorSubject({ status: LensVisServiceStatus.initial, - allSuggestions: undefined, currentSuggestionContext: { suggestion: undefined, type: UnifiedHistogramSuggestionType.unsupported, @@ -121,7 +118,6 @@ export class LensVisService { const stateSelector = stateSelectorFactory(this.state$); this.status$ = stateSelector((state) => state.status); - this.allSuggestions$ = stateSelector((state) => state.allSuggestions); this.currentSuggestionContext$ = stateSelector( (state) => state.currentSuggestionContext, isEqual @@ -152,15 +148,9 @@ export class LensVisService { externalVisContextStatus: UnifiedHistogramExternalVisContextStatus ) => void; }) => { - const allSuggestions = this.getAllSuggestions({ - queryParams, - preferredVisAttributes: externalVisContext?.attributes, - }); - const suggestionState = this.getCurrentSuggestionState({ externalVisContext, queryParams, - allSuggestions, timeInterval, breakdownField, }); @@ -182,7 +172,6 @@ export class LensVisService { this.state$.next({ status: LensVisServiceStatus.completed, - allSuggestions, currentSuggestionContext: suggestionState.currentSuggestionContext, visContext: lensAttributesState.visContext, }); @@ -225,13 +214,11 @@ export class LensVisService { }; private getCurrentSuggestionState = ({ - allSuggestions, externalVisContext, queryParams, timeInterval, breakdownField, }: { - allSuggestions: Suggestion[]; externalVisContext: UnifiedHistogramVisContext | undefined; queryParams: QueryParams; timeInterval: string | undefined; @@ -242,34 +229,41 @@ export class LensVisService { let type = UnifiedHistogramSuggestionType.unsupported; let currentSuggestion: Suggestion | undefined; - // takes lens suggestions if provided - let availableSuggestionsWithType: Array<{ + const availableSuggestionsWithType: Array<{ suggestion: UnifiedHistogramSuggestionContext['suggestion']; type: UnifiedHistogramSuggestionType; }> = []; - if (allSuggestions.length) { - availableSuggestionsWithType.push({ - suggestion: allSuggestions[0], - type: UnifiedHistogramSuggestionType.lensSuggestion, - }); - } - if (queryParams.isPlainRecord) { - // appends an ES|QL histogram - const histogramSuggestionForESQL = this.getHistogramSuggestionForESQL({ - queryParams, - breakdownField, - preferredVisAttributes: externalVisContext?.attributes, - }); - if (histogramSuggestionForESQL) { - // In case if histogram suggestion, we want to empty the array and push the new suggestion - // to ensure that only the histogram suggestion is available - availableSuggestionsWithType = []; - availableSuggestionsWithType.push({ - suggestion: histogramSuggestionForESQL, - type: UnifiedHistogramSuggestionType.histogramForESQL, - }); + if (isOfAggregateQueryType(queryParams.query)) { + if (hasTransformationalCommand(queryParams.query.esql)) { + // appends the first lens suggestion if available + const allSuggestions = this.getAllSuggestions({ + queryParams, + preferredVisAttributes: externalVisContext?.attributes, + }); + + if (allSuggestions.length) { + availableSuggestionsWithType.push({ + suggestion: allSuggestions[0], + type: UnifiedHistogramSuggestionType.lensSuggestion, + }); + } + } else { + // appends an ES|QL histogram if available + const histogramSuggestionForESQL = this.getHistogramSuggestionForESQL({ + queryParams, + breakdownField, + preferredVisAttributes: externalVisContext?.attributes, + }); + + if (histogramSuggestionForESQL) { + availableSuggestionsWithType.push({ + suggestion: histogramSuggestionForESQL, + type: UnifiedHistogramSuggestionType.histogramForESQL, + }); + } + } } } else { // appends histogram for the data view mode @@ -482,10 +476,13 @@ export class LensVisService { const breakdownColumn = breakdownField?.name ? columns?.find((column) => column.name === breakdownField.name) : undefined; - if (dataView.isTimeBased() && query && isOfAggregateQueryType(query) && timeRange) { - const isOnHistogramMode = shouldDisplayHistogram(query); - if (!isOnHistogramMode) return undefined; + if ( + dataView.isTimeBased() && + timeRange && + isOfAggregateQueryType(query) && + !hasTransformationalCommand(query.esql) + ) { const interval = computeInterval(timeRange, this.services.data); const esqlQuery = this.getESQLHistogramQuery({ dataView, @@ -609,13 +606,17 @@ export class LensVisService { }): Suggestion[] => { const { dataView, columns, query, isPlainRecord } = queryParams; + if (!isPlainRecord || !isOfAggregateQueryType(query)) { + return []; + } + const preferredChartType = preferredVisAttributes ? mapVisToChartType(preferredVisAttributes.visualizationType) : undefined; let visAttributes = preferredVisAttributes; - if (query && isOfAggregateQueryType(query) && preferredVisAttributes) { + if (preferredVisAttributes) { visAttributes = injectESQLQueryIntoLensLayers(preferredVisAttributes, query); } @@ -625,17 +626,16 @@ export class LensVisService { textBasedColumns: columns, query: query && isOfAggregateQueryType(query) ? query : undefined, }; - const allSuggestions = isPlainRecord - ? this.lensSuggestionsApi( - context, - dataView, - ['lnsDatatable'], - preferredChartType, - visAttributes - ) ?? [] - : []; - return allSuggestions; + return ( + this.lensSuggestionsApi( + context, + dataView, + ['lnsDatatable'], + preferredChartType, + visAttributes + ) ?? [] + ); }; private getLensAttributesState = ({ diff --git a/src/plugins/vis_types/timeseries/kibana.jsonc b/src/plugins/vis_types/timeseries/kibana.jsonc index 03cb4697162ed..08d76648220e2 100644 --- a/src/plugins/vis_types/timeseries/kibana.jsonc +++ b/src/plugins/vis_types/timeseries/kibana.jsonc @@ -4,6 +4,7 @@ "owner": [ "@elastic/kibana-visualizations" ], + // currently used from both visualisations and observability/infra "group": "platform", "visibility": "shared", "description": "Registers the TSVB visualization. TSVB has its one editor, works with index patterns and index strings and contains 6 types of charts: timeseries, topN, table. markdown, metric and gauge.", @@ -32,4 +33,4 @@ "fieldFormats" ] } -} \ No newline at end of file +} diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/data.js b/src/plugins/vis_types/vislib/public/vislib/lib/data.js index 94c39c95930af..83c6167d40923 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/data.js +++ b/src/plugins/vis_types/vislib/public/vislib/lib/data.js @@ -45,15 +45,11 @@ class D3MappableObject { * @param attr {Object|*} Visualization options */ export class Data { - constructor(data, uiState, createColorLookupFunction) { + constructor(data, uiState) { this.uiState = uiState; - this.createColorLookupFunction = createColorLookupFunction; this.data = this.copyDataObj(data); this.type = this.getDataType(); this.labels = this._getLabels(this.data); - this.color = this.labels - ? createColorLookupFunction(this.labels, uiState.get('vis.colors')) - : undefined; this._normalizeOrdered(); } @@ -385,7 +381,7 @@ export class Data { const defaultColors = this.uiState.get('vis.defaultColors'); const overwriteColors = this.uiState.get('vis.colors'); const colors = defaultColors ? _.defaults({}, overwriteColors, defaultColors) : overwriteColors; - return this.createColorLookupFunction(this.getLabels(), colors); + return (value) => colors[value]; } /** diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/vis_config.js b/src/plugins/vis_types/vislib/public/vislib/lib/vis_config.js index bb25a8ddaada4..28d0d0c67c277 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/vis_config.js +++ b/src/plugins/vis_types/vislib/public/vislib/lib/vis_config.js @@ -25,8 +25,8 @@ const DEFAULT_VIS_CONFIG = { }; export class VisConfig { - constructor(visConfigArgs, data, uiState, el, createColorLookupFunction) { - this.data = new Data(data, uiState, createColorLookupFunction); + constructor(visConfigArgs, data, uiState, el) { + this.data = new Data(data, uiState); const visType = visTypes[visConfigArgs.type]; const typeDefaults = visType(visConfigArgs, this.data); diff --git a/src/plugins/vis_types/vislib/public/vislib/vis.js b/src/plugins/vis_types/vislib/public/vislib/vis.js index 80f7393d69af2..35241d999f2f2 100644 --- a/src/plugins/vis_types/vislib/public/vislib/vis.js +++ b/src/plugins/vis_types/vislib/public/vislib/vis.js @@ -41,13 +41,7 @@ export class Vis extends EventEmitter { initVisConfig(data, uiState) { this.data = data; this.uiState = uiState; - this.visConfig = new VisConfig( - this.visConfigArgs, - this.data, - this.uiState, - this.element, - this.charts.legacyColors.createColorLookupFunction.bind(this.charts.legacyColors) - ); + this.visConfig = new VisConfig(this.visConfigArgs, this.data, this.uiState, this.element); } /** diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts b/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts index a2f8b1efe8dd3..23363cdb315d7 100644 --- a/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts +++ b/test/functional/apps/discover/context_awareness/extensions/_get_additional_cell_actions.ts @@ -12,7 +12,13 @@ import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'discover', 'header', 'unifiedFieldList']); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'header', + 'unifiedFieldList', + 'context', + ]); const dataViews = getService('dataViews'); const dataGrid = getService('dataGrid'); const browser = getService('browser'); @@ -29,7 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); let alert = await browser.getAlert(); try { @@ -37,7 +43,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -57,7 +63,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 2); + await dataGrid.clickCellExpandButton(0, { columnName: 'message' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( true ); @@ -76,7 +82,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( false ); @@ -94,7 +100,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-logs'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); let alert = await browser.getAlert(); try { @@ -102,7 +108,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -118,7 +124,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.refresh(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); alert = await browser.getAlert(); try { @@ -126,7 +133,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -143,7 +150,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-logs'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 2); + await dataGrid.clickCellExpandButton(0, { columnName: 'message' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( true ); @@ -159,7 +166,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-metrics'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( false ); diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index bf7c41c803f17..71757ecbfcd20 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -115,11 +115,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/many_fields'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); await browser.setWindowSize(1300, 1000); }); after(async () => { await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); + await esArchiver.unload('test/functional/fixtures/es_archiver/many_fields'); await kibanaServer.uiSettings.replace({}); await kibanaServer.savedObjects.cleanStandardList(); }); @@ -192,6 +200,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await discover.getVisContextSuggestionType()).to.be('histogramForDataView'); }); + it('should show no histogram for non-time-based data in data view and ES|QL modes', async () => { + await dataViews.switchToAndValidate('indices-stats*'); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await checkNoVis('50'); + + await discover.selectTextBaseLang(); + await header.waitUntilLoadingHasFinished(); + await discover.waitUntilSearchingHasFinished(); + await checkNoVis('10'); + }); + it('should show ESQL histogram for ES|QL query', async () => { await discover.selectTextBaseLang(); diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index e8a0de7fbc340..8feccfd955c7f 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -597,6 +597,7 @@ export class DiscoverPageObject extends FtrService { if (await this.testSubjects.exists('select-text-based-language-btn')) { await this.testSubjects.click('select-text-based-language-btn'); await this.header.waitUntilLoadingHasFinished(); + await this.waitUntilSearchingHasFinished(); } } diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index 36e5285a529b8..3b17a31d624b6 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -174,12 +174,14 @@ export class DataGridService extends FtrService { private async getCellActionButton( rowIndex: number = 0, - columnIndex: number = 0, + { columnIndex = 0, columnName }: { columnIndex?: number; columnName?: string }, selector: string ): Promise { let actionButton: WebElementWrapper | undefined; await this.retry.try(async () => { - const cell = await this.getCellElement(rowIndex, columnIndex); + const cell = columnName + ? await this.getCellElementByColumnName(rowIndex, columnName) + : await this.getCellElement(rowIndex, columnIndex); await cell.moveMouseTo(); await cell.click(); actionButton = await cell.findByTestSubject(selector); @@ -194,11 +196,15 @@ export class DataGridService extends FtrService { * Clicks grid cell 'expand' action button * @param rowIndex data row index starting from 0 (0 means 1st row) * @param columnIndex column index starting from 0 (0 means 1st column) + * @param columnName column/field name */ - public async clickCellExpandButton(rowIndex: number = 0, columnIndex: number = 0) { + public async clickCellExpandButton( + rowIndex: number = 0, + { columnIndex = 0, columnName }: { columnIndex?: number; columnName?: string } + ) { const actionButton = await this.getCellActionButton( rowIndex, - columnIndex, + { columnIndex, columnName }, 'euiDataGridCellExpandButton' ); await actionButton.moveMouseTo(); @@ -218,7 +224,7 @@ export class DataGridService extends FtrService { columnIndex: number = 0 ) { const controlsCount = await this.getControlColumnsCount(); - await this.clickCellExpandButton(rowIndex, controlsCount + columnIndex); + await this.clickCellExpandButton(rowIndex, { columnIndex: controlsCount + columnIndex }); } /** @@ -244,7 +250,11 @@ export class DataGridService extends FtrService { * @param columnIndex column index starting from 0 (0 means 1st column) */ public async clickCellFilterForButton(rowIndex: number = 0, columnIndex: number = 0) { - const actionButton = await this.getCellActionButton(rowIndex, columnIndex, 'filterForButton'); + const actionButton = await this.getCellActionButton( + rowIndex, + { columnIndex }, + 'filterForButton' + ); await actionButton.moveMouseTo(); await actionButton.click(); } @@ -261,7 +271,7 @@ export class DataGridService extends FtrService { const controlsCount = await this.getControlColumnsCount(); const actionButton = await this.getCellActionButton( rowIndex, - controlsCount + columnIndex, + { columnIndex: controlsCount + columnIndex }, 'filterForButton' ); await actionButton.moveMouseTo(); @@ -269,7 +279,11 @@ export class DataGridService extends FtrService { } public async clickCellFilterOutButton(rowIndex: number = 0, columnIndex: number = 0) { - const actionButton = await this.getCellActionButton(rowIndex, columnIndex, 'filterOutButton'); + const actionButton = await this.getCellActionButton( + rowIndex, + { columnIndex }, + 'filterOutButton' + ); await actionButton.moveMouseTo(); await actionButton.click(); } @@ -281,7 +295,7 @@ export class DataGridService extends FtrService { const controlsCount = await this.getControlColumnsCount(); const actionButton = await this.getCellActionButton( rowIndex, - controlsCount + columnIndex, + { columnIndex: controlsCount + columnIndex }, 'filterOutButton' ); await actionButton.moveMouseTo(); diff --git a/test/kibana.jsonc b/test/kibana.jsonc index f133563c47ca9..7f31b79cff9d0 100644 --- a/test/kibana.jsonc +++ b/test/kibana.jsonc @@ -2,5 +2,7 @@ "type": "test-helper", "id": "@kbn/test-suites-src", "owner": [], + "group": "platform", + "visibility": "shared", "devOnly": true } diff --git a/tsconfig.base.json b/tsconfig.base.json index 3e1d80208f5b4..d69eca86ea546 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -414,6 +414,8 @@ "@kbn/core-http-server-internal/*": ["packages/core/http/core-http-server-internal/*"], "@kbn/core-http-server-mocks": ["packages/core/http/core-http-server-mocks"], "@kbn/core-http-server-mocks/*": ["packages/core/http/core-http-server-mocks/*"], + "@kbn/core-http-server-utils": ["packages/core/http/core-http-server-utils"], + "@kbn/core-http-server-utils/*": ["packages/core/http/core-http-server-utils/*"], "@kbn/core-i18n-browser": ["packages/core/i18n/core-i18n-browser"], "@kbn/core-i18n-browser/*": ["packages/core/i18n/core-i18n-browser/*"], "@kbn/core-i18n-browser-internal": ["packages/core/i18n/core-i18n-browser-internal"], @@ -1562,6 +1564,8 @@ "@kbn/search-indices/*": ["x-pack/plugins/search_indices/*"], "@kbn/search-inference-endpoints": ["x-pack/plugins/search_inference_endpoints"], "@kbn/search-inference-endpoints/*": ["x-pack/plugins/search_inference_endpoints/*"], + "@kbn/search-navigation": ["x-pack/plugins/search_solution/search_navigation"], + "@kbn/search-navigation/*": ["x-pack/plugins/search_solution/search_navigation/*"], "@kbn/search-notebooks": ["x-pack/plugins/search_notebooks"], "@kbn/search-notebooks/*": ["x-pack/plugins/search_notebooks/*"], "@kbn/search-playground": ["x-pack/plugins/search_playground"], diff --git a/versions.json b/versions.json index d7e25ae6b4760..0843e7d912622 100644 --- a/versions.json +++ b/versions.json @@ -19,7 +19,7 @@ "previousMajor": true }, { - "version": "8.16.1", + "version": "8.16.2", "branch": "8.16", "previousMajor": true }, diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index e1e8478aa0517..7c97dcf1b722f 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -130,6 +130,7 @@ "xpack.searchSharedUI": "packages/search/shared_ui", "xpack.searchHomepage": "plugins/search_homepage", "xpack.searchIndices": "plugins/search_indices", + "xpack.searchNavigation": "plugins/search_solution/search_navigation", "xpack.searchNotebooks": "plugins/search_notebooks", "xpack.searchPlayground": "plugins/search_playground", "xpack.searchInferenceEndpoints": "plugins/search_inference_endpoints", diff --git a/x-pack/packages/ai-infra/inference-common/kibana.jsonc b/x-pack/packages/ai-infra/inference-common/kibana.jsonc index 568755d303c3b..0e88162fa1b02 100644 --- a/x-pack/packages/ai-infra/inference-common/kibana.jsonc +++ b/x-pack/packages/ai-infra/inference-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/inference-common", - "owner": "@elastic/appex-ai-infra" -} + "owner": [ + "@elastic/appex-ai-infra" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ai-infra/product-doc-common/kibana.jsonc b/x-pack/packages/ai-infra/product-doc-common/kibana.jsonc index 16336c1fc8e27..ed5332676de2e 100644 --- a/x-pack/packages/ai-infra/product-doc-common/kibana.jsonc +++ b/x-pack/packages/ai-infra/product-doc-common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/product-doc-common", - "owner": "@elastic/appex-ai-infra" -} + "owner": [ + "@elastic/appex-ai-infra" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/index-lifecycle-management/index_lifecycle_management_common_shared/kibana.jsonc b/x-pack/packages/index-lifecycle-management/index_lifecycle_management_common_shared/kibana.jsonc index dfaef1d0dfb9c..8e17b9e108b68 100644 --- a/x-pack/packages/index-lifecycle-management/index_lifecycle_management_common_shared/kibana.jsonc +++ b/x-pack/packages/index-lifecycle-management/index_lifecycle_management_common_shared/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/index-lifecycle-management-common-shared", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/index-management/index_management_shared_types/kibana.jsonc b/x-pack/packages/index-management/index_management_shared_types/kibana.jsonc index ad87bb2bb4797..db696168a35a1 100644 --- a/x-pack/packages/index-management/index_management_shared_types/kibana.jsonc +++ b/x-pack/packages/index-management/index_management_shared_types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/index-management-shared-types", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-ai-assistant-common/kibana.jsonc b/x-pack/packages/kbn-ai-assistant-common/kibana.jsonc index 8babdaccbd2df..41dcc5eac4046 100644 --- a/x-pack/packages/kbn-ai-assistant-common/kibana.jsonc +++ b/x-pack/packages/kbn-ai-assistant-common/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-common", "id": "@kbn/ai-assistant-common", - "owner": "@elastic/search-kibana", - "type": "shared-common" -} + "owner": [ + "@elastic/search-kibana" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-alerting-comparators/kibana.jsonc b/x-pack/packages/kbn-alerting-comparators/kibana.jsonc index 94ac1e532ab1f..cbc7950c05dfb 100644 --- a/x-pack/packages/kbn-alerting-comparators/kibana.jsonc +++ b/x-pack/packages/kbn-alerting-comparators/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/alerting-comparators", - "owner": "@elastic/response-ops" + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared" } \ No newline at end of file diff --git a/x-pack/packages/kbn-alerting-state-types/kibana.jsonc b/x-pack/packages/kbn-alerting-state-types/kibana.jsonc index 6c37f923f760b..03fa08fd14a00 100644 --- a/x-pack/packages/kbn-alerting-state-types/kibana.jsonc +++ b/x-pack/packages/kbn-alerting-state-types/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/alerting-state-types", - "owner": "@elastic/response-ops" -} + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc index f3bd18f10c7a8..02e924b91e134 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-common", "id": "@kbn/cloud-security-posture-common", - "owner": "@elastic/kibana-cloud-security-posture", - "type": "shared-common" -} + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc index 513861b347059..72fe9f90b58c5 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-browser", "id": "@kbn/cloud-security-posture-graph", - "owner": "@elastic/kibana-cloud-security-posture", - "type": "shared-browser" -} + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc index 811a1ab5dad41..1e30b747cc410 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-browser", "id": "@kbn/cloud-security-posture", - "owner": "@elastic/kibana-cloud-security-posture", - "type": "shared-browser" -} + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts new file mode 100644 index 0000000000000..9b126332b567b --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_misconfigurations.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; +import { useMisconfigurationPreview } from './use_misconfiguration_preview'; + +export const useHasMisconfigurations = (field: 'host.name' | 'user.name', value: string) => { + const { data } = useMisconfigurationPreview({ + query: buildEntityFlyoutPreviewQuery(field, value), + sort: [], + enabled: true, + pageSize: 1, + }); + + const passedFindings = data?.count.passed || 0; + const failedFindings = data?.count.failed || 0; + + const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; + + return { + passedFindings, + failedFindings, + hasMisconfigurationFindings, + }; +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts new file mode 100644 index 0000000000000..336892ee888af --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_has_vulnerabilities.ts @@ -0,0 +1,39 @@ +/* + * 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 { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; +import { useVulnerabilitiesPreview } from './use_vulnerabilities_preview'; +import { hasVulnerabilitiesData } from '../utils/vulnerability_helpers'; + +export const useHasVulnerabilities = (field: 'host.name' | 'user.name', value: string) => { + const { data: vulnerabilitiesData } = useVulnerabilitiesPreview({ + query: buildEntityFlyoutPreviewQuery(field, value), + sort: [], + enabled: true, + pageSize: 1, + }); + + const { + CRITICAL = 0, + HIGH = 0, + MEDIUM = 0, + LOW = 0, + NONE = 0, + } = vulnerabilitiesData?.count || {}; + + const counts = { + critical: CRITICAL, + high: HIGH, + medium: MEDIUM, + low: LOW, + none: NONE, + }; + + const hasVulnerabilitiesFindings = hasVulnerabilitiesData(counts); + + return { counts, hasVulnerabilitiesFindings }; +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts index 30dcd8c7f2ddf..d5bec5e200ff5 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks/dom'; +import { renderHook, act } from '@testing-library/react'; import { useNavigateVulnerabilities, useNavigateFindings } from './use_navigate_findings'; import { useHistory } from 'react-router-dom'; diff --git a/x-pack/packages/kbn-data-forge/kibana.jsonc b/x-pack/packages/kbn-data-forge/kibana.jsonc index 7a09830de0b3a..8b2eb5fa3d0d7 100644 --- a/x-pack/packages/kbn-data-forge/kibana.jsonc +++ b/x-pack/packages/kbn-data-forge/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/data-forge", - "owner": "@elastic/obs-ux-management-team" + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "platform", + "visibility": "shared" } diff --git a/x-pack/packages/kbn-elastic-assistant-common/kibana.jsonc b/x-pack/packages/kbn-elastic-assistant-common/kibana.jsonc index fe36d45dd2a4c..a509f30fa0017 100644 --- a/x-pack/packages/kbn-elastic-assistant-common/kibana.jsonc +++ b/x-pack/packages/kbn-elastic-assistant-common/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-common", "id": "@kbn/elastic-assistant-common", - "owner": "@elastic/security-generative-ai", - "type": "shared-common" -} + "owner": [ + "@elastic/security-generative-ai" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-elastic-assistant/kibana.jsonc b/x-pack/packages/kbn-elastic-assistant/kibana.jsonc index 29490e1bd93c6..3c6916f819b0a 100644 --- a/x-pack/packages/kbn-elastic-assistant/kibana.jsonc +++ b/x-pack/packages/kbn-elastic-assistant/kibana.jsonc @@ -1,5 +1,9 @@ { + "type": "shared-browser", "id": "@kbn/elastic-assistant", - "owner": "@elastic/security-generative-ai", - "type": "shared-browser" -} + "owner": [ + "@elastic/security-generative-ai" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-entities-schema/kibana.jsonc b/x-pack/packages/kbn-entities-schema/kibana.jsonc index 732a640df908b..a5e6fd29fe094 100644 --- a/x-pack/packages/kbn-entities-schema/kibana.jsonc +++ b/x-pack/packages/kbn-entities-schema/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/entities-schema", - "owner": "@elastic/obs-entities" -} + "owner": [ + "@elastic/obs-entities" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-infra-forge/kibana.jsonc b/x-pack/packages/kbn-infra-forge/kibana.jsonc index a450d148358a9..b68f360a7dee3 100644 --- a/x-pack/packages/kbn-infra-forge/kibana.jsonc +++ b/x-pack/packages/kbn-infra-forge/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/infra-forge", - "owner": "@elastic/obs-ux-management-team" + "owner": [ + "@elastic/obs-ux-management-team", + ], + "group": "platform", + "visibility": "private" } diff --git a/x-pack/packages/kbn-langchain/kibana.jsonc b/x-pack/packages/kbn-langchain/kibana.jsonc index 5ef91bd2c8e6a..5fa6ad5894402 100644 --- a/x-pack/packages/kbn-langchain/kibana.jsonc +++ b/x-pack/packages/kbn-langchain/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/langchain", - "owner": "@elastic/security-generative-ai" -} + "owner": [ + "@elastic/security-generative-ai" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts index 359342870a8b9..7f20591bd51a4 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/bedrock_runtime_client.ts @@ -8,12 +8,17 @@ import { BedrockRuntimeClient as _BedrockRuntimeClient, BedrockRuntimeClientConfig, + ConverseCommand, + ConverseResponse, + ConverseStreamCommand, + ConverseStreamResponse, } from '@aws-sdk/client-bedrock-runtime'; import { constructStack } from '@smithy/middleware-stack'; +import { HttpHandlerOptions } from '@smithy/types'; import { PublicMethodsOf } from '@kbn/utility-types'; import type { ActionsClient } from '@kbn/actions-plugin/server'; -import { NodeHttpHandler } from './node_http_handler'; +import { prepareMessages } from '../../utils/bedrock'; export interface CustomChatModelInput extends BedrockRuntimeClientConfig { actionsClient: PublicMethodsOf; @@ -23,15 +28,51 @@ export interface CustomChatModelInput extends BedrockRuntimeClientConfig { export class BedrockRuntimeClient extends _BedrockRuntimeClient { middlewareStack: _BedrockRuntimeClient['middlewareStack']; + streaming: boolean; + actionsClient: PublicMethodsOf; + connectorId: string; constructor({ actionsClient, connectorId, ...fields }: CustomChatModelInput) { super(fields ?? {}); - this.config.requestHandler = new NodeHttpHandler({ - streaming: fields.streaming ?? true, - actionsClient, - connectorId, - }); + this.streaming = fields.streaming ?? true; + this.actionsClient = actionsClient; + this.connectorId = connectorId; // eliminate middleware steps that handle auth as Kibana connector handles auth this.middlewareStack = constructStack() as _BedrockRuntimeClient['middlewareStack']; } + + public async send( + command: ConverseCommand | ConverseStreamCommand, + optionsOrCb?: HttpHandlerOptions | ((err: unknown, data: unknown) => void) + ) { + const options = typeof optionsOrCb !== 'function' ? optionsOrCb : {}; + if (command.input.messages) { + // without this, our human + human messages do not work and result in error: + // A conversation must alternate between user and assistant roles. + command.input.messages = prepareMessages(command.input.messages); + } + const data = (await this.actionsClient.execute({ + actionId: this.connectorId, + params: { + subAction: 'bedrockClientSend', + subActionParams: { + command, + signal: options?.abortSignal, + }, + }, + })) as { + data: ConverseResponse | ConverseStreamResponse; + status: string; + message?: string; + serviceMessage?: string; + }; + + if (data.status === 'error') { + throw new Error( + `ActionsClient BedrockRuntimeClient: action result status is error: ${data?.message} - ${data?.serviceMessage}` + ); + } + + return data.data; + } } diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts deleted file mode 100644 index ba8a1db1fbb00..0000000000000 --- a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.test.ts +++ /dev/null @@ -1,125 +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 { NodeHttpHandler } from './node_http_handler'; -import { HttpRequest } from '@smithy/protocol-http'; -import { actionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; -import { Readable } from 'stream'; -import { fromUtf8 } from '@smithy/util-utf8'; - -const mockActionsClient = actionsClientMock.create(); -const connectorId = 'mock-connector-id'; -const mockOutput = { - output: { - message: { - role: 'assistant', - content: [{ text: 'This is a response from the assistant.' }], - }, - }, - stopReason: 'end_turn', - usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 }, - metrics: { latencyMs: 123 }, - additionalModelResponseFields: {}, - trace: { guardrail: { modelOutput: ['Output text'] } }, -}; -describe('NodeHttpHandler', () => { - let handler: NodeHttpHandler; - - beforeEach(() => { - jest.clearAllMocks(); - handler = new NodeHttpHandler({ - streaming: false, - actionsClient: mockActionsClient, - connectorId, - }); - - mockActionsClient.execute.mockResolvedValue({ - data: mockOutput, - actionId: 'mock-action-id', - status: 'ok', - }); - }); - - it('handles non-streaming requests successfully', async () => { - const request = new HttpRequest({ - body: JSON.stringify({ messages: [] }), - }); - - const result = await handler.handle(request); - - expect(result.response.statusCode).toBe(200); - expect(result.response.headers['content-type']).toBe('application/json'); - expect(result.response.body).toStrictEqual(fromUtf8(JSON.stringify(mockOutput))); - }); - - it('handles streaming requests successfully', async () => { - handler = new NodeHttpHandler({ - streaming: true, - actionsClient: mockActionsClient, - connectorId, - }); - - const request = new HttpRequest({ - body: JSON.stringify({ messages: [] }), - }); - - const readable = new Readable(); - readable.push('streaming data'); - readable.push(null); - - mockActionsClient.execute.mockResolvedValue({ - data: readable, - status: 'ok', - actionId: 'mock-action-id', - }); - - const result = await handler.handle(request); - - expect(result.response.statusCode).toBe(200); - expect(result.response.body).toBe(readable); - }); - - it('throws an error for non-streaming requests with error status', async () => { - const request = new HttpRequest({ - body: JSON.stringify({ messages: [] }), - }); - - mockActionsClient.execute.mockResolvedValue({ - status: 'error', - message: 'error message', - serviceMessage: 'service error message', - actionId: 'mock-action-id', - }); - - await expect(handler.handle(request)).rejects.toThrow( - 'ActionsClientBedrockChat: action result status is error: error message - service error message' - ); - }); - - it('throws an error for streaming requests with error status', async () => { - handler = new NodeHttpHandler({ - streaming: true, - actionsClient: mockActionsClient, - connectorId, - }); - - const request = new HttpRequest({ - body: JSON.stringify({ messages: [] }), - }); - - mockActionsClient.execute.mockResolvedValue({ - status: 'error', - message: 'error message', - serviceMessage: 'service error message', - actionId: 'mock-action-id', - }); - - await expect(handler.handle(request)).rejects.toThrow( - 'ActionsClientBedrockChat: action result status is error: error message - service error message' - ); - }); -}); diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts deleted file mode 100644 index bd5143ef45d4a..0000000000000 --- a/x-pack/packages/kbn-langchain/server/language_models/chat_bedrock_converse/node_http_handler.ts +++ /dev/null @@ -1,88 +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 { NodeHttpHandler as _NodeHttpHandler } from '@smithy/node-http-handler'; -import { HttpRequest, HttpResponse } from '@smithy/protocol-http'; -import { HttpHandlerOptions, NodeHttpHandlerOptions } from '@smithy/types'; -import { PublicMethodsOf } from '@kbn/utility-types'; -import type { ActionsClient } from '@kbn/actions-plugin/server'; -import { Readable } from 'stream'; -import { fromUtf8 } from '@smithy/util-utf8'; -import { ConverseResponse } from '@aws-sdk/client-bedrock-runtime'; -import { prepareMessages } from '../../utils/bedrock'; - -interface NodeHandlerOptions extends NodeHttpHandlerOptions { - streaming: boolean; - actionsClient: PublicMethodsOf; - connectorId: string; -} - -export class NodeHttpHandler extends _NodeHttpHandler { - streaming: boolean; - actionsClient: PublicMethodsOf; - connectorId: string; - constructor(options: NodeHandlerOptions) { - super(options); - this.streaming = options.streaming; - this.actionsClient = options.actionsClient; - this.connectorId = options.connectorId; - } - - async handle( - request: HttpRequest, - options: HttpHandlerOptions = {} - ): Promise<{ response: HttpResponse }> { - const body = JSON.parse(request.body); - const messages = prepareMessages(body.messages); - - if (this.streaming) { - const data = (await this.actionsClient.execute({ - actionId: this.connectorId, - params: { - subAction: 'converseStream', - subActionParams: { ...body, messages, signal: options.abortSignal }, - }, - })) as { data: Readable; status: string; message?: string; serviceMessage?: string }; - - if (data.status === 'error') { - throw new Error( - `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` - ); - } - - return { - response: { - statusCode: 200, - headers: {}, - body: data.data, - }, - }; - } - - const data = (await this.actionsClient.execute({ - actionId: this.connectorId, - params: { - subAction: 'converse', - subActionParams: { ...body, messages, signal: options.abortSignal }, - }, - })) as { data: ConverseResponse; status: string; message?: string; serviceMessage?: string }; - - if (data.status === 'error') { - throw new Error( - `ActionsClientBedrockChat: action result status is error: ${data?.message} - ${data?.serviceMessage}` - ); - } - - return { - response: { - statusCode: 200, - headers: { 'content-type': 'application/json' }, - body: fromUtf8(JSON.stringify(data.data)), - }, - }; - } -} diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.test.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.test.ts index 07fe252bd5074..69086ffcd108b 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.test.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.test.ts @@ -13,6 +13,7 @@ import { BaseMessage, HumanMessage, SystemMessage } from '@langchain/core/messag import { ActionsClientChatVertexAI } from './chat_vertex'; import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager'; import { GeminiContent } from '@langchain/google-common'; +import { FinishReason } from '@google/generative-ai'; const connectorId = 'mock-connector-id'; @@ -55,6 +56,74 @@ const mockStreamExecute = jest.fn().mockImplementation(() => { }; }); +const mockStreamExecuteWithGoodStopEvents = jest.fn().mockImplementation(() => { + const passThrough = new PassThrough(); + + // Write the data chunks to the stream + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token1"}]}}],"modelVersion": "gemini-1.5-pro-001"}` + ) + ); + }); + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token2"}]}}],"modelVersion": "gemini-1.5-pro-001"}` + ) + ); + }); + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token3"}]},"finishReason": "${FinishReason.STOP}","safetyRatings": [{"category": "HARM_CATEGORY_HATE_SPEECH","probability": "NEGLIGIBLE","probabilityScore": 0.060086742,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.17106095},{"category": "HARM_CATEGORY_DANGEROUS_CONTENT","probability": "NEGLIGIBLE","probabilityScore": 0.16776322,"severity": "HARM_SEVERITY_LOW","severityScore": 0.37113687},{"category": "HARM_CATEGORY_HARASSMENT","probability": "NEGLIGIBLE","probabilityScore": 0.124212936,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.17441037},{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT","probability": "NEGLIGIBLE","probabilityScore": 0.05419875,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.03461887}]}],"usageMetadata": {"promptTokenCount": 1062,"candidatesTokenCount": 15,"totalTokenCount": 1077},"modelVersion": "gemini-1.5-pro-002"}` + ) + ); + // End the stream + passThrough.end(); + }); + + return { + data: passThrough, // PassThrough stream will act as the async iterator + status: 'ok', + }; +}); + +const mockStreamExecuteWithBadStopEvents = jest.fn().mockImplementation(() => { + const passThrough = new PassThrough(); + + // Write the data chunks to the stream + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token1"}]}}],"modelVersion": "gemini-1.5-pro-001"}` + ) + ); + }); + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token2"}]}}],"modelVersion": "gemini-1.5-pro-001"}` + ) + ); + }); + setTimeout(() => { + passThrough.write( + Buffer.from( + `data: {"candidates": [{"content": {"role": "model","parts": [{"text": "token3"}]},"finishReason": "${FinishReason.SAFETY}","safetyRatings": [{"category": "HARM_CATEGORY_HATE_SPEECH","probability": "NEGLIGIBLE","probabilityScore": 0.060086742,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.17106095},{"category": "HARM_CATEGORY_DANGEROUS_CONTENT","probability": "HIGH","probabilityScore": 0.96776322,"severity": "HARM_SEVERITY_HIGH","severityScore": 0.97113687,"blocked":true},{"category": "HARM_CATEGORY_HARASSMENT","probability": "NEGLIGIBLE","probabilityScore": 0.124212936,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.17441037},{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT","probability": "NEGLIGIBLE","probabilityScore": 0.05419875,"severity": "HARM_SEVERITY_NEGLIGIBLE","severityScore": 0.03461887}]}],"usageMetadata": {"promptTokenCount": 1062,"candidatesTokenCount": 15,"totalTokenCount": 1077},"modelVersion": "gemini-1.5-pro-002"}` + ) + ); + // End the stream + passThrough.end(); + }); + + return { + data: passThrough, // PassThrough stream will act as the async iterator + status: 'ok', + }; +}); + const systemInstruction = 'Answer the following questions truthfully and as best you can.'; const callMessages = [ @@ -198,6 +267,59 @@ describe('ActionsClientChatVertexAI', () => { expect(handleLLMNewToken).toHaveBeenCalledWith('token2'); expect(handleLLMNewToken).toHaveBeenCalledWith('token3'); }); + it('includes tokens from finishReason: STOP', async () => { + actionsClient.execute.mockImplementationOnce(mockStreamExecuteWithGoodStopEvents); + + const actionsClientChatVertexAI = new ActionsClientChatVertexAI({ + ...defaultArgs, + actionsClient, + streaming: true, + }); + + const gen = actionsClientChatVertexAI._streamResponseChunks( + callMessages, + callOptions, + callRunManager + ); + + const chunks = []; + + for await (const chunk of gen) { + chunks.push(chunk); + } + + expect(chunks.map((c) => c.text)).toEqual(['token1', 'token2', 'token3']); + expect(handleLLMNewToken).toHaveBeenCalledTimes(3); + expect(handleLLMNewToken).toHaveBeenCalledWith('token1'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token2'); + expect(handleLLMNewToken).toHaveBeenCalledWith('token3'); + }); + it('throws an error on bad stop events', async () => { + actionsClient.execute.mockImplementationOnce(mockStreamExecuteWithBadStopEvents); + + const actionsClientChatVertexAI = new ActionsClientChatVertexAI({ + ...defaultArgs, + actionsClient, + streaming: true, + }); + + const gen = actionsClientChatVertexAI._streamResponseChunks( + callMessages, + callOptions, + callRunManager + ); + + const chunks = []; + await expect(async () => { + for await (const chunk of gen) { + chunks.push(chunk); + } + }).rejects.toEqual( + Error( + `Gemini Utils: action result status is error. Candidate was blocked due to SAFETY - HARM_CATEGORY_DANGEROUS_CONTENT: HARM_SEVERITY_HIGH` + ) + ); + }); }); describe('message formatting', () => { diff --git a/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.ts b/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.ts index 745c273c79583..7cea2d421a9da 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/chat_vertex/chat_vertex.ts @@ -130,7 +130,12 @@ export class ActionsClientChatVertexAI extends ChatVertexAI { partialStreamChunk += nextChunk; } - if (parsedStreamChunk !== null && !parsedStreamChunk.candidates?.[0]?.finishReason) { + if (parsedStreamChunk !== null) { + const errorMessage = convertResponseBadFinishReasonToErrorMsg(parsedStreamChunk); + if (errorMessage != null) { + throw new Error(errorMessage); + } + const response = { ...parsedStreamChunk, functionCalls: () => @@ -178,12 +183,6 @@ export class ActionsClientChatVertexAI extends ChatVertexAI { yield chunk; await runManager?.handleLLMNewToken(chunk.text ?? ''); } - } else if (parsedStreamChunk) { - // handle bad finish reason - const errorMessage = convertResponseBadFinishReasonToErrorMsg(parsedStreamChunk); - if (errorMessage != null) { - throw new Error(errorMessage); - } } } } diff --git a/x-pack/packages/kbn-langchain/server/language_models/gemini_chat.ts b/x-pack/packages/kbn-langchain/server/language_models/gemini_chat.ts index 700e26d5a0a14..f8755af19d78c 100644 --- a/x-pack/packages/kbn-langchain/server/language_models/gemini_chat.ts +++ b/x-pack/packages/kbn-langchain/server/language_models/gemini_chat.ts @@ -199,7 +199,11 @@ export class ActionsClientGeminiChatModel extends ChatGoogleGenerativeAI { partialStreamChunk += nextChunk; } - if (parsedStreamChunk !== null && !parsedStreamChunk.candidates?.[0]?.finishReason) { + if (parsedStreamChunk !== null) { + const errorMessage = convertResponseBadFinishReasonToErrorMsg(parsedStreamChunk); + if (errorMessage != null) { + throw new Error(errorMessage); + } const response = { ...parsedStreamChunk, functionCalls: () => @@ -247,12 +251,6 @@ export class ActionsClientGeminiChatModel extends ChatGoogleGenerativeAI { yield chunk; await runManager?.handleLLMNewToken(chunk.text ?? ''); } - } else if (parsedStreamChunk) { - // handle bad finish reason - const errorMessage = convertResponseBadFinishReasonToErrorMsg(parsedStreamChunk); - if (errorMessage != null) { - throw new Error(errorMessage); - } } } } diff --git a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts index 7c8c069e5eb5a..b61144a5f9ad1 100644 --- a/x-pack/packages/kbn-langchain/server/utils/bedrock.ts +++ b/x-pack/packages/kbn-langchain/server/utils/bedrock.ts @@ -10,6 +10,7 @@ import { finished } from 'stream/promises'; import { Logger } from '@kbn/core/server'; import { EventStreamCodec } from '@smithy/eventstream-codec'; import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; +import { Message } from '@aws-sdk/client-bedrock-runtime'; import { StreamParser } from './types'; export const parseBedrockStreamAsAsyncIterator = async function* ( @@ -227,7 +228,7 @@ function parseContent(content: Array<{ text?: string; type: string }>): string { * Prepare messages for the bedrock API by combining messages from the same role * @param messages */ -export const prepareMessages = (messages: Array<{ role: string; content: string[] }>) => +export const prepareMessages = (messages: Message[]) => messages.reduce((acc, { role, content }) => { const lastMessage = acc[acc.length - 1]; @@ -236,13 +237,13 @@ export const prepareMessages = (messages: Array<{ role: string; content: string[ return acc; } - if (lastMessage.role === role) { - acc[acc.length - 1].content = lastMessage.content.concat(content); + if (lastMessage.role === role && lastMessage.content) { + acc[acc.length - 1].content = lastMessage.content.concat(content || []); return acc; } return acc; - }, [] as Array<{ role: string; content: string[] }>); + }, [] as Message[]); export const DEFAULT_BEDROCK_MODEL = 'anthropic.claude-3-5-sonnet-20240620-v1:0'; export const DEFAULT_BEDROCK_REGION = 'us-east-1'; diff --git a/x-pack/packages/kbn-random-sampling/kibana.jsonc b/x-pack/packages/kbn-random-sampling/kibana.jsonc index 963ef9add20b1..5f63a3a67b279 100644 --- a/x-pack/packages/kbn-random-sampling/kibana.jsonc +++ b/x-pack/packages/kbn-random-sampling/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/random-sampling", - "owner": "@elastic/kibana-visualizations", -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/kbn-slo-schema/kibana.jsonc b/x-pack/packages/kbn-slo-schema/kibana.jsonc index b4ca324fc112b..7e4c7cab070b8 100644 --- a/x-pack/packages/kbn-slo-schema/kibana.jsonc +++ b/x-pack/packages/kbn-slo-schema/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/slo-schema", - "owner": "@elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/maps/vector_tile_utils/kibana.jsonc b/x-pack/packages/maps/vector_tile_utils/kibana.jsonc index 5e1e9957ecdf3..1ec30b45e5225 100644 --- a/x-pack/packages/maps/vector_tile_utils/kibana.jsonc +++ b/x-pack/packages/maps/vector_tile_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/maps-vector-tile-utils", - "owner": "@elastic/kibana-presentation" -} + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/agg_utils/kibana.jsonc b/x-pack/packages/ml/agg_utils/kibana.jsonc index 3c29356a24ada..8b39e5ee5678f 100644 --- a/x-pack/packages/ml/agg_utils/kibana.jsonc +++ b/x-pack/packages/ml/agg_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-agg-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_change_point_detection/kibana.jsonc b/x-pack/packages/ml/aiops_change_point_detection/kibana.jsonc index 280a686665c66..29e42822d728c 100644 --- a/x-pack/packages/ml/aiops_change_point_detection/kibana.jsonc +++ b/x-pack/packages/ml/aiops_change_point_detection/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-change-point-detection", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_common/kibana.jsonc b/x-pack/packages/ml/aiops_common/kibana.jsonc index d675cd4022279..88dfda8bd28cd 100644 --- a/x-pack/packages/ml/aiops_common/kibana.jsonc +++ b/x-pack/packages/ml/aiops_common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-common", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_components/kibana.jsonc b/x-pack/packages/ml/aiops_components/kibana.jsonc index 6df0d201312a1..70a974dfba496 100644 --- a/x-pack/packages/ml/aiops_components/kibana.jsonc +++ b/x-pack/packages/ml/aiops_components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-components", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_log_pattern_analysis/kibana.jsonc b/x-pack/packages/ml/aiops_log_pattern_analysis/kibana.jsonc index da2c590b49dcb..042910e2f8a8e 100644 --- a/x-pack/packages/ml/aiops_log_pattern_analysis/kibana.jsonc +++ b/x-pack/packages/ml/aiops_log_pattern_analysis/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-log-pattern-analysis", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_log_pattern_analysis/schema.ts b/x-pack/packages/ml/aiops_log_pattern_analysis/schema.ts index 72b1dbca38032..05254e72a651c 100644 --- a/x-pack/packages/ml/aiops_log_pattern_analysis/schema.ts +++ b/x-pack/packages/ml/aiops_log_pattern_analysis/schema.ts @@ -38,7 +38,6 @@ export const indicesOptionsSchema = schema.object({ ), ignore_unavailable: schema.maybe(schema.boolean()), allow_no_indices: schema.maybe(schema.boolean()), - ignore_throttled: schema.maybe(schema.boolean()), }); /** diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/api/schema_v2.ts b/x-pack/packages/ml/aiops_log_rate_analysis/api/schema_v2.ts index 1e132f6f00e78..95c778a118454 100644 --- a/x-pack/packages/ml/aiops_log_rate_analysis/api/schema_v2.ts +++ b/x-pack/packages/ml/aiops_log_rate_analysis/api/schema_v2.ts @@ -45,6 +45,7 @@ export const aiopsLogRateAnalysisBase = schema.object({ end: schema.number(), searchQuery: schema.string(), timeFieldName: schema.string(), + // when v2 is removed, includeFrozen should not carry over to v3+ includeFrozen: schema.maybe(schema.boolean()), grouping: schema.maybe(schema.boolean()), /** Analysis selection time ranges */ diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/kibana.jsonc b/x-pack/packages/ml/aiops_log_rate_analysis/kibana.jsonc index 210878e009a2a..8b9f6a222583f 100644 --- a/x-pack/packages/ml/aiops_log_rate_analysis/kibana.jsonc +++ b/x-pack/packages/ml/aiops_log_rate_analysis/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-log-rate-analysis", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/params_match_all.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/params_match_all.ts index a81ba523caa43..36d63c883ecd8 100644 --- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/params_match_all.ts +++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/__mocks__/params_match_all.ts @@ -14,6 +14,5 @@ export const paramsMock = { baselineMax: 20, deviationMin: 30, deviationMax: 40, - includeFrozen: false, searchQuery: '{ "match_all": {} }', }; diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.test.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.test.ts deleted file mode 100644 index 33797e219fd37..0000000000000 --- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.test.ts +++ /dev/null @@ -1,25 +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 { paramsMock } from './__mocks__/params_match_all'; - -import { getRequestBase } from './get_request_base'; - -describe('getRequestBase', () => { - it('defaults to not setting `ignore_throttled`', () => { - const requestBase = getRequestBase(paramsMock); - expect(requestBase.ignore_throttled).toEqual(undefined); - }); - - it('adds `ignore_throttled=false` when `includeFrozen=true`', () => { - const requestBase = getRequestBase({ - ...paramsMock, - includeFrozen: true, - }); - expect(requestBase.ignore_throttled).toEqual(false); - }); -}); diff --git a/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.ts b/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.ts index 8083cb25c12b5..8b16b5c050596 100644 --- a/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.ts +++ b/x-pack/packages/ml/aiops_log_rate_analysis/queries/get_request_base.ts @@ -7,8 +7,7 @@ import type { AiopsLogRateAnalysisSchema } from '../api/schema'; -export const getRequestBase = ({ index, includeFrozen }: AiopsLogRateAnalysisSchema) => ({ +export const getRequestBase = ({ index }: AiopsLogRateAnalysisSchema) => ({ index, - ...(includeFrozen ? { ignore_throttled: false } : {}), ignore_unavailable: true, }); diff --git a/x-pack/packages/ml/aiops_test_utils/kibana.jsonc b/x-pack/packages/ml/aiops_test_utils/kibana.jsonc index 1c79f5adf34a4..3af237ddc2c07 100644 --- a/x-pack/packages/ml/aiops_test_utils/kibana.jsonc +++ b/x-pack/packages/ml/aiops_test_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/aiops-test-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/anomaly_utils/kibana.jsonc b/x-pack/packages/ml/anomaly_utils/kibana.jsonc index 92fa54e6104de..2685dfbcaa2ee 100644 --- a/x-pack/packages/ml/anomaly_utils/kibana.jsonc +++ b/x-pack/packages/ml/anomaly_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-anomaly-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/cancellable_search/kibana.jsonc b/x-pack/packages/ml/cancellable_search/kibana.jsonc index 2006bfd746711..8e7c129fd6134 100644 --- a/x-pack/packages/ml/cancellable_search/kibana.jsonc +++ b/x-pack/packages/ml/cancellable_search/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-cancellable-search", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/category_validator/kibana.jsonc b/x-pack/packages/ml/category_validator/kibana.jsonc index de1fea187f3c8..08e1dd96edd21 100644 --- a/x-pack/packages/ml/category_validator/kibana.jsonc +++ b/x-pack/packages/ml/category_validator/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-category-validator", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/chi2test/kibana.jsonc b/x-pack/packages/ml/chi2test/kibana.jsonc index 073ffe15d4294..29d73318e1d4b 100644 --- a/x-pack/packages/ml/chi2test/kibana.jsonc +++ b/x-pack/packages/ml/chi2test/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-chi2test", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/creation_wizard_utils/kibana.jsonc b/x-pack/packages/ml/creation_wizard_utils/kibana.jsonc index 158d811883500..01481fbf943df 100644 --- a/x-pack/packages/ml/creation_wizard_utils/kibana.jsonc +++ b/x-pack/packages/ml/creation_wizard_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-creation-wizard-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/data_frame_analytics_utils/kibana.jsonc b/x-pack/packages/ml/data_frame_analytics_utils/kibana.jsonc index 9a25068100ab6..78d1168b04951 100644 --- a/x-pack/packages/ml/data_frame_analytics_utils/kibana.jsonc +++ b/x-pack/packages/ml/data_frame_analytics_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-data-frame-analytics-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/data_grid/hooks/use_column_chart.test.tsx b/x-pack/packages/ml/data_grid/hooks/use_column_chart.test.tsx index 7a5493eedcfd7..4b8191de1d874 100644 --- a/x-pack/packages/ml/data_grid/hooks/use_column_chart.test.tsx +++ b/x-pack/packages/ml/data_grid/hooks/use_column_chart.test.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, renderHook } from '@testing-library/react'; import { KBN_FIELD_TYPES } from '@kbn/field-types'; diff --git a/x-pack/packages/ml/data_grid/kibana.jsonc b/x-pack/packages/ml/data_grid/kibana.jsonc index d13bf0f37aec3..517acb32d025e 100644 --- a/x-pack/packages/ml/data_grid/kibana.jsonc +++ b/x-pack/packages/ml/data_grid/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-data-grid", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/data_view_utils/kibana.jsonc b/x-pack/packages/ml/data_view_utils/kibana.jsonc index 41251d1f7cbc2..a97ecab13383b 100644 --- a/x-pack/packages/ml/data_view_utils/kibana.jsonc +++ b/x-pack/packages/ml/data_view_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-data-view-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/date_picker/kibana.jsonc b/x-pack/packages/ml/date_picker/kibana.jsonc index d5ba9fb472f9b..655a774725250 100644 --- a/x-pack/packages/ml/date_picker/kibana.jsonc +++ b/x-pack/packages/ml/date_picker/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/ml-date-picker", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/date_picker/src/hooks/use_timefilter.test.ts b/x-pack/packages/ml/date_picker/src/hooks/use_timefilter.test.ts index 4b54b74d900f9..86a2c127939c0 100644 --- a/x-pack/packages/ml/date_picker/src/hooks/use_timefilter.test.ts +++ b/x-pack/packages/ml/date_picker/src/hooks/use_timefilter.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useDatePickerContext } from './use_date_picker_context'; import { useTimefilter } from './use_timefilter'; diff --git a/x-pack/packages/ml/date_utils/kibana.jsonc b/x-pack/packages/ml/date_utils/kibana.jsonc index dd8f2187bacbf..ccf73f9d922bb 100644 --- a/x-pack/packages/ml/date_utils/kibana.jsonc +++ b/x-pack/packages/ml/date_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-date-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/error_utils/kibana.jsonc b/x-pack/packages/ml/error_utils/kibana.jsonc index 7629766aca7a7..fa13892db8769 100644 --- a/x-pack/packages/ml/error_utils/kibana.jsonc +++ b/x-pack/packages/ml/error_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-error-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/field_stats_flyout/kibana.jsonc b/x-pack/packages/ml/field_stats_flyout/kibana.jsonc index 4c362fcc84e05..d6c4fc392f88f 100644 --- a/x-pack/packages/ml/field_stats_flyout/kibana.jsonc +++ b/x-pack/packages/ml/field_stats_flyout/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/ml-field-stats-flyout", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/in_memory_table/kibana.jsonc b/x-pack/packages/ml/in_memory_table/kibana.jsonc index cb50985bc6159..b1dd95dc080d3 100644 --- a/x-pack/packages/ml/in_memory_table/kibana.jsonc +++ b/x-pack/packages/ml/in_memory_table/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-in-memory-table", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/inference_integration_flyout/kibana.jsonc b/x-pack/packages/ml/inference_integration_flyout/kibana.jsonc index f7657078bb781..6cf8955917b5c 100644 --- a/x-pack/packages/ml/inference_integration_flyout/kibana.jsonc +++ b/x-pack/packages/ml/inference_integration_flyout/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/inference_integration_flyout", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/is_defined/kibana.jsonc b/x-pack/packages/ml/is_defined/kibana.jsonc index b25718598901b..43b4d3a5fdae6 100644 --- a/x-pack/packages/ml/is_defined/kibana.jsonc +++ b/x-pack/packages/ml/is_defined/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-is-defined", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/is_populated_object/kibana.jsonc b/x-pack/packages/ml/is_populated_object/kibana.jsonc index 1ef21fe110b12..719c85fa24348 100644 --- a/x-pack/packages/ml/is_populated_object/kibana.jsonc +++ b/x-pack/packages/ml/is_populated_object/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-is-populated-object", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/json_schemas/kibana.jsonc b/x-pack/packages/ml/json_schemas/kibana.jsonc index 4233a2938ecae..cc9c6e710c310 100644 --- a/x-pack/packages/ml/json_schemas/kibana.jsonc +++ b/x-pack/packages/ml/json_schemas/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/json-schemas", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/json_schemas/src/put___ml_anomaly_detectors__job_id__schema.json b/x-pack/packages/ml/json_schemas/src/put___ml_anomaly_detectors__job_id__schema.json index 79a871f1ef3fa..81e1d22bdad9b 100644 --- a/x-pack/packages/ml/json_schemas/src/put___ml_anomaly_detectors__job_id__schema.json +++ b/x-pack/packages/ml/json_schemas/src/put___ml_anomaly_detectors__job_id__schema.json @@ -10765,10 +10765,6 @@ "ignore_unavailable": { "description": "If true, missing or closed indices are not included in the response.", "type": "boolean" - }, - "ignore_throttled": { - "description": "If true, concrete, expanded or aliased indices are ignored when frozen.", - "type": "boolean" } } }, @@ -10884,4 +10880,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/packages/ml/json_schemas/src/put___ml_datafeeds__datafeed_id__schema.json b/x-pack/packages/ml/json_schemas/src/put___ml_datafeeds__datafeed_id__schema.json index 575411eb3a8c2..8bf2dbfc1f529 100644 --- a/x-pack/packages/ml/json_schemas/src/put___ml_datafeeds__datafeed_id__schema.json +++ b/x-pack/packages/ml/json_schemas/src/put___ml_datafeeds__datafeed_id__schema.json @@ -7932,10 +7932,6 @@ "ignore_unavailable": { "description": "If true, missing or closed indices are not included in the response.", "type": "boolean" - }, - "ignore_throttled": { - "description": "If true, concrete, expanded or aliased indices are ignored when frozen.", - "type": "boolean" } } }, @@ -8051,4 +8047,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/packages/ml/kibana_theme/kibana.jsonc b/x-pack/packages/ml/kibana_theme/kibana.jsonc index e9f16a1537794..cbd58ef1489a6 100644 --- a/x-pack/packages/ml/kibana_theme/kibana.jsonc +++ b/x-pack/packages/ml/kibana_theme/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-kibana-theme", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/local_storage/kibana.jsonc b/x-pack/packages/ml/local_storage/kibana.jsonc index 8afac70248f4f..6b891cccb9594 100644 --- a/x-pack/packages/ml/local_storage/kibana.jsonc +++ b/x-pack/packages/ml/local_storage/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-local-storage", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/nested_property/kibana.jsonc b/x-pack/packages/ml/nested_property/kibana.jsonc index 8256bcfc7d725..0d3c27d833344 100644 --- a/x-pack/packages/ml/nested_property/kibana.jsonc +++ b/x-pack/packages/ml/nested_property/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/ml-nested-property", - "owner": "@elastic/ml-ui" + "owner": "@elastic/ml-ui", + "group": "platform", + "visibility": "private" } diff --git a/x-pack/packages/ml/number_utils/kibana.jsonc b/x-pack/packages/ml/number_utils/kibana.jsonc index ca46d88969078..604ca1648739d 100644 --- a/x-pack/packages/ml/number_utils/kibana.jsonc +++ b/x-pack/packages/ml/number_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-number-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/parse_interval/kibana.jsonc b/x-pack/packages/ml/parse_interval/kibana.jsonc index 6d8398c29b1cc..bb83b183b6fb2 100644 --- a/x-pack/packages/ml/parse_interval/kibana.jsonc +++ b/x-pack/packages/ml/parse_interval/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-parse-interval", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/query_utils/kibana.jsonc b/x-pack/packages/ml/query_utils/kibana.jsonc index a37eb31cb1da4..85476d1de652b 100644 --- a/x-pack/packages/ml/query_utils/kibana.jsonc +++ b/x-pack/packages/ml/query_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-query-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/random_sampler_utils/kibana.jsonc b/x-pack/packages/ml/random_sampler_utils/kibana.jsonc index 87b8e2ec0ca01..fc1185a36d953 100644 --- a/x-pack/packages/ml/random_sampler_utils/kibana.jsonc +++ b/x-pack/packages/ml/random_sampler_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-random-sampler-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/response_stream/kibana.jsonc b/x-pack/packages/ml/response_stream/kibana.jsonc index 7e8b96cc9d12b..b1fd2969348d2 100644 --- a/x-pack/packages/ml/response_stream/kibana.jsonc +++ b/x-pack/packages/ml/response_stream/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-response-stream", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/route_utils/kibana.jsonc b/x-pack/packages/ml/route_utils/kibana.jsonc index 8494cda1924d3..91565f4296b6c 100644 --- a/x-pack/packages/ml/route_utils/kibana.jsonc +++ b/x-pack/packages/ml/route_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-route-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/runtime_field_utils/kibana.jsonc b/x-pack/packages/ml/runtime_field_utils/kibana.jsonc index 5422abd1ac94d..0790fca4ed7c4 100644 --- a/x-pack/packages/ml/runtime_field_utils/kibana.jsonc +++ b/x-pack/packages/ml/runtime_field_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-runtime-field-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/string_hash/kibana.jsonc b/x-pack/packages/ml/string_hash/kibana.jsonc index 1573e9a970487..f454a38ac7813 100644 --- a/x-pack/packages/ml/string_hash/kibana.jsonc +++ b/x-pack/packages/ml/string_hash/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-string-hash", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/time_buckets/kibana.jsonc b/x-pack/packages/ml/time_buckets/kibana.jsonc index 850c794948d20..53f61afe112f0 100644 --- a/x-pack/packages/ml/time_buckets/kibana.jsonc +++ b/x-pack/packages/ml/time_buckets/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-time-buckets", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/trained_models_utils/kibana.jsonc b/x-pack/packages/ml/trained_models_utils/kibana.jsonc index 7481396bee40c..9a09f09e77bac 100644 --- a/x-pack/packages/ml/trained_models_utils/kibana.jsonc +++ b/x-pack/packages/ml/trained_models_utils/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-trained-models-utils", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/ml/ui_actions/kibana.jsonc b/x-pack/packages/ml/ui_actions/kibana.jsonc index 999f955bc2e47..b9324eb47457e 100644 --- a/x-pack/packages/ml/ui_actions/kibana.jsonc +++ b/x-pack/packages/ml/ui_actions/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-ui-actions", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/url_state/kibana.jsonc b/x-pack/packages/ml/url_state/kibana.jsonc index 8850913bfa8c2..3579ef3257303 100644 --- a/x-pack/packages/ml/url_state/kibana.jsonc +++ b/x-pack/packages/ml/url_state/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-url-state", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/ml/validators/kibana.jsonc b/x-pack/packages/ml/validators/kibana.jsonc index e747549d8e33c..d1cae5ea7515b 100644 --- a/x-pack/packages/ml/validators/kibana.jsonc +++ b/x-pack/packages/ml/validators/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/ml-validators", - "owner": "@elastic/ml-ui" -} + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/observability/alert_details/kibana.jsonc b/x-pack/packages/observability/alert_details/kibana.jsonc index f63d6cf11995d..a53cdcd28b208 100644 --- a/x-pack/packages/observability/alert_details/kibana.jsonc +++ b/x-pack/packages/observability/alert_details/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/observability-alert-details", - "owner": "@elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/observability/alerting_rule_utils/kibana.jsonc b/x-pack/packages/observability/alerting_rule_utils/kibana.jsonc index b1b3646302d1e..ecaebb0582b2e 100644 --- a/x-pack/packages/observability/alerting_rule_utils/kibana.jsonc +++ b/x-pack/packages/observability/alerting_rule_utils/kibana.jsonc @@ -1,5 +1,8 @@ { "type": "shared-common", "id": "@kbn/observability-alerting-rule-utils", - "owner": "@elastic/obs-ux-management-team" + "owner": "@elastic/obs-ux-management-team", + // TODO refactor and transfer owner / contents to response-ops / alerting + "group": "platform", + "visibility": "shared" } diff --git a/x-pack/packages/observability/get_padded_alert_time_range_util/kibana.jsonc b/x-pack/packages/observability/get_padded_alert_time_range_util/kibana.jsonc index 30797d6915c49..394dd91e0f3a1 100644 --- a/x-pack/packages/observability/get_padded_alert_time_range_util/kibana.jsonc +++ b/x-pack/packages/observability/get_padded_alert_time_range_util/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/observability-get-padded-alert-time-range-util", - "owner": "@elastic/obs-ux-management-team" -} + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/observability/logs_overview/kibana.jsonc b/x-pack/packages/observability/logs_overview/kibana.jsonc index 90b3375086720..34d8ac98a5253 100644 --- a/x-pack/packages/observability/logs_overview/kibana.jsonc +++ b/x-pack/packages/observability/logs_overview/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/observability-logs-overview", - "owner": "@elastic/obs-ux-logs-team" + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/observability/observability_utils/observability_utils_browser/kibana.jsonc b/x-pack/packages/observability/observability_utils/observability_utils_browser/kibana.jsonc index dbee36828d080..3786f797da39f 100644 --- a/x-pack/packages/observability/observability_utils/observability_utils_browser/kibana.jsonc +++ b/x-pack/packages/observability/observability_utils/observability_utils_browser/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/observability-utils-browser", - "owner": "@elastic/observability-ui" + "owner": [ + "@elastic/observability-ui" + ], + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/observability/observability_utils/observability_utils_common/kibana.jsonc b/x-pack/packages/observability/observability_utils/observability_utils_common/kibana.jsonc index eb120052e5b0e..35916e1ec4cea 100644 --- a/x-pack/packages/observability/observability_utils/observability_utils_common/kibana.jsonc +++ b/x-pack/packages/observability/observability_utils/observability_utils_common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/observability-utils-common", - "owner": "@elastic/observability-ui" + "owner": [ + "@elastic/observability-ui" + ], + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/observability/observability_utils/observability_utils_server/kibana.jsonc b/x-pack/packages/observability/observability_utils/observability_utils_server/kibana.jsonc index 4c2f20ef1491f..7374ebddff224 100644 --- a/x-pack/packages/observability/observability_utils/observability_utils_server/kibana.jsonc +++ b/x-pack/packages/observability/observability_utils/observability_utils_server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/observability-utils-server", - "owner": "@elastic/observability-ui" + "owner": [ + "@elastic/observability-ui" + ], + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/observability/synthetics_test_data/kibana.jsonc b/x-pack/packages/observability/synthetics_test_data/kibana.jsonc index 94f80d9b59cad..74e5bd7a76c19 100644 --- a/x-pack/packages/observability/synthetics_test_data/kibana.jsonc +++ b/x-pack/packages/observability/synthetics_test_data/kibana.jsonc @@ -2,4 +2,6 @@ "type": "shared-common", "id": "@kbn/observability-synthetics-test-data", "owner": "@elastic/obs-ux-management-team", + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/rollup/kibana.jsonc b/x-pack/packages/rollup/kibana.jsonc index 3961e7c7468e2..160c2b999ce53 100644 --- a/x-pack/packages/rollup/kibana.jsonc +++ b/x-pack/packages/rollup/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/rollup", - "owner": "@elastic/kibana-management" -} + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/search/shared_ui/kibana.jsonc b/x-pack/packages/search/shared_ui/kibana.jsonc index aedc015c1d6fa..94c698a4cded4 100644 --- a/x-pack/packages/search/shared_ui/kibana.jsonc +++ b/x-pack/packages/search/shared_ui/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/search-shared-ui", - "owner": "@elastic/search-kibana" + "owner": [ + "@elastic/search-kibana" + ], + "group": "search", + "visibility": "private" } \ No newline at end of file diff --git a/x-pack/packages/security-solution/data_table/kibana.jsonc b/x-pack/packages/security-solution/data_table/kibana.jsonc index 9695411a65301..027d2a426bf23 100644 --- a/x-pack/packages/security-solution/data_table/kibana.jsonc +++ b/x-pack/packages/security-solution/data_table/kibana.jsonc @@ -1,7 +1,9 @@ { "type": "shared-common", "id": "@kbn/securitysolution-data-table", - "owner": "@elastic/security-threat-hunting-investigations", + "owner": [ + "@elastic/security-threat-hunting-investigations" + ], "group": "security", "visibility": "private" -} +} \ No newline at end of file diff --git a/x-pack/packages/security-solution/distribution_bar/kibana.jsonc b/x-pack/packages/security-solution/distribution_bar/kibana.jsonc index 5c984aadba9ca..49d0c41ae1037 100644 --- a/x-pack/packages/security-solution/distribution_bar/kibana.jsonc +++ b/x-pack/packages/security-solution/distribution_bar/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/security-solution-distribution-bar", - "owner": "@elastic/kibana-cloud-security-posture" -} + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc b/x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc index 30cc9cf249820..f5686c6d5cf9f 100644 --- a/x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc +++ b/x-pack/packages/security-solution/ecs_data_quality_dashboard/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/ecs-data-quality-dashboard", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security-solution/features/kibana.jsonc b/x-pack/packages/security-solution/features/kibana.jsonc index 0e5a360ea9929..ce6c88cbc2f74 100644 --- a/x-pack/packages/security-solution/features/kibana.jsonc +++ b/x-pack/packages/security-solution/features/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-solution-features", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security-solution/navigation/kibana.jsonc b/x-pack/packages/security-solution/navigation/kibana.jsonc index cec9119374006..9b2d406eb08e0 100644 --- a/x-pack/packages/security-solution/navigation/kibana.jsonc +++ b/x-pack/packages/security-solution/navigation/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-solution-navigation", - "owner": "@elastic/security-threat-hunting-explore" + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private" } diff --git a/x-pack/packages/security-solution/side_nav/kibana.jsonc b/x-pack/packages/security-solution/side_nav/kibana.jsonc index 88e34019f44bd..0b83d7c4d44b4 100644 --- a/x-pack/packages/security-solution/side_nav/kibana.jsonc +++ b/x-pack/packages/security-solution/side_nav/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-solution-side-nav", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security-solution/upselling/kibana.jsonc b/x-pack/packages/security-solution/upselling/kibana.jsonc index 7cf9a3026f18f..b28572062b89c 100644 --- a/x-pack/packages/security-solution/upselling/kibana.jsonc +++ b/x-pack/packages/security-solution/upselling/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/security-solution-upselling", - "owner": "@elastic/security-threat-hunting-explore" -} + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security/api_key_management/kibana.jsonc b/x-pack/packages/security/api_key_management/kibana.jsonc index 16e9244e49275..9f467a2c53697 100644 --- a/x-pack/packages/security/api_key_management/kibana.jsonc +++ b/x-pack/packages/security/api_key_management/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/security-api-key-management", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/security/authorization_core/kibana.jsonc b/x-pack/packages/security/authorization_core/kibana.jsonc index f2e33db5c8a81..513d8ddc84d8d 100644 --- a/x-pack/packages/security/authorization_core/kibana.jsonc +++ b/x-pack/packages/security/authorization_core/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/security-authorization-core", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security/authorization_core_common/kibana.jsonc b/x-pack/packages/security/authorization_core_common/kibana.jsonc index 1ddb58d875826..9ff7f5d0cae8e 100644 --- a/x-pack/packages/security/authorization_core_common/kibana.jsonc +++ b/x-pack/packages/security/authorization_core_common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-authorization-core-common", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security/form_components/kibana.jsonc b/x-pack/packages/security/form_components/kibana.jsonc index 44f54ee5fe4ca..b78de9f2f9c37 100644 --- a/x-pack/packages/security/form_components/kibana.jsonc +++ b/x-pack/packages/security/form_components/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-form-components", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/security/plugin_types_common/kibana.jsonc b/x-pack/packages/security/plugin_types_common/kibana.jsonc index 714eb0f564cda..37202115cacfa 100644 --- a/x-pack/packages/security/plugin_types_common/kibana.jsonc +++ b/x-pack/packages/security/plugin_types_common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-plugin-types-common", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/security/plugin_types_public/kibana.jsonc b/x-pack/packages/security/plugin_types_public/kibana.jsonc index f4fbe8fe8ea7d..a9e235915ded6 100644 --- a/x-pack/packages/security/plugin_types_public/kibana.jsonc +++ b/x-pack/packages/security/plugin_types_public/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-browser", "id": "@kbn/security-plugin-types-public", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/security/plugin_types_server/kibana.jsonc b/x-pack/packages/security/plugin_types_server/kibana.jsonc index e4f4a074f6e76..40ada7902e5e9 100644 --- a/x-pack/packages/security/plugin_types_server/kibana.jsonc +++ b/x-pack/packages/security/plugin_types_server/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-server", "id": "@kbn/security-plugin-types-server", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/x-pack/packages/security/role_management_model/kibana.jsonc b/x-pack/packages/security/role_management_model/kibana.jsonc index 9ba7936494167..95a1116fd7184 100644 --- a/x-pack/packages/security/role_management_model/kibana.jsonc +++ b/x-pack/packages/security/role_management_model/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/security-role-management-model", - "owner": "@elastic/kibana-security" -} + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" +} \ No newline at end of file diff --git a/x-pack/packages/security/ui_components/kibana.jsonc b/x-pack/packages/security/ui_components/kibana.jsonc index 996f7b78e110a..40aaaf007acde 100644 --- a/x-pack/packages/security/ui_components/kibana.jsonc +++ b/x-pack/packages/security/ui_components/kibana.jsonc @@ -1,5 +1,9 @@ { - "type": "shared-browser", - "id": "@kbn/security-ui-components", - "owner": "@elastic/kibana-security" + "type": "shared-browser", + "id": "@kbn/security-ui-components", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private" } diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap index 86f9124702fb2..9367ecb221b57 100644 --- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap +++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap @@ -10,45 +10,6 @@ Object { "presence": "optional", }, "keys": Object { - "apiType": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "matches": Array [ - Object { - "schema": Object { - "allow": Array [ - "converse", - ], - "flags": Object { - "error": [Function], - "only": true, - }, - "type": "any", - }, - }, - Object { - "schema": Object { - "allow": Array [ - "invoke", - ], - "flags": Object { - "error": [Function], - "only": true, - }, - "type": "any", - }, - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "alternatives", - }, "body": Object { "flags": Object { "error": [Function], @@ -170,45 +131,6 @@ Object { "presence": "optional", }, "keys": Object { - "apiType": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "matches": Array [ - Object { - "schema": Object { - "allow": Array [ - "converse", - ], - "flags": Object { - "error": [Function], - "only": true, - }, - "type": "any", - }, - }, - Object { - "schema": Object { - "allow": Array [ - "invoke", - ], - "flags": Object { - "error": [Function], - "only": true, - }, - "type": "any", - }, - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "alternatives", - }, "body": Object { "flags": Object { "error": [Function], @@ -1471,23 +1393,18 @@ Object { "presence": "optional", }, "keys": Object { - "additionalModelRequestFields": Object { + "command": Object { "flags": Object { - "default": [Function], "error": [Function], - "presence": "optional", }, "metas": Array [ Object { "x-oas-any-type": true, }, - Object { - "x-oas-optional": true, - }, ], "type": "any", }, - "additionalModelResponseFieldPaths": Object { + "signal": Object { "flags": Object { "default": [Function], "error": [Function], @@ -1503,927 +1420,83 @@ Object { ], "type": "any", }, - "guardrailConfig": Object { + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .bedrock 8`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "apiUrl": Object { "flags": Object { - "default": [Function], "error": [Function], - "presence": "optional", }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, + "rules": Array [ Object { - "x-oas-optional": true, + "args": Object { + "method": [Function], + }, + "name": "custom", }, ], - "type": "any", + "type": "string", }, - "inferenceConfig": Object { + "defaultModel": Object { "flags": Object { - "default": Object { - "special": "deep", - }, + "default": "anthropic.claude-3-5-sonnet-20240620-v1:0", "error": [Function], "presence": "optional", }, - "keys": Object { - "maxTokens": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", - }, - "stopSequences": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "items": Array [ - Object { - "flags": Object { - "error": [Function], - "presence": "optional", - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "array", - }, - "temperature": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", - }, - "topP": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", + "rules": Array [ + Object { + "args": Object { + "method": [Function], }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", + "name": "custom", }, - }, - "type": "object", + ], + "type": "string", }, - "messages": Object { + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .bedrock 9`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "accessKey": Object { "flags": Object { "error": [Function], }, - "items": Array [ + "rules": Array [ Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "content": Object { - "flags": Object { - "error": [Function], - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - ], - "type": "any", - }, - "role": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, + "args": Object { + "method": [Function], }, - "type": "object", + "name": "custom", }, ], - "type": "array", + "type": "string", }, - "modelId": Object { + "secret": Object { "flags": Object { - "default": [Function], "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "signal": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - Object { - "x-oas-optional": true, - }, - ], - "type": "any", - }, - "system": Object { - "flags": Object { - "error": [Function], - }, - "items": Array [ - Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "text": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - "toolConfig": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "toolChoice": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - "unknown": true, - }, - "keys": Object {}, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "preferences": Object { - "stripUnknown": Object { - "objects": false, - }, - }, - "type": "object", - }, - "tools": Object { - "flags": Object { - "error": [Function], - }, - "items": Array [ - Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "toolSpec": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "description": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "inputSchema": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "json": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "$schema": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "additionalProperties": Object { - "flags": Object { - "error": [Function], - }, - "type": "boolean", - }, - "properties": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - "unknown": true, - }, - "keys": Object {}, - "preferences": Object { - "stripUnknown": Object { - "objects": false, - }, - }, - "type": "object", - }, - "required": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "items": Array [ - Object { - "flags": Object { - "error": [Function], - "presence": "optional", - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "array", - }, - "type": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - "name": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "object", - }, - }, - "type": "object", -} -`; - -exports[`Connector type config checks detect connector type changes for: .bedrock 8`] = ` -Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "additionalModelRequestFields": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - Object { - "x-oas-optional": true, - }, - ], - "type": "any", - }, - "additionalModelResponseFieldPaths": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - Object { - "x-oas-optional": true, - }, - ], - "type": "any", - }, - "guardrailConfig": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - Object { - "x-oas-optional": true, - }, - ], - "type": "any", - }, - "inferenceConfig": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "maxTokens": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", - }, - "stopSequences": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "items": Array [ - Object { - "flags": Object { - "error": [Function], - "presence": "optional", - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "array", - }, - "temperature": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", - }, - "topP": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "number", - }, - }, - "type": "object", - }, - "messages": Object { - "flags": Object { - "error": [Function], - }, - "items": Array [ - Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "content": Object { - "flags": Object { - "error": [Function], - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - ], - "type": "any", - }, - "role": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - "modelId": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "signal": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-any-type": true, - }, - Object { - "x-oas-optional": true, - }, - ], - "type": "any", - }, - "system": Object { - "flags": Object { - "error": [Function], - }, - "items": Array [ - Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "text": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - "toolConfig": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "toolChoice": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - "unknown": true, - }, - "keys": Object {}, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "preferences": Object { - "stripUnknown": Object { - "objects": false, - }, - }, - "type": "object", - }, - "tools": Object { - "flags": Object { - "error": [Function], - }, - "items": Array [ - Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "toolSpec": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "description": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "inputSchema": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "json": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "$schema": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "additionalProperties": Object { - "flags": Object { - "error": [Function], - }, - "type": "boolean", - }, - "properties": Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - "unknown": true, - }, - "keys": Object {}, - "preferences": Object { - "stripUnknown": Object { - "objects": false, - }, - }, - "type": "object", - }, - "required": Object { - "flags": Object { - "default": [Function], - "error": [Function], - "presence": "optional", - }, - "items": Array [ - Object { - "flags": Object { - "error": [Function], - "presence": "optional", - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - ], - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "array", - }, - "type": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - "name": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", - }, - }, - "type": "object", - }, - ], - "type": "array", - }, - }, - "metas": Array [ - Object { - "x-oas-optional": true, - }, - ], - "type": "object", - }, - }, - "type": "object", -} -`; - -exports[`Connector type config checks detect connector type changes for: .bedrock 9`] = ` -Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "apiUrl": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "defaultModel": Object { - "flags": Object { - "default": "anthropic.claude-3-5-sonnet-20240620-v1:0", - "error": [Function], - "presence": "optional", }, "rules": Array [ Object { @@ -2441,49 +1514,6 @@ Object { `; exports[`Connector type config checks detect connector type changes for: .bedrock 10`] = ` -Object { - "flags": Object { - "default": Object { - "special": "deep", - }, - "error": [Function], - "presence": "optional", - }, - "keys": Object { - "accessKey": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - "secret": Object { - "flags": Object { - "error": [Function], - }, - "rules": Array [ - Object { - "args": Object { - "method": [Function], - }, - "name": "custom", - }, - ], - "type": "string", - }, - }, - "type": "object", -} -`; - -exports[`Connector type config checks detect connector type changes for: .bedrock 11`] = ` Object { "flags": Object { "default": Object { diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts index d6c89a35ba7ff..f9cc6ff5a5ba0 100644 --- a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts @@ -24,6 +24,7 @@ describe('getGenAiTokenTracking', () => { let mockGetTokenCountFromInvokeStream: jest.Mock; let mockGetTokenCountFromInvokeAsyncIterator: jest.Mock; beforeEach(() => { + jest.clearAllMocks(); mockGetTokenCountFromBedrockInvoke = ( getTokenCountFromBedrockInvoke as jest.Mock ).mockResolvedValueOnce({ @@ -163,6 +164,103 @@ describe('getGenAiTokenTracking', () => { }); }); + it('should return the total, prompt, and completion token counts when given a valid ConverseResponse for bedrockClientSend subaction', async () => { + const actionTypeId = '.bedrock'; + + const result = { + actionId: '123', + status: 'ok' as const, + data: { + usage: { + inputTokens: 50, + outputTokens: 50, + totalTokens: 100, + }, + }, + }; + const validatedParams = { + subAction: 'bedrockClientSend', + }; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }); + expect(logger.error).not.toHaveBeenCalled(); + }); + + it('should return the total, prompt, and completion token counts when given a valid ConverseStreamResponse for bedrockClientSend subaction', async () => { + const chunkIterable = { + async *[Symbol.asyncIterator]() { + await new Promise((resolve) => setTimeout(resolve, 100)); + yield { + metadata: { + usage: { + totalTokens: 100, + inputTokens: 40, + outputTokens: 60, + }, + }, + }; + }, + }; + const actionTypeId = '.bedrock'; + + const result = { + actionId: '123', + status: 'ok' as const, + data: { + tokenStream: chunkIterable, + }, + }; + const validatedParams = { + subAction: 'bedrockClientSend', + }; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 40, + completion_tokens: 60, + }); + expect(logger.error).not.toHaveBeenCalled(); + }); + + it('should return null when given an invalid Bedrock response for bedrockClientSend subaction', async () => { + const actionTypeId = '.bedrock'; + const result = { + actionId: '123', + status: 'ok' as const, + data: {}, + }; + const validatedParams = { + subAction: 'bedrockClientSend', + }; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toBeNull(); + expect(logger.error).toHaveBeenCalled(); + }); it('should return the total, prompt, and completion token counts when given a valid OpenAI streamed response', async () => { const mockReader = new IncomingMessage(new Socket()); const actionTypeId = '.gen-ai'; diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts index 41bfa28605f40..d73610892098d 100644 --- a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts @@ -9,6 +9,10 @@ import { PassThrough, Readable } from 'stream'; import { Logger } from '@kbn/logging'; import { Stream } from 'openai/streaming'; import { ChatCompletionChunk } from 'openai/resources/chat/completions'; +import { + getTokensFromBedrockConverseStream, + SmithyStream, +} from './get_token_count_from_bedrock_converse'; import { InvokeAsyncIteratorBody, getTokenCountFromInvokeAsyncIterator, @@ -264,6 +268,29 @@ export const getGenAiTokenTracking = async ({ // silently fail and null is returned at bottom of function } } + + // BedrockRuntimeClient.send response used by chat model ActionsClientChatBedrockConverse + if (actionTypeId === '.bedrock' && validatedParams.subAction === 'bedrockClientSend') { + const { tokenStream, usage } = result.data as unknown as { + tokenStream?: SmithyStream; + usage?: { inputTokens: number; outputTokens: number; totalTokens: number }; + }; + if (tokenStream) { + const res = await getTokensFromBedrockConverseStream(tokenStream, logger); + return res; + } + if (usage) { + return { + total_tokens: usage.totalTokens, + prompt_tokens: usage.inputTokens, + completion_tokens: usage.outputTokens, + }; + } else { + logger.error('Response from Bedrock converse API did not contain usage object'); + return null; + } + } + return null; }; diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_converse.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_converse.ts new file mode 100644 index 0000000000000..55bd9e6582e00 --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_bedrock_converse.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 { SmithyMessageDecoderStream } from '@smithy/eventstream-codec'; +import { Logger } from '@kbn/logging'; + +export type SmithyStream = SmithyMessageDecoderStream<{ + metadata?: { + usage: { inputTokens: number; outputTokens: number; totalTokens: number }; + }; +}>; + +export const getTokensFromBedrockConverseStream = async function ( + responseStream: SmithyStream, + logger: Logger +): Promise<{ total_tokens: number; prompt_tokens: number; completion_tokens: number } | null> { + try { + for await (const { metadata } of responseStream) { + if (metadata) { + return { + total_tokens: metadata.usage.totalTokens, + prompt_tokens: metadata.usage.inputTokens, + completion_tokens: metadata.usage.outputTokens, + }; + } + } + return null; // Return the final tokens once the generator finishes + } catch (e) { + logger.error('Response from Bedrock converse API did not contain usage object'); + return null; + } +}; diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.ts index d067ddaaae7ad..cf1f9eed87c32 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.ts @@ -8,17 +8,6 @@ import { v4 as uuidv4 } from 'uuid'; import { pick } from 'lodash'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/server'; -import { - CoreKibanaRequest, - FakeRawRequest, - Headers, - IBasePath, - ISavedObjectsRepository, - Logger, - SavedObject, - SavedObjectReference, - SavedObjectsErrorHelpers, -} from '@kbn/core/server'; import { createTaskRunError, RunContext, @@ -28,6 +17,15 @@ import { } from '@kbn/task-manager-plugin/server'; import { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin/server'; import { createRetryableError, getErrorSource } from '@kbn/task-manager-plugin/server/task_running'; +import { type IBasePath, type Headers, type FakeRawRequest } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; +import type { Logger } from '@kbn/logging'; +import type { + ISavedObjectsRepository, + SavedObject, + SavedObjectReference, +} from '@kbn/core-saved-objects-api-server'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; import { ActionExecutorContract } from './action_executor'; import { ActionTaskExecutorParams, @@ -243,7 +241,7 @@ function getFakeRequest(apiKey?: string) { // Since we're using API keys and accessing elasticsearch can only be done // via a request, we're faking one with the proper authorization headers. - return CoreKibanaRequest.from(fakeRawRequest); + return kibanaRequestFactory(fakeRawRequest); } async function getActionTaskParams( diff --git a/x-pack/plugins/actions/tsconfig.json b/x-pack/plugins/actions/tsconfig.json index 8a3c56a472064..709826d33e897 100644 --- a/x-pack/plugins/actions/tsconfig.json +++ b/x-pack/plugins/actions/tsconfig.json @@ -47,7 +47,8 @@ "@kbn/core-test-helpers-kbn-server", "@kbn/security-plugin-types-server", "@kbn/core-application-common", - "@kbn/cloud-plugin" + "@kbn/cloud-plugin", + "@kbn/core-http-server-utils" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/ai_infra/llm_tasks/kibana.jsonc b/x-pack/plugins/ai_infra/llm_tasks/kibana.jsonc index 1ef211d01210e..2a3da90e3e3df 100644 --- a/x-pack/plugins/ai_infra/llm_tasks/kibana.jsonc +++ b/x-pack/plugins/ai_infra/llm_tasks/kibana.jsonc @@ -2,6 +2,9 @@ "type": "plugin", "id": "@kbn/llm-tasks-plugin", "owner": "@elastic/appex-ai-infra", + // all packages under 'ai_infra' will be used across solutions + "group": "platform", + "visibility": "shared", "plugin": { "id": "llmTasks", "server": true, diff --git a/x-pack/plugins/ai_infra/product_doc_base/kibana.jsonc b/x-pack/plugins/ai_infra/product_doc_base/kibana.jsonc index 268b4a70c9921..c157105026b13 100644 --- a/x-pack/plugins/ai_infra/product_doc_base/kibana.jsonc +++ b/x-pack/plugins/ai_infra/product_doc_base/kibana.jsonc @@ -2,6 +2,9 @@ "type": "plugin", "id": "@kbn/product-doc-base-plugin", "owner": "@elastic/appex-ai-infra", + // all packages under 'ai_infra' will be used across solutions + "group": "platform", + "visibility": "shared", "plugin": { "id": "productDocBase", "server": true, diff --git a/x-pack/plugins/aiops/public/components/log_categorization/format_category.test.tsx b/x-pack/plugins/aiops/public/components/log_categorization/format_category.test.tsx index 9ed7de75999aa..c93a2de548620 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/format_category.test.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/format_category.test.tsx @@ -7,7 +7,7 @@ import type { Category } from '@kbn/aiops-log-pattern-analysis/types'; import { useCreateFormattedExample } from './format_category'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; jest.mock('../../hooks/use_eui_theme', () => ({ useIsDarkTheme: () => false, diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis_results_table/use_copy_to_clipboard_action.test.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis_results_table/use_copy_to_clipboard_action.test.tsx index 506a92abce550..1d5dbd0dffb1e 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis_results_table/use_copy_to_clipboard_action.test.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis_results_table/use_copy_to_clipboard_action.test.tsx @@ -7,8 +7,7 @@ import type { ReactElement } from 'react'; import userEvent from '@testing-library/user-event'; -import { render } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, renderHook } from '@testing-library/react'; import type { SignificantItem } from '@kbn/ml-agg-utils'; diff --git a/x-pack/plugins/aiops/public/hooks/use_filters_query.test.tsx b/x-pack/plugins/aiops/public/hooks/use_filters_query.test.tsx index bfea21f9e8bbc..4ff9aaec9c271 100644 --- a/x-pack/plugins/aiops/public/hooks/use_filters_query.test.tsx +++ b/x-pack/plugins/aiops/public/hooks/use_filters_query.test.tsx @@ -6,7 +6,7 @@ */ import { FilterQueryContextProvider, useFilterQueryUpdates } from './use_filters_query'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { dataPluginMock as mockDataPlugin } from '@kbn/data-plugin/public/mocks'; import type { TimefilterConfig } from '@kbn/data-plugin/public/query'; import { Timefilter } from '@kbn/data-plugin/public/query'; diff --git a/x-pack/plugins/alerting/server/task_runner/maintenance_windows/get_maintenance_windows.test.ts b/x-pack/plugins/alerting/server/task_runner/maintenance_windows/get_maintenance_windows.test.ts index a6479fba828f4..9f44194dbb951 100644 --- a/x-pack/plugins/alerting/server/task_runner/maintenance_windows/get_maintenance_windows.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/maintenance_windows/get_maintenance_windows.test.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { maintenanceWindowCategoryIdTypes } from '../../application/maintenance_window/constants'; import { getMockMaintenanceWindow } from '../../data/maintenance_window/test_helpers'; @@ -21,6 +20,7 @@ import { import { getFakeKibanaRequest } from '../rule_loader'; import { TaskRunnerContext } from '../types'; import { FilterStateStore } from '@kbn/es-query'; +import { KibanaRequest } from '@kbn/core-http-server'; const logger = loggingSystemMock.create().get(); const mockBasePathService = { set: jest.fn() }; @@ -32,7 +32,7 @@ const ruleTypeId = mockedRule.alertTypeId; describe('getMaintenanceWindows', () => { let context: TaskRunnerContext; - let fakeRequest: CoreKibanaRequest; + let fakeRequest: KibanaRequest; let contextMock: ReturnType; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts b/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts index 1d4741f84749c..4690ccc653a32 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_loader.test.ts @@ -6,10 +6,11 @@ */ import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; -import { CoreKibanaRequest, SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { isCoreKibanaRequest } from '@kbn/core-http-server-utils'; import { schema } from '@kbn/config-schema'; -import { Logger } from '@kbn/core/server'; -import { loggingSystemMock } from '@kbn/core/server/mocks'; +import type { Logger } from '@kbn/logging'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { getDecryptedRule, @@ -244,59 +245,48 @@ describe('rule_loader', () => { describe('getFakeKibanaRequest()', () => { test('has API key, in default space', async () => { - const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from'); const fakeRequest = getFakeKibanaRequest(context, 'default', apiKey); - const bpsSetParams = mockBasePathService.set.mock.calls[0]; expect(bpsSetParams).toEqual([fakeRequest, '/']); - expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest)); - expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "headers": Object { - "authorization": "ApiKey MTIzOmFiYw==", - }, - "path": "/", - }, - ] - `); + expect(isCoreKibanaRequest(fakeRequest)).toEqual(true); + expect(fakeRequest.auth.isAuthenticated).toEqual(false); + expect(fakeRequest.headers.authorization).toEqual('ApiKey MTIzOmFiYw=='); + expect(fakeRequest.isFakeRequest).toEqual(true); + expect(fakeRequest.isInternalApiRequest).toEqual(false); + expect(fakeRequest.isSystemRequest).toEqual(false); + expect(fakeRequest.route.path).toEqual('/'); + expect(fakeRequest.url.toString()).toEqual('https://fake-request/url'); + expect(fakeRequest.uuid).toEqual(expect.any(String)); }); test('has API key, in non-default space', async () => { - const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from'); const fakeRequest = getFakeKibanaRequest(context, spaceId, apiKey); - const bpsSetParams = mockBasePathService.set.mock.calls[0]; expect(bpsSetParams).toEqual([fakeRequest, '/s/rule-spaceId']); - expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest)); - expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "headers": Object { - "authorization": "ApiKey MTIzOmFiYw==", - }, - "path": "/", - }, - ] - `); + expect(isCoreKibanaRequest(fakeRequest)).toEqual(true); + expect(fakeRequest.auth.isAuthenticated).toEqual(false); + expect(fakeRequest.headers.authorization).toEqual('ApiKey MTIzOmFiYw=='); + expect(fakeRequest.isFakeRequest).toEqual(true); + expect(fakeRequest.isInternalApiRequest).toEqual(false); + expect(fakeRequest.isSystemRequest).toEqual(false); + expect(fakeRequest.route.path).toEqual('/'); + expect(fakeRequest.url.toString()).toEqual('https://fake-request/url'); + expect(fakeRequest.uuid).toEqual(expect.any(String)); }); test('does not have API key, in default space', async () => { - const kibanaRequestFromMock = jest.spyOn(CoreKibanaRequest, 'from'); const fakeRequest = getFakeKibanaRequest(context, 'default', null); - const bpsSetParams = mockBasePathService.set.mock.calls[0]; expect(bpsSetParams).toEqual([fakeRequest, '/']); - expect(fakeRequest).toEqual(expect.any(CoreKibanaRequest)); - expect(kibanaRequestFromMock.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "headers": Object {}, - "path": "/", - }, - ] - `); + expect(fakeRequest.auth.isAuthenticated).toEqual(false); + expect(fakeRequest.headers).toEqual({}); + expect(fakeRequest.isFakeRequest).toEqual(true); + expect(fakeRequest.isInternalApiRequest).toEqual(false); + expect(fakeRequest.isSystemRequest).toEqual(false); + expect(fakeRequest.route.path).toEqual('/'); + expect(fakeRequest.url.toString()).toEqual('https://fake-request/url'); + expect(fakeRequest.uuid).toEqual(expect.any(String)); }); }); }); diff --git a/x-pack/plugins/alerting/server/task_runner/rule_loader.ts b/x-pack/plugins/alerting/server/task_runner/rule_loader.ts index 3dd0dc8c53a55..b917ba334b93b 100644 --- a/x-pack/plugins/alerting/server/task_runner/rule_loader.ts +++ b/x-pack/plugins/alerting/server/task_runner/rule_loader.ts @@ -6,16 +6,12 @@ */ import { addSpaceIdToPath } from '@kbn/spaces-plugin/server'; -import { - CoreKibanaRequest, - FakeRawRequest, - Headers, - Logger, - SavedObject, - SavedObjectReference, - SavedObjectsErrorHelpers, -} from '@kbn/core/server'; import { createTaskRunError, TaskErrorSource } from '@kbn/task-manager-plugin/server'; +import { type FakeRawRequest, type Headers } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; +import type { SavedObject, SavedObjectReference } from '@kbn/core-saved-objects-api-server'; +import type { Logger } from '@kbn/logging'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; import { RunRuleParams, TaskRunnerContext } from './types'; import { ErrorWithReason, validateRuleTypeParams } from '../lib'; import { @@ -174,7 +170,7 @@ export function getFakeKibanaRequest( path: '/', }; - const fakeRequest = CoreKibanaRequest.from(fakeRawRequest); + const fakeRequest = kibanaRequestFactory(fakeRawRequest); context.basePathService.set(fakeRequest, path); return fakeRequest; diff --git a/x-pack/plugins/alerting/tsconfig.json b/x-pack/plugins/alerting/tsconfig.json index eefc1999b26d5..d261a00db74ca 100644 --- a/x-pack/plugins/alerting/tsconfig.json +++ b/x-pack/plugins/alerting/tsconfig.json @@ -65,7 +65,6 @@ "@kbn/core-saved-objects-api-server-mocks", "@kbn/core-ui-settings-server-mocks", "@kbn/core-test-helpers-kbn-server", - "@kbn/core-http-router-server-internal", "@kbn/core-execution-context-server-mocks", "@kbn/react-kibana-context-render", "@kbn/search-types", @@ -74,7 +73,8 @@ "@kbn/core-http-server", "@kbn/zod", "@kbn/core-saved-objects-base-server-internal", - "@kbn/response-ops-rule-params" + "@kbn/response-ops-rule-params", + "@kbn/core-http-server-utils" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx index d293d8deade41..23823c54a26dd 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx @@ -6,7 +6,7 @@ */ import React, { FC, PropsWithChildren } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useAutoplayHelper } from './use_autoplay_helper'; import { WorkpadRoutingContext, WorkpadRoutingContextType } from '../workpad_routing_context'; diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_page_sync.test.ts b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_page_sync.test.ts index 6d4c99cf618fb..ba3fd671c5e2e 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_page_sync.test.ts +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_page_sync.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { usePageSync } from './use_page_sync'; const mockDispatch = jest.fn(); diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx index d7dbbcf43c121..bc23831c2b65e 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx @@ -6,7 +6,7 @@ */ import React, { PropsWithChildren } from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useRefreshHelper } from './use_refresh_helper'; import { WorkpadRoutingContext, WorkpadRoutingContextType } from '../workpad_routing_context'; @@ -31,7 +31,7 @@ const getMockedContext = (context: any) => const getContextWrapper = (context: WorkpadRoutingContextType) => - ({ children }: PropsWithChildren) => + ({ children }: PropsWithChildren) => {children}; describe('useRefreshHelper', () => { @@ -77,7 +77,7 @@ describe('useRefreshHelper', () => { expect(mockDispatch).not.toHaveBeenCalledWith(refreshAction); state.transient.inFlight = true; - // @ts-expect-error @types/react@18 - Type '() => void' has no properties in common with type '{ children?: ReactNode; }'. + rerender(useRefreshHelper); jest.runAllTimers(); diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_restore_history.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_restore_history.test.tsx index 0504368be05ac..5db80771dea24 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_restore_history.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_restore_history.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useRestoreHistory } from './use_restore_history'; import { encode } from '../route_state'; diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad.test.tsx index 1ba0dacd8c143..c8c106bb2bca8 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useWorkpad } from './use_workpad'; import { spacesService } from '../../../services/kibana_services'; @@ -62,7 +62,7 @@ describe('useWorkpad', () => { workpad: workpadResponse, }); - const { waitFor, unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); + const { unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); try { await waitFor(() => expect(mockDispatch).toHaveBeenCalledTimes(3)); @@ -88,7 +88,7 @@ describe('useWorkpad', () => { aliasId, }); - const { waitFor, unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); + const { unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); try { await waitFor(() => expect(mockDispatch).toHaveBeenCalledTimes(3)); @@ -118,7 +118,7 @@ describe('useWorkpad', () => { aliasPurpose: 'savedObjectConversion', }); - const { waitFor, unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); + const { unmount } = renderHook(() => useWorkpad(workpadId, true, getRedirectPath)); try { await waitFor(() => expect(mockRedirectLegacyUrl).toHaveBeenCalled()); expect(mockRedirectLegacyUrl).toBeCalledWith({ diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_history.test.ts b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_history.test.ts index 93c750a3e13f6..bb0430660890b 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_history.test.ts +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_history.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useWorkpadHistory } from './use_workpad_history'; import { encode } from '../route_state'; diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_persist.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_persist.test.tsx index 3193ad3dd79e5..f53a5a080f3dc 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_persist.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_workpad_persist.test.tsx @@ -4,11 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; + +import crypto from 'crypto'; +import { renderHook } from '@testing-library/react'; import { useWorkpadPersist } from './use_workpad_persist'; const mockGetState = jest.fn(); -const mockUpdateWorkpad = jest.fn(); +const mockUpdateWorkpad = jest.fn(() => Promise.resolve(null)); const mockUpdateAssets = jest.fn(); const mockUpdate = jest.fn(); @@ -36,53 +38,41 @@ jest.mock('../../../services', () => ({ })); describe('useWorkpadPersist', () => { + const initialState = { + persistent: { + workpad: { id: crypto.randomUUID(), some: 'workpad' }, + }, + assets: { + asset1: 'some asset', + asset2: 'other asset', + }, + }; + beforeEach(() => { - jest.resetAllMocks(); + // create a default state for each test + mockGetState.mockReturnValue(initialState); }); - afterAll(() => { + afterEach(() => { jest.clearAllMocks(); }); test('initial render does not persist state', () => { - const state = { - persistent: { - workpad: { some: 'workpad' }, - }, - assets: { - asset1: 'some asset', - asset2: 'other asset', - }, - }; - - mockGetState.mockReturnValue(state); - renderHook(useWorkpadPersist); expect(mockUpdateWorkpad).not.toBeCalled(); }); test('changes to workpad cause a workpad update', () => { - const state = { - persistent: { - workpad: { some: 'workpad' }, - }, - assets: { - asset1: 'some asset', - asset2: 'other asset', - }, - }; - - mockGetState.mockReturnValue(state); - const { rerender } = renderHook(useWorkpadPersist); const newState = { - ...state, + ...initialState, persistent: { - workpad: { new: 'workpad' }, + workpad: { id: crypto.randomUUID(), new: 'workpad' }, }, }; + mockGetState.mockReturnValue(newState); rerender(); @@ -91,13 +81,6 @@ describe('useWorkpadPersist', () => { }); test('non changes causes no updated', () => { - const state = { - persistent: { - workpad: { some: 'workpad' }, - }, - }; - mockGetState.mockReturnValue(state); - const { rerender } = renderHook(useWorkpadPersist); rerender(); @@ -106,26 +89,17 @@ describe('useWorkpadPersist', () => { }); test('non write permissions causes no updates', () => { - const state = { - persistent: { - workpad: { some: 'workpad' }, - }, - transient: { - canUserWrite: false, - }, - }; - mockGetState.mockReturnValue(state); - const { rerender } = renderHook(useWorkpadPersist); const newState = { persistent: { - workpad: { new: 'workpad value' }, + workpad: { id: crypto.randomUUID(), new: 'workpad value' }, }, transient: { canUserWrite: false, }, }; + mockGetState.mockReturnValue(newState); rerender(); diff --git a/x-pack/plugins/cases/public/components/case_form_fields/severity.test.tsx b/x-pack/plugins/cases/public/components/case_form_fields/severity.test.tsx index b1c893d020e4e..12f72a073b7fc 100644 --- a/x-pack/plugins/cases/public/components/case_form_fields/severity.test.tsx +++ b/x-pack/plugins/cases/public/components/case_form_fields/severity.test.tsx @@ -16,7 +16,8 @@ import { FormTestComponent } from '../../common/test_utils'; const onSubmit = jest.fn(); -describe('Severity form field', () => { +// FLAKY: https://github.com/elastic/kibana/issues/188951 +describe.skip('Severity form field', () => { let appMockRender: AppMockRenderer; beforeEach(() => { diff --git a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx index 8380276e3e106..e2aed2c397835 100644 --- a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx +++ b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx @@ -6,28 +6,19 @@ */ import React from 'react'; -import { screen, waitFor } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import type { AppMockRenderer } from '../../common/mock'; -import { createAppMockRenderer } from '../../common/mock'; import { CategoryFormField } from './category_form_field'; import { categories } from '../../containers/mock'; import { MAX_CATEGORY_LENGTH } from '../../../common/constants'; import { FormTestComponent } from '../../common/test_utils'; -// FLAKY: https://github.com/elastic/kibana/issues/189739 -describe.skip('Category', () => { - let appMockRender: AppMockRenderer; +describe('Category', () => { const onSubmit = jest.fn(); - beforeEach(() => { - jest.clearAllMocks(); - appMockRender = createAppMockRenderer(); - }); - it('renders the category field correctly', async () => { - appMockRender.render( + render( @@ -37,7 +28,7 @@ describe.skip('Category', () => { }); it('can submit without setting a category', async () => { - appMockRender.render( + render( @@ -53,7 +44,7 @@ describe.skip('Category', () => { }); it('can submit with category a string as default value', async () => { - appMockRender.render( + render( @@ -69,7 +60,7 @@ describe.skip('Category', () => { }); it('can submit with category with null as default value', async () => { - appMockRender.render( + render( @@ -85,7 +76,7 @@ describe.skip('Category', () => { }); it('cannot submit if the category is an empty string', async () => { - appMockRender.render( + render( @@ -100,13 +91,13 @@ describe.skip('Category', () => { expect(onSubmit).toBeCalledWith({}, false); }); - expect(screen.getByText('Empty category is not allowed')); + expect(await screen.findByText('Empty category is not allowed')); }); it(`cannot submit if the category is more than ${MAX_CATEGORY_LENGTH}`, async () => { const category = 'a'.repeat(MAX_CATEGORY_LENGTH + 1); - appMockRender.render( + render( @@ -122,20 +113,20 @@ describe.skip('Category', () => { }); expect( - screen.getByText( + await screen.findByText( 'The length of the category is too long. The maximum length is 50 characters.' ) ); }); it('can set a category from existing ones', async () => { - appMockRender.render( + render( ); - await userEvent.type(screen.getByRole('combobox'), `${categories[1]}{enter}`); + await userEvent.type(await screen.findByRole('combobox'), `${categories[1]}{enter}`); await userEvent.click(await screen.findByTestId('form-test-component-submit-button')); await waitFor(() => { @@ -145,13 +136,13 @@ describe.skip('Category', () => { }); it('can set a new category', async () => { - appMockRender.render( + render( ); - await userEvent.type(screen.getByRole('combobox'), 'my new category{enter}'); + await userEvent.type(await screen.findByRole('combobox'), 'my new category{enter}'); await userEvent.click(await screen.findByTestId('form-test-component-submit-button')); await waitFor(() => { @@ -161,30 +152,30 @@ describe.skip('Category', () => { }); it('cannot set an empty category', async () => { - appMockRender.render( + render( ); - await userEvent.type(screen.getByRole('combobox'), ' {enter}'); + await userEvent.type(await screen.findByRole('combobox'), ' {enter}'); await userEvent.click(await screen.findByTestId('form-test-component-submit-button')); await waitFor(() => { // data, isValid expect(onSubmit).toBeCalledWith({}, false); - expect(screen.getByText('Empty category is not allowed')); }); + expect(await screen.findByText('Empty category is not allowed')); }); it('setting an empty category and clear it do not produce an error', async () => { - appMockRender.render( + render( ); - await userEvent.type(screen.getByRole('combobox'), ' {enter}'); + await userEvent.type(await screen.findByRole('combobox'), ' {enter}'); await userEvent.click(await screen.findByTestId('form-test-component-submit-button')); await waitFor(() => { @@ -202,7 +193,7 @@ describe.skip('Category', () => { }); it('disables the component correctly when it is loading', async () => { - appMockRender.render( + render( diff --git a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx index 7f11214a1576c..8ba88a4d8a3c5 100644 --- a/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/owner_selector.test.tsx @@ -6,29 +6,19 @@ */ import React from 'react'; -import { waitFor, screen } from '@testing-library/react'; +import { waitFor, screen, render } from '@testing-library/react'; import { SECURITY_SOLUTION_OWNER } from '../../../common'; import { OBSERVABILITY_OWNER, OWNER_INFO } from '../../../common/constants'; import { CreateCaseOwnerSelector } from './owner_selector'; -import type { AppMockRenderer } from '../../common/mock'; -import { createAppMockRenderer } from '../../common/mock'; import userEvent from '@testing-library/user-event'; -// FLAKY: https://github.com/elastic/kibana/issues/188488 -describe.skip('Case Owner Selection', () => { +describe('Case Owner Selection', () => { const onOwnerChange = jest.fn(); const selectedOwner = SECURITY_SOLUTION_OWNER; - let appMockRender: AppMockRenderer; - - beforeEach(() => { - jest.clearAllMocks(); - appMockRender = createAppMockRenderer(); - }); - it('renders all options', async () => { - appMockRender.render( + render( { it.each([[SECURITY_SOLUTION_OWNER], [OBSERVABILITY_OWNER]])( 'only displays %s option if available', async (available) => { - appMockRender.render( + render( { ); it('changes the selection', async () => { - appMockRender.render( + render( { - let appMockRender: AppMockRenderer; +describe('TemplateSelector', () => { const onTemplateChange = jest.fn(); - beforeEach(() => { - jest.clearAllMocks(); - appMockRender = createAppMockRenderer(); - }); - - afterEach(async () => { - await appMockRender.clearQueryCache(); - }); - it('renders correctly', async () => { - appMockRender.render( + render( { it('selects a template correctly', async () => { const selectedTemplate = templatesConfigurationMock[2]; - appMockRender.render( + render( { it('shows selected template as default', async () => { const templateToSelect = templatesConfigurationMock[1]; - appMockRender.render( + render( { const templateToSelect = templatesConfigurationMock[1]; const newTemplate = templatesConfigurationMock[2]; - appMockRender.render( + render( { it('shows the selected option correctly', async () => { const selectedTemplate = templatesConfigurationMock[2]; - appMockRender.render( + render( { - let appMockRender: AppMockRenderer; - +describe('FileNameLink', () => { const defaultProps = { file: basicFileMock, showPreview: jest.fn(), @@ -26,11 +20,10 @@ describe.skip('FileNameLink', () => { beforeEach(() => { jest.clearAllMocks(); - appMockRender = createAppMockRenderer(); }); it('renders clickable name if file is image', async () => { - appMockRender.render(); + render(); const nameLink = await screen.findByTestId('cases-files-name-link'); @@ -42,7 +35,7 @@ describe.skip('FileNameLink', () => { }); it('renders simple text name if file is not image', async () => { - appMockRender.render( + render( { - let appMock: AppMockRenderer; +describe('DeleteAttachmentConfirmationModal', () => { const props = { title: 'My title', confirmButtonText: 'My button text', @@ -21,34 +18,29 @@ describe.skip('DeleteAttachmentConfirmationModal', () => { onConfirm: jest.fn(), }; - beforeEach(() => { - appMock = createAppMockRenderer(); - jest.clearAllMocks(); - }); - it('renders correctly', async () => { - const result = appMock.render(); + render(); - expect(result.getByTestId('property-actions-confirm-modal')).toBeInTheDocument(); - expect(result.getByText('My title')).toBeInTheDocument(); - expect(result.getByText('My button text')).toBeInTheDocument(); - expect(result.getByText('Cancel')).toBeInTheDocument(); + expect(await screen.findByTestId('property-actions-confirm-modal')).toBeInTheDocument(); + expect(await screen.findByText('My title')).toBeInTheDocument(); + expect(await screen.findByText('My button text')).toBeInTheDocument(); + expect(await screen.findByText('Cancel')).toBeInTheDocument(); }); it('calls onConfirm', async () => { - const result = appMock.render(); + const result = render(); - expect(result.getByText('My button text')).toBeInTheDocument(); - await userEvent.click(result.getByText('My button text')); + expect(await result.findByText('My button text')).toBeInTheDocument(); + await userEvent.click(await result.findByText('My button text')); expect(props.onConfirm).toHaveBeenCalled(); }); it('calls onCancel', async () => { - const result = appMock.render(); + render(); - expect(result.getByText('Cancel')).toBeInTheDocument(); - await userEvent.click(result.getByText('Cancel')); + expect(await screen.findByText('Cancel')).toBeInTheDocument(); + await userEvent.click(await screen.findByText('Cancel')); expect(props.onCancel).toHaveBeenCalled(); }); diff --git a/x-pack/plugins/cases/public/components/user_actions/show_more_button.test.tsx b/x-pack/plugins/cases/public/components/user_actions/show_more_button.test.tsx index 58c152f6b0b3c..34a0ad2713373 100644 --- a/x-pack/plugins/cases/public/components/user_actions/show_more_button.test.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/show_more_button.test.tsx @@ -14,7 +14,8 @@ import { createAppMockRenderer } from '../../common/mock'; const showMoreClickMock = jest.fn(); -describe('ShowMoreButton', () => { +// FLAKY: https://github.com/elastic/kibana/issues/192672 +describe.skip('ShowMoreButton', () => { let appMockRender: AppMockRenderer; beforeEach(() => { diff --git a/x-pack/plugins/cases/server/client/factory.test.ts b/x-pack/plugins/cases/server/client/factory.test.ts index f73e93afd680c..e9f60b45ddba1 100644 --- a/x-pack/plugins/cases/server/client/factory.test.ts +++ b/x-pack/plugins/cases/server/client/factory.test.ts @@ -5,12 +5,14 @@ * 2.0. */ -import { coreMock, httpServerMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { coreMock } from '@kbn/core/server/mocks'; +import { httpServerMock } from '@kbn/core-http-server-mocks'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { CasesClientFactory } from './factory'; import { createCasesClientFactoryMockArgs } from './mocks'; import { createCasesClient } from './client'; import type { FakeRawRequest } from '@kbn/core-http-server'; -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; jest.mock('./client'); @@ -23,7 +25,7 @@ describe('CasesClientFactory', () => { path: '/', }; - const fakeRequest = CoreKibanaRequest.from(rawRequest); + const fakeRequest = kibanaRequestFactory(rawRequest); const createCasesClientMocked = createCasesClient as jest.Mock; const logger = loggingSystemMock.createLogger(); const args = createCasesClientFactoryMockArgs(); diff --git a/x-pack/plugins/cases/server/connectors/cases/cases_connector.test.ts b/x-pack/plugins/cases/server/connectors/cases/cases_connector.test.ts index c0a2a8567fd79..8eebaba88d769 100644 --- a/x-pack/plugins/cases/server/connectors/cases/cases_connector.test.ts +++ b/x-pack/plugins/cases/server/connectors/cases/cases_connector.test.ts @@ -6,6 +6,7 @@ */ import Boom from '@hapi/boom'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import { actionsMock } from '@kbn/actions-plugin/server/mocks'; import { actionsConfigMock } from '@kbn/actions-plugin/server/actions_config.mock'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; @@ -17,7 +18,6 @@ import { CasesService } from './cases_service'; import { CasesConnectorError } from './cases_connector_error'; import { CaseError } from '../../common/error'; import { fullJitterBackoffFactory } from './full_jitter_backoff'; -import { CoreKibanaRequest } from '@kbn/core/server'; jest.mock('./cases_connector_executor'); jest.mock('./full_jitter_backoff'); @@ -28,7 +28,7 @@ const fullJitterBackoffFactoryMock = fullJitterBackoffFactory as jest.Mock; describe('CasesConnector', () => { const services = actionsMock.createServices(); const logger = loggingSystemMock.createLogger(); - const kibanaRequest = CoreKibanaRequest.from({ path: '/', headers: {} }); + const kibanaRequest = kibanaRequestFactory({ path: '/', headers: {} }); const groupingBy = ['host.name', 'dest.ip']; const rule = { diff --git a/x-pack/plugins/cases/tsconfig.json b/x-pack/plugins/cases/tsconfig.json index 1d126d78f9543..48ca36a02b2be 100644 --- a/x-pack/plugins/cases/tsconfig.json +++ b/x-pack/plugins/cases/tsconfig.json @@ -73,10 +73,11 @@ "@kbn/datemath", "@kbn/core-logging-server-mocks", "@kbn/core-logging-browser-mocks", - "@kbn/core-http-router-server-internal", "@kbn/presentation-publishing", "@kbn/alerts-ui-shared", "@kbn/cloud-plugin", + "@kbn/core-http-server-mocks", + "@kbn/core-http-server-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts index af488c4bb81b3..7dd8072ca2785 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_benchmark_dynamic_values.test.ts @@ -6,7 +6,7 @@ */ import { useBenchmarkDynamicValues } from './use_benchmark_dynamic_values'; -import { renderHook } from '@testing-library/react-hooks/dom'; +import { renderHook } from '@testing-library/react'; import type { BenchmarksCisId } from '@kbn/cloud-security-posture-common'; import { useCspIntegrationLink } from '../navigation/use_csp_integration_link'; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts index bc87cf2d9bb16..e8bbf1b044a79 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks/dom'; +import { renderHook, act } from '@testing-library/react'; import { useUrlQuery } from './use_url_query'; import { useLocation, useHistory } from 'react-router-dom'; import { encodeQuery } from '@kbn/cloud-security-posture'; diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts index 8bf3984f62faa..58ecb20aed049 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/setup_technology_selector/use_setup_technology.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { SetupTechnology } from '@kbn/fleet-plugin/public'; import { AgentPolicy, NewPackagePolicyInput } from '@kbn/fleet-plugin/common'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx index 6c28df502e5fc..5b2bdbf98968c 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { RuleStateAttributes } from '@kbn/cloud-security-posture-common/schema/rules/v4'; @@ -87,7 +87,7 @@ describe('use_change_csp_rule_state', () => { const appMockRender = testWrapper(); const httpPostSpy = jest.spyOn(useKibana().services.http!, 'post'); - const { result, waitForNextUpdate } = await renderHook(() => useChangeCspRuleState(), { + const { result } = await renderHook(() => useChangeCspRuleState(), { wrapper: appMockRender.wrapper, }); @@ -107,22 +107,22 @@ describe('use_change_csp_rule_state', () => { result.current.mutate(mockRuleStateUpdateRequest); }); - await waitForNextUpdate(); - - expect(httpPostSpy).toHaveBeenCalledWith(CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH, { - version: '1', - body: JSON.stringify({ - action: 'mute', - rules: [ - { - benchmark_id: 'benchmark_id', - benchmark_version: 'benchmark_version', - rule_number: '1', - rule_id: 'rule_1', - }, - ], - }), - }); + await waitFor(() => + expect(httpPostSpy).toHaveBeenCalledWith(CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH, { + version: '1', + body: JSON.stringify({ + action: 'mute', + rules: [ + { + benchmark_id: 'benchmark_id', + benchmark_version: 'benchmark_version', + rule_number: '1', + rule_id: 'rule_1', + }, + ], + }), + }) + ); }); it('should cancel queries and update query data onMutate', async () => { @@ -131,7 +131,7 @@ describe('use_change_csp_rule_state', () => { const queryClientGetSpy = jest.spyOn(appMockRender.queryClient, 'getQueryData'); const mockSetQueryDataSpy = jest.spyOn(appMockRender.queryClient, 'setQueryData'); - const { result, waitForNextUpdate } = await renderHook(() => useChangeCspRuleState(), { + const { result } = await renderHook(() => useChangeCspRuleState(), { wrapper: appMockRender.wrapper, }); @@ -151,24 +151,24 @@ describe('use_change_csp_rule_state', () => { result.current.mutate(mockRuleStateUpdateRequest); }); - await waitForNextUpdate(); - - const expectedMutatedRules = { - ...initialRules, - rule_1: { ...initialRules.rule_1, muted: true }, - }; + await waitFor(() => { + const expectedMutatedRules = { + ...initialRules, + rule_1: { ...initialRules.rule_1, muted: true }, + }; - expect(queryClientSpy).toHaveBeenCalled(); - expect(queryClientGetSpy).toHaveBeenCalled(); - expect(mockSetQueryDataSpy).toHaveBeenCalled(); - expect(mockSetQueryDataSpy).toHaveReturnedWith(expectedMutatedRules); + expect(queryClientSpy).toHaveBeenCalled(); + expect(queryClientGetSpy).toHaveBeenCalled(); + expect(mockSetQueryDataSpy).toHaveBeenCalled(); + expect(mockSetQueryDataSpy).toHaveReturnedWith(expectedMutatedRules); + }); }); it('should invalidate queries onSettled', async () => { const appMockRender = testWrapper(); const mockInvalidateQueriesSpy = jest.spyOn(appMockRender.queryClient, 'invalidateQueries'); - const { result, waitForNextUpdate } = await renderHook(() => useChangeCspRuleState(), { + const { result } = await renderHook(() => useChangeCspRuleState(), { wrapper: appMockRender.wrapper, }); @@ -188,19 +188,19 @@ describe('use_change_csp_rule_state', () => { result.current.mutate(mockRuleStateUpdateRequest); }); - await waitForNextUpdate(); - - expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(BENCHMARK_INTEGRATION_QUERY_KEY_V2); - expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(CSPM_STATS_QUERY_KEY); - expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(KSPM_STATS_QUERY_KEY); - expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(CSP_RULES_STATES_QUERY_KEY); + await waitFor(() => { + expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(BENCHMARK_INTEGRATION_QUERY_KEY_V2); + expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(CSPM_STATS_QUERY_KEY); + expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(KSPM_STATS_QUERY_KEY); + expect(mockInvalidateQueriesSpy).toHaveBeenCalledWith(CSP_RULES_STATES_QUERY_KEY); + }); }); it('should restore previous query data onError', async () => { const appMockRender = testWrapper(); const mockSetQueryDataSpy = jest.spyOn(appMockRender.queryClient, 'setQueryData'); - const { result, waitForNextUpdate } = await renderHook(() => useChangeCspRuleState(), { + const { result } = await renderHook(() => useChangeCspRuleState(), { wrapper: appMockRender.wrapper, }); @@ -221,13 +221,13 @@ describe('use_change_csp_rule_state', () => { result.current.mutate(mockRuleStateUpdateRequest); }); - await waitForNextUpdate(); - - expect(mockSetQueryDataSpy).toHaveBeenCalled(); - expect(mockSetQueryDataSpy).toHaveReturnedWith(initialRules); + await waitFor(() => { + expect(mockSetQueryDataSpy).toHaveBeenCalled(); + expect(mockSetQueryDataSpy).toHaveReturnedWith(initialRules); + }); }); - it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState', async () => { + it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState', () => { const request: RuleStateUpdateRequest = { newState: 'mute', ruleIds: [ @@ -267,7 +267,7 @@ describe('use_change_csp_rule_state', () => { expect(newRulesState).toEqual({ ...initialRules, ...updateRules }); }); - it('creates the new cache with rules in a unmute state', async () => { + it('creates the new cache with rules in a unmute state', () => { const initialMutedRules: Record = { rule_1: { benchmark_id: 'benchmark_id', diff --git a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts index 09a6481f24455..ccc8158ecace7 100644 --- a/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts +++ b/x-pack/plugins/data_usage/common/rest_types/usage_metrics.ts @@ -82,56 +82,45 @@ export type UsageMetricsRequestBody = TypeOf; export const UsageMetricsResponseSchema = { body: () => - schema.object({ - metrics: schema.recordOf( - metricTypesSchema, - schema.arrayOf( - schema.object({ - name: schema.string(), - error: schema.nullable(schema.string()), - data: schema.arrayOf( - schema.object({ - x: schema.number(), - y: schema.number(), - }) - ), - }) - ) - ), - }), + schema.recordOf( + metricTypesSchema, + schema.arrayOf( + schema.object({ + name: schema.string(), + error: schema.nullable(schema.string()), + data: schema.arrayOf( + schema.object({ + x: schema.number(), + y: schema.number(), + }) + ), + }) + ) + ), }; -export type UsageMetricsResponseSchemaBody = Omit< - TypeOf, - 'metrics' -> & { - metrics: Partial>; -}; -export type MetricSeries = TypeOf< - typeof UsageMetricsResponseSchema.body ->['metrics'][MetricTypes][number]; + +export type UsageMetricsResponseSchemaBody = Partial>; + +export type MetricSeries = TypeOf[MetricTypes][number]; export const UsageMetricsAutoOpsResponseSchema = { body: () => - schema.object({ - metrics: schema.recordOf( - metricTypesSchema, - schema.arrayOf( - schema.object({ - name: schema.string(), - error: schema.nullable(schema.string()), - data: schema.arrayOf(schema.arrayOf(schema.number(), { minSize: 2, maxSize: 2 })), - }) - ) - ), - }), + schema.recordOf( + metricTypesSchema, + schema.arrayOf( + schema.object({ + name: schema.string(), + error: schema.nullable(schema.string()), + data: schema.arrayOf(schema.arrayOf(schema.number(), { minSize: 2, maxSize: 2 })), + }) + ) + ), }; + export type UsageMetricsAutoOpsResponseMetricSeries = TypeOf< typeof UsageMetricsAutoOpsResponseSchema.body ->['metrics'][MetricTypes][number]; +>[MetricTypes][number]; -export type UsageMetricsAutoOpsResponseSchemaBody = Omit< - TypeOf, - 'metrics' -> & { - metrics: Partial>; -}; +export type UsageMetricsAutoOpsResponseSchemaBody = Partial< + Record +>; diff --git a/x-pack/plugins/data_usage/public/app/components/charts.tsx b/x-pack/plugins/data_usage/public/app/components/charts.tsx index 56857e7a63ff9..4a2b9b4fbc875 100644 --- a/x-pack/plugins/data_usage/public/app/components/charts.tsx +++ b/x-pack/plugins/data_usage/public/app/components/charts.tsx @@ -24,7 +24,7 @@ export const Charts: React.FC = ({ data, 'data-test-subj': dataTest return ( - {Object.entries(data.metrics).map(([metricType, series], idx) => ( + {Object.entries(data).map(([metricType, series], idx) => ( { ...getBaseMockedDataUsageMetrics, isFetched: true, data: { - metrics: { - ingest_rate: [ - { - name: '.ds-1', - data: [{ x: new Date(), y: 1000 }], - }, - { - name: '.ds-10', - data: [{ x: new Date(), y: 1100 }], - }, - ], - storage_retained: [ - { - name: '.ds-2', - data: [{ x: new Date(), y: 2000 }], - }, - { - name: '.ds-20', - data: [{ x: new Date(), y: 2100 }], - }, - ], - }, + ingest_rate: [ + { + name: '.ds-1', + data: [{ x: new Date(), y: 1000 }], + }, + { + name: '.ds-10', + data: [{ x: new Date(), y: 1100 }], + }, + ], + storage_retained: [ + { + name: '.ds-2', + data: [{ x: new Date(), y: 2000 }], + }, + { + name: '.ds-20', + data: [{ x: new Date(), y: 2100 }], + }, + ], }, }); const { getByTestId } = render(); diff --git a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx b/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx index 8bedde117785a..5460c7ada0389 100644 --- a/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx +++ b/x-pack/plugins/data_usage/public/app/components/data_usage_metrics.tsx @@ -206,7 +206,7 @@ export const DataUsageMetrics = memo( - {isFetched && data?.metrics ? ( + {isFetched && data ? ( ) : isFetching ? ( diff --git a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts index 07625ad4c0898..6907a683696a7 100644 --- a/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts +++ b/x-pack/plugins/data_usage/server/routes/internal/usage_metrics_handler.ts @@ -83,18 +83,16 @@ export const getUsageMetricsHandler = ( export function transformMetricsData( data: UsageMetricsAutoOpsResponseSchemaBody ): UsageMetricsResponseSchemaBody { - return { - metrics: Object.fromEntries( - Object.entries(data.metrics).map(([metricType, series]) => [ - metricType, - series.map((metricSeries) => ({ - name: metricSeries.name, - data: (metricSeries.data as Array<[number, number]>).map(([timestamp, value]) => ({ - x: timestamp, - y: value, - })), + return Object.fromEntries( + Object.entries(data).map(([metricType, series]) => [ + metricType, + series.map((metricSeries) => ({ + name: metricSeries.name, + data: (metricSeries.data as Array<[number, number]>).map(([timestamp, value]) => ({ + x: timestamp, + y: value, })), - ]) - ), - }; + })), + ]) + ) as UsageMetricsResponseSchemaBody; } diff --git a/x-pack/plugins/data_usage/server/services/autoops_api.ts b/x-pack/plugins/data_usage/server/services/autoops_api.ts index 582cd7ab33046..9fd742a3e73fa 100644 --- a/x-pack/plugins/data_usage/server/services/autoops_api.ts +++ b/x-pack/plugins/data_usage/server/services/autoops_api.ts @@ -164,11 +164,7 @@ export class AutoOpsAPIService { } ); - const validatedResponse = response.data.metrics - ? UsageMetricsAutoOpsResponseSchema.body().validate(response.data) - : UsageMetricsAutoOpsResponseSchema.body().validate({ - metrics: response.data, - }); + const validatedResponse = UsageMetricsAutoOpsResponseSchema.body().validate(response.data); this.logger.debug(`[AutoOps API] Successfully created an autoops agent ${response}`); return validatedResponse; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/use_column_chart.test.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/use_column_chart.test.tsx index 544ebe261f2e7..55346af2b49ca 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/use_column_chart.test.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/use_column_chart.test.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, renderHook } from '@testing-library/react'; import { KBN_FIELD_TYPES } from '@kbn/data-plugin/public'; diff --git a/x-pack/plugins/enterprise_search/kibana.jsonc b/x-pack/plugins/enterprise_search/kibana.jsonc index e284ae1862144..65343904ba7fc 100644 --- a/x-pack/plugins/enterprise_search/kibana.jsonc +++ b/x-pack/plugins/enterprise_search/kibana.jsonc @@ -20,7 +20,7 @@ "logsShared", "logsDataAccess", "esUiShared", - "navigation" + "navigation", ], "optionalPlugins": [ "customIntegrations", @@ -34,8 +34,9 @@ "guidedOnboarding", "console", "searchConnectors", - "searchPlayground", "searchInferenceEndpoints", + "searchNavigation", + "searchPlayground", "embeddable", "discover", "charts", diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.test.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.test.tsx index 2dc27c7f7bfad..fa390d39e99d8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.test.tsx @@ -9,9 +9,10 @@ import { setMockValues, setMockActions } from '../../../../../__mocks__/kea_logi import React from 'react'; -import { shallow, mount } from 'enzyme'; +import { shallow } from 'enzyme'; import { EuiModal, EuiFieldText, EuiCodeBlock } from '@elastic/eui'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; const mockActions = { makeRequest: jest.fn(), setKeyName: jest.fn() }; @@ -47,7 +48,9 @@ describe('GenerateAnalyticsApiKeyModal', () => { }); it('pre-set the key name with collection name', () => { - mount(); + mountWithIntl( + + ); expect(mockActions.setKeyName).toHaveBeenCalledWith('puggles API key'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.tsx index 7cf5b76490c4f..bd5b7eed2a891 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_integrate/api_key_modal/generate_analytics_api_key_modal.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React, { useRef, useEffect } from 'react'; import { useValues, useActions } from 'kea'; @@ -24,12 +24,13 @@ import { EuiFieldText, EuiFormRow, EuiText, - EuiSpacer, - EuiFormLabel, EuiCodeBlock, + EuiCallOut, + useGeneratedHtmlId, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; import { generateAnalyticsApiKeyLogic } from '../../../../api/generate_analytics_api_key/generate_analytics_api_key_logic'; @@ -47,15 +48,23 @@ export const GenerateAnalyticsApiKeyModal: React.FC(null); + const modalTitleId = useGeneratedHtmlId(); + + useEffect(() => { + if (isSuccess) { + copyApiKeyRef.current?.focus(); + } + }, [isSuccess]); useEffect(() => { setKeyName(`${collectionName} API key`); }, [collectionName]); return ( - + - + {i18n.translate( 'xpack.enterpriseSearch.content.analytics.api.generateAnalyticsApiKeyModal.title', { @@ -66,15 +75,24 @@ export const GenerateAnalyticsApiKeyModal: React.FC <> - + {!isSuccess ? ( <> - + + } + fullWidth + > ) : ( - {keyName} - + {keyName}, + }} + /> + } + color="success" + iconType="check" + role="alert" + /> {apiKey ? ( ) : ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/app_search_gate/app_search_gate.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/app_search_gate/app_search_gate.tsx index 85cea5e8bf3c1..c2385efe47061 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/app_search_gate/app_search_gate.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/app_search_gate/app_search_gate.tsx @@ -554,7 +554,7 @@ export const AppSearchGate: React.FC = () => { )} > = ({ onClose }) = )} - - - + /> = ({ onClose }) = & { 'data-telemetry-id'?: string; ignoredOptions?: string[]; + label?: string; }; export const IndicesSelectComboBox = ({ ignoredOptions, ...props }: IndicesSelectComboBoxProps) => { const [searchQuery, setSearchQuery] = useState(undefined); const { makeRequest } = useActions(FetchIndicesForSearchApplicationsAPILogic); const { status, data } = useValues(FetchIndicesForSearchApplicationsAPILogic); + const isInvalid = Boolean(searchQuery && !props.selectedOptions?.length); useEffect(() => { makeRequest({ searchQuery }); @@ -85,7 +88,20 @@ export const IndicesSelectComboBox = ({ ignoredOptions, ...props }: IndicesSelec renderOption, ...props, }; - return ; + + return ( + + + + ); }; export const indexToOption = ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx index 8b5bb17020ac0..5a2e279026bda 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/attach_index_box.tsx @@ -222,6 +222,12 @@ export const AttachIndexBox: React.FC = ({ connector }) => )} isLoading={isLoading} options={groupedOptions} + onKeyDown={(event) => { + // Index name should not contain spaces + if (event.key === ' ') { + event.preventDefault(); + } + }} onSearchChange={(searchValue) => { setQuery({ isFullMatch: options.some((option) => option.label === searchValue), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/generate_api_key_modal/modal.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/generate_api_key_modal/modal.tsx index d19568bea9e3c..5c0ba545bb565 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/generate_api_key_modal/modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/generate_api_key_modal/modal.tsx @@ -28,6 +28,7 @@ import { EuiLink, EuiCodeBlock, EuiCallOut, + useGeneratedHtmlId, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -51,6 +52,7 @@ export const GenerateApiKeyModal: React.FC = ({ indexN const { setKeyName } = useActions(GenerateApiKeyModalLogic); const { makeRequest } = useActions(GenerateApiKeyLogic); const copyApiKeyRef = useRef(null); + const modalTitleId = useGeneratedHtmlId(); useEffect(() => { if (isSuccess) { @@ -59,9 +61,9 @@ export const GenerateApiKeyModal: React.FC = ({ indexN }, [isSuccess]); return ( - + - + {i18n.translate('xpack.enterpriseSearch.content.overview.generateApiKeyModal.title', { defaultMessage: 'Generate API Key', })} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_field_rule_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_field_rule_flyout.tsx index 253d66d63820f..6dbda38ab1137 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_field_rule_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_field_rule_flyout.tsx @@ -199,6 +199,7 @@ export const EditFieldRuleFlyout: React.FC = ({ > = ({ > = ({ > = ({ cl reduce_whitespace: reduceWhitespace, run_ml_inference: runMLInference, } = pipelineState; + // Reference the first focusable element in the flyout for accessibility on click or Enter key action either Reset or Save button + const firstFocusInFlyoutRef = useRef(null); return ( @@ -81,6 +83,7 @@ export const DefaultSettingsFlyout: React.FC = ({ cl data-telemetry-id="entSearchContent-defaultSettingsFlyout-ingestPipelinesLink" href={docLinks.ingestPipelines} target="_blank" + ref={firstFocusInFlyoutRef} > {i18n.translate( 'xpack.enterpriseSearch.defaultSettingsFlyout.body.description.ingestPipelinesLink.link', @@ -204,7 +207,10 @@ export const DefaultSettingsFlyout: React.FC = ({ cl color="primary" disabled={hasNoChanges} isLoading={isLoading} - onClick={() => setPipeline(defaultPipeline)} + onClick={() => { + setPipeline(defaultPipeline); + firstFocusInFlyoutRef.current?.focus(); + }} data-test-subj={'entSearchContentSettingsResetButton'} > {i18n.translate('xpack.enterpriseSearch.content.settings.resetButtonLabel', { @@ -218,7 +224,10 @@ export const DefaultSettingsFlyout: React.FC = ({ cl fill disabled={hasNoChanges} isLoading={isLoading} - onClick={() => makeRequest(pipelineState)} + onClick={() => { + makeRequest(pipelineState); + firstFocusInFlyoutRef.current?.focus(); + }} data-test-subj={'entSearchContentSettingsSaveButton'} > {i18n.translate('xpack.enterpriseSearch.content.settings.saveButtonLabel', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx index 70f8412eeb5b4..dd67bf33d987b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx @@ -13,7 +13,6 @@ import { shallow } from 'enzyme'; import { ErrorStateCallout } from '../../../shared/error_state'; -import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; import { ElasticsearchProductCard } from './elasticsearch_product_card'; @@ -26,7 +25,6 @@ describe('ProductSelector', () => { const wrapper = shallow(); expect(wrapper.find(ElasticsearchProductCard)).toHaveLength(1); - expect(wrapper.find(SetupGuideCta)).toHaveLength(1); }); it('renders the trial callout', () => { @@ -62,14 +60,12 @@ describe('ProductSelector', () => { const wrapper = shallow(); expect(wrapper.find(ElasticsearchProductCard)).toHaveLength(1); - expect(wrapper.find(SetupGuideCta)).toHaveLength(0); }); it('does not render EnterpriseSearch card without access', () => { const wrapper = shallow(); expect(wrapper.find(ElasticsearchProductCard)).toHaveLength(1); - expect(wrapper.find(SetupGuideCta)).toHaveLength(0); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx index 71139a8b36402..1f25f5f69c2e0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx @@ -30,7 +30,6 @@ import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/ import headerImage from '../../assets/search_header.png'; import { EnterpriseSearchOverviewPageTemplate } from '../layout'; -import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; import { ElasticsearchProductCard } from './elasticsearch_product_card'; @@ -121,11 +120,6 @@ export const ProductSelector: React.FC = () => { - {!config.host && config.canDeployEntSearch && ( - - - - )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/index.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/index.ts index ba2e47b204648..8f952f9406102 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/index.ts @@ -6,4 +6,3 @@ */ export { SetupGuide } from './setup_guide'; -export { SetupGuideCta } from './setup_guide_cta'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.scss deleted file mode 100644 index b3e2ffd8c11e3..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.scss +++ /dev/null @@ -1,10 +0,0 @@ -.enterpriseSearchSetupCta { - &__image { - width: $euiSize * 10; - margin: 0 auto; - - @include euiBreakpoint('xs', 's') { - width: $euiSize * 15; - } - } -} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.test.tsx deleted file mode 100644 index 2516382914d6e..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.test.tsx +++ /dev/null @@ -1,21 +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 React from 'react'; - -import { shallow } from 'enzyme'; - -import { SetupGuideCta } from '.'; - -describe('SetupGuideCta', () => { - it('renders', () => { - const wrapper = shallow(); - - expect(wrapper.find('.enterpriseSearchSetupCta')).toHaveLength(1); - expect(wrapper.find('EuiImage')).toHaveLength(1); - }); -}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.tsx deleted file mode 100644 index 346477b08dbb9..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide_cta.tsx +++ /dev/null @@ -1,45 +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 React from 'react'; - -import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiText, EuiImage } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -import { EuiPanelTo } from '../../../shared/react_router_helpers'; -import { PRODUCT_SELECTOR_CALLOUT_HEADING } from '../../constants'; - -import CtaImage from './assets/getting_started.png'; -import './setup_guide_cta.scss'; - -export const SetupGuideCta: React.FC = () => ( - - - - -

{PRODUCT_SELECTOR_CALLOUT_HEADING}

-
- - {i18n.translate('xpack.enterpriseSearch.overview.setupCta.description', { - defaultMessage: - 'Add search to your app or internal organization with Elastic App Search and Workplace Search. Watch the video to see what you can do when search is made easy.', - })} - -
- - - -
-
-); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx index b971ab6deff53..a8fff53d8a9b2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/base_nav.tsx @@ -17,10 +17,11 @@ import { SEARCH_AI_SEARCH, } from '@kbn/deeplinks-search'; import { i18n } from '@kbn/i18n'; +import type { ClassicNavItem } from '@kbn/search-navigation/public'; import { GETTING_STARTED_TITLE } from '../../../../common/constants'; -import { ClassicNavItem, BuildClassicNavParameters } from '../types'; +import { BuildClassicNavParameters } from '../types'; export const buildBaseClassicNavItems = ({ productAccess, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.test.ts index 514072ba297aa..d43d14aba2235 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.test.ts @@ -8,6 +8,7 @@ import { mockKibanaValues } from '../../__mocks__/kea_logic'; import type { ChromeNavLink } from '@kbn/core-chrome-browser'; +import type { ClassicNavItem } from '@kbn/search-navigation/public'; import '../../__mocks__/react_router'; @@ -15,8 +16,6 @@ jest.mock('../react_router_helpers/link_events', () => ({ letBrowserHandleEvent: jest.fn(), })); -import { ClassicNavItem } from '../types'; - import { generateSideNavItems } from './classic_nav_helpers'; describe('generateSideNavItems', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.ts index 89f3c2ab5b59a..4609e01beb6f1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/classic_nav_helpers.ts @@ -6,12 +6,9 @@ */ import { ChromeNavLink, EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; +import type { ClassicNavItem } from '@kbn/search-navigation/public'; -import { - ClassicNavItem, - GenerateNavLinkFromDeepLinkParameters, - GenerateNavLinkParameters, -} from '../types'; +import type { GenerateNavLinkFromDeepLinkParameters, GenerateNavLinkParameters } from '../types'; import { generateNavLink } from './nav_link_helpers'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts index 095f1dddfcc4a..25fce6c62d05d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts @@ -5,8 +5,6 @@ * 2.0. */ -import type { ReactNode } from 'react'; - import type { AppDeepLinkId, EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../common/constants'; @@ -87,12 +85,3 @@ export interface GenerateNavLinkFromDeepLinkParameters { export interface BuildClassicNavParameters { productAccess: ProductAccess; } - -export interface ClassicNavItem { - 'data-test-subj'?: string; - deepLink?: GenerateNavLinkFromDeepLinkParameters; - iconToString?: string; - id: string; - items?: ClassicNavItem[]; - name?: ReactNode; -} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form.tsx index dedcc2fc53d07..714ee3ccdef69 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/gated_form.tsx @@ -645,7 +645,8 @@ export const WorkplaceSearchGate: React.FC = () => { )} > { + plugins.searchNavigation?.setGetBaseClassicNavItems(() => { + const productAccess: ProductAccess = this.data?.access ?? { + hasAppSearchAccess: false, + hasWorkplaceSearchAccess: false, + }; + + return buildBaseClassicNavItems({ productAccess }); + }); + }); + + // This is needed so that we can fetch product access for plugins + // that need to share the classic nav. This can be removed when we + // remove product access and ent-search apps. + plugins.searchNavigation.registerOnAppMountHandler(async () => { + return this.getInitialData(core.http); + }); + } plugins.licensing?.license$.subscribe((license) => { if (hasEnterpriseLicense(license)) { diff --git a/x-pack/plugins/enterprise_search/tsconfig.json b/x-pack/plugins/enterprise_search/tsconfig.json index 7b7556729a76c..de98a647e0a94 100644 --- a/x-pack/plugins/enterprise_search/tsconfig.json +++ b/x-pack/plugins/enterprise_search/tsconfig.json @@ -83,6 +83,7 @@ "@kbn/security-plugin-types-common", "@kbn/core-security-server", "@kbn/core-security-server-mocks", - "@kbn/unsaved-changes-prompt" + "@kbn/unsaved-changes-prompt", + "@kbn/search-navigation", ] } diff --git a/x-pack/plugins/fleet/cypress/e2e/package_policy.cy.ts b/x-pack/plugins/fleet/cypress/e2e/package_policy.cy.ts index 271d2ba7b871d..1c1191e32ded1 100644 --- a/x-pack/plugins/fleet/cypress/e2e/package_policy.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/package_policy.cy.ts @@ -4,36 +4,46 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { EXISTING_HOSTS_TAB } from '../screens/fleet'; +import { + ADD_INTEGRATION_POLICY_BTN, + CREATE_PACKAGE_POLICY_SAVE_BTN, + POLICY_EDITOR, +} from '../screens/integrations'; +import { CONFIRM_MODAL } from '../screens/navigation'; import { login } from '../tasks/login'; -describe('Edit package policy', () => { - const policyConfig = { - id: 'policy-1', - name: 'fleet_server-1', - namespace: 'default', - package: { name: 'fleet_server', title: 'Fleet Server', version: '1.1.0' }, - enabled: true, - policy_id: 'fleet-server-policy', - policy_ids: ['fleet-server-policy'], - output_id: 'fleet-default-output', - inputs: [ - { - type: 'fleet-server', - policy_template: 'fleet_server', - enabled: true, - streams: [], - vars: { - host: { value: ['0.0.0.0'], type: 'text' }, - port: { value: [8220], type: 'integer' }, - max_connections: { type: 'integer' }, - custom: { value: '', type: 'yaml' }, - }, - compiled_input: { server: { port: 8220, host: '0.0.0.0' } }, - }, - ], - }; +describe('Package policy', () => { beforeEach(() => { login(); + }); + + it('should edit package policy', () => { + const policyConfig = { + id: 'policy-1', + name: 'fleet_server-1', + namespace: 'default', + package: { name: 'fleet_server', title: 'Fleet Server', version: '1.1.0' }, + enabled: true, + policy_id: 'fleet-server-policy', + policy_ids: ['fleet-server-policy'], + output_id: 'fleet-default-output', + inputs: [ + { + type: 'fleet-server', + policy_template: 'fleet_server', + enabled: true, + streams: [], + vars: { + host: { value: ['0.0.0.0'], type: 'text' }, + port: { value: [8220], type: 'integer' }, + max_connections: { type: 'integer' }, + custom: { value: '', type: 'yaml' }, + }, + compiled_input: { server: { port: 8220, host: '0.0.0.0' } }, + }, + ], + }; cy.intercept('/api/fleet/package_policies/policy-1', { item: policyConfig, @@ -111,9 +121,7 @@ describe('Edit package policy', () => { status: 'not_installed', }, }); - }); - it('should edit package policy', () => { cy.visit('/app/fleet/policies/fleet-server-policy/edit-integration/policy-1'); cy.getBySel('packagePolicyDescriptionInput').clear().type('desc'); @@ -128,4 +136,27 @@ describe('Edit package policy', () => { expect(interception.request.body.description).to.equal('desc'); }); }); + + it('should create a new orphaned package policy', () => { + cy.visit('/app/integrations/detail/system'); + cy.getBySel(ADD_INTEGRATION_POLICY_BTN).click(); + cy.getBySel(EXISTING_HOSTS_TAB).click(); + cy.getBySel(POLICY_EDITOR.AGENT_POLICY_SELECT).should('exist'); + cy.getBySel(POLICY_EDITOR.AGENT_POLICY_CLEAR).should('not.exist'); + cy.getBySel(POLICY_EDITOR.POLICY_NAME_INPUT).clear().type('system-orphaned-test'); + + cy.intercept({ + method: 'POST', + url: '/api/fleet/package_policies', + }).as('createPackagePolicy'); + + cy.getBySel(CREATE_PACKAGE_POLICY_SAVE_BTN).should('be.enabled').click(); + cy.getBySel(CONFIRM_MODAL.CONFIRM_BUTTON).click(); + + cy.wait('@createPackagePolicy').then((interception) => { + expect(interception.request.body.name).to.equal('system-orphaned-test'); + expect(interception.request.body.policy_id).to.equal(undefined); + expect(interception.request.body.policy_ids).to.deep.equal([]); + }); + }); }); diff --git a/x-pack/plugins/fleet/cypress/screens/integrations.ts b/x-pack/plugins/fleet/cypress/screens/integrations.ts index 1a31d2dc5de31..8b29a95265ff2 100644 --- a/x-pack/plugins/fleet/cypress/screens/integrations.ts +++ b/x-pack/plugins/fleet/cypress/screens/integrations.ts @@ -39,6 +39,7 @@ export const POLICY_EDITOR = { POLICY_NAME_INPUT: 'packagePolicyNameInput', DATASET_SELECT: 'datasetComboBox', AGENT_POLICY_SELECT: 'agentPolicyMultiSelect', + AGENT_POLICY_CLEAR: 'comboBoxClearButton', INSPECT_PIPELINES_BTN: 'datastreamInspectPipelineBtn', EDIT_MAPPINGS_BTN: 'datastreamEditMappingsBtn', CREATE_MAPPINGS_BTN: 'datastreamAddCustomComponentTemplateBtn', diff --git a/x-pack/plugins/fleet/public/applications/fleet/hooks/use_apm_service_href.test.ts b/x-pack/plugins/fleet/public/applications/fleet/hooks/use_apm_service_href.test.ts index 4a2eaddbc45d9..da4d0e2c2594d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/hooks/use_apm_service_href.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/hooks/use_apm_service_href.test.ts @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; + +import { waitFor, renderHook } from '@testing-library/react'; import type { DataStream } from '../types'; import * as useLocatorModule from '../../../hooks/use_locator'; @@ -29,12 +30,12 @@ describe('useApmServiceHref hook', () => { package: 'elastic_agent', } as DataStream; - const { result, waitForNextUpdate } = renderHook(() => useAPMServiceDetailHref(datastream)); - - await waitForNextUpdate(); + const { result } = renderHook(() => useAPMServiceDetailHref(datastream)); - expect(result.current).toMatchObject({ isSuccessful: true, href: undefined }); - expect(apmLocatorMock).not.toBeCalled(); + await waitFor(() => { + expect(result.current).toMatchObject({ isSuccessful: true, href: undefined }); + expect(apmLocatorMock).not.toBeCalled(); + }); }); const testCases = [ @@ -83,12 +84,12 @@ describe('useApmServiceHref hook', () => { it.each(testCases)( 'it passes the correct params to apm locator for %s', async (datastream, locatorParams) => { - const { result, waitForNextUpdate } = renderHook(() => useAPMServiceDetailHref(datastream)); - - await waitForNextUpdate(); + const { result } = renderHook(() => useAPMServiceDetailHref(datastream)); - expect(result.current).toMatchObject({ isSuccessful: true, href: '' }); - expect(apmLocatorMock).toBeCalledWith(expect.objectContaining(locatorParams)); + await waitFor(() => { + expect(result.current).toMatchObject({ isSuccessful: true, href: '' }); + expect(apmLocatorMock).toBeCalledWith(expect.objectContaining(locatorParams)); + }); } ); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/hooks.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/hooks.test.tsx index 85a241fe828c9..599603d9d5f6a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/hooks.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/hooks.test.tsx @@ -5,6 +5,8 @@ * 2.0. */ +import { waitFor } from '@testing-library/react'; + import { createFleetTestRendererMock } from '../../../../../../mock'; import type { MockedFleetStartServices } from '../../../../../../mock'; import { useLicense } from '../../../../../../hooks/use_license'; @@ -189,12 +191,10 @@ describe('useOutputOptions', () => { hasAtLeast: () => true, } as unknown as LicenseService); mockApiCallsWithOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useOutputOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useOutputOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions).toMatchInlineSnapshot(` Array [ Object { @@ -317,12 +317,10 @@ describe('useOutputOptions', () => { hasAtLeast: () => false, } as unknown as LicenseService); mockApiCallsWithOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useOutputOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useOutputOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions).toMatchInlineSnapshot(` Array [ Object { @@ -445,12 +443,10 @@ describe('useOutputOptions', () => { hasAtLeast: () => true, } as unknown as LicenseService); mockApiCallsWithLogstashOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useOutputOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useOutputOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions).toMatchInlineSnapshot(` Array [ Object { @@ -497,7 +493,7 @@ describe('useOutputOptions', () => { hasAtLeast: () => true, } as unknown as LicenseService); mockApiCallsWithLogstashOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => + const { result } = testRenderer.renderHook(() => useOutputOptions({ package_policies: [ { @@ -510,7 +506,7 @@ describe('useOutputOptions', () => { ); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions).toMatchInlineSnapshot(` Array [ Object { @@ -601,12 +597,10 @@ describe('useOutputOptions', () => { hasAtLeast: () => true, } as unknown as LicenseService); mockApiCallsWithRemoteESOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useOutputOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useOutputOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions.length).toEqual(2); expect(result.current.dataOutputOptions[1].value).toEqual('remote1'); expect(result.current.monitoringOutputOptions.length).toEqual(2); @@ -619,12 +613,10 @@ describe('useOutputOptions', () => { hasAtLeast: () => true, } as unknown as LicenseService); mockApiCallsWithInternalOutputs(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useOutputOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useOutputOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.dataOutputOptions).toMatchInlineSnapshot(` Array [ Object { @@ -670,12 +662,10 @@ describe('useFleetServerHostsOptions', () => { it('should not enable internal fleet server hosts', async () => { const testRenderer = createFleetTestRendererMock(); mockApiCallsWithInternalFleetServerHost(testRenderer.startServices.http); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => - useFleetServerHostsOptions({} as AgentPolicy) - ); + const { result } = testRenderer.renderHook(() => useFleetServerHostsOptions({} as AgentPolicy)); expect(result.current.isLoading).toBeTruthy(); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.fleetServerHostsOptions).toMatchInlineSnapshot(` Array [ Object { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.test.tsx index 583957861bd79..dd3945664bd6f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.test.tsx @@ -123,7 +123,8 @@ describe('StepSelectHosts', () => { await waitFor(() => { expect(renderResult.getByText('New agent policy name')).toBeInTheDocument(); }); - expect(renderResult.queryByRole('tablist')).not.toBeInTheDocument(); + expect(renderResult.queryByRole('tablist')).toBeInTheDocument(); + expect(renderResult.getByText('Create agent policy')).toBeInTheDocument(); }); it('should display tabs with New hosts selected when agent policies exist', async () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.tsx index c4504e6596353..5a9d6fd6e31f0 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_hosts.tsx @@ -105,7 +105,7 @@ export const StepSelectHosts: React.FunctionComponent = ({ const handleOnTabClick = (tab: EuiTabbedContentTab) => updateSelectedTab(tab.id as SelectedPolicyTab); - return existingAgentPolicies.length > 0 ? ( + return ( = ({ tabs={tabs} onTabClick={handleOnTabClick} /> - ) : ( - ); }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.test.tsx index 9283a8fa42c39..4ed0fd697850b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { act } from '@testing-library/react-hooks'; -import type { RenderHookResult } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { act, waitFor } from '@testing-library/react'; import type { TestRenderer } from '../../../../../../../mock'; import { createFleetTestRendererMock } from '../../../../../../../mock'; @@ -71,11 +71,11 @@ describe('useOnSubmit', () => { let testRenderer: TestRenderer; let renderResult: RenderHookResult< - Parameters, - ReturnType + ReturnType, + Parameters >; - const render = ({ isUpdate } = { isUpdate: false }) => - (renderResult = testRenderer.renderHook(() => + const render = async ({ isUpdate } = { isUpdate: false }) => { + renderResult = testRenderer.renderHook(() => useOnSubmit({ agentCount: 0, packageInfo, @@ -85,7 +85,12 @@ describe('useOnSubmit', () => { queryParamsPolicyId: undefined, hasFleetAddAgentsPrivileges: true, }) - )); + ); + + await waitFor(() => new Promise((resolve) => resolve(null))); + + return renderResult; + }; beforeEach(() => { testRenderer = createFleetTestRendererMock(); @@ -95,10 +100,8 @@ describe('useOnSubmit', () => { }); describe('default API response', () => { - beforeEach(() => { - act(() => { - render(); - }); + beforeEach(async () => { + await render(); }); it('should set new values when package policy changes', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx index 0c3f54d9e5dff..3dbe300b119bd 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx @@ -280,7 +280,7 @@ export function useOnSubmit({ useEffect(() => { if ( - agentPolicies.length > 0 && + (canUseMultipleAgentPolicies || agentPolicies.length > 0) && !isEqual( agentPolicies.map((policy) => policy.id), packagePolicy.policy_ids @@ -290,7 +290,7 @@ export function useOnSubmit({ policy_ids: agentPolicies.map((policy) => policy.id), }); } - }, [packagePolicy, agentPolicies, updatePackagePolicy]); + }, [packagePolicy, agentPolicies, updatePackagePolicy, canUseMultipleAgentPolicies]); const onSaveNavigate = useOnSaveNavigate({ packagePolicy, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts index 82e4f80c9b271..0953f2367d05c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks/dom'; - -import { waitFor } from '@testing-library/react'; +import { waitFor, renderHook, act } from '@testing-library/react'; import { createPackagePolicyMock } from '../../../../../../../../common/mocks'; @@ -580,9 +578,9 @@ describe('useSetupTechnology', () => { }) ); - await waitFor(() => new Promise((resolve) => resolve(null))); - - expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); + await waitFor(() => + expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED) + ); act(() => { result.current.handleSetupTechnologyChange(SetupTechnology.AGENT_BASED); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx index db223fee26bf2..e3b1959475649 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx @@ -284,17 +284,15 @@ describe('When on the package policy create page', () => { let cancelButton: HTMLAnchorElement; beforeEach(async () => { - await act(async () => { - render(); + render(); - cancelLink = renderResult.getByTestId( - 'createPackagePolicy_cancelBackLink' - ) as HTMLAnchorElement; + cancelLink = renderResult.getByTestId( + 'createPackagePolicy_cancelBackLink' + ) as HTMLAnchorElement; - cancelButton = (await renderResult.findByTestId( - 'createPackagePolicyCancelButton' - )) as HTMLAnchorElement; - }); + cancelButton = (await renderResult.findByTestId( + 'createPackagePolicyCancelButton' + )) as HTMLAnchorElement; }); test('should use custom "cancel" URL', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.test.tsx index e30fa6c22c5ce..249b037a6f6c3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.test.tsx @@ -124,8 +124,9 @@ describe('StepEditHosts', () => { render(); - expect(renderResult.getByText('New agent policy name')).toBeInTheDocument(); expect(renderResult.queryByRole('tablist')).not.toBeInTheDocument(); + expect(renderResult.getByText('For existing hosts:')).toBeInTheDocument(); + expect(renderResult.getByText('For a new host:')).toBeInTheDocument(); }); it('should display new policy button and existing policies when agent policies exist', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.tsx index 64d104172af53..54e210eddc3c1 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/components/step_edit_hosts.tsx @@ -60,7 +60,7 @@ export const StepEditHosts: React.FunctionComponent = ({ } }, [existingAgentPolicies.length]); // eslint-disable-line react-hooks/exhaustive-deps - return existingAgentPolicies.length > 0 ? ( + return ( @@ -141,13 +141,5 @@ export const StepEditHosts: React.FunctionComponent = ({ )} - ) : ( - ); }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_history_block.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_history_block.test.tsx index 491c5f6276941..cac13357ffa7e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_history_block.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_history_block.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act } from '@testing-library/react-hooks'; +import { act, waitFor } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; @@ -36,7 +36,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).toBeCalledWith( @@ -53,7 +53,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).not.toBeCalled(); @@ -81,7 +81,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test?param=test')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).toBeCalledWith( @@ -98,7 +98,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test?param=test')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).not.toBeCalled(); @@ -127,7 +127,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test#/hash')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).toBeCalledWith( @@ -144,7 +144,7 @@ describe('useHistoryBlock', () => { act(() => renderer.mountHistory.push('/test#/hash')); // needed because we have an async useEffect - await act(() => new Promise((resolve) => resolve())); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(renderer.startServices.overlays.openConfirm).toBeCalled(); expect(renderer.startServices.application.navigateToUrl).not.toBeCalled(); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.test.tsx index 67b8f35a22eb4..2df9363a3daa0 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/hooks/use_package_policy.test.tsx @@ -12,6 +12,7 @@ * 2.0. */ +import { waitFor } from '@testing-library/react'; import { omit } from 'lodash'; import { sendGetPackageInfoByKey, sendUpgradePackagePolicyDryRun } from '../../../../../../hooks'; @@ -274,22 +275,22 @@ jest.mock('../../../../../../hooks/use_request', () => ({ describe('usePackagePolicy', () => { it('should load the package policy if this is a not an upgrade', async () => { const renderer = createFleetTestRendererMock(); - const { result, waitForNextUpdate } = renderer.renderHook(() => + const { result } = renderer.renderHook(() => usePackagePolicyWithRelatedData('package-policy-1', {}) ); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.packagePolicy).toEqual(omit(mockPackagePolicy, 'id')); }); it('should load the package policy if this is an upgrade', async () => { const renderer = createFleetTestRendererMock(); - const { result, waitForNextUpdate } = renderer.renderHook(() => + const { result } = renderer.renderHook(() => usePackagePolicyWithRelatedData('package-policy-1', { forceUpgrade: true, }) ); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.packagePolicy).toMatchInlineSnapshot(` Object { "description": "Nginx description", @@ -514,12 +515,12 @@ describe('usePackagePolicy', () => { isLoading: false, } as any); const renderer = createFleetTestRendererMock(); - const { result, waitForNextUpdate } = renderer.renderHook(() => + const { result } = renderer.renderHook(() => usePackagePolicyWithRelatedData('package-policy-2', { forceUpgrade: true, }) ); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result.current.packagePolicy).toMatchInlineSnapshot(` Object { "description": "Nginx description", diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/services/devtools_request.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/services/devtools_request.tsx index 8badac52213e4..aa866106e8421 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/services/devtools_request.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/services/devtools_request.tsx @@ -18,6 +18,7 @@ import type { UpdatePackagePolicy, UpdateAgentPolicyRequest, } from '../../../types'; +import { canUseMultipleAgentPolicies } from '../../../hooks'; function generateKibanaDevToolsRequest(method: string, path: string, body: any) { return `${method} kbn:${path}\n${JSON.stringify(body, null, 2)}\n`; @@ -49,9 +50,13 @@ export function generateCreateAgentPolicyDevToolsRequest( export function generateCreatePackagePolicyDevToolsRequest( packagePolicy: NewPackagePolicy & { force?: boolean } ) { + const canHaveNoAgentPolicies = canUseMultipleAgentPolicies(); + return generateKibanaDevToolsRequest('POST', packagePolicyRouteService.getCreatePath(), { policy_ids: - packagePolicy.policy_ids.length > 0 ? packagePolicy.policy_ids : [''], + packagePolicy.policy_ids.length > 0 || canHaveNoAgentPolicies + ? packagePolicy.policy_ids + : [''], package: formatPackage(packagePolicy.package), ...omit(packagePolicy, 'policy_ids', 'package', 'enabled'), inputs: formatInputs(packagePolicy.inputs), diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/export_csv.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/export_csv.test.tsx index b2fdf7a1023f6..48bed25131b86 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/export_csv.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/export_csv.test.tsx @@ -5,8 +5,7 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { act } from '@testing-library/react-hooks'; +import { act, type RenderHookResult } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_action_status.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_action_status.test.tsx index 1b4f3e6faff7c..76e8aeb78c3d2 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_action_status.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_action_status.test.tsx @@ -5,7 +5,9 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; + +import type { ActionStatus } from '../../../../../../../common/types'; import { sendGetActionStatus, sendPostCancelAction, useStartServices } from '../../../../hooks'; @@ -41,7 +43,7 @@ describe('useActionStatus', () => { nbAgentsFailed: 0, nbAgentsActioned: 2, creationTime: '2022-09-19T12:07:27.102Z', - }, + } as ActionStatus, ]; beforeEach(() => { mockSendGetActionStatus.mockReset(); @@ -63,20 +65,15 @@ describe('useActionStatus', () => { it('should refresh statuses on refresh flag', async () => { let refresh = false; - await act(async () => { - const result = renderHook(() => useActionStatus(mockOnAbortSuccess, refresh, 20, null)); - refresh = true; - result.rerender(); - }); - expect(mockSendGetActionStatus).toHaveBeenCalledTimes(5); + const result = renderHook(() => useActionStatus(mockOnAbortSuccess, refresh, 20, null)); + refresh = true; + result.rerender(); + await waitFor(() => expect(mockSendGetActionStatus).toHaveBeenCalled()); }); it('should post cancel and invoke callback on cancel upgrade', async () => { mockSendPostCancelAction.mockResolvedValue({}); - let result: any | undefined; - await act(async () => { - ({ result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null))); - }); + const { result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null)); await act(async () => { await result.current.abortUpgrade(mockActionStatuses[0]); }); @@ -89,10 +86,7 @@ describe('useActionStatus', () => { it('should post cancel and invoke callback on cancel upgrade - plural', async () => { mockSendPostCancelAction.mockResolvedValue({}); - let result: any | undefined; - await act(async () => { - ({ result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null))); - }); + const { result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null)); await act(async () => { await result.current.abortUpgrade({ ...mockActionStatuses[0], nbAgentsAck: 0 }); }); @@ -106,10 +100,7 @@ describe('useActionStatus', () => { it('should report error on cancel upgrade failure', async () => { const error = new Error('error'); mockSendPostCancelAction.mockRejectedValue(error); - let result: any | undefined; - await act(async () => { - ({ result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null))); - }); + const { result } = renderHook(() => useActionStatus(mockOnAbortSuccess, false, 20, null)); await act(async () => { await result.current.abortUpgrade(mockActionStatuses[0]); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_agent_soft_limit.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_agent_soft_limit.test.tsx index 4b9d908baa84d..46c72c9c5213c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_agent_soft_limit.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_agent_soft_limit.test.tsx @@ -38,10 +38,12 @@ describe('useAgentSoftLimit', () => { total: 5, }, } as any); - const { result, waitForNextUpdate } = renderer.renderHook(() => useAgentSoftLimit()); - await waitForNextUpdate(); + const { result, rerender } = renderer.renderHook(() => useAgentSoftLimit()); + await renderer.waitFor(() => expect(mockedSendGetAgents).toBeCalled()); + + // re-render so cache is updated to value from most recent call + rerender(); - expect(mockedSendGetAgents).toBeCalled(); expect(result.current.shouldDisplayAgentSoftLimit).toEqual(false); }); @@ -53,10 +55,12 @@ describe('useAgentSoftLimit', () => { total: 15, }, } as any); - const { result, waitForNextUpdate } = renderer.renderHook(() => useAgentSoftLimit()); - await waitForNextUpdate(); + const { result, rerender } = renderer.renderHook(() => useAgentSoftLimit()); + await renderer.waitFor(() => expect(mockedSendGetAgents).toBeCalled()); + + // re-render so cache is updated to value from most recent call + rerender(); - expect(mockedSendGetAgents).toBeCalled(); expect(result.current.shouldDisplayAgentSoftLimit).toEqual(true); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.test.tsx index db4cff14e4804..27cb000bdb154 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_fetch_agents_data.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act } from '@testing-library/react-hooks'; +import { act, waitFor } from '@testing-library/react'; import { useStartServices } from '../../../../hooks'; @@ -118,10 +118,8 @@ describe('useFetchAgentsData', () => { it('should fetch agents and agent policies data', async () => { const renderer = createFleetTestRendererMock(); - const { result, waitForNextUpdate } = renderer.renderHook(() => useFetchAgentsData()); - await act(async () => { - await waitForNextUpdate(); - }); + const { result } = renderer.renderHook(() => useFetchAgentsData()); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(result?.current.selectedStatus).toEqual(['healthy', 'unhealthy', 'updating', 'offline']); expect(result?.current.allAgentPolicies).toEqual([ @@ -155,27 +153,22 @@ describe('useFetchAgentsData', () => { it('sync querystring kuery with current search', async () => { const renderer = createFleetTestRendererMock(); - const { result, waitForNextUpdate } = renderer.renderHook(() => useFetchAgentsData()); - await act(async () => { - await waitForNextUpdate(); - }); + const { result } = renderer.renderHook(() => useFetchAgentsData()); - expect(renderer.history.location.search).toEqual(''); + await waitFor(() => expect(renderer.history.location.search).toEqual('')); // Set search await act(async () => { result.current.setSearch('active:true'); - await waitForNextUpdate(); }); - expect(renderer.history.location.search).toEqual('?kuery=active%3Atrue'); + await waitFor(() => expect(renderer.history.location.search).toEqual('?kuery=active%3Atrue')); // Clear search await act(async () => { result.current.setSearch(''); - await waitForNextUpdate(); }); - expect(renderer.history.location.search).toEqual(''); + await waitFor(() => expect(renderer.history.location.search).toEqual('')); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_update_tags.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_update_tags.test.tsx index 89059d5a17971..0545f1b412f00 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_update_tags.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/hooks/use_update_tags.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { sendPostBulkAgentTagsUpdate, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/hooks.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/hooks.test.tsx index 8aea16559058a..be5de3cd04343 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/hooks.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/hooks.test.tsx @@ -6,7 +6,7 @@ */ import moment from 'moment'; -import { act } from '@testing-library/react-hooks'; +import { act } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/hooks/use_fleet_server_unhealthy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/hooks/use_fleet_server_unhealthy.test.tsx index 7372edf0ada2a..c4caa7e47c07b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/hooks/use_fleet_server_unhealthy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/hooks/use_fleet_server_unhealthy.test.tsx @@ -22,7 +22,7 @@ jest.mock('../../../../../hooks/use_authz', () => ({ describe('useFleetServerUnhealthy', () => { const testRenderer = createFleetTestRendererMock(); - it('should return isUnHealthy:false with an online fleet slerver', async () => { + it('should return isUnHealthy:false with an online fleet server', async () => { jest.mocked(sendGetEnrollmentSettings).mockResolvedValueOnce({ error: null, data: { @@ -46,13 +46,12 @@ describe('useFleetServerUnhealthy', () => { }, }); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => useFleetServerUnhealthy()); - await waitForNextUpdate(); - expect(result.current.isLoading).toBeFalsy(); + const { result } = testRenderer.renderHook(() => useFleetServerUnhealthy()); + await testRenderer.waitFor(() => expect(result.current.isLoading).toBeFalsy()); expect(result.current.isUnhealthy).toBeFalsy(); }); - it('should return isUnHealthy:true with only one offline fleet slerver', async () => { + it('should return isUnHealthy:true with only one offline fleet server', async () => { jest.mocked(sendGetEnrollmentSettings).mockResolvedValue({ error: null, data: { @@ -62,9 +61,8 @@ describe('useFleetServerUnhealthy', () => { }, }, }); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => useFleetServerUnhealthy()); - await waitForNextUpdate(); - expect(result.current.isLoading).toBeFalsy(); + const { result } = testRenderer.renderHook(() => useFleetServerUnhealthy()); + await testRenderer.waitFor(() => expect(result.current.isLoading).toBeFalsy()); expect(result.current.isUnhealthy).toBeTruthy(); }); @@ -73,9 +71,8 @@ describe('useFleetServerUnhealthy', () => { error: new Error('Invalid request'), data: null, }); - const { result, waitForNextUpdate } = testRenderer.renderHook(() => useFleetServerUnhealthy()); - await waitForNextUpdate(); - expect(result.current.isLoading).toBeFalsy(); + const { result } = testRenderer.renderHook(() => useFleetServerUnhealthy()); + await testRenderer.waitFor(() => expect(result.current.isLoading).toBeFalsy()); expect(result.current.isUnhealthy).toBeFalsy(); expect(testRenderer.startServices.notifications.toasts.addError).toBeCalled(); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_fleet_proxy_flyout/use_fleet_proxy_form.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_fleet_proxy_flyout/use_fleet_proxy_form.test.tsx index 4650b97bfd656..7e3d3f87137da 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_fleet_proxy_flyout/use_fleet_proxy_form.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_fleet_proxy_flyout/use_fleet_proxy_form.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act } from 'react-test-renderer'; +import { act } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/use_fleet_server_host_form.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/use_fleet_server_host_form.test.tsx index 95a94848f4794..87555b034680b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/use_fleet_server_host_form.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/use_fleet_server_host_form.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act } from 'react-test-renderer'; +import { act } from '@testing-library/react'; import { createFleetTestRendererMock } from '../../../../../../mock'; @@ -28,20 +28,22 @@ describe('useFleetServerHostsForm', () => { await act(() => result.current.submit()); - expect(result.current.inputs.hostUrlsInput.props.errors).toMatchInlineSnapshot(` - Array [ - Object { - "index": 0, - "message": "Duplicate URL", - }, - Object { - "index": 1, - "message": "Duplicate URL", - }, - ] - `); - expect(onSuccess).not.toBeCalled(); - expect(result.current.isDisabled).toBeTruthy(); + await testRenderer.waitFor(() => { + expect(result.current.inputs.hostUrlsInput.props.errors).toMatchInlineSnapshot(` + Array [ + Object { + "index": 0, + "message": "Duplicate URL", + }, + Object { + "index": 1, + "message": "Duplicate URL", + }, + ] + `); + expect(onSuccess).not.toBeCalled(); + expect(result.current.isDisabled).toBeTruthy(); + }); }); it('should submit a valid form', async () => { @@ -64,7 +66,8 @@ describe('useFleetServerHostsForm', () => { act(() => result.current.inputs.hostUrlsInput.props.onChange(['https://test.fr'])); await act(() => result.current.submit()); - expect(onSuccess).toBeCalled(); + + await testRenderer.waitFor(() => expect(onSuccess).toBeCalled()); }); it('should allow the user to correct and submit a invalid form', async () => { @@ -89,13 +92,16 @@ describe('useFleetServerHostsForm', () => { ); await act(() => result.current.submit()); - expect(onSuccess).not.toBeCalled(); - expect(result.current.isDisabled).toBeTruthy(); + + await testRenderer.waitFor(() => { + expect(onSuccess).not.toBeCalled(); + expect(result.current.isDisabled).toBeTruthy(); + }); act(() => result.current.inputs.hostUrlsInput.props.onChange(['https://test.fr'])); expect(result.current.isDisabled).toBeFalsy(); await act(() => result.current.submit()); - expect(onSuccess).toBeCalled(); + await testRenderer.waitFor(() => expect(onSuccess).toBeCalled()); }); }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_merge_epr_with_replacements.test.ts b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_merge_epr_with_replacements.test.ts index d137d908ca3b9..f5aed7de52ab8 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_merge_epr_with_replacements.test.ts +++ b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_merge_epr_with_replacements.test.ts @@ -8,7 +8,7 @@ import type { CustomIntegration } from '@kbn/custom-integrations-plugin/common'; import type { IntegrationCategory } from '@kbn/custom-integrations-plugin/common'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { PackageListItem } from '../../../../common/types/models'; diff --git a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_package_install.test.tsx b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_package_install.test.tsx index 6040c3bacd70f..d73d233ac0b09 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_package_install.test.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_package_install.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { act, type WrapperComponent } from '@testing-library/react-hooks'; +import { act } from '@testing-library/react'; import { coreMock } from '@kbn/core/public/mocks'; import { createIntegrationsTestRendererMock } from '../../../mock'; @@ -48,9 +48,10 @@ describe('usePackageInstall', () => { throw error; }) as any); - const wrapper: WrapperComponent = ({ children }) => ( + const wrapper = ({ children }: React.PropsWithChildren) => ( {children} ); + const { result } = renderer.renderHook(() => useInstallPackage(), wrapper); const installPackage = result.current; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.test.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.test.tsx index 716f59231a4c4..f3c7665f3b0e4 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.test.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.test.tsx @@ -68,7 +68,8 @@ function renderPackageCard(props: PackageCardProps) { return { utils }; } -describe('package card', () => { +// FLAKY: https://github.com/elastic/kibana/issues/200848 +describe.skip('package card', () => { let mockNavigateToApp: jest.Mock; let mockNavigateToUrl: jest.Mock; const mockGetLineClamp = getLineClampStyles as jest.Mock; diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.test.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.test.tsx index 4c02ddeeaaf27..8d9dd6c8b604b 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.test.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.test.tsx @@ -15,7 +15,8 @@ import type { AgentPolicy } from '../../types'; import { AgentPolicySelection } from '.'; -describe('step select agent policy', () => { +// FLAKY: https://github.com/elastic/kibana/issues/200777 +describe.skip('step select agent policy', () => { let testRenderer: TestRenderer; let renderResult: ReturnType; let agentPolicies: AgentPolicy[] = []; diff --git a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx index 7195eb73890f2..f016acf8783aa 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_actions_menu.test.tsx @@ -109,7 +109,8 @@ function createMockPackagePolicy( ...props, }; } -describe('PackagePolicyActionsMenu', () => { +// FLAKY: https://github.com/elastic/kibana/issues/191804 +describe.skip('PackagePolicyActionsMenu', () => { beforeAll(() => { useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: false }); }); diff --git a/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts b/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts index 34a7afe33baaa..36024a38fb51e 100644 --- a/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts +++ b/x-pack/plugins/fleet/public/hooks/use_agent_version.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useAgentVersion } from './use_agent_version'; import { useKibanaVersion } from './use_kibana_version'; @@ -28,13 +28,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual(mockKibanaVersion); + await waitFor(() => expect(result.current).toEqual(mockKibanaVersion)); }); it('should return agent version with newer patch than kibana', async () => { @@ -46,13 +44,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.8.2'); + await waitFor(() => expect(result.current).toEqual('8.8.2')); }); it('should return the latest availeble agent version if a version that matches Kibana version is not released', async () => { @@ -64,13 +60,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.9.2'); + await waitFor(() => expect(result.current).toEqual('8.9.2')); }); it('should return the agent version that is <= Kibana version if an agent version that matches Kibana version is not released', async () => { @@ -82,13 +76,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.8.2'); + await waitFor(() => expect(result.current).toEqual('8.8.2')); }); it('should return the latest availeble agent version if a snapshot version', async () => { @@ -100,13 +92,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.9.2'); + await waitFor(() => expect(result.current).toEqual('8.9.2')); }); it('should return kibana version if no agent versions available', async () => { @@ -118,13 +108,11 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.11.0'); + await waitFor(() => expect(result.current).toEqual('8.11.0')); }); it('should return kibana version if the list of available agent versions is not available', async () => { @@ -133,12 +121,10 @@ describe('useAgentVersion', () => { (useKibanaVersion as jest.Mock).mockReturnValue(mockKibanaVersion); (sendGetAgentsAvailableVersions as jest.Mock).mockRejectedValue(new Error('Fetching error')); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual(mockKibanaVersion); + await waitFor(() => expect(result.current).toEqual(mockKibanaVersion)); }); it('should return the latest availeble agent version if has build suffix', async () => { @@ -157,12 +143,10 @@ describe('useAgentVersion', () => { data: { items: mockAvailableVersions }, }); - const { result, waitForNextUpdate } = renderHook(() => useAgentVersion()); + const { result } = renderHook(() => useAgentVersion()); expect(sendGetAgentsAvailableVersions).toHaveBeenCalled(); - await waitForNextUpdate(); - - expect(result.current).toEqual('8.11.1+build123456789'); + await waitFor(() => expect(result.current).toEqual('8.11.1+build123456789')); }); }); diff --git a/x-pack/plugins/fleet/public/hooks/use_dismissable_tour.test.ts b/x-pack/plugins/fleet/public/hooks/use_dismissable_tour.test.ts index 394699fc3f34f..7dbdcea26b250 100644 --- a/x-pack/plugins/fleet/public/hooks/use_dismissable_tour.test.ts +++ b/x-pack/plugins/fleet/public/hooks/use_dismissable_tour.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { TOUR_STORAGE_KEYS } from '../constants'; import { createStartServices } from '../mock'; diff --git a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx index 6f9c96d130ebd..1676f07d2e11f 100644 --- a/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx +++ b/x-pack/plugins/fleet/public/hooks/use_fleet_server_hosts_for_policy.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useFleetServerHostsForPolicy } from './use_fleet_server_hosts_for_policy'; import { useGetEnrollmentSettings } from './use_request/settings'; diff --git a/x-pack/plugins/fleet/public/hooks/use_is_package_policy_upgradable.test.tsx b/x-pack/plugins/fleet/public/hooks/use_is_package_policy_upgradable.test.tsx index b928a74c306ea..80e0360f739a0 100644 --- a/x-pack/plugins/fleet/public/hooks/use_is_package_policy_upgradable.test.tsx +++ b/x-pack/plugins/fleet/public/hooks/use_is_package_policy_upgradable.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useIsPackagePolicyUpgradable } from './use_is_package_policy_upgradable'; import { useGetPackages } from './use_request/epm'; diff --git a/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts b/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts index b85b944c6ee00..b2648b1d55da7 100644 --- a/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts +++ b/x-pack/plugins/fleet/public/hooks/use_multiple_agent_policies.ts @@ -8,15 +8,16 @@ import { LICENCE_FOR_MULTIPLE_AGENT_POLICIES } from '../../common/constants'; import { ExperimentalFeaturesService } from '../services'; -import { useLicense } from './use_license'; +import { licenseService } from './use_license'; export function useMultipleAgentPolicies() { - const licenseService = useLicense(); + return { canUseMultipleAgentPolicies: canUseMultipleAgentPolicies() }; +} + +export function canUseMultipleAgentPolicies() { const { enableReusableIntegrationPolicies } = ExperimentalFeaturesService.get(); const hasEnterpriseLicence = licenseService.hasAtLeast(LICENCE_FOR_MULTIPLE_AGENT_POLICIES); - const canUseMultipleAgentPolicies = enableReusableIntegrationPolicies && hasEnterpriseLicence; - - return { canUseMultipleAgentPolicies }; + return Boolean(enableReusableIntegrationPolicies && hasEnterpriseLicence); } diff --git a/x-pack/plugins/fleet/public/hooks/use_space_settings_context.test.tsx b/x-pack/plugins/fleet/public/hooks/use_space_settings_context.test.tsx index 6f3d286db3706..9f7bfc8ceaf8e 100644 --- a/x-pack/plugins/fleet/public/hooks/use_space_settings_context.test.tsx +++ b/x-pack/plugins/fleet/public/hooks/use_space_settings_context.test.tsx @@ -23,7 +23,7 @@ describe('useSpaceSettingsContext', () => { function renderHook() { return createFleetTestRendererMock().renderHook( () => useSpaceSettingsContext(), - ({ children }: { children: any }) => ( + ({ children }: React.PropsWithChildren) => ( {children} ) ); diff --git a/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx b/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx index 66155cee7bb35..3eb6ade241d3f 100644 --- a/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx +++ b/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx @@ -8,10 +8,8 @@ import type { History } from 'history'; import { createMemoryHistory } from 'history'; import React, { memo } from 'react'; -import type { RenderOptions, RenderResult } from '@testing-library/react'; -import { render as reactRender, act } from '@testing-library/react'; -import { renderHook, type WrapperComponent } from '@testing-library/react-hooks'; -import type { RenderHookResult } from '@testing-library/react-hooks'; +import type { RenderOptions, RenderResult, RenderHookResult } from '@testing-library/react'; +import { render as reactRender, act, waitFor, renderHook } from '@testing-library/react'; import { Router } from '@kbn/shared-ux-router'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; @@ -52,11 +50,12 @@ export interface TestRenderer { AppWrapper: React.FC; HookWrapper: React.FC; render: UiRender; - renderHook: ( + renderHook: ( callback: (props: TProps) => TResult, - wrapper?: WrapperComponent - ) => RenderHookResult; + wrapper?: React.FC + ) => RenderHookResult; setHeaderActionMenu: Function; + waitFor: typeof waitFor; } // disable retries to avoid test flakiness @@ -124,17 +123,21 @@ export const createFleetTestRendererMock = (): TestRenderer => { HookWrapper, renderHook: ( callback, - ExtraWrapper: WrapperComponent = memo(({ children }) => <>{children}) + ExtraWrapper: React.FC> = memo(({ children }) => ( + <>{children} + )) ) => { - const wrapper: WrapperComponent = ({ children }) => ( + const wrapper: React.FC> = ({ children }) => ( {children} ); + return renderHook(callback, { wrapper, }); }, + waitFor, render: (ui, options) => { let renderResponse: RenderResult; act(() => { @@ -207,9 +210,11 @@ export const createIntegrationsTestRendererMock = (): TestRenderer => { }, renderHook: ( callback, - ExtraWrapper: WrapperComponent = memo(({ children }) => <>{children}) + ExtraWrapper: React.FC> = memo(({ children }) => ( + <>{children} + )) ) => { - const wrapper: WrapperComponent = ({ children }) => ( + const wrapper: React.FC> = ({ children }) => ( {children} @@ -218,6 +223,7 @@ export const createIntegrationsTestRendererMock = (): TestRenderer => { wrapper, }); }, + waitFor, }; return testRendererMocks; diff --git a/x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts b/x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts index 8888ae75e4699..b422660ba78fa 100644 --- a/x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts +++ b/x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts @@ -9,8 +9,8 @@ import type { CreateRestAPIKeyParams, CreateRestAPIKeyWithKibanaPrivilegesParams, } from '@kbn/security-plugin/server'; -import type { FakeRawRequest, Headers } from '@kbn/core-http-server'; -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import { type FakeRawRequest, type Headers } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import type { Logger } from '@kbn/logging'; @@ -43,7 +43,7 @@ function createKibanaRequestFromAuth(authorizationHeader: HTTPAuthorizationHeade // Since we're using API keys and accessing elasticsearch can only be done // via a request, we're faking one with the proper authorization headers. - const fakeRequest = CoreKibanaRequest.from(fakeRawRequest); + const fakeRequest = kibanaRequestFactory(fakeRawRequest); return fakeRequest; } diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index da40f8ff7d819..8b49ca1b32329 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -8,16 +8,9 @@ import type { Observable } from 'rxjs'; import { BehaviorSubject } from 'rxjs'; import { kibanaPackageJson } from '@kbn/repo-info'; -import type { - ElasticsearchClient, - SavedObjectsServiceStart, - HttpServiceSetup, - Logger, - KibanaRequest, - SecurityServiceStart, -} from '@kbn/core/server'; -import { CoreKibanaRequest } from '@kbn/core/server'; +import type { HttpServiceSetup, KibanaRequest } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import type { PluginStart as DataPluginStart } from '@kbn/data-plugin/server'; import type { @@ -29,8 +22,12 @@ import type { SecurityPluginStart, SecurityPluginSetup } from '@kbn/security-plu import type { CloudSetup } from '@kbn/cloud-plugin/server'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import type { SavedObjectTaggingStart } from '@kbn/saved-objects-tagging-plugin/server'; +import type { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server'; import { SECURITY_EXTENSION_ID, SPACES_EXTENSION_ID } from '@kbn/core-saved-objects-server'; import type { TaskManagerStartContract } from '@kbn/task-manager-plugin/server'; +import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { SecurityServiceStart } from '@kbn/core-security-server'; +import type { Logger } from '@kbn/logging'; import type { FleetConfigType } from '../../common/types'; import { @@ -188,7 +185,7 @@ class AppContextService { return this.savedObjectsTagging; } public getInternalUserSOClientForSpaceId(spaceId?: string) { - const request = CoreKibanaRequest.from({ + const request = kibanaRequestFactory({ headers: {}, path: '/', route: { settings: {} }, diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index 6ebdaffde2a31..7499f980d5ebf 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -93,7 +93,6 @@ "@kbn/core-http-request-handler-context-server", "@kbn/shared-ux-router", "@kbn/shared-ux-link-redirect-app", - "@kbn/core-http-router-server-internal", "@kbn/safer-lodash-set", "@kbn/shared-ux-file-types", "@kbn/core-application-browser", @@ -118,5 +117,7 @@ "@kbn/zod", "@kbn/reporting-public", "@kbn/field-formats-plugin", + "@kbn/core-security-server", + "@kbn/core-http-server-utils", ] } diff --git a/x-pack/plugins/index_lifecycle_management/kibana.jsonc b/x-pack/plugins/index_lifecycle_management/kibana.jsonc index e61210ebbbef9..e081aab35d3ef 100644 --- a/x-pack/plugins/index_lifecycle_management/kibana.jsonc +++ b/x-pack/plugins/index_lifecycle_management/kibana.jsonc @@ -2,6 +2,8 @@ "type": "plugin", "id": "@kbn/index-lifecycle-management-plugin", "owner": "@elastic/kibana-management", + "group": "platform", + "visibility": "private", "plugin": { "id": "indexLifecycleManagement", "server": true, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts index 1d7ee65790cfd..3bc122ad867f6 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts @@ -812,7 +812,7 @@ describe('Data Streams tab', () => { const { actions, findDetailPanelIlmPolicyLink } = testBed; await actions.clickNameAt(0); - expect(findDetailPanelIlmPolicyLink().prop('href')).toBe('/test/my_ilm_policy'); + expect(findDetailPanelIlmPolicyLink().prop('data-href')).toBe('/test/my_ilm_policy'); }); test('with an ILM url locator and no ILM policy', async () => { diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx index d962305a7147c..10ef17c566241 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx @@ -131,7 +131,7 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ const { error, data: dataStream, isLoading } = useLoadDataStream(dataStreamName); const ilmPolicyLink = useIlmLocator(ILM_PAGES_POLICY_EDIT, dataStream?.ilmPolicyName); - const { history, config } = useAppContext(); + const { history, config, core } = useAppContext(); let indicesLink; let content; @@ -193,7 +193,11 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ > <> {ilmPolicyLink ? ( - + core.application.navigateToUrl(ilmPolicyLink)} + > {ilmPolicyName} ) : ( @@ -204,7 +208,11 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ ) : ( <> {ilmPolicyLink ? ( - + core.application.navigateToUrl(ilmPolicyLink)} + > {ilmPolicyName} ) : ( @@ -429,7 +437,7 @@ export const DataStreamDetailPanel: React.FunctionComponent = ({ defaultMessage="To edit data retention for this data stream, you must edit its associated {link}." values={{ link: ( - + core.application.navigateToUrl(ilmPolicyLink)}> { + const { core } = useAppContext(); + return ( + core.application.navigateToUrl(ilmPolicyLink)} + > {ilmPolicyName} ), diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx index 2621f3ec483c1..eed3335d01431 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/tabs/tab_summary.tsx @@ -63,7 +63,7 @@ export const TabSummary: React.FunctionComponent = ({ templateDetails }) const numIndexPatterns = indexPatterns.length; - const { history } = useAppContext(); + const { history, core } = useAppContext(); const ilmPolicyLink = useIlmLocator(ILM_PAGES_POLICY_EDIT, ilmPolicy?.name); return ( @@ -171,7 +171,9 @@ export const TabSummary: React.FunctionComponent = ({ templateDetails }) {ilmPolicy?.name && ilmPolicyLink ? ( - {ilmPolicy!.name} + core.application.navigateToUrl(ilmPolicyLink)}> + {ilmPolicy!.name} + ) : ( ilmPolicy?.name || i18nTexts.none )} diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts index 419e287e23bf7..d7ce89e2e8f63 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts @@ -277,6 +277,13 @@ describe('renderPackageManifestYAML', () => { expect(manifest.name).toBe(integration.name); expect(manifest.type).toBe('integration'); expect(manifest.description).toBe(integration.description); - expect(manifest.icons).toBeTruthy(); + expect(Array.isArray(manifest.icons)).toBe(true); + expect((manifest.icons as object[]).length).toBe(1); + expect((manifest.icons as object[])[0]).toEqual({ + src: '/img/logo.svg', + title: 'Sample Integration Logo', + size: '32x32', + type: 'image/svg+xml', + }); }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts index 8743ada38bdb6..bf2e9b6b9d5a7 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.ts @@ -185,12 +185,14 @@ function createPackageManifestDict( }; if (package_logo !== undefined && package_logo !== '') { - data.icons = { - src: '/img/logo.svg', - title: `${package_title} Logo`, - size: '32x32', - type: 'image/svg+xml', - }; + data.icons = [ + { + src: '/img/logo.svg', + title: `${package_title} Logo`, + size: '32x32', + type: 'image/svg+xml', + }, + ]; } return data; } diff --git a/x-pack/plugins/lists/server/get_space_id.test.ts b/x-pack/plugins/lists/server/get_space_id.test.ts index 3faaf5f1c142a..980a4125d254f 100644 --- a/x-pack/plugins/lists/server/get_space_id.test.ts +++ b/x-pack/plugins/lists/server/get_space_id.test.ts @@ -5,16 +5,16 @@ * 2.0. */ -import { httpServerMock } from '@kbn/core/server/mocks'; -import { CoreKibanaRequest } from '@kbn/core/server'; import { spacesServiceMock } from '@kbn/spaces-plugin/server/spaces_service/spaces_service.mock'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; +import { httpServerMock } from '@kbn/core-http-server-mocks'; import { getSpaceId } from './get_space_id'; describe('get_space_id', () => { - let request = CoreKibanaRequest.from(httpServerMock.createRawRequest({})); + let request = kibanaRequestFactory(httpServerMock.createRawRequest({})); beforeEach(() => { - request = CoreKibanaRequest.from(httpServerMock.createRawRequest({})); + request = kibanaRequestFactory(httpServerMock.createRawRequest({})); jest.clearAllMocks(); }); diff --git a/x-pack/plugins/lists/tsconfig.json b/x-pack/plugins/lists/tsconfig.json index a7d1c5b7b3153..61229d39bdbdd 100644 --- a/x-pack/plugins/lists/tsconfig.json +++ b/x-pack/plugins/lists/tsconfig.json @@ -42,7 +42,9 @@ "@kbn/core-elasticsearch-client-server-mocks", "@kbn/core-saved-objects-server", "@kbn/zod-helpers", - "@kbn/core-security-server" + "@kbn/core-security-server", + "@kbn/core-http-server-mocks", + "@kbn/core-http-server-utils" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/ml/common/types/storage.test.tsx b/x-pack/plugins/ml/common/types/storage.test.tsx index a1473b23c5dcd..5f3cc1222547b 100644 --- a/x-pack/plugins/ml/common/types/storage.test.tsx +++ b/x-pack/plugins/ml/common/types/storage.test.tsx @@ -7,7 +7,8 @@ import type { FC } from 'react'; import React from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import { StorageContextProvider, useStorage } from '@kbn/ml-local-storage'; @@ -61,12 +62,9 @@ describe('useStorage', () => { }); test('updates the storage value', async () => { - const { result, waitForNextUpdate } = renderHook( - () => useStorage('ml.gettingStarted.isDismissed'), - { - wrapper: Provider, - } - ); + const { result } = renderHook(() => useStorage('ml.gettingStarted.isDismissed'), { + wrapper: Provider, + }); const [value, setValue] = result.current; @@ -74,7 +72,6 @@ describe('useStorage', () => { await act(async () => { setValue(false); - await waitForNextUpdate(); }); expect(result.current[0]).toBe(false); @@ -82,12 +79,9 @@ describe('useStorage', () => { }); test('removes the storage value', async () => { - const { result, waitForNextUpdate } = renderHook( - () => useStorage('ml.gettingStarted.isDismissed'), - { - wrapper: Provider, - } - ); + const { result } = renderHook(() => useStorage('ml.gettingStarted.isDismissed'), { + wrapper: Provider, + }); const [value, setValue] = result.current; @@ -95,7 +89,6 @@ describe('useStorage', () => { await act(async () => { setValue(undefined); - await waitForNextUpdate(); }); expect(result.current[0]).toBe(undefined); @@ -103,12 +96,9 @@ describe('useStorage', () => { }); test('updates the value on storage event', async () => { - const { result, waitForNextUpdate } = renderHook( - () => useStorage('ml.gettingStarted.isDismissed'), - { - wrapper: Provider, - } - ); + const { result } = renderHook(() => useStorage('ml.gettingStarted.isDismissed'), { + wrapper: Provider, + }); expect(result.current[0]).toBe(true); @@ -130,7 +120,6 @@ describe('useStorage', () => { newValue: null, }) ); - await waitForNextUpdate(); }); expect(result.current[0]).toBe(undefined); @@ -142,7 +131,6 @@ describe('useStorage', () => { newValue: 'false', }) ); - await waitForNextUpdate(); }); expect(result.current[0]).toBe(false); diff --git a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx index a2623266712dc..b78164804f9c2 100644 --- a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx +++ b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { of, throwError } from 'rxjs'; import { useMlNotifications, MlNotificationsContextProvider } from './ml_notifications_context'; import { useStorage } from '@kbn/ml-local-storage'; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js index cb5a705a48709..a83b1a5a472a6 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/components/explorer_chart_label/explorer_chart_label.js @@ -94,7 +94,7 @@ export function ExplorerChartLabel({ } ExplorerChartLabel.propTypes = { detectorLabel: PropTypes.object.isRequired, - isEmbeddable: PropTypes.boolean, + isEmbeddable: PropTypes.bool, entityFields: PropTypes.arrayOf(ExplorerChartLabelBadge.propTypes.entity), infoTooltip: PropTypes.object.isRequired, wrapLabel: PropTypes.bool, diff --git a/x-pack/plugins/ml/public/application/hooks/use_as_observable.test.ts b/x-pack/plugins/ml/public/application/hooks/use_as_observable.test.ts index d8680f8393e6e..078300e3733ef 100644 --- a/x-pack/plugins/ml/public/application/hooks/use_as_observable.test.ts +++ b/x-pack/plugins/ml/public/application/hooks/use_as_observable.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, renderHook } from '@testing-library/react'; import { useAsObservable } from './use_as_observable'; describe('useAsObservable', () => { @@ -16,6 +16,8 @@ describe('useAsObservable', () => { test('provides and observable preserving a reference', () => { const { result, rerender } = renderHook(useAsObservable, { initialProps: 1 }); + const initial = result.current; + let observableValue; const subscriptionMock = jest.fn((v) => (observableValue = v)); @@ -27,7 +29,7 @@ describe('useAsObservable', () => { act(() => rerender(1)); - expect(result.all[0]).toStrictEqual(result.all[1]); + expect(initial).toStrictEqual(result.current); expect(subscriptionMock).toHaveBeenCalledWith(1); expect(subscriptionMock).toHaveBeenCalledTimes(1); @@ -35,7 +37,7 @@ describe('useAsObservable', () => { }); test('updates the subject with a new value', async () => { - const { result, rerender, waitForNextUpdate } = renderHook(useAsObservable, { + const { result, rerender } = renderHook(useAsObservable, { initialProps: 'test', }); @@ -50,7 +52,6 @@ describe('useAsObservable', () => { await act(async () => { rerender('test update'); - await waitForNextUpdate(); }); expect(subscriptionMock).toHaveBeenCalledTimes(2); diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index a717995d4ee14..d66ab1ab3db16 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -697,7 +697,7 @@ export const ModelsList: FC = ({ <> {downloadState ? ( - (downloadState.downloaded_parts / downloadState.total_parts) * + (downloadState.downloaded_parts / (downloadState.total_parts || -1)) * 100 ).toFixed(0) + '%' : '100%'} diff --git a/x-pack/plugins/ml/public/application/routing/use_resolver.test.ts b/x-pack/plugins/ml/public/application/routing/use_resolver.test.ts index b3b59c3f12a4b..164cbe1b2d955 100644 --- a/x-pack/plugins/ml/public/application/routing/use_resolver.test.ts +++ b/x-pack/plugins/ml/public/application/routing/use_resolver.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useMlKibana, useMlLicenseInfo } from '../contexts/kibana'; import { usePermissionCheck } from '../capabilities/check_capabilities'; import { useRouteResolver } from './use_resolver'; @@ -63,8 +63,8 @@ describe('useResolver', () => { it.skip('redirects to the access denied page if some required capabilities are missing', async () => { (usePermissionCheck as jest.Mock).mockReturnValueOnce([false]); - const { waitForNextUpdate } = renderHook(() => useRouteResolver('full', ['canGetCalendars'])); - await waitForNextUpdate(); + renderHook(() => useRouteResolver('full', ['canGetCalendars'])); + await waitFor(() => new Promise((resolve) => resolve(null))); expect(useMlKibana().services.application.navigateToUrl).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/ml/server/models/job_service/jobs.ts b/x-pack/plugins/ml/server/models/job_service/jobs.ts index 9c4ea6b1d3307..fa779258e5f23 100644 --- a/x-pack/plugins/ml/server/models/job_service/jobs.ts +++ b/x-pack/plugins/ml/server/models/job_service/jobs.ts @@ -354,6 +354,10 @@ export function jobsProvider( const result: { datafeed?: Datafeed; job?: Job } = { job: undefined, datafeed: undefined }; if (datafeedResult && datafeedResult.job_id === jobId) { result.datafeed = datafeedResult; + if (result.datafeed.indices_options?.ignore_throttled !== undefined) { + // ignore_throttled is a deprecated setting, remove it from the response + delete result.datafeed.indices_options.ignore_throttled; + } } if (jobResults?.jobs?.length > 0) { diff --git a/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts b/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts index 27e1b6afe3364..2c61dca8859b2 100644 --- a/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/datafeeds_schema.ts @@ -27,7 +27,10 @@ export const indicesOptionsSchema = schema.object({ ), ignore_unavailable: schema.maybe(schema.boolean()), allow_no_indices: schema.maybe(schema.boolean()), + // retaining the deprecated ignore_throttled in case an older jobs are used + // we don't want to fail the schema validation if this is present ignore_throttled: schema.maybe(schema.boolean()), + failure_store: schema.maybe(schema.string()), }); export const datafeedConfigSchema = schema.object({ diff --git a/x-pack/plugins/ml/server/shared_services/shared_services.ts b/x-pack/plugins/ml/server/shared_services/shared_services.ts index f7b0d42409221..d4af7166435d4 100644 --- a/x-pack/plugins/ml/server/shared_services/shared_services.ts +++ b/x-pack/plugins/ml/server/shared_services/shared_services.ts @@ -5,20 +5,17 @@ * 2.0. */ -import type { - IClusterClient, - IScopedClusterClient, - SavedObjectsClientContract, - UiSettingsServiceStart, - KibanaRequest, - CoreAuditService, -} from '@kbn/core/server'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/server'; -import { CoreKibanaRequest } from '@kbn/core/server'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { PluginStart as DataViewsPluginStart } from '@kbn/data-views-plugin/server'; import type { SecurityPluginSetup } from '@kbn/security-plugin/server'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/server'; +import { isCoreKibanaRequest } from '@kbn/core-http-server-utils'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import type { IClusterClient, IScopedClusterClient } from '@kbn/core-elasticsearch-server'; +import type { UiSettingsServiceStart } from '@kbn/core-ui-settings-server'; +import type { CoreAuditService } from '@kbn/core-security-server'; import type { CompatibleModule } from '../../common/constants/app'; import type { MlLicense } from '../../common/license'; @@ -269,7 +266,7 @@ function getRequestItemsProvider( }; let mlSavedObjectService; - if (request instanceof CoreKibanaRequest) { + if (isCoreKibanaRequest(request)) { scopedClient = clusterClient.asScoped(request); mlSavedObjectService = getSobSavedObjectService(scopedClient); const auditLogger = new MlAuditLogger(auditService, request); diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index 73ab75d5f2515..e11358f258a3a 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -133,5 +133,9 @@ "@kbn/unified-search-plugin", "@kbn/usage-collection-plugin", "@kbn/utility-types", + "@kbn/core-http-server-utils", + "@kbn/core-saved-objects-api-server", + "@kbn/core-ui-settings-server", + "@kbn/core-security-server", ] } diff --git a/x-pack/plugins/observability_solution/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts b/x-pack/plugins/observability_solution/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts index 861481351bf96..fd456d6b203d4 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/anomaly_detection/create_anomaly_detection_jobs.ts @@ -11,7 +11,6 @@ import { snakeCase } from 'lodash'; import moment from 'moment'; import { v4 as uuidv4 } from 'uuid'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; -import { waitForIndexStatus } from '@kbn/core-saved-objects-migration-server-internal'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; import { ElasticsearchCapabilities } from '@kbn/core-elasticsearch-server'; import { ML_ERRORS } from '../../../common/anomaly_detection'; @@ -51,10 +50,20 @@ export async function createAnomalyDetectionJobs({ return withApmSpan('create_anomaly_detection_jobs', async () => { logger.info(`Creating ML anomaly detection jobs for environments: [${uniqueMlJobEnvs}].`); - const apmMetricIndex = indices.metric; const responses = []; const failedJobs = []; + + if (!esCapabilities.serverless) { + // Waiting for the index is not enabled in serverless, this could potentially cause + // problems when creating jobs in parallel + try { + await waitForIndexStatus(esClient, apmMetricIndex, 'yellow'); + } catch (err) { + logger.warn(`Error waiting for ${apmMetricIndex} to turn yellow before creating ML jobs`); + } + } + // Avoid the creation of multiple ml jobs in parallel // https://github.com/elastic/elasticsearch/issues/36271 for (const environment of uniqueMlJobEnvs) { @@ -62,10 +71,8 @@ export async function createAnomalyDetectionJobs({ responses.push( await createAnomalyDetectionJob({ mlClient, - esClient, environment, apmMetricIndex, - esCapabilities, }) ); } catch (e) { @@ -88,19 +95,13 @@ export async function createAnomalyDetectionJobs({ async function createAnomalyDetectionJob({ mlClient, - esClient, environment, apmMetricIndex, - esCapabilities, }: { mlClient: Required; - esClient: ElasticsearchClient; environment: string; apmMetricIndex: string; - esCapabilities: ElasticsearchCapabilities; }) { - const { serverless } = esCapabilities; - return withApmSpan('create_anomaly_detection_job', async () => { const randomToken = uuidv4().substr(-4); @@ -134,17 +135,6 @@ async function createAnomalyDetectionJob({ ], }); - // Waiting for the index is not enabled in serverless, this could potentially cause - // problems when creating jobs in parallels - if (!serverless) { - await waitForIndexStatus({ - client: esClient, - index: '.ml-*', - timeout: DEFAULT_TIMEOUT, - status: 'yellow', - })(); - } - return anomalyDetectionJob; }); } @@ -166,3 +156,22 @@ async function getUniqueMlJobEnvs(mlClient: MlClient, environments: Environment[ return environments.filter((env) => !existingMlJobEnvs.includes(env)); } + +async function waitForIndexStatus( + esClient: ElasticsearchClient, + index: string, + waitForStatus: 'yellow' | 'green', + timeout = DEFAULT_TIMEOUT +) { + return await esClient.cluster.health( + { + index, + wait_for_status: waitForStatus, + timeout, + }, + { + retryOnTimeout: true, + maxRetries: 3, + } + ); +} diff --git a/x-pack/plugins/observability_solution/apm/tsconfig.json b/x-pack/plugins/observability_solution/apm/tsconfig.json index 0f08bf3143cd2..d3de1633dcad7 100644 --- a/x-pack/plugins/observability_solution/apm/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm/tsconfig.json @@ -70,7 +70,6 @@ "@kbn/core-saved-objects-api-server-mocks", "@kbn/field-types", "@kbn/babel-register", - "@kbn/core-saved-objects-migration-server-internal", "@kbn/core-elasticsearch-server", "@kbn/safer-lodash-set", "@kbn/shared-ux-router", diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts index e6bf32332a51f..75048ac22a6a8 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.test.ts @@ -10,6 +10,7 @@ import { type InfraMetricsClient } from '../../lib/helpers/get_infra_metrics_cli import { getDataStreamTypes } from './get_data_stream_types'; import { getHasMetricsData } from './get_has_metrics_data'; import { getLatestEntity } from './get_latest_entity'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; jest.mock('./get_has_metrics_data', () => ({ getHasMetricsData: jest.fn(), @@ -25,6 +26,7 @@ describe('getDataStreamTypes', () => { let infraMetricsClient: jest.Mocked; let obsEsClient: jest.Mocked; let entityManagerClient: jest.Mocked; + const logger = loggingSystemMock.createLogger(); beforeEach(() => { infraMetricsClient = {} as jest.Mocked; @@ -43,6 +45,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -65,6 +68,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -84,6 +88,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -95,6 +100,7 @@ describe('getDataStreamTypes', () => { entityId: 'entity123', entityType: 'host', entityManagerClient, + logger, }); }); @@ -109,6 +115,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); @@ -128,6 +135,7 @@ describe('getDataStreamTypes', () => { infraMetricsClient, obsEsClient, entityManagerClient, + logger, }; const result = await getDataStreamTypes(params); diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts index 2d587a6e7d9a9..4a949de4d0ed7 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_data_stream_types.ts @@ -10,6 +10,7 @@ import { findInventoryFields } from '@kbn/metrics-data-access-plugin/common'; import { EntityDataStreamType } from '@kbn/observability-shared-plugin/common'; import type { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; import { castArray } from 'lodash'; +import { Logger } from '@kbn/logging'; import { type InfraMetricsClient } from '../../lib/helpers/get_infra_metrics_client'; import { getHasMetricsData } from './get_has_metrics_data'; import { getLatestEntity } from './get_latest_entity'; @@ -21,6 +22,7 @@ interface Params { infraMetricsClient: InfraMetricsClient; obsEsClient: ObservabilityElasticsearchClient; entityManagerClient: EntityClient; + logger: Logger; } export async function getDataStreamTypes({ @@ -30,6 +32,7 @@ export async function getDataStreamTypes({ entityType, infraMetricsClient, obsEsClient, + logger, }: Params) { const hasMetricsData = await getHasMetricsData({ infraMetricsClient, @@ -48,6 +51,7 @@ export async function getDataStreamTypes({ entityId, entityType, entityManagerClient, + logger, }); if (latestEntity) { diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts index 0756bc3d52c8f..c109f53be1f11 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/get_latest_entity.ts @@ -9,6 +9,7 @@ import { ENTITY_LATEST, entitiesAliasPattern } from '@kbn/entities-schema'; import { type EntityClient } from '@kbn/entityManager-plugin/server/lib/entity_client'; import { ENTITY_TYPE, SOURCE_DATA_STREAM_TYPE } from '@kbn/observability-shared-plugin/common'; import type { ObservabilityElasticsearchClient } from '@kbn/observability-utils-server/es/client/create_observability_es_client'; +import type { Logger } from '@kbn/logging'; const ENTITIES_LATEST_ALIAS = entitiesAliasPattern({ type: '*', @@ -24,32 +25,38 @@ export async function getLatestEntity({ entityId, entityType, entityManagerClient, + logger, }: { inventoryEsClient: ObservabilityElasticsearchClient; entityType: 'host' | 'container'; entityId: string; entityManagerClient: EntityClient; + logger: Logger; }): Promise { - const { definitions } = await entityManagerClient.getEntityDefinitions({ - builtIn: true, - type: entityType, - }); + try { + const { definitions } = await entityManagerClient.getEntityDefinitions({ + builtIn: true, + type: entityType, + }); - const hostOrContainerIdentityField = definitions[0]?.identityFields?.[0]?.field; - if (hostOrContainerIdentityField === undefined) { - return undefined; - } + const hostOrContainerIdentityField = definitions[0]?.identityFields?.[0]?.field; + if (hostOrContainerIdentityField === undefined) { + return undefined; + } - const response = await inventoryEsClient.esql<{ - source_data_stream?: { type?: string | string[] }; - }>('get_latest_entities', { - query: `FROM ${ENTITIES_LATEST_ALIAS} + const response = await inventoryEsClient.esql<{ + source_data_stream?: { type?: string | string[] }; + }>('get_latest_entities', { + query: `FROM ${ENTITIES_LATEST_ALIAS} | WHERE ${ENTITY_TYPE} == ? | WHERE ${hostOrContainerIdentityField} == ? | KEEP ${SOURCE_DATA_STREAM_TYPE} `, - params: [entityType, entityId], - }); + params: [entityType, entityId], + }); - return { sourceDataStreamType: response[0].source_data_stream?.type }; + return { sourceDataStreamType: response[0].source_data_stream?.type }; + } catch (e) { + logger.error(e); + } } diff --git a/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts b/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts index 30be4fc9da498..46f2cecf45254 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/entities/index.ts @@ -36,8 +36,11 @@ export const initEntitiesConfigurationRoutes = (libs: InfraBackendLibs) => { }, async (requestContext, request, response) => { const { entityId, entityType } = request.params; - const coreContext = await requestContext.core; - const infraContext = await requestContext.infra; + const [coreContext, infraContext] = await Promise.all([ + requestContext.core, + requestContext.infra, + ]); + const entityManagerClient = await infraContext.entityManager.getScopedClient({ request }); const infraMetricsClient = await getInfraMetricsClient({ request, @@ -63,6 +66,7 @@ export const initEntitiesConfigurationRoutes = (libs: InfraBackendLibs) => { entityType, infraMetricsClient, obsEsClient, + logger, }); return response.ok({ diff --git a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts index ce7bdfd102a40..fdb68826e9dc8 100644 --- a/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts +++ b/x-pack/plugins/observability_solution/inventory/e2e/cypress/e2e/home.cy.ts @@ -225,7 +225,7 @@ describe('Home page', () => { cy.getByTestSubj('inventoryEntityActionOpenInDiscover').click(); cy.url().should( 'include', - "query:'container.id:%20foo%20AND%20entity.definition_id%20:%20builtin*" + "query:'container.id:%20%22foo%22%20AND%20entity.definition_id%20:%20builtin*" ); }); }); diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/grid_columns.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/grid_columns.tsx index be5c50eba9c07..867425b9e0aed 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/grid_columns.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/grid_columns.tsx @@ -116,9 +116,7 @@ export const getColumns = ({ id: 'actions' as const, // keep it for accessibility purposes displayAsText: entityActionsLabel, - display: ( - - ), + display: {entityActionsLabel}, initialWidth: 100, }, ] diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx index ff4329955773d..dd421d30a3a9c 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx @@ -160,7 +160,7 @@ export function EntitiesGrid({ @@ -169,10 +169,10 @@ export function EntitiesGrid({ ), total: entities.length, - boldEntites: ( + boldEntities: ( {i18n.translate( - 'xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entites', + 'xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entities', { defaultMessage: 'Entities' } )} diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts index 2c04cdf8f0767..7d5086323e90b 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts @@ -15,7 +15,6 @@ import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; import type { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; -import type { OsqueryPluginStart } from '@kbn/osquery-plugin/public'; import { ALERT_GROUP, ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; @@ -72,7 +71,6 @@ export interface InfraClientStartDeps { lens: LensPublicStart; observability: ObservabilityPublicStart; observabilityShared: ObservabilitySharedPluginStart; - osquery?: OsqueryPluginStart; share: SharePluginStart; spaces: SpacesPluginStart; storage: IStorageWrapper; diff --git a/x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts b/x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts index 59ae964ce8831..5df2ed8d0e682 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/annotations/register_annotation_apis.ts @@ -95,6 +95,12 @@ export function registerAnnotationAPIs({ router.post( { path: '/api/observability/annotation', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { body: unknowns, }, @@ -110,6 +116,12 @@ export function registerAnnotationAPIs({ router.put( { path: '/api/observability/annotation/{id}', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { body: unknowns, }, @@ -125,6 +137,12 @@ export function registerAnnotationAPIs({ router.delete( { path: '/api/observability/annotation/{id}', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { params: unknowns, }, @@ -140,6 +158,12 @@ export function registerAnnotationAPIs({ router.get( { path: '/api/observability/annotation/{id}', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { params: unknowns, }, @@ -155,6 +179,12 @@ export function registerAnnotationAPIs({ router.get( { path: '/api/observability/annotation/find', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { query: unknowns, }, @@ -170,6 +200,12 @@ export function registerAnnotationAPIs({ router.get( { path: '/api/observability/annotation/permissions', + security: { + authz: { + enabled: false, + reason: 'This route delegates authorization to Elasticsearch', + }, + }, validate: { query: unknowns, }, diff --git a/x-pack/plugins/observability_solution/observability/tsconfig.json b/x-pack/plugins/observability_solution/observability/tsconfig.json index 83c14047131b6..84a691f1033af 100644 --- a/x-pack/plugins/observability_solution/observability/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability/tsconfig.json @@ -66,7 +66,6 @@ "@kbn/discover-plugin", "@kbn/embeddable-plugin", "@kbn/lens-plugin", - "@kbn/osquery-plugin", "@kbn/ui-actions-plugin", "@kbn/unified-search-plugin", "@kbn/lens-embeddable-utils", diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts index 57cac3a4e0c0f..77ba9afb18260 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts @@ -48,7 +48,7 @@ export function registerGetDatasetInfoFunction({ try { const body = await esClient.asCurrentUser.indices.resolveIndex({ - name: index === '' ? '*' : index.split(','), + name: index === '' ? ['*', '*:*'] : index.split(','), expand_wildcards: 'open', }); indices = [ diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_logs_explorer/src/notifications.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_logs_explorer/src/notifications.tsx deleted file mode 100644 index 79ad5820ff277..0000000000000 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_logs_explorer/src/notifications.tsx +++ /dev/null @@ -1,21 +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 { mountReactNode } from '@kbn/core-mount-utils-browser-internal'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; - -export const createRequestFeedbackNotifier = (toasts: IToasts) => () => { - toasts.addInfo({ - title: i18n.translate('xpack.observabilityLogsExplorer.feedbackToast.title', { - defaultMessage: 'Tell us what you think!', - }), - text: mountReactNode(<>), - iconType: 'editorComment', - }); -}; 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 5a2f18aa4249a..443d4ef8f0de7 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json @@ -13,7 +13,6 @@ "kbn_references": [ "@kbn/config-schema", "@kbn/core", - "@kbn/core-mount-utils-browser-internal", "@kbn/core-notifications-browser", "@kbn/data-plugin", "@kbn/deeplinks-observability", diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/use_auto_detect_telemetry.test.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/use_auto_detect_telemetry.test.ts index d296e598c9e11..f77db3b8aad3d 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/use_auto_detect_telemetry.test.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/auto_detect/use_auto_detect_telemetry.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useAutoDetectTelemetry } from './use_auto_detect_telemetry'; import { ObservabilityOnboardingFlowStatus } from './get_onboarding_status'; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.test.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.test.tsx index aede0d27bd4ef..45ca17d878991 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.test.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useFlowProgressTelemetry } from './use_flow_progress_telemetry'; import { useKibana } from './use_kibana'; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.test.tsx b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.test.tsx index c166057df0304..8407fd8764196 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.test.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; -import React, { ReactNode } from 'react'; +import { renderHook } from '@testing-library/react'; +import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; @@ -28,7 +28,7 @@ const kibanaServices = { } as unknown as Partial; const KibanaContext = createKibanaReactContext(kibanaServices); -function Wrapper({ children }: { children?: ReactNode }) { +function Wrapper({ children }: React.PropsWithChildren) { return ( {children} @@ -38,18 +38,20 @@ function Wrapper({ children }: { children?: ReactNode }) { describe('useBreadcrumbs', () => { afterEach(() => { - setBreadcrumbs.mockClear(); - setTitle.mockClear(); + jest.clearAllMocks(); }); describe('when setBreadcrumbs and setTitle are not defined', () => { it('does not set breadcrumbs or the title', () => { renderHook(() => useBreadcrumbs([]), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + wrapper: ({ children }: React.PropsWithChildren) => ( + { + ...kibanaServices, + chrome: { ...kibanaServices.chrome, docTitle: {}, setBreadcrumbs: null }, + } as unknown as Partial } > {children} diff --git a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.ts b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.ts index 5c9c0d3981bb0..81ee8857e03f4 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_breadcrumbs.ts @@ -97,7 +97,7 @@ export const useBreadcrumbs = ( const setBreadcrumbs = useMemo(() => { if (!serverless?.setBreadcrumbs) { return (breadcrumbs: ChromeBreadcrumb[]) => - chromeSetBreadcrumbs( + chromeSetBreadcrumbs?.( breadcrumbs, !classicOnly ? { diff --git a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_link_props.test.tsx b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_link_props.test.tsx index 69ad845939e49..4c6a4f4a06ff0 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_link_props.test.tsx +++ b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_link_props.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import React, { PropsWithChildren } from 'react'; import { Router } from '@kbn/shared-ux-router'; diff --git a/x-pack/plugins/observability_solution/slo/public/application.tsx b/x-pack/plugins/observability_solution/slo/public/application.tsx index abd85fc712c0e..12019ae1fdf75 100644 --- a/x-pack/plugins/observability_solution/slo/public/application.tsx +++ b/x-pack/plugins/observability_solution/slo/public/application.tsx @@ -13,7 +13,6 @@ import { Storage } from '@kbn/kibana-utils-plugin/public'; import { ObservabilityRuleTypeRegistry } from '@kbn/observability-plugin/public'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; @@ -53,7 +52,7 @@ export const renderApp = ({ experimentalFeatures, sloClient, }: Props) => { - const { element, history, theme$ } = appMountParameters; + const { element, history } = appMountParameters; // ensure all divs are .kbnAppWrappers element.classList.add(APP_WRAPPER_CLASS); @@ -90,42 +89,40 @@ export const renderApp = ({ ReactDOM.render( - - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + , element diff --git a/x-pack/plugins/observability_solution/slo/public/rules/register_burn_rate_rule_type.ts b/x-pack/plugins/observability_solution/slo/public/rules/register_burn_rate_rule_type.ts index cea53c96ab0a0..cd0b5ec478362 100644 --- a/x-pack/plugins/observability_solution/slo/public/rules/register_burn_rate_rule_type.ts +++ b/x-pack/plugins/observability_solution/slo/public/rules/register_burn_rate_rule_type.ts @@ -67,7 +67,9 @@ export const registerBurnRateRuleType = ( documentationUrl(docLinks) { return `${docLinks.links.observability.sloBurnRateRule}`; }, - ruleParamsExpression: lazy(() => import('../components/burn_rate_rule_editor')), + ruleParamsExpression: lazyWithContextProviders( + lazy(() => import('../components/burn_rate_rule_editor')) + ), validate: validateBurnRateRule, requiresAppContext: false, defaultActionMessage: sloBurnRateDefaultActionMessage, diff --git a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts index 7f3b395c7adba..2081f38df552f 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts @@ -29,7 +29,6 @@ import { updateSLOParamsSchema, } from '@kbn/slo-schema'; import { getOverviewParamsSchema } from '@kbn/slo-schema/src/rest_specs/routes/get_overview'; -import type { IndicatorTypes } from '../../domain/models'; import { executeWithErrorHandler } from '../../errors'; import { CreateSLO, @@ -60,29 +59,10 @@ import { SloDefinitionClient } from '../../services/slo_definition_client'; import { getSloSettings, storeSloSettings } from '../../services/slo_settings'; import { DefaultSummarySearchClient } from '../../services/summary_search_client'; import { DefaultSummaryTransformGenerator } from '../../services/summary_transform_generator/summary_transform_generator'; -import { - ApmTransactionDurationTransformGenerator, - ApmTransactionErrorRateTransformGenerator, - HistogramTransformGenerator, - KQLCustomTransformGenerator, - MetricCustomTransformGenerator, - SyntheticsAvailabilityTransformGenerator, - TimesliceMetricTransformGenerator, - TransformGenerator, -} from '../../services/transform_generators'; +import { createTransformGenerators } from '../../services/transform_generators'; import { createSloServerRoute } from '../create_slo_server_route'; import { SLORoutesDependencies } from '../types'; -const transformGenerators: Record = { - 'sli.apm.transactionDuration': new ApmTransactionDurationTransformGenerator(), - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), - 'sli.synthetics.availability': new SyntheticsAvailabilityTransformGenerator(), - 'sli.kql.custom': new KQLCustomTransformGenerator(), - 'sli.metric.custom': new MetricCustomTransformGenerator(), - 'sli.histogram.custom': new HistogramTransformGenerator(), - 'sli.metric.timeslice': new TimesliceMetricTransformGenerator(), -}; - const assertPlatinumLicense = async (plugins: SLORoutesDependencies['plugins']) => { const licensing = await plugins.licensing.start(); const hasCorrectLicense = (await licensing.getLicense()).hasAtLeast('platinum'); @@ -120,14 +100,18 @@ const createSLORoute = createSloServerRoute({ getSpaceId(plugins, request), dataViews.dataViewsServiceFactory(soClient, esClient), ]); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, @@ -168,14 +152,17 @@ const inspectSLORoute = createSloServerRoute({ const soClient = core.savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, @@ -218,14 +205,17 @@ const updateSLORoute = createSloServerRoute({ const soClient = core.savedObjects.client; const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, @@ -271,14 +261,16 @@ const deleteSLORoute = createSloServerRoute({ const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); + const transformGenerators = createTransformGenerators( + spaceId, + dataViewsService, + sloContext.isServerless + ); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, scopedClusterClient, - logger, - spaceId, - dataViewsService, - sloContext.isServerless + logger ); const summaryTransformManager = new DefaultSummaryTransformManager( @@ -346,14 +338,18 @@ const enableSLORoute = createSloServerRoute({ const esClient = core.elasticsearch.client.asCurrentUser; const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, @@ -388,14 +384,17 @@ const disableSLORoute = createSloServerRoute({ const esClient = core.elasticsearch.client.asCurrentUser; const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, @@ -430,14 +429,17 @@ const resetSLORoute = createSloServerRoute({ const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); - const transformManager = new DefaultTransformManager( - transformGenerators, - scopedClusterClient, - logger, + + const transformGenerators = createTransformGenerators( spaceId, dataViewsService, sloContext.isServerless ); + const transformManager = new DefaultTransformManager( + transformGenerators, + scopedClusterClient, + logger + ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), scopedClusterClient, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/synthetics_availability.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/synthetics_availability.test.ts.snap index 3c71844678885..309fdc7ffffb3 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/synthetics_availability.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/synthetics_availability.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Synthetics Availability Transform Generator returns the expected transform params 1`] = ` +exports[`Synthetics Availability Transform Generator when serverless is disabled returns the expected transform params 1`] = ` Object { "_meta": Object { "managed": true, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/transform_generator.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/transform_generator.test.ts.snap index 144a4fa35eda5..7d8e989c1140d 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/transform_generator.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/__snapshots__/transform_generator.test.ts.snap @@ -1,8 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Transform Generator builds common runtime mappings and group by with single group by 1`] = `Object {}`; - -exports[`Transform Generator builds common runtime mappings and group by with single group by 2`] = ` +exports[`Transform Generator buildCommonGroupBy builds common groupBy with single group by 1`] = ` Object { "@timestamp": Object { "date_histogram": Object { @@ -18,9 +16,7 @@ Object { } `; -exports[`Transform Generator builds common runtime mappings and group by with single group by 3`] = `Object {}`; - -exports[`Transform Generator builds common runtime mappings and group by with single group by 4`] = ` +exports[`Transform Generator buildCommonGroupBy builds common groupBy with single group by 2`] = ` Object { "@timestamp": Object { "date_histogram": Object { @@ -36,9 +32,7 @@ Object { } `; -exports[`Transform Generator builds common runtime mappings without multi group by 1`] = `Object {}`; - -exports[`Transform Generator builds common runtime mappings without multi group by 2`] = ` +exports[`Transform Generator buildCommonGroupBy builds common groupBy with single group by 3`] = ` Object { "@timestamp": Object { "date_histogram": Object { @@ -59,9 +53,7 @@ Object { } `; -exports[`Transform Generator builds empty runtime mappings without group by 1`] = `Object {}`; - -exports[`Transform Generator builds empty runtime mappings without group by 2`] = ` +exports[`Transform Generator buildCommonGroupBy builds empty runtime mappings without group by 1`] = ` Object { "@timestamp": Object { "date_histogram": Object { diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts index b764b83ea9349..c928c121e3e77 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; import { ALL_VALUE } from '@kbn/slo-schema'; import { twoMinute } from '../fixtures/duration'; import { @@ -13,15 +14,14 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { ApmTransactionDurationTransformGenerator } from './apm_transaction_duration'; -import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new ApmTransactionDurationTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new ApmTransactionDurationTransformGenerator(SPACE_ID, dataViewsService); describe('APM Transaction Duration Transform Generator', () => { it('returns the expected transform params with every specified indicator params', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createAPMTransactionDurationIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -31,7 +31,7 @@ describe('APM Transaction Duration Transform Generator', () => { id: 'irrelevant', indicator: createAPMTransactionDurationIndicator(), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -46,7 +46,7 @@ describe('APM Transaction Duration Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -60,7 +60,7 @@ describe('APM Transaction Duration Transform Generator', () => { transactionType: ALL_VALUE, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); }); @@ -72,7 +72,7 @@ describe('APM Transaction Duration Transform Generator', () => { index, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.index).toEqual(index); }); @@ -84,7 +84,7 @@ describe('APM Transaction Duration Transform Generator', () => { filter, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); }); @@ -99,7 +99,7 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -115,7 +115,7 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -131,7 +131,7 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -147,7 +147,7 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -163,7 +163,7 @@ describe('APM Transaction Duration Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts index b349a5affeceb..d1f05605dab36 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts @@ -8,30 +8,29 @@ import { estypes } from '@elastic/elasticsearch'; import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; import { AggregationsAggregationContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { ALL_VALUE, apmTransactionDurationIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; -import { DataViewsService } from '@kbn/data-views-plugin/common'; -import { getElasticsearchQueryOrThrow, TransformGenerator } from '.'; +import { TransformGenerator, getElasticsearchQueryOrThrow } from '.'; import { + SLO_DESTINATION_INDEX_NAME, getSLOPipelineId, getSLOTransformId, - SLO_DESTINATION_INDEX_NAME, } from '../../../common/constants'; import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { APMTransactionDurationIndicator, SLODefinition } from '../../domain/models'; import { InvalidTransformError } from '../../errors'; -import { parseIndex } from './common'; -import { getTimesliceTargetComparator, getFilterRange } from './common'; +import { getFilterRange, getTimesliceTargetComparator, parseIndex } from './common'; export class ApmTransactionDurationTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!apmTransactionDurationIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -39,7 +38,7 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo, slo.indicator), @@ -75,11 +74,7 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator return this.buildCommonGroupBy(slo, '@timestamp', extraGroupByFields); } - private async buildSource( - slo: SLODefinition, - indicator: APMTransactionDurationIndicator, - dataViewService: DataViewsService - ) { + private async buildSource(slo: SLODefinition, indicator: APMTransactionDurationIndicator) { const queryFilter: estypes.QueryDslQueryContainer[] = [getFilterRange(slo, '@timestamp')]; if (indicator.params.service !== ALL_VALUE) { @@ -113,10 +108,7 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator }, }); } - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.dataViewId, - }); + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); if (!!indicator.params.filter) { queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter, dataView)); @@ -124,7 +116,7 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts index 13c73443960af..6b71e37ec4b93 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; import { ALL_VALUE } from '@kbn/slo-schema'; import { oneMinute, twoMinute } from '../fixtures/duration'; import { @@ -13,10 +14,9 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { ApmTransactionErrorRateTransformGenerator } from './apm_transaction_error_rate'; -import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new ApmTransactionErrorRateTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new ApmTransactionErrorRateTransformGenerator(SPACE_ID, dataViewsService); describe('APM Transaction Error Rate Transform Generator', () => { it('returns the expected transform params with every specified indicator params', async () => { @@ -24,7 +24,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { id: 'irrelevant', indicator: createAPMTransactionErrorRateIndicator(), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -34,7 +34,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { id: 'irrelevant', indicator: createAPMTransactionErrorRateIndicator(), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -49,7 +49,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform).toMatchSnapshot(); }); @@ -63,7 +63,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { transactionType: ALL_VALUE, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); }); @@ -75,7 +75,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { index, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.index).toEqual(index); }); @@ -87,7 +87,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { filter, }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); }); @@ -102,7 +102,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -118,7 +118,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -134,7 +134,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -150,7 +150,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); @@ -166,7 +166,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts index 3aa0d4507e8a4..6adbd1d3eae9f 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts @@ -13,11 +13,11 @@ import { apmTransactionErrorRateIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; -import { getElasticsearchQueryOrThrow, TransformGenerator } from '.'; +import { TransformGenerator, getElasticsearchQueryOrThrow } from '.'; import { + SLO_DESTINATION_INDEX_NAME, getSLOPipelineId, getSLOTransformId, - SLO_DESTINATION_INDEX_NAME, } from '../../../common/constants'; import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { APMTransactionErrorRateIndicator, SLODefinition } from '../../domain/models'; @@ -25,11 +25,11 @@ import { InvalidTransformError } from '../../errors'; import { getFilterRange, getTimesliceTargetComparator, parseIndex } from './common'; export class ApmTransactionErrorRateTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!apmTransactionErrorRateIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -37,7 +37,7 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo), @@ -73,11 +73,7 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato return this.buildCommonGroupBy(slo, '@timestamp', extraGroupByFields); } - private async buildSource( - slo: SLODefinition, - indicator: APMTransactionErrorRateIndicator, - dataViewService: DataViewsService - ) { + private async buildSource(slo: SLODefinition, indicator: APMTransactionErrorRateIndicator) { const queryFilter: estypes.QueryDslQueryContainer[] = [getFilterRange(slo, '@timestamp')]; if (indicator.params.service !== ALL_VALUE) { @@ -112,10 +108,7 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato }); } - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.dataViewId, - }); + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); if (indicator.params.filter) { queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter, dataView)); @@ -123,7 +116,7 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts index 2de75b8f7d86c..5410efb048dcd 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts @@ -14,8 +14,8 @@ import { import { HistogramTransformGenerator } from './histogram'; import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new HistogramTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new HistogramTransformGenerator(SPACE_ID, dataViewsService); describe('Histogram Transform Generator', () => { describe('validation', () => { @@ -32,9 +32,7 @@ describe('Histogram Transform Generator', () => { }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL: foo:/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL: foo:/); }); it('throws when the total filter is invalid', async () => { @@ -48,24 +46,20 @@ describe('Histogram Transform Generator', () => { }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL: foo:/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL: foo:/); }); it('throws when the query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ filter: '{ kql.query: invalid' }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createHistogramIndicator() }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -75,7 +69,7 @@ describe('Histogram Transform Generator', () => { id: 'irrelevant', indicator: createHistogramIndicator(), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -90,7 +84,7 @@ describe('Histogram Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -99,7 +93,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.query).toMatchSnapshot(); }); @@ -108,7 +102,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ index: 'my-own-index*' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.index).toBe('my-own-index*'); }); @@ -119,7 +113,7 @@ describe('Histogram Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -130,7 +124,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator(), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -147,7 +141,7 @@ describe('Histogram Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -156,7 +150,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator(), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -171,7 +165,7 @@ describe('Histogram Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -186,7 +180,7 @@ describe('Histogram Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts index b19f9a48e70f0..805e18c9c31db 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts @@ -6,18 +6,17 @@ */ import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { HistogramIndicator, histogramIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; - -import { DataViewsService } from '@kbn/data-views-plugin/common'; -import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; +import { TransformGenerator, getElasticsearchQueryOrThrow, parseIndex } from '.'; import { + SLO_DESTINATION_INDEX_NAME, getSLOPipelineId, getSLOTransformId, - SLO_DESTINATION_INDEX_NAME, } from '../../../common/constants'; import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { SLODefinition } from '../../domain/models'; @@ -26,11 +25,11 @@ import { GetHistogramIndicatorAggregation } from '../aggregations'; import { getFilterRange, getTimesliceTargetComparator } from './common'; export class HistogramTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!histogramIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -38,7 +37,7 @@ export class HistogramTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -51,19 +50,12 @@ export class HistogramTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private async buildSource( - slo: SLODefinition, - indicator: HistogramIndicator, - dataViewService: DataViewsService - ) { - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.index, - }); + private async buildSource(slo: SLODefinition, indicator: HistogramIndicator) { + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/index.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/index.ts index c58de27e9b98e..9b68c19692ee4 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/index.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/index.ts @@ -14,3 +14,4 @@ export * from './metric_custom'; export * from './histogram'; export * from './timeslice_metric'; export * from './common'; +export * from './transform_generators_factory'; diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts index c41e0d4b3df53..e25aefdb3be1a 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts @@ -14,8 +14,8 @@ import { import { KQLCustomTransformGenerator } from './kql_custom'; import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new KQLCustomTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new KQLCustomTransformGenerator(SPACE_ID, dataViewsService); describe('KQL Custom Transform Generator', () => { describe('validation', () => { @@ -23,31 +23,25 @@ describe('KQL Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ good: '{ kql.query: invalid' }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); it('throws when the KQL denominator is invalid', async () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ total: '{ kql.query: invalid' }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); it('throws when the KQL query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ filter: '{ kql.query: invalid' }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createKQLCustomIndicator() }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -57,7 +51,7 @@ describe('KQL Custom Transform Generator', () => { id: 'irrelevant', indicator: createKQLCustomIndicator(), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -72,7 +66,7 @@ describe('KQL Custom Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -81,7 +75,7 @@ describe('KQL Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.query).toMatchSnapshot(); }); @@ -90,7 +84,7 @@ describe('KQL Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ index: 'my-own-index*' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.index).toBe('my-own-index*'); }); @@ -101,7 +95,7 @@ describe('KQL Custom Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -114,7 +108,7 @@ describe('KQL Custom Transform Generator', () => { good: 'latency < 400 and (http.status_code: 2xx or http.status_code: 3xx or http.status_code: 4xx)', }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -125,7 +119,7 @@ describe('KQL Custom Transform Generator', () => { total: 'http.status_code: *', }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -140,7 +134,7 @@ describe('KQL Custom Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts index 0082e13968c80..61238c82ab600 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts @@ -6,14 +6,13 @@ */ import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; -import { kqlCustomIndicatorSchema, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; - import { DataViewsService } from '@kbn/data-views-plugin/common'; -import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; +import { kqlCustomIndicatorSchema, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; +import { TransformGenerator, getElasticsearchQueryOrThrow, parseIndex } from '.'; import { + SLO_DESTINATION_INDEX_NAME, getSLOPipelineId, getSLOTransformId, - SLO_DESTINATION_INDEX_NAME, } from '../../../common/constants'; import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { KQLCustomIndicator, SLODefinition } from '../../domain/models'; @@ -21,11 +20,11 @@ import { InvalidTransformError } from '../../errors'; import { getFilterRange, getTimesliceTargetComparator } from './common'; export class KQLCustomTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!kqlCustomIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -33,7 +32,7 @@ export class KQLCustomTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -46,18 +45,11 @@ export class KQLCustomTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private async buildSource( - slo: SLODefinition, - indicator: KQLCustomIndicator, - dataViewService: DataViewsService - ) { - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.dataViewId, - }); + private async buildSource(slo: SLODefinition, indicator: KQLCustomIndicator) { + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts index 85da6de832c98..b725d77af63dc 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts @@ -14,8 +14,8 @@ import { import { MetricCustomTransformGenerator } from './metric_custom'; import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new MetricCustomTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new MetricCustomTransformGenerator(SPACE_ID, dataViewsService); describe('Metric Custom Transform Generator', () => { describe('validation', () => { @@ -28,9 +28,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid equation/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid equation/); }); it('throws when the good filter is invalid', async () => { const anSLO = createSLO({ @@ -41,9 +39,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL: foo:/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL: foo:/); }); it('throws when the total equation is invalid', async () => { const anSLO = createSLO({ @@ -54,9 +50,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid equation/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid equation/); }); it('throws when the total filter is invalid', async () => { const anSLO = createSLO({ @@ -67,23 +61,19 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - await expect(() => - generator.getTransformParams(anSLO, spaceId, dataViewsService) - ).rejects.toThrow(/Invalid KQL: foo:/); + await expect(() => generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL: foo:/); }); it('throws when the query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ filter: '{ kql.query: invalid' }), }); - await expect(() => - generator.getTransformParams(anSLO, spaceId, dataViewsService) - ).rejects.toThrow(/Invalid KQL/); + await expect(() => generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createMetricCustomIndicator() }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -93,7 +83,7 @@ describe('Metric Custom Transform Generator', () => { id: 'irrelevant', indicator: createMetricCustomIndicator(), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -102,7 +92,7 @@ describe('Metric Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.query).toMatchSnapshot(); }); @@ -111,7 +101,7 @@ describe('Metric Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ index: 'my-own-index*' }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.index).toBe('my-own-index*'); }); @@ -122,7 +112,7 @@ describe('Metric Custom Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -138,7 +128,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -152,7 +142,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -168,7 +158,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -182,7 +172,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -196,7 +186,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -210,7 +200,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -224,7 +214,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -239,7 +229,7 @@ describe('Metric Custom Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts index e96f252d5ed84..f2259955bdfb0 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts @@ -24,11 +24,11 @@ import { getFilterRange, getTimesliceTargetComparator } from './common'; export const INVALID_EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g; export class MetricCustomTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!metricCustomIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -36,7 +36,7 @@ export class MetricCustomTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -49,18 +49,11 @@ export class MetricCustomTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private async buildSource( - slo: SLODefinition, - indicator: MetricCustomIndicator, - dataViewService: DataViewsService - ) { - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.dataViewId, - }); + private async buildSource(slo: SLODefinition, indicator: MetricCustomIndicator) { + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts index fa40ab9cc1e8d..cccb1c9eba3e3 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts @@ -12,286 +12,330 @@ import { twoMinute } from '../fixtures/duration'; import { createSLO, createSyntheticsAvailabilityIndicator } from '../fixtures/slo'; import { SyntheticsAvailabilityTransformGenerator } from './synthetics_availability'; -const generator = new SyntheticsAvailabilityTransformGenerator(); +const SPACE_ID = 'custom-space'; describe('Synthetics Availability Transform Generator', () => { - const spaceId = 'custom-space'; - - it('returns the expected transform params', async () => { - const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - - expect(transform).toMatchSnapshot(); - expect(transform.source.query?.bool?.filter).toContainEqual({ - term: { - 'summary.final_attempt': true, - }, - }); - }); - - it('groups by config id and observer.name when using default groupings', async () => { - const slo = createSLO({ - id: 'irrelevant', - indicator: createSyntheticsAvailabilityIndicator(), - }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - - expect(transform.pivot?.group_by).toEqual( - expect.objectContaining({ - 'monitor.config_id': { - terms: { - field: 'config_id', - }, - }, - 'observer.name': { - terms: { - field: 'observer.name', - }, - }, - }) + describe('when serverless is disabled', () => { + const generator = new SyntheticsAvailabilityTransformGenerator( + SPACE_ID, + dataViewsService, + false ); - }); - it('does not include config id and observer.name when using non default groupings', async () => { - const slo = createSLO({ - id: 'irrelevant', - indicator: createSyntheticsAvailabilityIndicator(), - groupBy: ['host.name'], - }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - - expect(transform.pivot?.group_by).not.toEqual( - expect.objectContaining({ - 'monitor.config_id': { - terms: { - field: 'config_id', - }, - }, - 'observer.name': { - terms: { - field: 'observer.name', - }, - }, - }) - ); + it('returns the expected transform params', async () => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + }); + const transform = await generator.getTransformParams(slo); - expect(transform.pivot?.group_by).toEqual( - expect.objectContaining({ - 'slo.groupings.host.name': { - terms: { - field: 'host.name', - }, + expect(transform).toMatchSnapshot(); + expect(transform.source.query?.bool?.filter).toContainEqual({ + term: { + 'summary.final_attempt': true, }, - }) - ); - }); + }); + }); - it.each([[[]], [[ALL_VALUE]]])( - 'adds observer.geo.name and monitor.name to groupings key by default, multi group by', - async (groupBy) => { + it('groups by config id and observer.name when using default groupings', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), - groupBy, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); + const transform = await generator.getTransformParams(slo); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ - 'slo.groupings.monitor.name': { + 'monitor.config_id': { terms: { - field: 'monitor.name', + field: 'config_id', }, }, - 'slo.groupings.observer.geo.name': { + 'observer.name': { terms: { - field: 'observer.geo.name', + field: 'observer.name', }, }, }) ); - } - ); + }); - it.each([[''], [ALL_VALUE]])( - 'adds observer.geo.name and monitor.name to groupings key by default, single group by', - async (groupBy) => { + it('does not include config id and observer.name when using non default groupings', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), - groupBy, + groupBy: ['host.name'], }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); + const transform = await generator.getTransformParams(slo); - expect(transform.pivot?.group_by).toEqual( + expect(transform.pivot?.group_by).not.toEqual( expect.objectContaining({ - 'slo.groupings.monitor.name': { + 'monitor.config_id': { terms: { - field: 'monitor.name', + field: 'config_id', }, }, - 'slo.groupings.observer.geo.name': { + 'observer.name': { terms: { - field: 'observer.geo.name', + field: 'observer.name', }, }, }) ); - } - ); - - it.each([['host.name'], [['host.name']]])('handles custom groupBy', async (groupBy) => { - const slo = createSLO({ - id: 'irrelevant', - indicator: createSyntheticsAvailabilityIndicator(), - groupBy, - }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - expect(transform.pivot?.group_by).toEqual( - expect.objectContaining({ - 'slo.groupings.host.name': { - terms: { - field: 'host.name', + expect(transform.pivot?.group_by).toEqual( + expect.objectContaining({ + 'slo.groupings.host.name': { + terms: { + field: 'host.name', + }, }, - }, - }) + }) + ); + }); + + it.each([[[]], [[ALL_VALUE]]])( + 'adds observer.geo.name and monitor.name to groupings key by default, multi group by', + async (groupBy) => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + groupBy, + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.pivot?.group_by).toEqual( + expect.objectContaining({ + 'slo.groupings.monitor.name': { + terms: { + field: 'monitor.name', + }, + }, + 'slo.groupings.observer.geo.name': { + terms: { + field: 'observer.geo.name', + }, + }, + }) + ); + } ); - }); - it('filters by summary.final_attempt', async () => { - const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); + it.each([[''], [ALL_VALUE]])( + 'adds observer.geo.name and monitor.name to groupings key by default, single group by', + async (groupBy) => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + groupBy, + }); + const transform = await generator.getTransformParams(slo); - expect(transform.source.query?.bool?.filter).toContainEqual({ - term: { - 'summary.final_attempt': true, - }, - }); - }); + expect(transform.pivot?.group_by).toEqual( + expect.objectContaining({ + 'slo.groupings.monitor.name': { + terms: { + field: 'monitor.name', + }, + }, + 'slo.groupings.observer.geo.name': { + terms: { + field: 'observer.geo.name', + }, + }, + }) + ); + } + ); + + it.each([[['host.name']], [['host.name', 'host.region']]])( + 'handles custom groupBy', + async (groupBy) => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + groupBy, + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.pivot?.group_by).toEqual( + expect.objectContaining({ + 'slo.groupings.host.name': { + terms: { + field: 'host.name', + }, + }, + }) + ); + } + ); - it('adds tag filters', async () => { - const tags = [ - { value: 'tag-1', label: 'tag1' }, - { value: 'tag-2', label: 'tag2' }, - ]; - const indicator = createSyntheticsAvailabilityIndicator(); - const slo = createSLO({ - id: 'irrelevant', - indicator: { - ...indicator, - params: { - ...indicator.params, - tags, + it('filters by summary.final_attempt', async () => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.source.query?.bool?.filter).toContainEqual({ + term: { + 'summary.final_attempt': true, }, - } as SLODefinition['indicator'], + }); }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - expect(transform.source.query?.bool?.filter).toContainEqual({ - terms: { - tags: ['tag-1', 'tag-2'], - }, - }); - expect(transform.pivot?.group_by?.tags).toEqual({ - terms: { - field: 'tags', - }, - }); - }); + it('adds tag filters', async () => { + const tags = [ + { value: 'tag-1', label: 'tag1' }, + { value: 'tag-2', label: 'tag2' }, + ]; + const indicator = createSyntheticsAvailabilityIndicator(); + const slo = createSLO({ + id: 'irrelevant', + indicator: { + ...indicator, + params: { + ...indicator.params, + tags, + }, + } as SLODefinition['indicator'], + }); + const transform = await generator.getTransformParams(slo); - it('adds monitorId filter', async () => { - const monitorIds = [ - { value: 'id-1', label: 'Monitor name 1' }, - { value: 'id-2', label: 'Monitor name 2' }, - ]; - const indicator = createSyntheticsAvailabilityIndicator(); - const slo = createSLO({ - id: 'irrelevant', - indicator: { - ...indicator, - params: { - ...indicator.params, - monitorIds, + expect(transform.source.query?.bool?.filter).toContainEqual({ + terms: { + tags: ['tag-1', 'tag-2'], }, - } as SLODefinition['indicator'], + }); + expect(transform.pivot?.group_by?.tags).toEqual({ + terms: { + field: 'tags', + }, + }); }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - expect(transform.source.query?.bool?.filter).toContainEqual({ - terms: { - 'monitor.id': ['id-1', 'id-2'], - }, - }); - expect(transform.pivot?.group_by?.['monitor.id']).toEqual({ - terms: { - field: 'monitor.id', - }, - }); - }); + it('adds monitorId filter', async () => { + const monitorIds = [ + { value: 'id-1', label: 'Monitor name 1' }, + { value: 'id-2', label: 'Monitor name 2' }, + ]; + const indicator = createSyntheticsAvailabilityIndicator(); + const slo = createSLO({ + id: 'irrelevant', + indicator: { + ...indicator, + params: { + ...indicator.params, + monitorIds, + }, + } as SLODefinition['indicator'], + }); + const transform = await generator.getTransformParams(slo); - it('adds project id filter', async () => { - const projects = [ - { value: 'id-1', label: 'Project name 1' }, - { value: 'id-2', label: 'Project name 2' }, - ]; - const indicator = createSyntheticsAvailabilityIndicator(); - const slo = createSLO({ - id: 'irrelevant', - indicator: { - ...indicator, - params: { - ...indicator.params, - projects, + expect(transform.source.query?.bool?.filter).toContainEqual({ + terms: { + 'monitor.id': ['id-1', 'id-2'], + }, + }); + expect(transform.pivot?.group_by?.['monitor.id']).toEqual({ + terms: { + field: 'monitor.id', }, - } as SLODefinition['indicator'], + }); }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); - expect(transform.source.query?.bool?.filter).toContainEqual({ - terms: { - 'monitor.project.id': ['id-1', 'id-2'], - }, + it('adds project id filter', async () => { + const projects = [ + { value: 'id-1', label: 'Project name 1' }, + { value: 'id-2', label: 'Project name 2' }, + ]; + const indicator = createSyntheticsAvailabilityIndicator(); + const slo = createSLO({ + id: 'irrelevant', + indicator: { + ...indicator, + params: { + ...indicator.params, + projects, + }, + } as SLODefinition['indicator'], + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.source.query?.bool?.filter).toContainEqual({ + terms: { + 'monitor.project.id': ['id-1', 'id-2'], + }, + }); + expect(transform.pivot?.group_by?.['monitor.project.id']).toEqual({ + terms: { + field: 'monitor.project.id', + }, + }); }); - expect(transform.pivot?.group_by?.['monitor.project.id']).toEqual({ - terms: { - field: 'monitor.project.id', - }, + + it('filters by space', async () => { + const slo = createSLO({ + id: 'irrelevant', + indicator: createSyntheticsAvailabilityIndicator(), + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.source.query?.bool?.filter).toContainEqual({ + term: { + 'meta.space_id': SPACE_ID, + }, + }); }); - }); - it('filters by space', async () => { - const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService, false); + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { + const slo = createSLO({ + indicator: createSyntheticsAvailabilityIndicator(), + settings: { + frequency: twoMinute(), + syncDelay: twoMinute(), + preventInitialBackfill: true, + }, + }); + + const transform = await generator.getTransformParams(slo); + + // @ts-ignore + const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); - expect(transform.source.query?.bool?.filter).toContainEqual({ - term: { - 'meta.space_id': spaceId, - }, + expect(rangeFilter).toEqual({ + range: { + '@timestamp': { + gte: 'now-300s/m', // 2m + 2m + 60s + }, + }, + }); }); - }); - it("overrides the range filter when 'preventInitialBackfill' is true", async () => { - const slo = createSLO({ - indicator: createSyntheticsAvailabilityIndicator(), - settings: { - frequency: twoMinute(), - syncDelay: twoMinute(), - preventInitialBackfill: true, - }, + it("uses the 'event.ingested' as syncField", async () => { + const slo = createSLO({ + indicator: createSyntheticsAvailabilityIndicator(), + }); + const transform = await generator.getTransformParams(slo); + + expect(transform.sync?.time?.field).toEqual('event.ingested'); }); + }); - const transform = await generator.getTransformParams(slo, 'default', dataViewsService, false); + describe('when serverless is enabled', () => { + const generator = new SyntheticsAvailabilityTransformGenerator( + SPACE_ID, + dataViewsService, + true + ); - // @ts-ignore - const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); + it("overrides the syncField with '@timestamp'", async () => { + const slo = createSLO({ + indicator: createSyntheticsAvailabilityIndicator(), + }); + const transform = await generator.getTransformParams(slo); - expect(rangeFilter).toEqual({ - range: { - '@timestamp': { - gte: 'now-300s/m', // 2m + 2m + 60s - }, - }, + expect(transform.sync?.time?.field).toEqual('@timestamp'); }); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts index 285820f908182..65fda9c3fc222 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts @@ -28,12 +28,11 @@ import { InvalidTransformError } from '../../errors'; import { getFilterRange } from './common'; export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService, - isServerless: boolean - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService, isServerless: boolean) { + super(spaceId, dataViewService, isServerless); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!syntheticsAvailabilityIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -41,11 +40,11 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, spaceId, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo), - this.buildSettings(slo, isServerless ? '@timestamp' : 'event.ingested'), + this.buildSettings(slo, this.isServerless ? '@timestamp' : 'event.ingested'), slo ); } @@ -108,15 +107,10 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator ); } - private async buildSource( - slo: SLODefinition, - indicator: SyntheticsAvailabilityIndicator, - spaceId: string, - dataViewService: DataViewsService - ) { + private async buildSource(slo: SLODefinition, indicator: SyntheticsAvailabilityIndicator) { const queryFilter: estypes.QueryDslQueryContainer[] = [ { term: { 'summary.final_attempt': true } }, - { term: { 'meta.space_id': spaceId } }, + { term: { 'meta.space_id': this.spaceId } }, getFilterRange(slo, '@timestamp'), ]; const { monitorIds, tags, projects } = buildParamValues({ @@ -153,14 +147,11 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter)); } - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.dataViewId, - }); + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); return { index: SYNTHETICS_INDEX_PATTERN, - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: queryFilter, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts index 02c69f38d6705..c8fd371479c29 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts @@ -5,18 +5,17 @@ * 2.0. */ +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; import { twoMinute } from '../fixtures/duration'; import { - createTimesliceMetricIndicator, - createSLOWithTimeslicesBudgetingMethod, createSLO, + createSLOWithTimeslicesBudgetingMethod, + createTimesliceMetricIndicator, } from '../fixtures/slo'; import { TimesliceMetricTransformGenerator } from './timeslice_metric'; -import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; - -const generator = new TimesliceMetricTransformGenerator(); -const spaceId = 'custom-space'; +const SPACE_ID = 'custom-space'; +const generator = new TimesliceMetricTransformGenerator(SPACE_ID, dataViewsService); const everythingIndicator = createTimesliceMetricIndicator( [ { name: 'A', aggregation: 'avg', field: 'test.field', filter: 'test.category: "test"' }, @@ -38,7 +37,7 @@ describe('Timeslice Metric Transform Generator', () => { '(A / 200) + A' ), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + await expect(generator.getTransformParams(anSLO)).rejects.toThrow( 'The sli.metric.timeslice indicator MUST have a timeslice budgeting method.' ); }); @@ -49,9 +48,7 @@ describe('Timeslice Metric Transform Generator', () => { '(a / 200) + A' ), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid equation/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid equation/); }); it('throws when the metric filter is invalid', async () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ @@ -60,9 +57,7 @@ describe('Timeslice Metric Transform Generator', () => { '(A / 200) + A' ), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL: test:/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL: test:/); }); it('throws when the query_filter is invalid', async () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ @@ -72,9 +67,7 @@ describe('Timeslice Metric Transform Generator', () => { 'test:' ), }); - await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( - /Invalid KQL/ - ); + await expect(generator.getTransformParams(anSLO)).rejects.toThrow(/Invalid KQL/); }); }); @@ -83,7 +76,7 @@ describe('Timeslice Metric Transform Generator', () => { id: 'irrelevant', indicator: everythingIndicator, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -93,7 +86,7 @@ describe('Timeslice Metric Transform Generator', () => { id: 'irrelevant', indicator: everythingIndicator, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform).toMatchSnapshot(); }); @@ -102,7 +95,7 @@ describe('Timeslice Metric Transform Generator', () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: everythingIndicator, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.query).toMatchSnapshot(); }); @@ -114,7 +107,7 @@ describe('Timeslice Metric Transform Generator', () => { params: { ...everythingIndicator.params, index: 'my-own-index*' }, }, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.source.index).toBe('my-own-index*'); }); @@ -126,7 +119,7 @@ describe('Timeslice Metric Transform Generator', () => { params: { ...everythingIndicator.params, timestampField: 'my-date-field' }, }, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -137,7 +130,7 @@ describe('Timeslice Metric Transform Generator', () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: everythingIndicator, }); - const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); + const transform = await generator.getTransformParams(anSLO); expect(transform.pivot!.aggregations!._metric).toEqual({ bucket_script: { @@ -185,7 +178,7 @@ describe('Timeslice Metric Transform Generator', () => { }, }); - const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); + const transform = await generator.getTransformParams(slo); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts index b0e32f7094a2f..e2f305e68fee8 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts @@ -28,11 +28,11 @@ import { getFilterRange } from './common'; const INVALID_EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g; export class TimesliceMetricTransformGenerator extends TransformGenerator { - public async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + public async getTransformParams(slo: SLODefinition): Promise { if (!timesliceMetricIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -40,7 +40,7 @@ export class TimesliceMetricTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - await this.buildSource(slo, slo.indicator, dataViewService), + await this.buildSource(slo, slo.indicator), this.buildDestination(slo), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -53,18 +53,12 @@ export class TimesliceMetricTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private async buildSource( - slo: SLODefinition, - indicator: TimesliceMetricIndicator, - dataViewService: DataViewsService - ) { - const dataView = await this.getIndicatorDataView({ - dataViewService, - dataViewId: indicator.params.index, - }); + private async buildSource(slo: SLODefinition, indicator: TimesliceMetricIndicator) { + const dataView = await this.getIndicatorDataView(indicator.params.dataViewId); + return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), + runtime_mappings: this.buildCommonRuntimeMappings(dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.test.ts index 9f07c6cfb5afa..e70d406d75396 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.test.ts @@ -7,50 +7,42 @@ import { createAPMTransactionErrorRateIndicator, createSLO } from '../fixtures/slo'; import { ApmTransactionErrorRateTransformGenerator } from './apm_transaction_error_rate'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; -const generator = new ApmTransactionErrorRateTransformGenerator(); +const generator = new ApmTransactionErrorRateTransformGenerator('my-space-id', dataViewsService); describe('Transform Generator', () => { - it('builds empty runtime mappings without group by', async () => { - const slo = createSLO({ - id: 'irrelevant', - indicator: createAPMTransactionErrorRateIndicator(), - }); - const commonRuntime = generator.buildCommonRuntimeMappings(slo); - expect(commonRuntime).toMatchSnapshot(); - - const commonGroupBy = generator.buildCommonGroupBy(slo); - expect(commonGroupBy).toMatchSnapshot(); - }); - - it.each(['example', ['example']])( - 'builds common runtime mappings and group by with single group by', - async (groupBy) => { - const indicator = createAPMTransactionErrorRateIndicator(); + describe('buildCommonGroupBy', () => { + it('builds empty runtime mappings without group by', async () => { const slo = createSLO({ id: 'irrelevant', - groupBy, - indicator, + indicator: createAPMTransactionErrorRateIndicator(), }); - const commonRuntime = generator.buildCommonRuntimeMappings(slo); - expect(commonRuntime).toMatchSnapshot(); const commonGroupBy = generator.buildCommonGroupBy(slo); expect(commonGroupBy).toMatchSnapshot(); - } - ); - - it('builds common runtime mappings without multi group by', async () => { - const indicator = createAPMTransactionErrorRateIndicator(); - const slo = createSLO({ - id: 'irrelevant', - groupBy: ['example1', 'example2'], - indicator, }); - const commonRuntime = generator.buildCommonRuntimeMappings(slo); - expect(commonRuntime).toMatchSnapshot(); - const commonGroupBy = generator.buildCommonGroupBy(slo); - expect(commonGroupBy).toMatchSnapshot(); + it.each(['example', ['example'], ['example1', 'example2']])( + 'builds common groupBy with single group by', + async (groupBy) => { + const indicator = createAPMTransactionErrorRateIndicator(); + const slo = createSLO({ + id: 'irrelevant', + groupBy, + indicator, + }); + + const commonGroupBy = generator.buildCommonGroupBy(slo); + expect(commonGroupBy).toMatchSnapshot(); + } + ); + }); + + describe('buildCommonRuntimeMappings', () => { + it('builds empty runtime mappings without data view', async () => { + const runtimeMappings = generator.buildCommonRuntimeMappings(); + expect(runtimeMappings).toEqual({}); + }); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts index 25b0dc161661c..6c44471fd6566 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts @@ -9,23 +9,22 @@ import { MappingRuntimeFields, TransformPutTransformRequest, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ALL_VALUE, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; import { DataView, DataViewsService } from '@kbn/data-views-plugin/common'; +import { ALL_VALUE, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; import { TransformSettings } from '../../assets/transform_templates/slo_transform_template'; import { SLODefinition } from '../../domain/models'; export abstract class TransformGenerator { - public abstract getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService, - isServerless: boolean - ): Promise; + constructor( + protected spaceId: string, + protected dataViewService: DataViewsService, + protected isServerless: boolean = false + ) {} - public buildCommonRuntimeMappings(slo: SLODefinition, dataView?: DataView): MappingRuntimeFields { - return { - ...(dataView?.getRuntimeMappings?.() ?? {}), - }; + public abstract getTransformParams(slo: SLODefinition): Promise; + + public buildCommonRuntimeMappings(dataView?: DataView): MappingRuntimeFields { + return dataView?.getRuntimeMappings?.() ?? {}; } public buildDescription(slo: SLODefinition): string { @@ -71,17 +70,11 @@ export abstract class TransformGenerator { }; } - public async getIndicatorDataView({ - dataViewService, - dataViewId, - }: { - dataViewService: DataViewsService; - dataViewId?: string; - }): Promise { + public async getIndicatorDataView(dataViewId?: string): Promise { let dataView: DataView | undefined; if (dataViewId) { try { - dataView = await dataViewService.get(dataViewId); + dataView = await this.dataViewService.get(dataViewId); } catch (e) { // If the data view is not found, we will continue without it } diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generators_factory.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generators_factory.ts new file mode 100644 index 0000000000000..1da2ce1eca4e5 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generators_factory.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataViewsService } from '@kbn/data-views-plugin/server'; +import { + ApmTransactionDurationTransformGenerator, + ApmTransactionErrorRateTransformGenerator, + HistogramTransformGenerator, + KQLCustomTransformGenerator, + MetricCustomTransformGenerator, + SyntheticsAvailabilityTransformGenerator, + TimesliceMetricTransformGenerator, + TransformGenerator, +} from '.'; +import { IndicatorTypes } from '../../domain/models'; + +export function createTransformGenerators( + spaceId: string, + dataViewsService: DataViewsService, + isServerless: boolean +): Record { + return { + 'sli.apm.transactionDuration': new ApmTransactionDurationTransformGenerator( + spaceId, + dataViewsService + ), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), + 'sli.synthetics.availability': new SyntheticsAvailabilityTransformGenerator( + spaceId, + dataViewsService, + isServerless + ), + 'sli.kql.custom': new KQLCustomTransformGenerator(spaceId, dataViewsService), + 'sli.metric.custom': new MetricCustomTransformGenerator(spaceId, dataViewsService), + 'sli.histogram.custom': new HistogramTransformGenerator(spaceId, dataViewsService), + 'sli.metric.timeslice': new TimesliceMetricTransformGenerator(spaceId, dataViewsService), + }; +} diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts index e837db4e88dc2..aa0884860e8e0 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts @@ -44,15 +44,12 @@ describe('TransformManager', () => { it('throws when no generator exists for the slo indicator type', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionDuration': new DummyTransformGenerator(), + 'sli.apm.transactionDuration': new DummyTransformGenerator(spaceId, dataViewsService), }; const service = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await expect( @@ -63,15 +60,12 @@ describe('TransformManager', () => { it('throws when transform generator fails', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionDuration': new FailTransformGenerator(), + 'sli.apm.transactionDuration': new FailTransformGenerator(spaceId, dataViewsService), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await expect( @@ -85,15 +79,15 @@ describe('TransformManager', () => { it('installs the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -110,15 +104,15 @@ describe('TransformManager', () => { it('previews the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await transformManager.preview('slo-transform-id'); @@ -133,15 +127,15 @@ describe('TransformManager', () => { it('starts the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await transformManager.start('slo-transform-id'); @@ -156,15 +150,15 @@ describe('TransformManager', () => { it('stops the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await transformManager.stop('slo-transform-id'); @@ -179,15 +173,15 @@ describe('TransformManager', () => { it('uninstalls the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await transformManager.uninstall('slo-transform-id'); @@ -203,15 +197,15 @@ describe('TransformManager', () => { ); // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transactionErrorRate': new ApmTransactionErrorRateTransformGenerator( + spaceId, + dataViewsService + ), }; const transformManager = new DefaultTransformManager( generators, scopedClusterClientMock, - loggerMock, - spaceId, - dataViewsService, - false + loggerMock ); await transformManager.uninstall('slo-transform-id'); @@ -224,21 +218,20 @@ describe('TransformManager', () => { }); class DummyTransformGenerator extends TransformGenerator { - async getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + async getTransformParams(slo: SLODefinition): Promise { return {} as TransformPutTransformRequest; } } class FailTransformGenerator extends TransformGenerator { - getTransformParams( - slo: SLODefinition, - spaceId: string, - dataViewService: DataViewsService - ): Promise { + constructor(spaceId: string, dataViewService: DataViewsService) { + super(spaceId, dataViewService); + } + + getTransformParams(slo: SLODefinition): Promise { throw new Error('Some error'); } } diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts index aed9931822bdc..464d1f1aeaa59 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts @@ -5,11 +5,9 @@ * 2.0. */ -import { IScopedClusterClient, Logger } from '@kbn/core/server'; - import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { DataViewsService } from '@kbn/data-views-plugin/server'; -import { SLODefinition, IndicatorTypes } from '../domain/models'; +import { IScopedClusterClient, Logger } from '@kbn/core/server'; +import { IndicatorTypes, SLODefinition } from '../domain/models'; import { SecurityException } from '../errors'; import { retryTransientEsErrors } from '../utils/retry'; import { TransformGenerator } from './transform_generators'; @@ -29,10 +27,7 @@ export class DefaultTransformManager implements TransformManager { constructor( private generators: Record, private scopedClusterClient: IScopedClusterClient, - private logger: Logger, - private spaceId: string, - private dataViewService: DataViewsService, - private isServerless: boolean + private logger: Logger ) {} async install(slo: SLODefinition): Promise { @@ -42,12 +37,7 @@ export class DefaultTransformManager implements TransformManager { throw new Error(`Unsupported indicator type [${slo.indicator.type}]`); } - const transformParams = await generator.getTransformParams( - slo, - this.spaceId, - this.dataViewService, - this.isServerless - ); + const transformParams = await generator.getTransformParams(slo); try { await retryTransientEsErrors( () => this.scopedClusterClient.asSecondaryAuthUser.transform.putTransform(transformParams), @@ -74,12 +64,7 @@ export class DefaultTransformManager implements TransformManager { throw new Error(`Unsupported indicator type [${slo.indicator.type}]`); } - return await generator.getTransformParams( - slo, - this.spaceId, - this.dataViewService, - this.isServerless - ); + return await generator.getTransformParams(slo); } async preview(transformId: string): Promise { diff --git a/x-pack/plugins/observability_solution/slo/tsconfig.json b/x-pack/plugins/observability_solution/slo/tsconfig.json index be74e370a1fc1..02a2ea06cc527 100644 --- a/x-pack/plugins/observability_solution/slo/tsconfig.json +++ b/x-pack/plugins/observability_solution/slo/tsconfig.json @@ -24,7 +24,6 @@ "@kbn/observability-plugin", "@kbn/observability-shared-plugin", "@kbn/kibana-react-plugin", - "@kbn/react-kibana-context-theme", "@kbn/shared-ux-link-redirect-app", "@kbn/kibana-utils-plugin", "@kbn/slo-schema", diff --git a/x-pack/plugins/observability_solution/synthetics/server/feature.ts b/x-pack/plugins/observability_solution/synthetics/server/feature.ts index bf86ac7b0c890..5a4c4d508853b 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/feature.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/feature.ts @@ -106,6 +106,7 @@ export const syntheticsFeature = { syntheticsSettingsObjectType, syntheticsMonitorType, syntheticsApiKeyObjectType, + privateLocationSavedObjectName, legacyPrivateLocationsSavedObjectName, // uptime settings object is also registered here since feature is shared between synthetics and uptime uptimeSettingsObjectType, diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/run_once_monitor.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/run_once_monitor.ts index 6f7b3427f96f0..2af3a10f39750 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/run_once_monitor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/run_once_monitor.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import { isEmpty } from 'lodash'; import { PrivateLocationAttributes } from '../../runtime_types/private_locations'; import { getPrivateLocationsForMonitor } from '../monitor_cruds/add_monitor/utils'; import { SyntheticsRestApiRouteFactory } from '../types'; @@ -31,6 +32,9 @@ export const runOnceSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = }): Promise => { const monitor = request.body as MonitorFields; const { monitorId } = request.params; + if (isEmpty(monitor)) { + return response.badRequest({ body: { message: 'Monitor data is empty.' } }); + } const validationResult = validateMonitor(monitor); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/test_now_monitor.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/test_now_monitor.ts index 3f878b10ac8f8..d1a1513ae85c8 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/test_now_monitor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/test_now_monitor.ts @@ -6,6 +6,8 @@ */ import { schema } from '@kbn/config-schema'; import { v4 as uuidv4 } from 'uuid'; +import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { IKibanaResponse } from '@kbn/core-http-server'; import { getDecryptedMonitor } from '../../saved_objects/synthetics_monitor'; import { PrivateLocationAttributes } from '../../runtime_types/private_locations'; import { RouteContext, SyntheticsRestApiRouteFactory } from '../types'; @@ -14,6 +16,7 @@ import { ConfigKey, MonitorFields } from '../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../common/constants'; import { normalizeSecrets } from '../../synthetics_service/utils/secrets'; import { getPrivateLocationsForMonitor } from '../monitor_cruds/add_monitor/utils'; +import { getMonitorNotFoundResponse } from './service_errors'; export const testNowMonitorRoute: SyntheticsRestApiRouteFactory = () => ({ method: 'POST', @@ -33,48 +36,56 @@ export const testNowMonitorRoute: SyntheticsRestApiRouteFactory export const triggerTestNow = async ( monitorId: string, routeContext: RouteContext -): Promise => { - const { server, spaceId, syntheticsMonitorClient, savedObjectsClient } = routeContext; +): Promise> => { + const { server, spaceId, syntheticsMonitorClient, savedObjectsClient, response } = routeContext; - const monitorWithSecrets = await getDecryptedMonitor(server, monitorId, spaceId); - const normalizedMonitor = normalizeSecrets(monitorWithSecrets); + try { + const monitorWithSecrets = await getDecryptedMonitor(server, monitorId, spaceId); + const normalizedMonitor = normalizeSecrets(monitorWithSecrets); - const { [ConfigKey.SCHEDULE]: schedule, [ConfigKey.LOCATIONS]: locations } = - monitorWithSecrets.attributes; + const { [ConfigKey.SCHEDULE]: schedule, [ConfigKey.LOCATIONS]: locations } = + monitorWithSecrets.attributes; - const privateLocations: PrivateLocationAttributes[] = await getPrivateLocationsForMonitor( - savedObjectsClient, - normalizedMonitor.attributes - ); - const testRunId = uuidv4(); + const privateLocations: PrivateLocationAttributes[] = await getPrivateLocationsForMonitor( + savedObjectsClient, + normalizedMonitor.attributes + ); + const testRunId = uuidv4(); - const [, errors] = await syntheticsMonitorClient.testNowConfigs( - { - monitor: normalizedMonitor.attributes as MonitorFields, - id: monitorId, - testRunId, - }, - savedObjectsClient, - privateLocations, - spaceId - ); + const [, errors] = await syntheticsMonitorClient.testNowConfigs( + { + monitor: normalizedMonitor.attributes as MonitorFields, + id: monitorId, + testRunId, + }, + savedObjectsClient, + privateLocations, + spaceId + ); + + if (errors && errors?.length > 0) { + return { + errors, + testRunId, + schedule, + locations, + configId: monitorId, + monitor: normalizedMonitor.attributes, + }; + } - if (errors && errors?.length > 0) { return { - errors, testRunId, schedule, locations, configId: monitorId, monitor: normalizedMonitor.attributes, }; - } + } catch (getErr) { + if (SavedObjectsErrorHelpers.isNotFoundError(getErr)) { + return getMonitorNotFoundResponse(response, monitorId); + } - return { - testRunId, - schedule, - locations, - configId: monitorId, - monitor: normalizedMonitor.attributes, - }; + throw getErr; + } }; diff --git a/x-pack/plugins/observability_solution/synthetics/server/server.ts b/x-pack/plugins/observability_solution/synthetics/server/server.ts index 77937c57590e7..9ba4341ecad30 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/server.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/server.ts @@ -21,7 +21,7 @@ export const initSyntheticsServer = ( ) => { const { router } = server; syntheticsAppRestApiRoutes.forEach((route) => { - const { method, options, handler, validate, path } = syntheticsRouteWrapper( + const { method, options, handler, validate, path, security } = syntheticsRouteWrapper( createSyntheticsRouteWithAuth(route), server, syntheticsMonitorClient @@ -30,6 +30,7 @@ export const initSyntheticsServer = ( const routeDefinition = { path, validate, + security, options, }; @@ -52,11 +53,8 @@ export const initSyntheticsServer = ( }); syntheticsAppPublicRestApiRoutes.forEach((route) => { - const { method, options, handler, validate, path, validation } = syntheticsRouteWrapper( - createSyntheticsRouteWithAuth(route), - server, - syntheticsMonitorClient - ); + const { method, options, handler, validate, path, validation, security } = + syntheticsRouteWrapper(createSyntheticsRouteWithAuth(route), server, syntheticsMonitorClient); const routeDefinition = { path, @@ -70,13 +68,11 @@ export const initSyntheticsServer = ( .get({ access: 'public', path: routeDefinition.path, - options: { - tags: options?.tags, - }, }) .addVersion( { version: '2023-10-31', + security, validate: validation ?? false, }, handler @@ -87,13 +83,11 @@ export const initSyntheticsServer = ( .put({ access: 'public', path: routeDefinition.path, - options: { - tags: options?.tags, - }, }) .addVersion( { version: '2023-10-31', + security, validate: validation ?? false, }, handler @@ -104,13 +98,11 @@ export const initSyntheticsServer = ( .post({ access: 'public', path: routeDefinition.path, - options: { - tags: options?.tags, - }, }) .addVersion( { version: '2023-10-31', + security, validate: validation ?? false, }, handler @@ -128,6 +120,7 @@ export const initSyntheticsServer = ( .addVersion( { version: '2023-10-31', + security, validate: validation ?? false, }, handler 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 a0785b4486912..697cf93d74213 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 @@ -4,9 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { KibanaResponse } from '@kbn/core-http-router-server-internal'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { isEmpty } from 'lodash'; +import { isKibanaResponse } from '@kbn/core-http-server'; import { isTestUser, SyntheticsEsClient } from './lib'; import { checkIndicesReadPrivileges } from './synthetics_service/authentication/check_has_privilege'; import { SYNTHETICS_INDEX_PATTERN } from '../common/constants'; @@ -20,9 +20,13 @@ export const syntheticsRouteWrapper: SyntheticsRouteWrapper = ( ) => ({ ...uptimeRoute, options: { - tags: ['access:uptime-read', ...(uptimeRoute?.writeAccess ? ['access:uptime-write'] : [])], ...(uptimeRoute.options ?? {}), }, + security: { + authz: { + requiredPrivileges: ['uptime-read', ...(uptimeRoute?.writeAccess ? ['uptime-write'] : [])], + }, + }, handler: async (context, request, response) => { const { elasticsearch, savedObjects, uiSettings } = await context.core; @@ -56,7 +60,7 @@ export const syntheticsRouteWrapper: SyntheticsRouteWrapper = ( spaceId, syntheticsMonitorClient, }); - if (res instanceof KibanaResponse) { + if (isKibanaResponse(res)) { return res; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/utils/fake_kibana_request.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/utils/fake_kibana_request.ts index d57fc23cd5c7c..a156b0473ad9c 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/utils/fake_kibana_request.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/utils/fake_kibana_request.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { FakeRawRequest, Headers } from '@kbn/core/server'; -import { CoreKibanaRequest } from '@kbn/core/server'; +import { type FakeRawRequest, type Headers } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; export function getFakeKibanaRequest(apiKey: { id: string; api_key: string }) { const requestHeaders: Headers = {}; @@ -20,5 +20,5 @@ export function getFakeKibanaRequest(apiKey: { id: string; api_key: string }) { path: '/', }; - return CoreKibanaRequest.from(fakeRawRequest); + return kibanaRequestFactory(fakeRawRequest); } diff --git a/x-pack/plugins/observability_solution/synthetics/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/tsconfig.json index 32d15f8080ffd..c82f6a5c3036a 100644 --- a/x-pack/plugins/observability_solution/synthetics/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/tsconfig.json @@ -45,7 +45,6 @@ "@kbn/core-http-browser", "@kbn/core-notifications-browser", "@kbn/rison", - "@kbn/core-http-router-server-internal", "@kbn/licensing-plugin", "@kbn/rule-registry-plugin", "@kbn/encrypted-saved-objects-plugin", @@ -106,7 +105,8 @@ "@kbn/alerting-types", "@kbn/core-chrome-browser", "@kbn/core-rendering-browser", - "@kbn/index-lifecycle-management-common-shared" + "@kbn/index-lifecycle-management-common-shared", + "@kbn/core-http-server-utils" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/routes/uptime_route_wrapper.ts b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/routes/uptime_route_wrapper.ts index 2590db8524105..a4ef42c07f02b 100644 --- a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/routes/uptime_route_wrapper.ts +++ b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/routes/uptime_route_wrapper.ts @@ -5,18 +5,19 @@ * 2.0. */ -import { KibanaResponse } from '@kbn/core-http-router-server-internal'; -import { UMKibanaRouteWrapper } from './types'; +import { isKibanaResponse } from '@kbn/core-http-server'; +import type { UMKibanaRouteWrapper } from './types'; import { UptimeEsClient } from '../lib/lib'; export const uptimeRouteWrapper: UMKibanaRouteWrapper = (uptimeRoute, server) => ({ ...uptimeRoute, options: { - tags: [ - 'oas-tag:uptime', - 'access:uptime-read', - ...(uptimeRoute?.writeAccess ? ['access:uptime-write'] : []), - ], + tags: ['oas-tag:uptime'], + }, + security: { + authz: { + requiredPrivileges: ['uptime-read', ...(uptimeRoute?.writeAccess ? ['uptime-write'] : [])], + }, }, handler: async (context, request, response) => { const coreContext = await context.core; @@ -41,7 +42,7 @@ export const uptimeRouteWrapper: UMKibanaRouteWrapper = (uptimeRoute, server) => server, }); - if (res instanceof KibanaResponse) { + if (isKibanaResponse(res)) { return res; } diff --git a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/uptime_server.ts b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/uptime_server.ts index b8a9b56c2a909..32feb62fcb0fd 100644 --- a/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/uptime_server.ts +++ b/x-pack/plugins/observability_solution/uptime/server/legacy_uptime/uptime_server.ts @@ -41,7 +41,7 @@ export const initUptimeServer = ( router: UptimeRouter ) => { legacyUptimeRestApiRoutes.forEach((route) => { - const { method, options, handler, validate, path } = uptimeRouteWrapper( + const { method, options, handler, validate, path, security } = uptimeRouteWrapper( createRouteWithAuth(libs, route), server ); @@ -50,6 +50,7 @@ export const initUptimeServer = ( path, validate, options, + security, }; switch (method) { @@ -71,26 +72,20 @@ export const initUptimeServer = ( }); legacyUptimePublicRestApiRoutes.forEach((route) => { - const { method, options, handler, path, ...rest } = uptimeRouteWrapper( + const { method, options, handler, path, security, ...rest } = uptimeRouteWrapper( createRouteWithAuth(libs, route), server ); const validate = rest.validate ? getRequestValidation(rest.validate) : rest.validate; - const routeDefinition = { - path, - validate, - options, - }; - switch (method) { case 'GET': router.versioned .get({ access: 'public', description: `Get uptime settings`, - path: routeDefinition.path, + path, options: { tags: options?.tags, }, @@ -98,6 +93,7 @@ export const initUptimeServer = ( .addVersion( { version: INITIAL_REST_VERSION, + security, validate: { request: { body: validate ? validate?.body : undefined, @@ -117,7 +113,7 @@ export const initUptimeServer = ( .put({ access: 'public', description: `Update uptime settings`, - path: routeDefinition.path, + path, options: { tags: options?.tags, }, @@ -125,6 +121,7 @@ export const initUptimeServer = ( .addVersion( { version: INITIAL_REST_VERSION, + security, validate: { request: { body: validate ? validate?.body : undefined, diff --git a/x-pack/plugins/observability_solution/uptime/tsconfig.json b/x-pack/plugins/observability_solution/uptime/tsconfig.json index 22b5e9afb7381..1d60bc456170e 100644 --- a/x-pack/plugins/observability_solution/uptime/tsconfig.json +++ b/x-pack/plugins/observability_solution/uptime/tsconfig.json @@ -68,7 +68,6 @@ "@kbn/safer-lodash-set", "@kbn/core-elasticsearch-client-server-mocks", "@kbn/core-http-server", - "@kbn/core-http-router-server-internal", "@kbn/actions-plugin", "@kbn/core-saved-objects-server", "@kbn/observability-ai-assistant-plugin", diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts index efb725bff3d5f..4d8a83d8d6b5f 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_response_actions_form.cy.ts @@ -24,227 +24,232 @@ import { import { clickRuleName, inputQuery, typeInECSFieldInput } from '../../tasks/live_query'; import { closeDateTabIfVisible, closeToastIfVisible } from '../../tasks/integrations'; -describe('Alert Event Details - Response Actions Form', { tags: ['@ess', '@serverless'] }, () => { - let multiQueryPackId: string; - let multiQueryPackName: string; - let ruleId: string; - let ruleName: string; - let packId: string; - let packName: string; - const packData = packFixture(); - const multiQueryPackData = multiQueryPackFixture(); - before(() => { - initializeDataViews(); - }); - beforeEach(() => { - loadPack(packData).then((data) => { - packId = data.saved_object_id; - packName = data.name; - }); - loadPack(multiQueryPackData).then((data) => { - multiQueryPackId = data.saved_object_id; - multiQueryPackName = data.name; - }); - loadRule().then((data) => { - ruleId = data.id; - ruleName = data.name; - }); - }); - afterEach(() => { - cleanupPack(packId); - cleanupPack(multiQueryPackId); - cleanupRule(ruleId); - }); - - it('adds response actions with osquery with proper validation and form values', () => { - cy.visit('/app/security/rules'); - clickRuleName(ruleName); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - closeDateTabIfVisible(); - cy.getBySel('edit-rule-actions-tab').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.contains('Response actions are run on each rule execution.'); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); - - cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { - cy.contains('Query is a required field'); - cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); - }); - - // check if changing error state of one input doesn't clear other errors - START - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('Advanced').click(); - cy.getBySel('timeout-input').clear(); - cy.contains('The timeout value must be 60 seconds or higher.'); - }); - - cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { - cy.contains('Query is a required field'); - cy.contains('The timeout value must be 60 seconds or higher.'); - }); - - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.getBySel('timeout-input').type('6'); - cy.contains('The timeout value must be 60 seconds or higher.'); - }); - cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { - cy.contains('Query is a required field'); - cy.contains('The timeout value must be 60 seconds or higher.'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.getBySel('timeout-input').type('6'); - cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); - }); - cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { - cy.contains('Query is a required field'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.getBySel('timeout-input').type('6'); - }); - cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { - cy.contains('Query is a required field'); - cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); - }); - // check if changing error state of one input doesn't clear other errors - END +// FLAKY: https://github.com/elastic/kibana/issues/169785 +describe.skip( + 'Alert Event Details - Response Actions Form', + { tags: ['@ess', '@serverless'] }, + () => { + let multiQueryPackId: string; + let multiQueryPackName: string; + let ruleId: string; + let ruleName: string; + let packId: string; + let packName: string; + const packData = packFixture(); + const multiQueryPackData = multiQueryPackFixture(); + before(() => { + initializeDataViews(); + }); + beforeEach(() => { + loadPack(packData).then((data) => { + packId = data.saved_object_id; + packName = data.name; + }); + loadPack(multiQueryPackData).then((data) => { + multiQueryPackId = data.saved_object_id; + multiQueryPackName = data.name; + }); + loadRule().then((data) => { + ruleId = data.id; + ruleName = data.name; + }); + }); + afterEach(() => { + cleanupPack(packId); + cleanupPack(multiQueryPackId); + cleanupRule(ruleId); + }); + + it('adds response actions with osquery with proper validation and form values', () => { + cy.visit('/app/security/rules'); + clickRuleName(ruleName); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + closeDateTabIfVisible(); + cy.getBySel('edit-rule-actions-tab').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.contains('Response actions are run on each rule execution.'); + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + + cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { + cy.contains('Query is a required field'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); + }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('Query is a required field'); - inputQuery('select * from uptime1'); - }); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('Run a set of queries in a pack').click(); - }); - cy.getBySel(RESPONSE_ACTIONS_ERRORS) - .within(() => { - cy.contains('Pack is a required field'); - }) - .should('exist'); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('Pack is a required field'); - cy.getBySel('comboBoxInput').click(); - cy.getBySel('comboBoxInput').type(`${packName}`); - cy.contains(`doesn't match any options`).should('not.exist'); - cy.getBySel('comboBoxInput').type('{downArrow}{enter}'); - }); + // check if changing error state of one input doesn't clear other errors - START + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('Advanced').click(); + cy.getBySel('timeout-input').clear(); + cy.contains('The timeout value must be 60 seconds or higher.'); + }); - cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { + cy.contains('Query is a required field'); + cy.contains('The timeout value must be 60 seconds or higher.'); + }); + + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.getBySel('timeout-input').type('6'); + cy.contains('The timeout value must be 60 seconds or higher.'); + }); + cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { + cy.contains('Query is a required field'); + cy.contains('The timeout value must be 60 seconds or higher.'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.getBySel('timeout-input').type('6'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); + }); + cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { + cy.contains('Query is a required field'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.getBySel('timeout-input').type('6'); + }); + cy.getBySel(RESPONSE_ACTIONS_ERRORS).within(() => { + cy.contains('Query is a required field'); + cy.contains('The timeout value must be 60 seconds or higher.').should('not.exist'); + }); + // check if changing error state of one input doesn't clear other errors - END - cy.getBySel(RESPONSE_ACTIONS_ITEM_2) - .within(() => { + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { cy.contains('Query is a required field'); - inputQuery('select * from uptime'); - cy.contains('Query is a required field').should('not.exist'); - cy.contains('Advanced').click(); - typeInECSFieldInput('label{downArrow}{enter}'); - cy.getBySel('osqueryColumnValueSelect').type('days{downArrow}{enter}'); - }) - .clickOutside(); - - cy.getBySel('ruleEditSubmitButton').click(); - cy.contains(`${ruleName} was saved`).should('exist'); - closeToastIfVisible(); - - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('edit-rule-actions-tab').click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('select * from uptime1'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { - cy.contains('select * from uptime'); - cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); - cy.contains('Days of uptime'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.getBySel('comboBoxSearchInput').should('have.value', packName); - cy.getBySel('comboBoxInput').type('{selectall}{backspace}{enter}'); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { - cy.contains('select * from uptime1'); - cy.getBySel('remove-response-action').click(); - }); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0) - .within(() => { - cy.getBySel('comboBoxSearchInput').click(); - cy.contains('Search for a pack to run'); + inputQuery('select * from uptime1'); + }); + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { + cy.contains('Run a set of queries in a pack').click(); + }); + cy.getBySel(RESPONSE_ACTIONS_ERRORS) + .within(() => { + cy.contains('Pack is a required field'); + }) + .should('exist'); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { cy.contains('Pack is a required field'); - cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); - cy.contains(packName); - }) - .clickOutside(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { - cy.contains('select * from uptime'); - cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); - cy.contains('Days of uptime'); - }); - - cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleSingleQuery'); - - cy.getBySel('ruleEditSubmitButton').click(); - cy.wait('@saveRuleSingleQuery', { timeout: 15000 }).should(({ request }) => { - const oneQuery = [ - { - interval: 3600, - query: 'select * from uptime;', - id: Object.keys(packData.queries)[0], - }, - ]; - expect(request.body.response_actions[0].params.queries).to.deep.equal(oneQuery); - }); - - cy.contains(`${ruleName} was saved`).should('exist'); - closeToastIfVisible(); - - cy.getBySel('globalLoadingIndicator').should('not.exist'); - cy.getBySel('editRuleSettingsLink').click(); - cy.getBySel('globalLoadingIndicator').should('not.exist'); - - cy.getBySel('edit-rule-actions-tab').click(); - cy.getBySel(RESPONSE_ACTIONS_ITEM_0) - .within(() => { + cy.getBySel('comboBoxInput').click(); + cy.getBySel('comboBoxInput').type(`${packName}`); + cy.contains(`doesn't match any options`).should('not.exist'); + cy.getBySel('comboBoxInput').type('{downArrow}{enter}'); + }); + + cy.getBySel(OSQUERY_RESPONSE_ACTION_ADD_BUTTON).click(); + + cy.getBySel(RESPONSE_ACTIONS_ITEM_2) + .within(() => { + cy.contains('Query is a required field'); + inputQuery('select * from uptime'); + cy.contains('Query is a required field').should('not.exist'); + cy.contains('Advanced').click(); + typeInECSFieldInput('label{downArrow}{enter}'); + cy.getBySel('osqueryColumnValueSelect').type('days{downArrow}{enter}'); + }) + .clickOutside(); + + cy.getBySel('ruleEditSubmitButton').click(); + cy.contains(`${ruleName} was saved`).should('exist'); + closeToastIfVisible(); + + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('edit-rule-actions-tab').click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('select * from uptime1'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_2).within(() => { + cy.contains('select * from uptime'); + cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); + cy.contains('Days of uptime'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { cy.getBySel('comboBoxSearchInput').should('have.value', packName); - cy.getBySel('comboBoxInput').type( - `{selectall}{backspace}${multiQueryPackName}{downArrow}{enter}` - ); - cy.contains('SELECT * FROM memory_info;'); - cy.contains('SELECT * FROM system_info;'); - }) - .clickOutside(); - - cy.getBySel(RESPONSE_ACTIONS_ITEM_1) - .within(() => { + cy.getBySel('comboBoxInput').type('{selectall}{backspace}{enter}'); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0).within(() => { + cy.contains('select * from uptime1'); + cy.getBySel('remove-response-action').click(); + }); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0) + .within(() => { + cy.getBySel('comboBoxSearchInput').click(); + cy.contains('Search for a pack to run'); + cy.contains('Pack is a required field'); + cy.getBySel('comboBoxInput').type(`${packName}{downArrow}{enter}`); + cy.contains(packName); + }) + .clickOutside(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_1).within(() => { cy.contains('select * from uptime'); cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); cy.contains('Days of uptime'); - }) - .clickOutside(); - cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleMultiQuery'); - - cy.contains('Save changes').click(); - cy.wait('@saveRuleMultiQuery', { timeout: 15000 }).should(({ request }) => { - const threeQueries = [ - { - interval: 3600, - query: 'SELECT * FROM memory_info;', - platform: 'linux', - id: Object.keys(multiQueryPackData.queries)[0], - }, - { - interval: 3600, - query: 'SELECT * FROM system_info;', - id: Object.keys(multiQueryPackData.queries)[1], - }, - { - interval: 10, - query: 'select opera_extensions.* from users join opera_extensions using (uid);', - id: Object.keys(multiQueryPackData.queries)[2], - }, - ]; - expect(request.body.response_actions[0].params.queries).to.deep.equal(threeQueries); - }); - }); -}); + }); + + cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleSingleQuery'); + + cy.getBySel('ruleEditSubmitButton').click(); + cy.wait('@saveRuleSingleQuery', { timeout: 15000 }).should(({ request }) => { + const oneQuery = [ + { + interval: 3600, + query: 'select * from uptime;', + id: Object.keys(packData.queries)[0], + }, + ]; + expect(request.body.response_actions[0].params.queries).to.deep.equal(oneQuery); + }); + + cy.contains(`${ruleName} was saved`).should('exist'); + closeToastIfVisible(); + + cy.getBySel('globalLoadingIndicator').should('not.exist'); + cy.getBySel('editRuleSettingsLink').click(); + cy.getBySel('globalLoadingIndicator').should('not.exist'); + + cy.getBySel('edit-rule-actions-tab').click(); + cy.getBySel(RESPONSE_ACTIONS_ITEM_0) + .within(() => { + cy.getBySel('comboBoxSearchInput').should('have.value', packName); + cy.getBySel('comboBoxInput').type( + `{selectall}{backspace}${multiQueryPackName}{downArrow}{enter}` + ); + cy.contains('SELECT * FROM memory_info;'); + cy.contains('SELECT * FROM system_info;'); + }) + .clickOutside(); + + cy.getBySel(RESPONSE_ACTIONS_ITEM_1) + .within(() => { + cy.contains('select * from uptime'); + cy.contains('Custom key/value pairs. e.g. {"application":"foo-bar","env":"production"}'); + cy.contains('Days of uptime'); + }) + .clickOutside(); + cy.intercept('PUT', '/api/detection_engine/rules').as('saveRuleMultiQuery'); + + cy.contains('Save changes').click(); + cy.wait('@saveRuleMultiQuery', { timeout: 15000 }).should(({ request }) => { + const threeQueries = [ + { + interval: 3600, + query: 'SELECT * FROM memory_info;', + platform: 'linux', + id: Object.keys(multiQueryPackData.queries)[0], + }, + { + interval: 3600, + query: 'SELECT * FROM system_info;', + id: Object.keys(multiQueryPackData.queries)[1], + }, + { + interval: 10, + query: 'select opera_extensions.* from users join opera_extensions using (uid);', + id: Object.keys(multiQueryPackData.queries)[2], + }, + ]; + expect(request.body.response_actions[0].params.queries).to.deep.equal(threeQueries); + }); + }); + } +); diff --git a/x-pack/plugins/osquery/kibana.jsonc b/x-pack/plugins/osquery/kibana.jsonc index cd8e929da43d9..3cd4cfc7f0052 100644 --- a/x-pack/plugins/osquery/kibana.jsonc +++ b/x-pack/plugins/osquery/kibana.jsonc @@ -2,6 +2,8 @@ "type": "plugin", "id": "@kbn/osquery-plugin", "owner": "@elastic/security-defend-workflows", + "group": "platform", + "visibility": "shared", "plugin": { "id": "osquery", "server": true, diff --git a/x-pack/plugins/rollup/server/types.ts b/x-pack/plugins/rollup/server/types.ts index cb3f9b37541a9..b76a1e99f6d1d 100644 --- a/x-pack/plugins/rollup/server/types.ts +++ b/x-pack/plugins/rollup/server/types.ts @@ -5,24 +5,22 @@ * 2.0. */ -import { IRouter } from '@kbn/core/server'; -import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; -import { VisTypeTimeseriesSetup } from '@kbn/vis-type-timeseries-plugin/server'; +import type { IRouter } from '@kbn/core/server'; +import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; -import { getCapabilitiesForRollupIndices } from '@kbn/data-plugin/server'; -import { IndexManagementPluginSetup } from '@kbn/index-management-plugin/server'; -import { FeaturesPluginSetup } from '@kbn/features-plugin/server'; -import { DataViewsServerPluginSetup } from '@kbn/data-views-plugin/server'; -import { PluginSetup as DataPluginSetup } from '@kbn/data-plugin/server'; -import { LicensingPluginSetup } from '@kbn/licensing-plugin/server'; -import { License } from './services'; -import { IndexPatternsFetcher } from './shared_imports'; -import { handleEsError } from './shared_imports'; -import { formatEsError } from './lib/format_es_error'; +import type { getCapabilitiesForRollupIndices } from '@kbn/data-plugin/server'; +import type { IndexManagementPluginSetup } from '@kbn/index-management-plugin/server'; +import type { FeaturesPluginSetup } from '@kbn/features-plugin/server'; +import type { DataViewsServerPluginSetup } from '@kbn/data-views-plugin/server'; +import type { PluginSetup as DataPluginSetup } from '@kbn/data-plugin/server'; +import type { LicensingPluginSetup } from '@kbn/licensing-plugin/server'; +import type { License } from './services'; +import type { IndexPatternsFetcher } from './shared_imports'; +import type { handleEsError } from './shared_imports'; +import type { formatEsError } from './lib/format_es_error'; export interface Dependencies { indexManagement?: IndexManagementPluginSetup; - visTypeTimeseries?: VisTypeTimeseriesSetup; usageCollection?: UsageCollectionSetup; licensing: LicensingPluginSetup; features: FeaturesPluginSetup; diff --git a/x-pack/plugins/rollup/tsconfig.json b/x-pack/plugins/rollup/tsconfig.json index 2957a4bcb17c4..a74f689515de1 100644 --- a/x-pack/plugins/rollup/tsconfig.json +++ b/x-pack/plugins/rollup/tsconfig.json @@ -19,7 +19,6 @@ "@kbn/home-plugin", "@kbn/index-management-plugin", "@kbn/usage-collection-plugin", - "@kbn/vis-type-timeseries-plugin", // required bundles "@kbn/kibana-utils-plugin", "@kbn/kibana-react-plugin", diff --git a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts index 0ecab0aaa0945..ca5e72c529d71 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.ts @@ -7,7 +7,7 @@ import { IRouter } from '@kbn/core/server'; import * as t from 'io-ts'; -import { id as _id } from '@kbn/securitysolution-io-ts-list-types'; +import { NonEmptyString } from '@kbn/securitysolution-io-ts-types'; import { transformError } from '@kbn/securitysolution-es-utils'; import { RacRequestHandlerContext } from '../types'; @@ -23,7 +23,7 @@ export const getAlertByIdRoute = (router: IRouter) => t.intersection([ t.exact( t.type({ - id: _id, + id: NonEmptyString, }) ), t.exact( diff --git a/x-pack/plugins/rule_registry/tsconfig.json b/x-pack/plugins/rule_registry/tsconfig.json index 8c244ed95e014..794917b370125 100644 --- a/x-pack/plugins/rule_registry/tsconfig.json +++ b/x-pack/plugins/rule_registry/tsconfig.json @@ -24,7 +24,6 @@ "@kbn/spaces-plugin", "@kbn/securitysolution-es-utils", "@kbn/securitysolution-io-ts-types", - "@kbn/securitysolution-io-ts-list-types", "@kbn/es-types", "@kbn/core-elasticsearch-client-server-mocks", "@kbn/logging-mocks", diff --git a/x-pack/plugins/search_connectors/kibana.jsonc b/x-pack/plugins/search_connectors/kibana.jsonc index 83d052ac232ad..6290b9692b384 100644 --- a/x-pack/plugins/search_connectors/kibana.jsonc +++ b/x-pack/plugins/search_connectors/kibana.jsonc @@ -2,8 +2,11 @@ "type": "plugin", "id": "@kbn/search-connectors-plugin", "owner": "@elastic/search-kibana", - "group": "platform", - "visibility": "shared", + // TODO this is currently used from Observability too, must be refactored before solution-specific builds + // see x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/search_connector_tab.tsx + // cc sphilipse + "group": "search", + "visibility": "private", "description": "Plugin hosting shared features for connectors", "plugin": { "id": "searchConnectors", diff --git a/x-pack/plugins/search_solution/search_navigation/README.mdx b/x-pack/plugins/search_solution/search_navigation/README.mdx new file mode 100644 index 0000000000000..13ece425b680f --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/README.mdx @@ -0,0 +1,3 @@ +# Search Navigation + +The Search Navigation plugin is used to handle navigation for search solution plugins across both stack and serverless. diff --git a/x-pack/plugins/search_solution/search_navigation/common/index.ts b/x-pack/plugins/search_solution/search_navigation/common/index.ts new file mode 100644 index 0000000000000..8a5bd50a5bc37 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/common/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 const PLUGIN_ID = 'searchNavigation'; +export const PLUGIN_NAME = 'searchNavigation'; diff --git a/x-pack/plugins/search_solution/search_navigation/jest.config.js b/x-pack/plugins/search_solution/search_navigation/jest.config.js new file mode 100644 index 0000000000000..e86a30c143245 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/jest.config.js @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/x-pack/plugins/search_solution/search_navigation'], + coverageDirectory: + '/target/kibana-coverage/jest/x-pack/plugins/search_solution/search_navigation', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/search_solution/search_navigation/{public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/search_solution/search_navigation/kibana.jsonc b/x-pack/plugins/search_solution/search_navigation/kibana.jsonc new file mode 100644 index 0000000000000..4b10b5f3a5a78 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/kibana.jsonc @@ -0,0 +1,21 @@ +{ + "type": "plugin", + "id": "@kbn/search-navigation", + "owner": "@elastic/search-kibana", + "group": "search", + "visibility": "private", + "plugin": { + "id": "searchNavigation", + "server": false, + "browser": true, + "configPath": [ + "xpack", + "searchNavigation" + ], + "requiredPlugins": [], + "optionalPlugins": [ + "serverless" + ], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.test.ts b/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.test.ts new file mode 100644 index 0000000000000..1b17296f54c73 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.test.ts @@ -0,0 +1,201 @@ +/* + * 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 { CoreStart, ScopedHistory } from '@kbn/core/public'; +import type { ChromeNavLink } from '@kbn/core-chrome-browser'; + +import { classicNavigationFactory } from './classic_navigation'; +import { ClassicNavItem } from './types'; + +describe('classicNavigationFactory', function () { + const mockedNavLinks: Array> = [ + { + id: 'enterpriseSearch', + url: '/app/enterprise_search/overview', + title: 'Overview', + }, + { + id: 'enterpriseSearchContent:searchIndices', + title: 'Indices', + url: '/app/enterprise_search/content/search_indices', + }, + { + id: 'enterpriseSearchContent:connectors', + title: 'Connectors', + url: '/app/enterprise_search/content/connectors', + }, + { + id: 'enterpriseSearchContent:webCrawlers', + title: 'Web crawlers', + url: '/app/enterprise_search/content/crawlers', + }, + ]; + const mockedCoreStart = { + chrome: { + navLinks: { + getAll: () => mockedNavLinks, + }, + }, + }; + const core = mockedCoreStart as unknown as CoreStart; + const mockHistory = { + location: { + pathname: '/', + }, + createHref: jest.fn(), + }; + const history = mockHistory as unknown as ScopedHistory; + + beforeEach(() => { + jest.clearAllMocks(); + mockHistory.location.pathname = '/'; + mockHistory.createHref.mockReturnValue('/'); + }); + + it('can render top-level items', () => { + const items: ClassicNavItem[] = [ + { + id: 'unit-test', + deepLink: { + link: 'enterpriseSearch', + }, + }, + ]; + expect(classicNavigationFactory(items, core, history)).toEqual({ + icon: 'logoEnterpriseSearch', + items: [ + { + href: '/app/enterprise_search/overview', + id: 'unit-test', + isSelected: false, + name: 'Overview', + onClick: expect.any(Function), + }, + ], + name: 'Elasticsearch', + }); + }); + + it('will set isSelected', () => { + mockHistory.location.pathname = '/overview'; + mockHistory.createHref.mockReturnValue('/app/enterprise_search/overview'); + + const items: ClassicNavItem[] = [ + { + id: 'unit-test', + deepLink: { + link: 'enterpriseSearch', + }, + }, + ]; + + const solutionNav = classicNavigationFactory(items, core, history); + expect(solutionNav!.items).toEqual([ + { + href: '/app/enterprise_search/overview', + id: 'unit-test', + isSelected: true, + name: 'Overview', + onClick: expect.any(Function), + }, + ]); + }); + it('can render items with children', () => { + const items: ClassicNavItem[] = [ + { + id: 'searchContent', + name: 'Content', + items: [ + { + id: 'searchIndices', + deepLink: { + link: 'enterpriseSearchContent:searchIndices', + }, + }, + { + id: 'searchConnectors', + deepLink: { + link: 'enterpriseSearchContent:connectors', + }, + }, + ], + }, + ]; + + const solutionNav = classicNavigationFactory(items, core, history); + expect(solutionNav!.items).toEqual([ + { + id: 'searchContent', + items: [ + { + href: '/app/enterprise_search/content/search_indices', + id: 'searchIndices', + isSelected: false, + name: 'Indices', + onClick: expect.any(Function), + }, + { + href: '/app/enterprise_search/content/connectors', + id: 'searchConnectors', + isSelected: false, + name: 'Connectors', + onClick: expect.any(Function), + }, + ], + name: 'Content', + }, + ]); + }); + it('returns name if provided over the deeplink title', () => { + const items: ClassicNavItem[] = [ + { + id: 'searchIndices', + deepLink: { + link: 'enterpriseSearchContent:searchIndices', + }, + name: 'Index Management', + }, + ]; + const solutionNav = classicNavigationFactory(items, core, history); + expect(solutionNav!.items).toEqual([ + { + href: '/app/enterprise_search/content/search_indices', + id: 'searchIndices', + isSelected: false, + name: 'Index Management', + onClick: expect.any(Function), + }, + ]); + }); + it('removes item if deeplink not defined', () => { + const items: ClassicNavItem[] = [ + { + id: 'unit-test', + deepLink: { + link: 'enterpriseSearch', + }, + }, + { + id: 'serverlessElasticsearch', + deepLink: { + link: 'serverlessElasticsearch', + }, + }, + ]; + + const solutionNav = classicNavigationFactory(items, core, history); + expect(solutionNav!.items).toEqual([ + { + href: '/app/enterprise_search/overview', + id: 'unit-test', + isSelected: false, + name: 'Overview', + onClick: expect.any(Function), + }, + ]); + }); +}); diff --git a/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.ts b/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.ts new file mode 100644 index 0000000000000..99a6b33c4bcce --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/classic_navigation.ts @@ -0,0 +1,124 @@ +/* + * 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 MouseEvent } from 'react'; +import { i18n } from '@kbn/i18n'; +import type { CoreStart, ScopedHistory } from '@kbn/core/public'; +import type { ChromeNavLink, EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; +import type { SolutionNavProps } from '@kbn/shared-ux-page-solution-nav'; + +import type { ClassicNavItem, ClassicNavItemDeepLink, ClassicNavigationFactoryFn } from './types'; +import { stripTrailingSlash } from './utils'; + +type DeepLinksMap = Record; +type SolutionNavItems = SolutionNavProps['items']; + +export const classicNavigationFactory: ClassicNavigationFactoryFn = ( + classicItems: ClassicNavItem[], + core: CoreStart, + history: ScopedHistory +): SolutionNavProps | undefined => { + const navLinks = core.chrome.navLinks.getAll(); + const deepLinks = navLinks.reduce((links: DeepLinksMap, link: ChromeNavLink) => { + links[link.id] = link; + return links; + }, {}); + + const currentPath = stripTrailingSlash(history.location.pathname); + const currentLocation = history.createHref({ pathname: currentPath }); + const items: SolutionNavItems = generateSideNavItems( + classicItems, + core, + deepLinks, + currentLocation + ); + + return { + items, + icon: 'logoEnterpriseSearch', + name: i18n.translate('xpack.searchNavigation.classicNav.name', { + defaultMessage: 'Elasticsearch', + }), + }; +}; + +function generateSideNavItems( + classicItems: ClassicNavItem[], + core: CoreStart, + deepLinks: DeepLinksMap, + currentLocation: string +): SolutionNavItems { + const result: SolutionNavItems = []; + + for (const navItem of classicItems) { + let children: SolutionNavItems | undefined; + + const { deepLink, items, ...rest } = navItem; + if (items) { + children = generateSideNavItems(items, core, deepLinks, currentLocation); + } + + let item: EuiSideNavItemTypeEnhanced<{}> | undefined; + if (deepLink) { + const sideNavProps = getSideNavItemLinkProps(deepLink, deepLinks, core, currentLocation); + if (sideNavProps) { + const { name, ...linkProps } = sideNavProps; + item = { + ...rest, + ...linkProps, + name: navItem?.name ?? name, + }; + } + } else { + item = { + ...rest, + items: children, + name: navItem.name, + }; + } + + if (isValidSideNavItem(item)) { + result.push(item); + } + } + + return result; +} + +function isValidSideNavItem( + item: EuiSideNavItemTypeEnhanced | undefined +): item is EuiSideNavItemTypeEnhanced { + if (item === undefined) return false; + if (item.href || item.onClick) return true; + if (item?.items?.length ?? 0 > 0) return true; + + return false; +} + +function getSideNavItemLinkProps( + { link, shouldShowActiveForSubroutes }: ClassicNavItemDeepLink, + deepLinks: DeepLinksMap, + core: CoreStart, + currentLocation: string +) { + const deepLink = deepLinks[link]; + if (!deepLink || !deepLink.url) return undefined; + const isSelected = Boolean( + deepLink.url === currentLocation || + (shouldShowActiveForSubroutes && currentLocation.startsWith(deepLink.url)) + ); + + return { + onClick: (e: MouseEvent) => { + e.preventDefault(); + core.application.navigateToUrl(deepLink.url); + }, + href: deepLink.url, + name: deepLink.title, + isSelected, + }; +} diff --git a/x-pack/plugins/search_solution/search_navigation/public/index.ts b/x-pack/plugins/search_solution/search_navigation/public/index.ts new file mode 100644 index 0000000000000..f5fc03e088a2c --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PluginInitializerContext } from '@kbn/core-plugins-browser'; +import { SearchNavigationPlugin } from './plugin'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new SearchNavigationPlugin(initializerContext); +} + +export type { + SearchNavigationPluginSetup, + SearchNavigationPluginStart, + ClassicNavItem, + ClassicNavItemDeepLink, +} from './types'; diff --git a/x-pack/plugins/search_solution/search_navigation/public/plugin.ts b/x-pack/plugins/search_solution/search_navigation/public/plugin.ts new file mode 100644 index 0000000000000..4b618a6245c40 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/plugin.ts @@ -0,0 +1,92 @@ +/* + * 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 { + CoreSetup, + CoreStart, + Plugin, + PluginInitializerContext, + ScopedHistory, +} from '@kbn/core/public'; +import type { ChromeStyle } from '@kbn/core-chrome-browser'; +import type { Logger } from '@kbn/logging'; +import type { + SearchNavigationPluginSetup, + SearchNavigationPluginStart, + ClassicNavItem, + ClassicNavigationFactoryFn, +} from './types'; + +export class SearchNavigationPlugin + implements Plugin +{ + private readonly logger: Logger; + private currentChromeStyle: ChromeStyle | undefined = undefined; + private baseClassicNavItemsFn: (() => ClassicNavItem[]) | undefined = undefined; + private coreStart: CoreStart | undefined = undefined; + private classicNavFactory: ClassicNavigationFactoryFn | undefined = undefined; + private onAppMountHandlers: Array<() => Promise> = []; + + constructor(private readonly initializerContext: PluginInitializerContext) { + this.logger = this.initializerContext.logger.get(); + } + + public setup(_core: CoreSetup): SearchNavigationPluginSetup { + return {}; + } + + public start(core: CoreStart): SearchNavigationPluginStart { + this.coreStart = core; + core.chrome.getChromeStyle$().subscribe((value) => { + this.currentChromeStyle = value; + }); + + import('./classic_navigation').then(({ classicNavigationFactory }) => { + this.classicNavFactory = classicNavigationFactory; + }); + + return { + handleOnAppMount: this.handleOnAppMount.bind(this), + registerOnAppMountHandler: this.registerOnAppMountHandler.bind(this), + setGetBaseClassicNavItems: this.setGetBaseClassicNavItems.bind(this), + useClassicNavigation: this.useClassicNavigation.bind(this), + }; + } + + public stop() {} + + private async handleOnAppMount() { + if (this.onAppMountHandlers.length === 0) return; + + try { + await Promise.all(this.onAppMountHandlers); + } catch (e) { + this.logger.warn('Error handling app mount functions for search navigation'); + this.logger.warn(e); + } + } + + private registerOnAppMountHandler(handler: () => Promise) { + this.onAppMountHandlers.push(handler); + } + + private setGetBaseClassicNavItems(classicNavItemsFn: () => ClassicNavItem[]) { + this.baseClassicNavItemsFn = classicNavItemsFn; + } + + private useClassicNavigation(history: ScopedHistory) { + if ( + this.baseClassicNavItemsFn === undefined || + this.classicNavFactory === undefined || + this.coreStart === undefined || + this.currentChromeStyle !== 'classic' + ) + return undefined; + + return this.classicNavFactory(this.baseClassicNavItemsFn(), this.coreStart, history); + } +} diff --git a/x-pack/plugins/search_solution/search_navigation/public/types.ts b/x-pack/plugins/search_solution/search_navigation/public/types.ts new file mode 100644 index 0000000000000..91e8cc73524e2 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/types.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 { ReactNode } from 'react'; +import type { AppDeepLinkId } from '@kbn/core-chrome-browser'; +import type { CoreStart, ScopedHistory } from '@kbn/core/public'; +import type { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; +import type { SolutionNavProps } from '@kbn/shared-ux-page-solution-nav'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchNavigationPluginSetup {} + +export interface SearchNavigationPluginStart { + registerOnAppMountHandler: (onAppMount: () => Promise) => void; + handleOnAppMount: () => Promise; + // This is temporary until we can migrate building the class nav item list out of `enterprise_search` plugin + setGetBaseClassicNavItems: (classicNavItemsFn: () => ClassicNavItem[]) => void; + useClassicNavigation: (history: ScopedHistory) => SolutionNavProps | undefined; +} + +export interface AppPluginSetupDependencies { + serverless?: ServerlessPluginSetup; +} + +export interface AppPluginStartDependencies { + serverless?: ServerlessPluginStart; +} + +export interface ClassicNavItemDeepLink { + link: AppDeepLinkId; + shouldShowActiveForSubroutes?: boolean; +} + +export interface ClassicNavItem { + 'data-test-subj'?: string; + deepLink?: ClassicNavItemDeepLink; + iconToString?: string; + id: string; + items?: ClassicNavItem[]; + name?: ReactNode; +} + +export type ClassicNavigationFactoryFn = ( + items: ClassicNavItem[], + core: CoreStart, + history: ScopedHistory +) => SolutionNavProps | undefined; diff --git a/x-pack/plugins/search_solution/search_navigation/public/utils.ts b/x-pack/plugins/search_solution/search_navigation/public/utils.ts new file mode 100644 index 0000000000000..fb80778977b16 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/public/utils.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. + */ + +/** + * Helpers for stripping trailing or leading slashes from URLs or paths + * (usually ones that come in from React Router or API endpoints) + */ + +export const stripTrailingSlash = (url: string): string => { + return url && url.endsWith('/') ? url.slice(0, -1) : url; +}; + +export const stripLeadingSlash = (path: string): string => { + return path && path.startsWith('/') ? path.substring(1) : path; +}; diff --git a/x-pack/plugins/search_solution/search_navigation/tsconfig.json b/x-pack/plugins/search_solution/search_navigation/tsconfig.json new file mode 100644 index 0000000000000..6d61fbb24ec89 --- /dev/null +++ b/x-pack/plugins/search_solution/search_navigation/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "__mocks__/**/*", + "common/**/*", + "public/**/*", + "server/**/*", + "../../../../typings/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/i18n", + "@kbn/core-chrome-browser", + "@kbn/shared-ux-page-solution-nav", + "@kbn/logging", + "@kbn/serverless", + "@kbn/core-plugins-browser", + ], + "exclude": ["target/**/*"] +} diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx index f536b5838bab7..8ceff7f1460f6 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx @@ -274,6 +274,7 @@ export const ApiKeysTable: FunctionComponent = ({ = ({ que onFilterChange({ ...filters, type: filters.type === 'rest' ? undefined : 'rest' }); }} withNext={types.includes('cross_cluster') || types.includes('managed')} + data-test-subj="personalFilterButton" > = ({ que }); }} withNext={types.includes('managed')} + data-test-subj="crossClusterFilterButton" > = ({ que type: filters.type === 'managed' ? undefined : 'managed', }); }} + data-test-subj="managedFilterButton" > = ({ } }} withNext={true} + data-test-subj="activeFilterButton" > = ({ onFilterChange({ ...filters, expired: true }); } }} + data-test-subj="expiredFilterButton" > = ({ que numFilters={usernames.length} hasActiveFilters={numActiveFilters ? true : false} numActiveFilters={numActiveFilters} + data-test-subj="ownerFilterButton" > { headers: {}, path: '/', }; - const request = CoreKibanaRequest.from(fakeRawRequest); + const request = kibanaRequestFactory(fakeRawRequest); await auditSetup.asScoped(request).log({ message: 'MESSAGE', diff --git a/x-pack/plugins/security/server/authentication/api_keys/fake_kibana_request.ts b/x-pack/plugins/security/server/authentication/api_keys/fake_kibana_request.ts index d57fc23cd5c7c..c00dc6a44fa71 100644 --- a/x-pack/plugins/security/server/authentication/api_keys/fake_kibana_request.ts +++ b/x-pack/plugins/security/server/authentication/api_keys/fake_kibana_request.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { FakeRawRequest, Headers } from '@kbn/core/server'; -import { CoreKibanaRequest } from '@kbn/core/server'; +import type { FakeRawRequest, Headers } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; export function getFakeKibanaRequest(apiKey: { id: string; api_key: string }) { const requestHeaders: Headers = {}; @@ -20,5 +20,5 @@ export function getFakeKibanaRequest(apiKey: { id: string; api_key: string }) { path: '/', }; - return CoreKibanaRequest.from(fakeRawRequest); + return kibanaRequestFactory(fakeRawRequest); } diff --git a/x-pack/plugins/security/server/session_management/session_index.test.ts b/x-pack/plugins/security/server/session_management/session_index.test.ts index e1890273469ed..04991f4aeefd6 100644 --- a/x-pack/plugins/security/server/session_management/session_index.test.ts +++ b/x-pack/plugins/security/server/session_management/session_index.test.ts @@ -473,6 +473,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.search).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.search).toHaveBeenCalledWith({ _source_includes: 'usernameHash,provider', + allow_partial_search_results: true, sort: '_shard_doc', track_total_hits: false, search_after: undefined, @@ -555,6 +556,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.search).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.search).toHaveBeenCalledWith({ _source_includes: 'usernameHash,provider', + allow_partial_search_results: true, sort: '_shard_doc', track_total_hits: false, search_after: undefined, @@ -649,6 +651,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.search).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.search).toHaveBeenCalledWith({ _source_includes: 'usernameHash,provider', + allow_partial_search_results: true, sort: '_shard_doc', track_total_hits: false, search_after: undefined, @@ -737,6 +740,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.search).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.search).toHaveBeenCalledWith({ _source_includes: 'usernameHash,provider', + allow_partial_search_results: true, sort: '_shard_doc', track_total_hits: false, search_after: undefined, @@ -850,6 +854,7 @@ describe('Session index', () => { expect(mockElasticsearchClient.search).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.search).toHaveBeenCalledWith({ _source_includes: 'usernameHash,provider', + allow_partial_search_results: true, sort: '_shard_doc', track_total_hits: false, search_after: undefined, diff --git a/x-pack/plugins/security/server/session_management/session_index.ts b/x-pack/plugins/security/server/session_management/session_index.ts index 9f11e9224243c..9166ec9deb91f 100644 --- a/x-pack/plugins/security/server/session_management/session_index.ts +++ b/x-pack/plugins/security/server/session_management/session_index.ts @@ -857,6 +857,7 @@ export class SessionIndex { size: SESSION_INDEX_CLEANUP_BATCH_SIZE, sort: '_shard_doc', track_total_hits: false, // for performance + allow_partial_search_results: true, }); const { hits } = searchResponse.hits; if (hits.length > 0) { diff --git a/x-pack/plugins/security/tsconfig.json b/x-pack/plugins/security/tsconfig.json index 4837d3729e3f9..bfbf5df127597 100644 --- a/x-pack/plugins/security/tsconfig.json +++ b/x-pack/plugins/security/tsconfig.json @@ -88,6 +88,9 @@ "@kbn/core-http-router-server-mocks", "@kbn/security-authorization-core-common", "@kbn/doc-links", + "@kbn/core-capabilities-server", + "@kbn/core-elasticsearch-server", + "@kbn/core-http-server-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts index 5138e94b78db2..6262fd0e579e7 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts @@ -9,14 +9,17 @@ import { z } from '@kbn/zod'; import { BuildingBlockType, DataViewId, + EventCategoryOverride, IndexPatternArray, KqlQueryLanguage, RuleFilterArray, RuleNameOverride, RuleQuery, SavedQueryId, + TiebreakerField, TimelineTemplateId, TimelineTemplateTitle, + TimestampField, TimestampOverride, TimestampOverrideFallbackDisabled, } from '../../../../model/rule_schema'; @@ -78,6 +81,9 @@ export const RuleEqlQuery = z.object({ query: RuleQuery, language: z.literal('eql'), filters: RuleFilterArray, + event_category_override: EventCategoryOverride.optional(), + timestamp_field: TimestampField.optional(), + tiebreaker_field: TiebreakerField.optional(), }); export type RuleEsqlQuery = z.infer; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts index 374c6ff492e8d..38331d3a01c62 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts @@ -9,7 +9,6 @@ import { z } from '@kbn/zod'; import { AlertSuppression, AnomalyThreshold, - EventCategoryOverride, HistoryWindowStart, InvestigationFields, InvestigationGuide, @@ -37,8 +36,6 @@ import { ThreatMapping, Threshold, ThresholdAlertSuppression, - TiebreakerField, - TimestampField, } from '../../../../model/rule_schema'; import { @@ -113,9 +110,6 @@ export const DiffableEqlFields = z.object({ type: z.literal('eql'), eql_query: RuleEqlQuery, // NOTE: new field data_source: RuleDataSource.optional(), // NOTE: new field - event_category_override: EventCategoryOverride.optional(), - timestamp_field: TimestampField.optional(), - tiebreaker_field: TiebreakerField.optional(), alert_suppression: AlertSuppression.optional(), }); diff --git a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts index f0d8445c41eed..5a1cf49baecd1 100644 --- a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts +++ b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts @@ -299,14 +299,8 @@ import type { CreateTimelinesRequestBodyInput, CreateTimelinesResponse, } from './timeline/create_timelines/create_timelines_route.gen'; -import type { - DeleteNoteRequestBodyInput, - DeleteNoteResponse, -} from './timeline/delete_note/delete_note_route.gen'; -import type { - DeleteTimelinesRequestBodyInput, - DeleteTimelinesResponse, -} from './timeline/delete_timelines/delete_timelines_route.gen'; +import type { DeleteNoteRequestBodyInput } from './timeline/delete_note/delete_note_route.gen'; +import type { DeleteTimelinesRequestBodyInput } from './timeline/delete_timelines/delete_timelines_route.gen'; import type { ExportTimelinesRequestQueryInput, ExportTimelinesRequestBodyInput, @@ -768,7 +762,7 @@ If a record already exists for the specified entity, that record is overwritten async deleteNote(props: DeleteNoteProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteNote`); return this.kbnClient - .request({ + .request({ path: '/api/note', headers: { [ELASTIC_HTTP_VERSION_HEADER]: '2023-10-31', @@ -801,7 +795,7 @@ If a record already exists for the specified entity, that record is overwritten async deleteTimelines(props: DeleteTimelinesProps) { this.log.info(`${new Date().toISOString()} Calling API DeleteTimelines`); return this.kbnClient - .request({ + .request({ path: '/api/timeline', headers: { [ELASTIC_HTTP_VERSION_HEADER]: '2023-10-31', diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts index d98455c1fdb59..f0ee5665b9f78 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts @@ -30,8 +30,3 @@ export const DeleteNoteRequestBody = z.union([ .nullable(), ]); export type DeleteNoteRequestBodyInput = z.input; - -export type DeleteNoteResponse = z.infer; -export const DeleteNoteResponse = z.object({ - data: z.object({}).optional(), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml index e79cb9aab65ac..672488e4ff6cd 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml @@ -37,10 +37,3 @@ paths: responses: '200': description: Indicates the note was successfully deleted. - content: - application/json: - schema: - type: object - properties: - data: - type: object diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.gen.ts index 5b63249843f41..98761d710f031 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.gen.ts @@ -25,10 +25,3 @@ export const DeleteTimelinesRequestBody = z.object({ searchIds: z.array(z.string()).optional(), }); export type DeleteTimelinesRequestBodyInput = z.input; - -export type DeleteTimelinesResponse = z.infer; -export const DeleteTimelinesResponse = z.object({ - data: z.object({ - deleteTimeline: z.boolean(), - }), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml index bb6674fa65877..4dd5105a737a3 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.schema.yaml @@ -36,15 +36,3 @@ paths: responses: '200': description: Indicates the Timeline was successfully deleted. - content: - application/json: - schema: - type: object - required: [data] - properties: - data: - type: object - required: [deleteTimeline] - properties: - deleteTimeline: - type: boolean diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts index 0ee6445dd71e3..c8ef00e3c5260 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts @@ -60,4 +60,4 @@ export const GetNotesRequestQuery = z.object({ export type GetNotesRequestQueryInput = z.input; export type GetNotesResponse = z.infer; -export const GetNotesResponse = z.union([GetNotesResult, z.object({})]); +export const GetNotesResponse = GetNotesResult; diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml index e142126817707..601fd8bfc9966 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml @@ -66,9 +66,7 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/GetNotesResult' - - type: object + $ref: '#/components/schemas/GetNotesResult' components: schemas: diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts index 7a41788077524..72df3caf8c6d6 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.gen.ts @@ -32,11 +32,4 @@ export const GetTimelineRequestQuery = z.object({ export type GetTimelineRequestQueryInput = z.input; export type GetTimelineResponse = z.infer; -export const GetTimelineResponse = z.union([ - z.object({ - data: z.object({ - getOneTimeline: TimelineResponse, - }), - }), - z.object({}).strict(), -]); +export const GetTimelineResponse = TimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml index 9b5d3fedfd59e..40022f34b6ea5 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_timeline/get_timeline_route.schema.yaml @@ -32,15 +32,4 @@ paths: content: application/json: schema: - oneOf: - - type: object - required: [data] - properties: - data: - type: object - required: [getOneTimeline] - properties: - getOneTimeline: - $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' - - type: object - additionalProperties: false + $ref: '../model/components.schema.yaml#/components/schemas/TimelineResponse' diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts index 93d627f53263b..6de7425d226e8 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts @@ -309,8 +309,6 @@ export type FavoriteTimelineResponse = z.infer; export const FavoriteTimelineResponse = z.object({ savedObjectId: z.string(), version: z.string(), - code: z.number().nullable().optional(), - message: z.string().nullable().optional(), templateTimelineId: z.string().nullable().optional(), templateTimelineVersion: z.number().nullable().optional(), timelineType: TimelineType.optional(), @@ -318,13 +316,7 @@ export const FavoriteTimelineResponse = z.object({ }); export type PersistTimelineResponse = z.infer; -export const PersistTimelineResponse = z.object({ - data: z.object({ - persistTimeline: z.object({ - timeline: TimelineResponse, - }), - }), -}); +export const PersistTimelineResponse = TimelineResponse; export type BareNoteWithoutExternalRefs = z.infer; export const BareNoteWithoutExternalRefs = z.object({ diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml index 568eec1975769..fb5b4a964788c 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml @@ -225,12 +225,6 @@ components: type: string version: type: string - code: - type: number - nullable: true - message: - type: string - nullable: true templateTimelineId: type: string nullable: true @@ -244,19 +238,7 @@ components: items: $ref: '#/components/schemas/FavoriteTimelineResult' PersistTimelineResponse: - type: object - required: [data] - properties: - data: - type: object - required: [persistTimeline] - properties: - persistTimeline: - type: object - required: [timeline] - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' + $ref: '#/components/schemas/TimelineResponse' ColumnHeaderResult: type: object properties: diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.gen.ts index c3c5f16cf2e32..675ad647c692c 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.gen.ts @@ -28,8 +28,4 @@ export const PersistFavoriteRouteRequestBody = z.object({ export type PersistFavoriteRouteRequestBodyInput = z.input; export type PersistFavoriteRouteResponse = z.infer; -export const PersistFavoriteRouteResponse = z.object({ - data: z.object({ - persistFavorite: FavoriteTimelineResponse, - }), -}); +export const PersistFavoriteRouteResponse = FavoriteTimelineResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml index 3a57dd066d3b3..c3a0def405a6c 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.schema.yaml @@ -39,15 +39,8 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistFavorite] - properties: - persistFavorite: - $ref: '../model/components.schema.yaml#/components/schemas/FavoriteTimelineResponse' + $ref: '../model/components.schema.yaml#/components/schemas/FavoriteTimelineResponse' + '403': description: Indicates the user does not have the required permissions to persist the favorite status. content: diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts index 36def713d4994..a24428d64c2b0 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts @@ -20,8 +20,6 @@ import { BareNote, Note } from '../model/components.gen'; export type ResponseNote = z.infer; export const ResponseNote = z.object({ - code: z.number(), - message: z.string(), note: Note, }); @@ -38,8 +36,4 @@ export const PersistNoteRouteRequestBody = z.object({ export type PersistNoteRouteRequestBodyInput = z.input; export type PersistNoteRouteResponse = z.infer; -export const PersistNoteRouteResponse = z.object({ - data: z.object({ - persistNote: ResponseNote, - }), -}); +export const PersistNoteRouteResponse = ResponseNote; diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml index 640e75171c613..c5b3cee081667 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml @@ -50,24 +50,12 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistNote] - properties: - persistNote: - $ref: '#/components/schemas/ResponseNote' + $ref: '#/components/schemas/ResponseNote' components: schemas: ResponseNote: type: object - required: [code, message, note] + required: [note] properties: - code: - type: number - message: - type: string note: $ref: '../model/components.schema.yaml#/components/schemas/Note' diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts index 6fd628e5a258e..8dd99913c5e30 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts @@ -18,16 +18,12 @@ import { z } from '@kbn/zod'; import { PinnedEvent } from '../model/components.gen'; -export type PinnedEventBaseResponseBody = z.infer; -export const PinnedEventBaseResponseBody = z.object({ - code: z.number(), - message: z.string().optional(), -}); - export type PersistPinnedEventResponse = z.infer; export const PersistPinnedEventResponse = z.union([ - PinnedEvent.merge(PinnedEventBaseResponseBody), - z.object({}).nullable(), + PinnedEvent, + z.object({ + unpinned: z.boolean(), + }), ]); export type PersistPinnedEventRouteRequestBody = z.infer; @@ -41,8 +37,4 @@ export type PersistPinnedEventRouteRequestBodyInput = z.input< >; export type PersistPinnedEventRouteResponse = z.infer; -export const PersistPinnedEventRouteResponse = z.object({ - data: z.object({ - persistPinnedEventOnTimeline: PersistPinnedEventResponse, - }), -}); +export const PersistPinnedEventRouteResponse = PersistPinnedEventResponse; diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml index 3b697e957ad89..3059dec003312 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml @@ -37,30 +37,15 @@ paths: content: application/json: schema: - type: object - required: [data] - properties: - data: - type: object - required: [persistPinnedEventOnTimeline] - properties: - persistPinnedEventOnTimeline: - $ref: '#/components/schemas/PersistPinnedEventResponse' + $ref: '#/components/schemas/PersistPinnedEventResponse' components: schemas: PersistPinnedEventResponse: oneOf: - - allOf: - - $ref: '../model/components.schema.yaml#/components/schemas/PinnedEvent' - - $ref: '#/components/schemas/PinnedEventBaseResponseBody' + - $ref: '../model/components.schema.yaml#/components/schemas/PinnedEvent' - type: object - nullable: true - PinnedEventBaseResponseBody: - type: object - required: [code] - properties: - code: - type: number - message: - type: string + required: [unpinned] + properties: + unpinned: + type: boolean diff --git a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts index d4c79eec50b26..d245dcf4a16ab 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.gen.ts @@ -32,9 +32,4 @@ export const ResolveTimelineRequestQuery = z.object({ export type ResolveTimelineRequestQueryInput = z.input; export type ResolveTimelineResponse = z.infer; -export const ResolveTimelineResponse = z.union([ - z.object({ - data: ResolvedTimeline, - }), - z.object({}).strict(), -]); +export const ResolveTimelineResponse = ResolvedTimeline; diff --git a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml index b06969e28cad4..ce0cfdc81f527 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/resolve_timeline/resolve_timeline_route.schema.yaml @@ -28,14 +28,7 @@ paths: content: application/json: schema: - oneOf: - - type: object - required: [data] - properties: - data: - $ref: '../model/components.schema.yaml#/components/schemas/ResolvedTimeline' - - type: object - additionalProperties: false + $ref: '../model/components.schema.yaml#/components/schemas/ResolvedTimeline' '400': description: The request is missing parameters diff --git a/x-pack/plugins/security_solution/common/api/timeline/routes.ts b/x-pack/plugins/security_solution/common/api/timeline/routes.ts index 70b339c92f197..d5996d9706701 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/routes.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/routes.ts @@ -5,17 +5,14 @@ * 2.0. */ -export { - DeleteTimelinesRequestBody, - DeleteTimelinesResponse, -} from './delete_timelines/delete_timelines_route.gen'; +export { DeleteTimelinesRequestBody } from './delete_timelines/delete_timelines_route.gen'; export { PersistNoteRouteRequestBody, PersistNoteRouteResponse, ResponseNote, } from './persist_note/persist_note_route.gen'; -export { DeleteNoteRequestBody, DeleteNoteResponse } from './delete_note/delete_note_route.gen'; +export { DeleteNoteRequestBody } from './delete_note/delete_note_route.gen'; export { CleanDraftTimelinesResponse, diff --git a/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable.ts b/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable.ts index 882dcae3e36aa..95ceb5c718825 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/convert_rule_to_diffable.ts @@ -175,11 +175,15 @@ const extractDiffableEqlFieldsFromRuleObject = ( ): RequiredOptional => { return { type: rule.type, - eql_query: extractRuleEqlQuery(rule.query, rule.language, rule.filters), + eql_query: extractRuleEqlQuery({ + query: rule.query, + language: rule.language, + filters: rule.filters, + eventCategoryOverride: rule.event_category_override, + timestampField: rule.timestamp_field, + tiebreakerField: rule.tiebreaker_field, + }), data_source: extractRuleDataSource(rule.index, rule.data_view_id), - event_category_override: rule.event_category_override, - timestamp_field: rule.timestamp_field, - tiebreaker_field: rule.tiebreaker_field, alert_suppression: rule.alert_suppression, }; }; diff --git a/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/extract_rule_data_query.ts b/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/extract_rule_data_query.ts index 4f4164c6a0086..99bb27b99357f 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/extract_rule_data_query.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules/diff/extract_rule_data_query.ts @@ -8,9 +8,12 @@ import type { EqlQueryLanguage, EsqlQueryLanguage, + EventCategoryOverride, KqlQueryLanguage, RuleFilterArray, RuleQuery, + TiebreakerField, + TimestampField, } from '../../../api/detection_engine/model/rule_schema'; import type { InlineKqlQuery, @@ -49,15 +52,23 @@ export const extractInlineKqlQuery = ( }; }; -export const extractRuleEqlQuery = ( - query: RuleQuery, - language: EqlQueryLanguage, - filters: RuleFilterArray | undefined -): RuleEqlQuery => { +interface ExtractRuleEqlQueryParams { + query: RuleQuery; + language: EqlQueryLanguage; + filters: RuleFilterArray | undefined; + eventCategoryOverride: EventCategoryOverride | undefined; + timestampField: TimestampField | undefined; + tiebreakerField: TiebreakerField | undefined; +} + +export const extractRuleEqlQuery = (params: ExtractRuleEqlQueryParams): RuleEqlQuery => { return { - query, - language, - filters: filters ?? [], + query: params.query, + language: params.language, + filters: params.filters ?? [], + event_category_override: params.eventCategoryOverride, + timestamp_field: params.timestampField, + tiebreaker_field: params.tiebreakerField, }; }; diff --git a/x-pack/plugins/security_solution/common/search_strategy/timeline/events/eql/index.ts b/x-pack/plugins/security_solution/common/search_strategy/timeline/events/eql/index.ts index 10f993b468189..ce7805f89db1a 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/timeline/events/eql/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/timeline/events/eql/index.ts @@ -7,7 +7,7 @@ export type { TimelineEqlResponse, - EqlOptionsData, - EqlOptionsSelected, + EqlFieldsComboBoxOptions, + EqlOptions, FieldsEqlOptions, } from '@kbn/timelines-plugin/common'; diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts index 0554ef18a13f7..38d7e2c4584bb 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.gen.ts @@ -88,6 +88,10 @@ export const ElasticRule = z.object({ * The Elastic prebuilt rule id matched. */ prebuilt_rule_id: NonEmptyString.optional(), + /** + * The Elastic integration IDs related to the rule. + */ + integration_ids: z.array(z.string()).optional(), /** * The Elastic rule id installed as a result. */ diff --git a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml index 95ff05df39a15..552d192a641f3 100644 --- a/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml +++ b/x-pack/plugins/security_solution/common/siem_migrations/model/rule_migration.schema.yaml @@ -73,6 +73,11 @@ components: prebuilt_rule_id: description: The Elastic prebuilt rule id matched. $ref: './common.schema.yaml#/components/schemas/NonEmptyString' + integration_ids: + type: array + items: + type: string + description: The Elastic integration IDs related to the rule. id: description: The Elastic rule id installed as a result. $ref: './common.schema.yaml#/components/schemas/NonEmptyString' diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index 562bf9b80d3ea..351e53f2fd013 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -43,13 +43,6 @@ paths: required: true responses: '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object description: Indicates the note was successfully deleted. summary: Delete a note tags: @@ -111,9 +104,7 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/GetNotesResult' - - type: object + $ref: '#/components/schemas/GetNotesResult' description: Indicates the requested notes were returned. summary: Get notes tags: @@ -157,17 +148,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistNote: - $ref: '#/components/schemas/ResponseNote' - required: - - persistNote - required: - - data + $ref: '#/components/schemas/ResponseNote' description: Indicates the note was successfully created. summary: Add or update a note tags: @@ -200,17 +181,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistPinnedEventOnTimeline: - $ref: '#/components/schemas/PersistPinnedEventResponse' - required: - - persistPinnedEventOnTimeline - required: - - data + $ref: '#/components/schemas/PersistPinnedEventResponse' description: Indicates the event was successfully pinned to the Timeline. summary: Pin an event tags: @@ -243,20 +214,6 @@ paths: required: true responses: '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object - properties: - deleteTimeline: - type: boolean - required: - - deleteTimeline - required: - - data description: Indicates the Timeline was successfully deleted. summary: Delete Timelines or Timeline templates tags: @@ -281,20 +238,7 @@ paths: content: application/json: schema: - oneOf: - - type: object - properties: - data: - type: object - properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - getOneTimeline - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/TimelineResponse' description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -636,17 +580,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistFavorite: - $ref: '#/components/schemas/FavoriteTimelineResponse' - required: - - persistFavorite - required: - - data + $ref: '#/components/schemas/FavoriteTimelineResponse' description: Indicates the favorite status was successfully updated. '403': content: @@ -811,15 +745,7 @@ paths: content: application/json: schema: - oneOf: - - type: object - properties: - data: - $ref: '#/components/schemas/ResolvedTimeline' - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/ResolvedTimeline' description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -1089,16 +1015,10 @@ components: FavoriteTimelineResponse: type: object properties: - code: - nullable: true - type: number favorite: items: $ref: '#/components/schemas/FavoriteTimelineResult' type: array - message: - nullable: true - type: string savedObjectId: type: string templateTimelineId: @@ -1267,28 +1187,15 @@ components: - version PersistPinnedEventResponse: oneOf: - - allOf: - - $ref: '#/components/schemas/PinnedEvent' - - $ref: '#/components/schemas/PinnedEventBaseResponseBody' - - nullable: true - type: object - PersistTimelineResponse: - type: object - properties: - data: - type: object + - $ref: '#/components/schemas/PinnedEvent' + - type: object properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline + unpinned: + type: boolean required: - - persistTimeline - required: - - data + - unpinned + PersistTimelineResponse: + $ref: '#/components/schemas/TimelineResponse' PinnedEvent: allOf: - $ref: '#/components/schemas/BarePinnedEvent' @@ -1301,15 +1208,6 @@ components: required: - pinnedEventId - version - PinnedEventBaseResponseBody: - type: object - properties: - code: - type: number - message: - type: string - required: - - code QueryMatchResult: type: object properties: @@ -1350,15 +1248,9 @@ components: ResponseNote: type: object properties: - code: - type: number - message: - type: string note: $ref: '#/components/schemas/Note' required: - - code - - message - note RowRendererId: enum: diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index a68919aa0e1fd..410dd9962f409 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -43,13 +43,6 @@ paths: required: true responses: '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object description: Indicates the note was successfully deleted. summary: Delete a note tags: @@ -111,9 +104,7 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/GetNotesResult' - - type: object + $ref: '#/components/schemas/GetNotesResult' description: Indicates the requested notes were returned. summary: Get notes tags: @@ -157,17 +148,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistNote: - $ref: '#/components/schemas/ResponseNote' - required: - - persistNote - required: - - data + $ref: '#/components/schemas/ResponseNote' description: Indicates the note was successfully created. summary: Add or update a note tags: @@ -200,17 +181,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistPinnedEventOnTimeline: - $ref: '#/components/schemas/PersistPinnedEventResponse' - required: - - persistPinnedEventOnTimeline - required: - - data + $ref: '#/components/schemas/PersistPinnedEventResponse' description: Indicates the event was successfully pinned to the Timeline. summary: Pin an event tags: @@ -243,20 +214,6 @@ paths: required: true responses: '200': - content: - application/json: - schema: - type: object - properties: - data: - type: object - properties: - deleteTimeline: - type: boolean - required: - - deleteTimeline - required: - - data description: Indicates the Timeline was successfully deleted. summary: Delete Timelines or Timeline templates tags: @@ -281,20 +238,7 @@ paths: content: application/json: schema: - oneOf: - - type: object - properties: - data: - type: object - properties: - getOneTimeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - getOneTimeline - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/TimelineResponse' description: Indicates that the (template) Timeline was found and returned. summary: Get Timeline or Timeline template details tags: @@ -636,17 +580,7 @@ paths: content: application/json: schema: - type: object - properties: - data: - type: object - properties: - persistFavorite: - $ref: '#/components/schemas/FavoriteTimelineResponse' - required: - - persistFavorite - required: - - data + $ref: '#/components/schemas/FavoriteTimelineResponse' description: Indicates the favorite status was successfully updated. '403': content: @@ -811,15 +745,7 @@ paths: content: application/json: schema: - oneOf: - - type: object - properties: - data: - $ref: '#/components/schemas/ResolvedTimeline' - required: - - data - - additionalProperties: false - type: object + $ref: '#/components/schemas/ResolvedTimeline' description: The (template) Timeline has been found '400': description: The request is missing parameters @@ -1089,16 +1015,10 @@ components: FavoriteTimelineResponse: type: object properties: - code: - nullable: true - type: number favorite: items: $ref: '#/components/schemas/FavoriteTimelineResult' type: array - message: - nullable: true - type: string savedObjectId: type: string templateTimelineId: @@ -1267,28 +1187,15 @@ components: - version PersistPinnedEventResponse: oneOf: - - allOf: - - $ref: '#/components/schemas/PinnedEvent' - - $ref: '#/components/schemas/PinnedEventBaseResponseBody' - - nullable: true - type: object - PersistTimelineResponse: - type: object - properties: - data: - type: object + - $ref: '#/components/schemas/PinnedEvent' + - type: object properties: - persistTimeline: - type: object - properties: - timeline: - $ref: '#/components/schemas/TimelineResponse' - required: - - timeline + unpinned: + type: boolean required: - - persistTimeline - required: - - data + - unpinned + PersistTimelineResponse: + $ref: '#/components/schemas/TimelineResponse' PinnedEvent: allOf: - $ref: '#/components/schemas/BarePinnedEvent' @@ -1301,15 +1208,6 @@ components: required: - pinnedEventId - version - PinnedEventBaseResponseBody: - type: object - properties: - code: - type: number - message: - type: string - required: - - code QueryMatchResult: type: object properties: @@ -1350,15 +1248,9 @@ components: ResponseNote: type: object properties: - code: - type: number - message: - type: string note: $ref: '#/components/schemas/Note' required: - - code - - message - note RowRendererId: enum: diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.test.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.test.tsx index fff9450b6a1cb..594629e9f9e27 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.test.tsx @@ -58,7 +58,7 @@ describe('AlertsPreview', () => { it('renders', () => { const { getByTestId } = render( - + ); @@ -68,7 +68,7 @@ describe('AlertsPreview', () => { it('renders correct alerts number', () => { const { getByTestId } = render( - + ); @@ -78,7 +78,7 @@ describe('AlertsPreview', () => { it('should render the correct number of distribution bar section based on the number of severities', () => { const { queryAllByTestId } = render( - + ); diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.tsx index a5f08527cdc77..8edd0b7981936 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/alerts/alerts_preview.tsx @@ -5,40 +5,21 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { capitalize } from 'lodash'; import type { EuiThemeComputed } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, EuiTitle, useEuiTheme } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { DistributionBar } from '@kbn/security-solution-distribution-bar'; -import { - buildEntityFlyoutPreviewQuery, - getAbbreviatedNumber, -} from '@kbn/cloud-security-posture-common'; -import { hasVulnerabilitiesData } from '@kbn/cloud-security-posture'; -import { useMisconfigurationPreview } from '@kbn/cloud-security-posture/src/hooks/use_misconfiguration_preview'; -import { useVulnerabilitiesPreview } from '@kbn/cloud-security-posture/src/hooks/use_vulnerabilities_preview'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { getAbbreviatedNumber } from '@kbn/cloud-security-posture-common'; import type { AlertsByStatus, ParsedAlertsData, } from '../../../overview/components/detection_response/alerts_by_status/types'; import { ExpandablePanel } from '../../../flyout/shared/components/expandable_panel'; import { getSeverityColor } from '../../../detections/components/alerts_kpis/severity_level_panel/helpers'; -import type { HostRiskScore, UserRiskScore } from '../../../../common/search_strategy'; -import { - buildHostNamesFilter, - buildUserNamesFilter, - RiskScoreEntity, -} from '../../../../common/search_strategy'; -import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; -import { FIRST_RECORD_PAGINATION } from '../../../entity_analytics/common'; -import { HostDetailsPanelKey } from '../../../flyout/entity_details/host_details_left'; -import { - EntityDetailsLeftPanelTab, - CspInsightLeftPanelSubTab, -} from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; -import { UserDetailsPanelKey } from '../../../flyout/entity_details/user_details_left'; +import { CspInsightLeftPanelSubTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; +import { useNavigateEntityInsight } from '../../hooks/use_entity_insight'; const AlertsCount = ({ alertsTotal, @@ -77,13 +58,13 @@ const AlertsCount = ({ export const AlertsPreview = ({ alertsData, - fieldName, - name, + field, + value, isPreviewMode, }: { alertsData: ParsedAlertsData; - fieldName: string; - name: string; + field: 'host.name' | 'user.name'; + value: string; isPreviewMode?: boolean; }) => { const { euiTheme } = useEuiTheme(); @@ -107,101 +88,14 @@ export const AlertsPreview = ({ const totalAlertsCount = alertStats.reduce((total, item) => total + item.count, 0); - const { data } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery(fieldName, name), - sort: [], - enabled: true, - pageSize: 1, - ignore_unavailable: true, - }); - const isUsingHostName = fieldName === 'host.name'; - const passedFindings = data?.count.passed || 0; - const failedFindings = data?.count.failed || 0; - - const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - - const { data: vulnerabilitiesData } = useVulnerabilitiesPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', name), - sort: [], - enabled: true, - pageSize: 1, - }); - - const { - CRITICAL = 0, - HIGH = 0, - MEDIUM = 0, - LOW = 0, - NONE = 0, - } = vulnerabilitiesData?.count || {}; - - const hasVulnerabilitiesFindings = hasVulnerabilitiesData({ - critical: CRITICAL, - high: HIGH, - medium: MEDIUM, - low: LOW, - none: NONE, - }); - - const buildFilterQuery = useMemo( - () => (isUsingHostName ? buildHostNamesFilter([name]) : buildUserNamesFilter([name])), - [isUsingHostName, name] - ); - - const riskScoreState = useRiskScore({ - riskEntity: isUsingHostName ? RiskScoreEntity.host : RiskScoreEntity.user, - filterQuery: buildFilterQuery, - onlyLatest: false, - pagination: FIRST_RECORD_PAGINATION, - }); - - const { data: hostRisk } = riskScoreState; - - const riskData = hostRisk?.[0]; - - const isRiskScoreExist = isUsingHostName - ? !!(riskData as HostRiskScore)?.host.risk - : !!(riskData as UserRiskScore)?.user.risk; - const hasNonClosedAlerts = totalAlertsCount > 0; - const { openLeftPanel } = useExpandableFlyoutApi(); - - const goToEntityInsightTab = useCallback(() => { - openLeftPanel({ - id: isUsingHostName ? HostDetailsPanelKey : UserDetailsPanelKey, - params: isUsingHostName - ? { - name, - isRiskScoreExist, - hasMisconfigurationFindings, - hasVulnerabilitiesFindings, - hasNonClosedAlerts, - path: { - tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, - subTab: CspInsightLeftPanelSubTab.ALERTS, - }, - } - : { - user: { name }, - isRiskScoreExist, - hasMisconfigurationFindings, - hasNonClosedAlerts, - path: { - tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, - subTab: CspInsightLeftPanelSubTab.ALERTS, - }, - }, - }); - }, [ - hasMisconfigurationFindings, - hasNonClosedAlerts, - hasVulnerabilitiesFindings, - isRiskScoreExist, - isUsingHostName, - name, - openLeftPanel, - ]); + const { goToEntityInsightTab } = useNavigateEntityInsight({ + field, + value, + queryIdExtension: 'ALERTS_PREVIEW', + subTab: CspInsightLeftPanelSubTab.ALERTS, + }); const link = useMemo( () => !isPreviewMode diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/alerts_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/alerts_findings_details_table.tsx index 966de68e3497f..6567fb41a93f4 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/alerts_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/alerts_findings_details_table.tsx @@ -60,7 +60,7 @@ interface AlertsDetailsFields { } export const AlertsDetailsTable = memo( - ({ fieldName, queryName }: { fieldName: 'host.name' | 'user.name'; queryName: string }) => { + ({ field, value }: { field: 'host.name' | 'user.name'; value: string }) => { useEffect(() => { uiMetricService.trackUiMetric( METRIC_TYPE.COUNT, @@ -90,7 +90,7 @@ export const AlertsDetailsTable = memo( const { to, from } = useGlobalTime(); const { signalIndexName } = useSignalIndex(); const { data } = useQueryAlerts({ - query: buildEntityAlertsQuery(fieldName, to, from, queryName, 500), + query: buildEntityAlertsQuery(field, to, from, value, 500), queryName: ALERTS_QUERY_NAMES.BY_RULE_BY_STATUS, indexName: signalIndexName, }); @@ -216,11 +216,11 @@ export const AlertsDetailsTable = memo( [ { title: - fieldName === 'host.name' + field === 'host.name' ? OPEN_IN_ALERTS_TITLE_HOSTNAME : OPEN_IN_ALERTS_TITLE_USERNAME, - selectedOptions: [queryName], - fieldName, + selectedOptions: [value], + fieldName: field, }, { title: OPEN_IN_ALERTS_TITLE_STATUS, @@ -230,7 +230,7 @@ export const AlertsDetailsTable = memo( ], true ), - [fieldName, openAlertsPageWithFilters, queryName] + [field, openAlertsPageWithFilters, value] ); return ( diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx index 2e7b4171fd023..84e3ee4faee99 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/insights_tab_csp.tsx @@ -42,7 +42,7 @@ function isCspFlyoutPanelProps( } export const InsightsTabCsp = memo( - ({ name, fieldName }: { name: string; fieldName: 'host.name' | 'user.name' }) => { + ({ value, field }: { value: string; field: 'host.name' | 'user.name' }) => { const panels = useExpandableFlyoutState(); let hasMisconfigurationFindings = false; @@ -150,11 +150,11 @@ export const InsightsTabCsp = memo( /> {activeInsightsId === CspInsightLeftPanelSubTab.MISCONFIGURATIONS ? ( - + ) : activeInsightsId === CspInsightLeftPanelSubTab.VULNERABILITIES ? ( - + ) : ( - + )} ); diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx index 69912c58e4e15..00430c2b87262 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx @@ -59,7 +59,7 @@ const getFindingsStats = (passedFindingsStats: number, failedFindingsStats: numb * Insights view displayed in the document details expandable flyout left section */ export const MisconfigurationFindingsDetailsTable = memo( - ({ fieldName, queryName }: { fieldName: 'host.name' | 'user.name'; queryName: string }) => { + ({ field, value }: { field: 'host.name' | 'user.name'; value: string }) => { useEffect(() => { uiMetricService.trackUiMetric( METRIC_TYPE.COUNT, @@ -68,7 +68,7 @@ export const MisconfigurationFindingsDetailsTable = memo( }, []); const { data } = useMisconfigurationFindings({ - query: buildEntityFlyoutPreviewQuery(fieldName, queryName), + query: buildEntityFlyoutPreviewQuery(field, value), sort: [], enabled: true, pageSize: 1, @@ -183,7 +183,7 @@ export const MisconfigurationFindingsDetailsTable = memo( { diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx index 82c5f91bf4250..155946a791f79 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx @@ -44,7 +44,7 @@ interface VulnerabilitiesPackage extends Vulnerability { }; } -export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryName: string }) => { +export const VulnerabilitiesFindingsDetailsTable = memo(({ value }: { value: string }) => { useEffect(() => { uiMetricService.trackUiMetric( METRIC_TYPE.COUNT, @@ -53,7 +53,7 @@ export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryN }, []); const { data } = useVulnerabilitiesFindings({ - query: buildEntityFlyoutPreviewQuery('host.name', queryName), + query: buildEntityFlyoutPreviewQuery('host.name', value), sort: [], enabled: true, pageSize: 1, @@ -204,7 +204,7 @@ export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryN { diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/entity_insight.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/entity_insight.tsx index 7139994f7e972..eec66e765371b 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/entity_insight.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/entity_insight.tsx @@ -7,97 +7,56 @@ import { EuiAccordion, EuiHorizontalRule, EuiSpacer, EuiTitle, useEuiTheme } from '@elastic/eui'; -import React, { useMemo } from 'react'; +import React from 'react'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useMisconfigurationPreview } from '@kbn/cloud-security-posture/src/hooks/use_misconfiguration_preview'; -import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; -import { useVulnerabilitiesPreview } from '@kbn/cloud-security-posture/src/hooks/use_vulnerabilities_preview'; -import { hasVulnerabilitiesData } from '@kbn/cloud-security-posture'; -import { FILTER_CLOSED } from '../../../common/types'; +import { useHasVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_has_vulnerabilities'; +import { useHasMisconfigurations } from '@kbn/cloud-security-posture/src/hooks/use_has_misconfigurations'; import { MisconfigurationsPreview } from './misconfiguration/misconfiguration_preview'; import { VulnerabilitiesPreview } from './vulnerabilities/vulnerabilities_preview'; import { AlertsPreview } from './alerts/alerts_preview'; import { useGlobalTime } from '../../common/containers/use_global_time'; -import type { ParsedAlertsData } from '../../overview/components/detection_response/alerts_by_status/types'; import { DETECTION_RESPONSE_ALERTS_BY_STATUS_ID } from '../../overview/components/detection_response/alerts_by_status/types'; -import { useAlertsByStatus } from '../../overview/components/detection_response/alerts_by_status/use_alerts_by_status'; -import { useSignalIndex } from '../../detections/containers/detection_engine/alerts/use_signal_index'; +import { useNonClosedAlerts } from '../hooks/use_non_closed_alerts'; export const EntityInsight = ({ - name, - fieldName, + value, + field, isPreviewMode, }: { - name: string; - fieldName: 'host.name' | 'user.name'; + value: string; + field: 'host.name' | 'user.name'; isPreviewMode?: boolean; }) => { const { euiTheme } = useEuiTheme(); const insightContent: React.ReactElement[] = []; - const { data: dataMisconfiguration } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery(fieldName, name), - sort: [], - enabled: true, - pageSize: 1, - }); - - const passedFindings = dataMisconfiguration?.count.passed || 0; - const failedFindings = dataMisconfiguration?.count.failed || 0; - - const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - - const { data } = useVulnerabilitiesPreview({ - query: buildEntityFlyoutPreviewQuery(fieldName, name), - sort: [], - enabled: true, - pageSize: 1, - }); - - const { CRITICAL = 0, HIGH = 0, MEDIUM = 0, LOW = 0, NONE = 0 } = data?.count || {}; - - const hasVulnerabilitiesFindings = hasVulnerabilitiesData({ - critical: CRITICAL, - high: HIGH, - medium: MEDIUM, - low: LOW, - none: NONE, - }); - - const isVulnerabilitiesFindingForHost = hasVulnerabilitiesFindings && fieldName === 'host.name'; + const { hasMisconfigurationFindings: showMisconfigurationsPreview } = useHasMisconfigurations( + field, + value + ); - const { signalIndexName } = useSignalIndex(); + const { hasVulnerabilitiesFindings } = useHasVulnerabilities(field, value); - const entityFilter = useMemo(() => ({ field: fieldName, value: name }), [fieldName, name]); + const showVulnerabilitiesPreview = hasVulnerabilitiesFindings && field === 'host.name'; const { to, from } = useGlobalTime(); - const { items: alertsData } = useAlertsByStatus({ - entityFilter, - signalIndexName, - queryId: DETECTION_RESPONSE_ALERTS_BY_STATUS_ID, + const { hasNonClosedAlerts: showAlertsPreview, filteredAlertsData } = useNonClosedAlerts({ + field, + value, to, from, + queryId: DETECTION_RESPONSE_ALERTS_BY_STATUS_ID, }); - const filteredAlertsData: ParsedAlertsData = alertsData - ? Object.fromEntries(Object.entries(alertsData).filter(([key]) => key !== FILTER_CLOSED)) - : {}; - - const alertsOpenCount = filteredAlertsData?.open?.total || 0; - - const alertsAcknowledgedCount = filteredAlertsData?.acknowledged?.total || 0; - - const alertsCount = alertsOpenCount + alertsAcknowledgedCount; - - if (alertsCount > 0) { + if (showAlertsPreview) { insightContent.push( <> @@ -105,34 +64,23 @@ export const EntityInsight = ({ ); } - if (hasMisconfigurationFindings) + if (showMisconfigurationsPreview) insightContent.push( <> - 0} - isPreviewMode={isPreviewMode} - /> + ); - if (isVulnerabilitiesFindingForHost && hasVulnerabilitiesFindings) + if (showVulnerabilitiesPreview) insightContent.push( <> - 0} - /> + ); return ( <> - {(insightContent.length > 0 || - hasMisconfigurationFindings || - (isVulnerabilitiesFindingForHost && hasVulnerabilitiesFindings)) && ( + {insightContent.length > 0 && ( <> { it('renders', () => { const { getByTestId } = render( - + ); diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx index 42a5906ce4e36..c7c1889a5838b 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/misconfiguration/misconfiguration_preview.tsx @@ -5,39 +5,23 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo } from 'react'; import { css } from '@emotion/react'; import type { EuiThemeComputed } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, useEuiTheme, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { DistributionBar } from '@kbn/security-solution-distribution-bar'; -import { useMisconfigurationPreview } from '@kbn/cloud-security-posture/src/hooks/use_misconfiguration_preview'; +import { useHasMisconfigurations } from '@kbn/cloud-security-posture/src/hooks/use_has_misconfigurations'; import { i18n } from '@kbn/i18n'; -import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useVulnerabilitiesPreview } from '@kbn/cloud-security-posture/src/hooks/use_vulnerabilities_preview'; -import { hasVulnerabilitiesData, statusColors } from '@kbn/cloud-security-posture'; +import { statusColors } from '@kbn/cloud-security-posture'; import { METRIC_TYPE } from '@kbn/analytics'; import { ENTITY_FLYOUT_WITH_MISCONFIGURATION_VISIT, uiMetricService, } from '@kbn/cloud-security-posture-common/utils/ui_metrics'; import { ExpandablePanel } from '../../../flyout/shared/components/expandable_panel'; -import { - CspInsightLeftPanelSubTab, - EntityDetailsLeftPanelTab, -} from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; -import { UserDetailsPanelKey } from '../../../flyout/entity_details/user_details_left'; -import { HostDetailsPanelKey } from '../../../flyout/entity_details/host_details_left'; -import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; -import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; -import type { HostRiskScore, UserRiskScore } from '../../../../common/search_strategy'; -import { buildHostNamesFilter, buildUserNamesFilter } from '../../../../common/search_strategy'; - -const FIRST_RECORD_PAGINATION = { - cursorStart: 0, - querySize: 1, -}; +import { CspInsightLeftPanelSubTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; +import { useNavigateEntityInsight } from '../../hooks/use_entity_insight'; export const getFindingsStats = (passedFindingsStats: number, failedFindingsStats: number) => { if (passedFindingsStats === 0 && failedFindingsStats === 0) return []; @@ -101,113 +85,30 @@ const MisconfigurationPreviewScore = ({ }; export const MisconfigurationsPreview = ({ - name, - fieldName, - hasNonClosedAlerts = false, + value, + field, isPreviewMode, }: { - name: string; - fieldName: 'host.name' | 'user.name'; - hasNonClosedAlerts?: boolean; + value: string; + field: 'host.name' | 'user.name'; isPreviewMode?: boolean; }) => { - const { data } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery(fieldName, name), - sort: [], - enabled: true, - pageSize: 1, - ignore_unavailable: true, - }); - const isUsingHostName = fieldName === 'host.name'; - const passedFindings = data?.count.passed || 0; - const failedFindings = data?.count.failed || 0; + const { hasMisconfigurationFindings, passedFindings, failedFindings } = useHasMisconfigurations( + field, + value + ); useEffect(() => { uiMetricService.trackUiMetric(METRIC_TYPE.CLICK, ENTITY_FLYOUT_WITH_MISCONFIGURATION_VISIT); }, []); const { euiTheme } = useEuiTheme(); - const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - const { data: vulnerabilitiesData } = useVulnerabilitiesPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', name), - sort: [], - enabled: true, - pageSize: 1, + const { goToEntityInsightTab } = useNavigateEntityInsight({ + field, + value, + queryIdExtension: 'MISCONFIGURATION_PREVIEW', + subTab: CspInsightLeftPanelSubTab.MISCONFIGURATIONS, }); - - const { - CRITICAL = 0, - HIGH = 0, - MEDIUM = 0, - LOW = 0, - NONE = 0, - } = vulnerabilitiesData?.count || {}; - - const hasVulnerabilitiesFindings = hasVulnerabilitiesData({ - critical: CRITICAL, - high: HIGH, - medium: MEDIUM, - low: LOW, - none: NONE, - }); - - const buildFilterQuery = useMemo( - () => (isUsingHostName ? buildHostNamesFilter([name]) : buildUserNamesFilter([name])), - [isUsingHostName, name] - ); - - const riskScoreState = useRiskScore({ - riskEntity: isUsingHostName ? RiskScoreEntity.host : RiskScoreEntity.user, - filterQuery: buildFilterQuery, - onlyLatest: false, - pagination: FIRST_RECORD_PAGINATION, - }); - - const { data: hostRisk } = riskScoreState; - - const riskData = hostRisk?.[0]; - - const isRiskScoreExist = isUsingHostName - ? !!(riskData as HostRiskScore)?.host.risk - : !!(riskData as UserRiskScore)?.user.risk; - - const { openLeftPanel } = useExpandableFlyoutApi(); - - const goToEntityInsightTab = useCallback(() => { - openLeftPanel({ - id: isUsingHostName ? HostDetailsPanelKey : UserDetailsPanelKey, - params: isUsingHostName - ? { - name, - isRiskScoreExist, - hasMisconfigurationFindings, - hasVulnerabilitiesFindings, - hasNonClosedAlerts, - path: { - tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, - subTab: CspInsightLeftPanelSubTab.MISCONFIGURATIONS, - }, - } - : { - user: { name }, - isRiskScoreExist, - hasMisconfigurationFindings, - hasNonClosedAlerts, - path: { - tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, - subTab: CspInsightLeftPanelSubTab.MISCONFIGURATIONS, - }, - }, - }); - }, [ - hasMisconfigurationFindings, - hasNonClosedAlerts, - hasVulnerabilitiesFindings, - isRiskScoreExist, - isUsingHostName, - name, - openLeftPanel, - ]); const link = useMemo( () => !isPreviewMode diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.test.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.test.tsx index cc71d1be2158d..14a6366fd4baa 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.test.tsx @@ -37,7 +37,7 @@ describe('VulnerabilitiesPreview', () => { it('renders', () => { const { getByTestId } = render( - + ); diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.tsx index c4335d921e371..5a5b638abafa3 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/vulnerabilities/vulnerabilities_preview.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo } from 'react'; import { css } from '@emotion/react'; import type { EuiThemeComputed } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, useEuiTheme, EuiTitle } from '@elastic/eui'; @@ -17,24 +17,14 @@ import { getAbbreviatedNumber, } from '@kbn/cloud-security-posture-common'; import { getVulnerabilityStats, hasVulnerabilitiesData } from '@kbn/cloud-security-posture'; -import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; -import { useMisconfigurationPreview } from '@kbn/cloud-security-posture/src/hooks/use_misconfiguration_preview'; import { ENTITY_FLYOUT_WITH_VULNERABILITY_PREVIEW, uiMetricService, } from '@kbn/cloud-security-posture-common/utils/ui_metrics'; import { METRIC_TYPE } from '@kbn/analytics'; import { ExpandablePanel } from '../../../flyout/shared/components/expandable_panel'; -import { EntityDetailsLeftPanelTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; -import { HostDetailsPanelKey } from '../../../flyout/entity_details/host_details_left'; -import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; -import { RiskScoreEntity } from '../../../../common/entity_analytics/risk_engine'; -import { buildHostNamesFilter } from '../../../../common/search_strategy'; - -const FIRST_RECORD_PAGINATION = { - cursorStart: 0, - querySize: 1, -}; +import { CspInsightLeftPanelSubTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; +import { useNavigateEntityInsight } from '../../hooks/use_entity_insight'; const VulnerabilitiesCount = ({ vulnerabilitiesTotal, @@ -70,20 +60,20 @@ const VulnerabilitiesCount = ({ }; export const VulnerabilitiesPreview = ({ - name, + value, + field, isPreviewMode, - hasNonClosedAlerts = false, }: { - name: string; + value: string; + field: 'host.name' | 'user.name'; isPreviewMode?: boolean; - hasNonClosedAlerts?: boolean; }) => { useEffect(() => { uiMetricService.trackUiMetric(METRIC_TYPE.CLICK, ENTITY_FLYOUT_WITH_VULNERABILITY_PREVIEW); }, []); const { data } = useVulnerabilitiesPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', name), + query: buildEntityFlyoutPreviewQuery(field, value), sort: [], enabled: true, pageSize: 1, @@ -103,49 +93,12 @@ export const VulnerabilitiesPreview = ({ const { euiTheme } = useEuiTheme(); - const { data: dataMisconfiguration } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', name), - sort: [], - enabled: true, - pageSize: 1, - }); - - const passedFindings = dataMisconfiguration?.count.passed || 0; - const failedFindings = dataMisconfiguration?.count.failed || 0; - - const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - - const buildFilterQuery = useMemo(() => buildHostNamesFilter([name]), [name]); - const riskScoreState = useRiskScore({ - riskEntity: RiskScoreEntity.host, - filterQuery: buildFilterQuery, - onlyLatest: false, - pagination: FIRST_RECORD_PAGINATION, + const { goToEntityInsightTab } = useNavigateEntityInsight({ + field, + value, + queryIdExtension: 'VULNERABILITIES_PREVIEW', + subTab: CspInsightLeftPanelSubTab.VULNERABILITIES, }); - const { data: hostRisk } = riskScoreState; - const riskData = hostRisk?.[0]; - const isRiskScoreExist = riskData?.host.risk; - const { openLeftPanel } = useExpandableFlyoutApi(); - const goToEntityInsightTab = useCallback(() => { - openLeftPanel({ - id: HostDetailsPanelKey, - params: { - name, - isRiskScoreExist, - hasMisconfigurationFindings, - hasVulnerabilitiesFindings, - hasNonClosedAlerts, - path: { tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, subTab: 'vulnerabilitiesTabId' }, - }, - }); - }, [ - hasMisconfigurationFindings, - hasNonClosedAlerts, - hasVulnerabilitiesFindings, - isRiskScoreExist, - name, - openLeftPanel, - ]); const link = useMemo( () => !isPreviewMode diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_entity_insight.ts b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_entity_insight.ts new file mode 100644 index 0000000000000..fc35474ffdef0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_entity_insight.ts @@ -0,0 +1,89 @@ +/* + * 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 { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useCallback } from 'react'; +import { useHasVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_has_vulnerabilities'; +import { useHasMisconfigurations } from '@kbn/cloud-security-posture/src/hooks/use_has_misconfigurations'; +import { UserDetailsPanelKey } from '../../flyout/entity_details/user_details_left'; +import { HostDetailsPanelKey } from '../../flyout/entity_details/host_details_left'; +import { EntityDetailsLeftPanelTab } from '../../flyout/entity_details/shared/components/left_panel/left_panel_header'; +import { useGlobalTime } from '../../common/containers/use_global_time'; +import { DETECTION_RESPONSE_ALERTS_BY_STATUS_ID } from '../../overview/components/detection_response/alerts_by_status/types'; +import { useNonClosedAlerts } from './use_non_closed_alerts'; +import { useHasRiskScore } from './use_risk_score_data'; + +export const useNavigateEntityInsight = ({ + field, + value, + subTab, + queryIdExtension, +}: { + field: 'host.name' | 'user.name'; + value: string; + subTab: string; + queryIdExtension: string; +}) => { + const isHostNameField = field === 'host.name'; + const { to, from } = useGlobalTime(); + + const { hasNonClosedAlerts } = useNonClosedAlerts({ + field, + value, + to, + from, + queryId: `${DETECTION_RESPONSE_ALERTS_BY_STATUS_ID}${queryIdExtension}`, + }); + + const { hasVulnerabilitiesFindings } = useHasVulnerabilities(field, value); + + const { hasRiskScore } = useHasRiskScore({ + field, + value, + }); + const { hasMisconfigurationFindings } = useHasMisconfigurations(field, value); + const { openLeftPanel } = useExpandableFlyoutApi(); + + const goToEntityInsightTab = useCallback(() => { + openLeftPanel({ + id: isHostNameField ? HostDetailsPanelKey : UserDetailsPanelKey, + params: isHostNameField + ? { + name: value, + isRiskScoreExist: hasRiskScore, + hasMisconfigurationFindings, + hasVulnerabilitiesFindings, + hasNonClosedAlerts, + path: { + tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, + subTab, + }, + } + : { + user: { name: value }, + isRiskScoreExist: hasRiskScore, + hasMisconfigurationFindings, + hasNonClosedAlerts, + path: { + tab: EntityDetailsLeftPanelTab.CSP_INSIGHTS, + subTab, + }, + }, + }); + }, [ + openLeftPanel, + isHostNameField, + value, + hasRiskScore, + hasMisconfigurationFindings, + hasVulnerabilitiesFindings, + hasNonClosedAlerts, + subTab, + ]); + + return { goToEntityInsightTab }; +}; diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_non_closed_alerts.ts b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_non_closed_alerts.ts new file mode 100644 index 0000000000000..598f78cd68402 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_non_closed_alerts.ts @@ -0,0 +1,47 @@ +/* + * 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 { useMemo } from 'react'; +import { FILTER_CLOSED } from '@kbn/securitysolution-data-table/common/types'; +import { useSignalIndex } from '../../detections/containers/detection_engine/alerts/use_signal_index'; +import { useAlertsByStatus } from '../../overview/components/detection_response/alerts_by_status/use_alerts_by_status'; +import type { ParsedAlertsData } from '../../overview/components/detection_response/alerts_by_status/types'; + +export const useNonClosedAlerts = ({ + field, + value, + to, + from, + queryId, +}: { + field: 'host.name' | 'user.name'; + value: string; + to: string; + from: string; + queryId: string; +}) => { + const { signalIndexName } = useSignalIndex(); + + const entityFilter = useMemo(() => ({ field, value }), [field, value]); + + const { items: alertsData } = useAlertsByStatus({ + entityFilter, + signalIndexName, + queryId, + to, + from, + }); + + const filteredAlertsData: ParsedAlertsData = alertsData + ? Object.fromEntries(Object.entries(alertsData).filter(([key]) => key !== FILTER_CLOSED)) + : {}; + + const hasNonClosedAlerts = + (filteredAlertsData?.acknowledged?.total || 0) + (filteredAlertsData?.open?.total || 0) > 0; + + return { hasNonClosedAlerts, filteredAlertsData }; +}; diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_risk_score_data.ts b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_risk_score_data.ts new file mode 100644 index 0000000000000..b100fe30b105b --- /dev/null +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/hooks/use_risk_score_data.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { + RiskScoreEntity, + type HostRiskScore, + type UserRiskScore, + buildHostNamesFilter, + buildUserNamesFilter, +} from '../../../common/search_strategy'; +import { useRiskScore } from '../../entity_analytics/api/hooks/use_risk_score'; +import { FIRST_RECORD_PAGINATION } from '../../entity_analytics/common'; + +export const useHasRiskScore = ({ + field, + value, +}: { + field: 'host.name' | 'user.name'; + value: string; +}) => { + const isHostNameField = field === 'host.name'; + const buildFilterQuery = useMemo( + () => (isHostNameField ? buildHostNamesFilter([value]) : buildUserNamesFilter([value])), + [isHostNameField, value] + ); + const { data } = useRiskScore({ + riskEntity: isHostNameField ? RiskScoreEntity.host : RiskScoreEntity.user, + filterQuery: buildFilterQuery, + onlyLatest: false, + pagination: FIRST_RECORD_PAGINATION, + }); + + const riskData = data?.[0]; + + const hasRiskScore = isHostNameField + ? !!(riskData as HostRiskScore)?.host.risk + : !!(riskData as UserRiskScore)?.user.risk; + + return { hasRiskScore }; +}; diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_data_providers.test.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_data_providers.test.ts index 4d1807b91b718..f8b0e1bff9441 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_data_providers.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_data_providers.test.ts @@ -4,13 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; -import type { UseInsightDataProvidersProps, Provider } from './use_insight_data_providers'; + +import { renderHook } from '@testing-library/react'; +import type { Provider } from './use_insight_data_providers'; import type { TimelineEventsDetailsItem } from '../../../../../../common/search_strategy'; -import { - useInsightDataProviders, - type UseInsightDataProvidersResult, -} from './use_insight_data_providers'; +import { useInsightDataProviders } from './use_insight_data_providers'; import { mockAlertDetailsData } from '../../../event_details/mocks'; const mockAlertDetailsDataWithIsObject = mockAlertDetailsData.map((detail) => { @@ -103,7 +101,7 @@ const providerWithRange: Provider[][] = [ describe('useInsightDataProviders', () => { it('should return 2 data providers, 1 with a nested provider ANDed to it', () => { - const { result } = renderHook(() => + const { result } = renderHook(() => useInsightDataProviders({ providers: nestedAndProvider, alertData: mockAlertDetailsDataWithIsObject, @@ -117,7 +115,7 @@ describe('useInsightDataProviders', () => { }); it('should return 3 data providers without any containing nested ANDs', () => { - const { result } = renderHook(() => + const { result } = renderHook(() => useInsightDataProviders({ providers: topLevelOnly, alertData: mockAlertDetailsDataWithIsObject, @@ -130,7 +128,7 @@ describe('useInsightDataProviders', () => { }); it('should use the string literal if no field in the alert matches a bracketed value', () => { - const { result } = renderHook(() => + const { result } = renderHook(() => useInsightDataProviders({ providers: nonExistantField, alertData: mockAlertDetailsDataWithIsObject, @@ -145,7 +143,7 @@ describe('useInsightDataProviders', () => { }); it('should use template data providers when called without alertData', () => { - const { result } = renderHook(() => + const { result } = renderHook(() => useInsightDataProviders({ providers: nestedAndProvider, }) @@ -159,7 +157,7 @@ describe('useInsightDataProviders', () => { }); it('should return an empty array of dataProviders and populated filters if a provider contains a range type', () => { - const { result } = renderHook(() => + const { result } = renderHook(() => useInsightDataProviders({ providers: providerWithRange, }) diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.test.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.test.ts index a162c625c7adc..98d5e2f3f7df4 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.test.ts @@ -4,13 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { QueryOperator } from '@kbn/timelines-plugin/common'; import { DataProviderTypeEnum } from '../../../../../../common/api/timeline'; import { useInsightQuery } from './use_insight_query'; import { TestProviders } from '../../../../mock'; -import type { UseInsightQuery, UseInsightQueryResult } from './use_insight_query'; import { IS_OPERATOR } from '../../../../../timelines/components/timeline/data_providers/data_provider'; const mockProvider = { @@ -30,7 +28,7 @@ const mockProvider = { describe('useInsightQuery', () => { it('should return renderable defaults', () => { - const { result } = renderHook, UseInsightQueryResult>( + const { result } = renderHook( () => useInsightQuery({ dataProviders: [mockProvider], diff --git a/x-pack/plugins/security_solution/public/common/hooks/eql/api.test.ts b/x-pack/plugins/security_solution/public/common/hooks/eql/api.test.ts index ee7c9a1515f9e..a0e47595c5da7 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/eql/api.test.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/eql/api.test.ts @@ -34,7 +34,7 @@ const triggerValidateEql = () => { query: 'any where true', signal, runtimeMappings: undefined, - options: undefined, + eqlOptions: undefined, }); }; diff --git a/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts b/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts index 569344297f319..b586e0593ab6f 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/eql/api.ts @@ -11,7 +11,7 @@ import type { EqlSearchStrategyRequest, EqlSearchStrategyResponse } from '@kbn/d import { EQL_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { EqlOptionsSelected } from '../../../../common/search_strategy'; +import type { EqlOptions } from '../../../../common/search_strategy'; import { getValidationErrors, isErrorResponse, @@ -31,9 +31,9 @@ interface Params { dataViewTitle: string; query: string; data: DataPublicPluginStart; - signal: AbortSignal; runtimeMappings: estypes.MappingRuntimeFields | undefined; - options: Omit | undefined; + eqlOptions: Omit | undefined; + signal?: AbortSignal; } export interface EqlResponseError { @@ -51,9 +51,9 @@ export const validateEql = async ({ data, dataViewTitle, query, - signal, runtimeMappings, - options, + eqlOptions, + signal, }: Params): Promise => { try { const { rawResponse: response } = await firstValueFrom( @@ -62,9 +62,12 @@ export const validateEql = async ({ params: { index: dataViewTitle, body: { query, runtime_mappings: runtimeMappings, size: 0 }, - timestamp_field: options?.timestampField, - tiebreaker_field: options?.tiebreakerField || undefined, - event_category_field: options?.eventCategoryField, + // Prevent passing empty string values + timestamp_field: eqlOptions?.timestampField ? eqlOptions.timestampField : undefined, + tiebreaker_field: eqlOptions?.tiebreakerField ? eqlOptions.tiebreakerField : undefined, + event_category_field: eqlOptions?.eventCategoryField + ? eqlOptions.eventCategoryField + : undefined, }, options: { ignore: [400] }, }, @@ -79,19 +82,23 @@ export const validateEql = async ({ valid: false, error: { code: EQL_ERROR_CODES.INVALID_SYNTAX, messages: getValidationErrors(response) }, }; - } else if (isVerificationErrorResponse(response) || isMappingErrorResponse(response)) { + } + + if (isVerificationErrorResponse(response) || isMappingErrorResponse(response)) { return { valid: false, error: { code: EQL_ERROR_CODES.INVALID_EQL, messages: getValidationErrors(response) }, }; - } else if (isErrorResponse(response)) { + } + + if (isErrorResponse(response)) { return { valid: false, error: { code: EQL_ERROR_CODES.FAILED_REQUEST, error: new Error(JSON.stringify(response)) }, }; - } else { - return { valid: true }; } + + return { valid: true }; } catch (error) { if (error instanceof Error && error.message.startsWith('index_not_found_exception')) { return { @@ -99,6 +106,7 @@ export const validateEql = async ({ error: { code: EQL_ERROR_CODES.MISSING_DATA_SOURCE, messages: [error.message] }, }; } + return { valid: false, error: { diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 6ae63769b114d..79bd0eb558683 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -349,7 +349,6 @@ export const mockGlobalState: State = { description: '', eqlOptions: { eventCategoryField: 'event.category', - tiebreakerField: '', timestampField: '@timestamp', }, eventIdToNoteIds: { '1': ['1'] }, diff --git a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts index 406ff1f4ffe31..5feee5adafcdc 100644 --- a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts +++ b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts @@ -2015,15 +2015,6 @@ export const mockGetOneTimelineResult: TimelineResponse = { version: '1', }; -export const mockTimelineResult = { - data: { - getOneTimeline: mockGetOneTimelineResult, - }, - loading: false, - networkStatus: 7, - stale: false, -}; - export const defaultTimelineProps: CreateTimelineProps = { from: '2018-11-05T18:58:25.937Z', timeline: { @@ -2051,7 +2042,6 @@ export const defaultTimelineProps: CreateTimelineProps = { eventCategoryField: 'event.category', query: '', size: 100, - tiebreakerField: '', timestampField: '@timestamp', }, eventIdToNoteIds: {}, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_overview_link.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_overview_link.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_overview_link.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_overview_link.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.test.tsx similarity index 64% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.test.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.test.tsx index 67e0e516e22e3..0496f08dd264c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.test.tsx @@ -8,9 +8,10 @@ import React from 'react'; import { shallow } from 'enzyme'; import { render, screen, fireEvent, within } from '@testing-library/react'; - +import type { SecuritySolutionDataViewBase } from '../../../../common/types'; import { mockIndexPattern, TestProviders, useFormFieldMock } from '../../../../common/mock'; import { mockQueryBar } from '../../../rule_management_ui/components/rules_table/__mocks__/mock'; +import { selectEuiComboBoxOption } from '../../../../common/test/eui/combobox'; import type { EqlQueryBarProps } from './eql_query_bar'; import { EqlQueryBar } from './eql_query_bar'; import { getEqlValidationError } from './validators.mock'; @@ -115,36 +116,82 @@ describe('EqlQueryBar', () => { }); describe('EQL options interaction', () => { - const mockOptionsData = { - keywordFields: [], - dateFields: [{ label: 'timestamp', value: 'timestamp' }], - nonDateFields: [], + const mockIndexPatternWithEqlOptionsFields: SecuritySolutionDataViewBase = { + fields: [ + { + name: 'category', + searchable: true, + type: 'keyword', + esTypes: ['keyword'], + aggregatable: true, + }, + { + name: 'timestamp', + searchable: true, + type: 'date', + aggregatable: true, + }, + { + name: 'tiebreaker', + searchable: true, + type: 'string', + aggregatable: true, + }, + ], + title: 'test-*', }; - it('invokes onOptionsChange when the EQL options change', () => { - const onOptionsChangeMock = jest.fn(); + it('updates EQL options', async () => { + let eqlOptions = {}; + + const mockEqlOptionsField = useFormFieldMock({ + value: {}, + setValue: (updater) => { + if (typeof updater === 'function') { + eqlOptions = updater(eqlOptions); + } + }, + }); - const { getByTestId, getByText } = render( + const { getByTestId } = render( ); // open options popover fireEvent.click(getByTestId('eql-settings-trigger')); - // display combobox options - within(getByTestId(`eql-timestamp-field`)).getByRole('combobox').focus(); - // select timestamp - getByText('timestamp').click(); - expect(onOptionsChangeMock).toHaveBeenCalledWith('timestampField', 'timestamp'); + await selectEuiComboBoxOption({ + comboBoxToggleButton: within(getByTestId('eql-event-category-field')).getByRole('combobox'), + optionText: 'category', + }); + + expect(eqlOptions).toEqual({ eventCategoryField: 'category' }); + + await selectEuiComboBoxOption({ + comboBoxToggleButton: within(getByTestId('eql-tiebreaker-field')).getByRole('combobox'), + optionText: 'tiebreaker', + }); + + expect(eqlOptions).toEqual({ eventCategoryField: 'category', tiebreakerField: 'tiebreaker' }); + + await selectEuiComboBoxOption({ + comboBoxToggleButton: within(getByTestId('eql-timestamp-field')).getByRole('combobox'), + optionText: 'timestamp', + }); + + expect(eqlOptions).toEqual({ + eventCategoryField: 'category', + tiebreakerField: 'tiebreaker', + timestampField: 'timestamp', + }); }); }); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.tsx index 607b7a3ef2bb2..079735aab3c48 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/eql_query_bar.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_bar.tsx @@ -17,16 +17,13 @@ import { FilterManager } from '@kbn/data-plugin/public'; import type { FieldHook } from '../../../../shared_imports'; import { FilterBar } from '../../../../common/components/filter_bar'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import type { DefineStepRule } from '../../../../detections/pages/detection_engine/rules/types'; -import * as i18n from './translations'; +import type { EqlOptions } from '../../../../../common/search_strategy'; +import { useKibana } from '../../../../common/lib/kibana'; +import type { FieldValueQueryBar } from '../../../rule_creation_ui/components/query_bar'; +import type { EqlQueryBarFooterProps } from './footer'; import { EqlQueryBarFooter } from './footer'; import { getValidationResults } from './validators'; -import type { - EqlOptionsData, - EqlOptionsSelected, - FieldsEqlOptions, -} from '../../../../../common/search_strategy'; -import { useKibana } from '../../../../common/lib/kibana'; +import * as i18n from './translations'; const TextArea = styled(EuiTextArea)` display: block; @@ -60,32 +57,28 @@ const StyledFormRow = styled(EuiFormRow)` export interface EqlQueryBarProps { dataTestSubj: string; - field: FieldHook; - isLoading: boolean; + field: FieldHook; + eqlOptionsField?: FieldHook; + isLoading?: boolean; indexPattern: DataViewBase; showFilterBar?: boolean; idAria?: string; - optionsData?: EqlOptionsData; - optionsSelected?: EqlOptionsSelected; isSizeOptionDisabled?: boolean; - onOptionsChange?: (field: FieldsEqlOptions, newValue: string | undefined) => void; onValidityChange?: (arg: boolean) => void; - onValiditingChange?: (arg: boolean) => void; + onValidatingChange?: (arg: boolean) => void; } export const EqlQueryBar: FC = ({ dataTestSubj, field, + eqlOptionsField, isLoading = false, indexPattern, showFilterBar, idAria, - optionsData, - optionsSelected, isSizeOptionDisabled, - onOptionsChange, onValidityChange, - onValiditingChange, + onValidatingChange, }) => { const { addError } = useAppToasts(); const [errorMessages, setErrorMessages] = useState([]); @@ -115,10 +108,10 @@ export const EqlQueryBar: FC = ({ }, [error, addError]); useEffect(() => { - if (onValiditingChange) { - onValiditingChange(isValidating); + if (onValidatingChange) { + onValidatingChange(isValidating); } - }, [isValidating, onValiditingChange]); + }, [isValidating, onValidatingChange]); useEffect(() => { let isSubscribed = true; @@ -156,8 +149,8 @@ export const EqlQueryBar: FC = ({ const handleChange = useCallback( (e: ChangeEvent) => { const newQuery = e.target.value; - if (onValiditingChange) { - onValiditingChange(true); + if (onValidatingChange) { + onValidatingChange(true); } setErrorMessages([]); setFieldValue({ @@ -169,7 +162,19 @@ export const EqlQueryBar: FC = ({ saved_id: null, }); }, - [fieldValue, setFieldValue, onValiditingChange] + [fieldValue, setFieldValue, onValidatingChange] + ); + + const handleEqlOptionsChange = useCallback< + NonNullable + >( + (eqlOptionsFieldName, value) => { + eqlOptionsField?.setValue((prevEqlOptions) => ({ + ...prevEqlOptions, + [eqlOptionsFieldName]: value, + })); + }, + [eqlOptionsField] ); return ( @@ -195,9 +200,9 @@ export const EqlQueryBar: FC = ({ errors={errorMessages} isLoading={isValidating} isSizeOptionDisabled={isSizeOptionDisabled} - optionsData={optionsData} - optionsSelected={optionsSelected} - onOptionsChange={onOptionsChange} + dataView={indexPattern} + eqlOptions={eqlOptionsField?.value} + onEqlOptionsChange={handleEqlOptionsChange} /> {showFilterBar && ( <> diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_edit.tsx new file mode 100644 index 0000000000000..5b519cb43c841 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_edit.tsx @@ -0,0 +1,135 @@ +/* + * 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, { useMemo } from 'react'; +import type { DataViewBase } from '@kbn/es-query'; +import { debounceAsync } from '@kbn/securitysolution-utils'; +import type { FormData, FieldConfig, ValidationFuncArg } from '../../../../shared_imports'; +import { UseMultiFields } from '../../../../shared_imports'; +import type { EqlFieldsComboBoxOptions, EqlOptions } from '../../../../../common/search_strategy'; +import { queryRequiredValidatorFactory } from '../../../rule_creation_ui/validators/query_required_validator_factory'; +import { eqlQueryValidatorFactory } from './eql_query_validator_factory'; +import { EqlQueryBar } from './eql_query_bar'; +import * as i18n from './translations'; +import type { FieldValueQueryBar } from '../../../rule_creation_ui/components/query_bar'; + +interface EqlQueryEditProps { + path: string; + eqlOptionsPath: string; + fieldsToValidateOnChange?: string | string[]; + eqlFieldsComboBoxOptions?: EqlFieldsComboBoxOptions; + showEqlSizeOption?: boolean; + showFilterBar?: boolean; + dataView: DataViewBase; + required?: boolean; + loading?: boolean; + disabled?: boolean; + // This is a temporal solution for Prebuilt Customization workflow + skipEqlValidation?: boolean; + onValidityChange?: (arg: boolean) => void; +} + +export function EqlQueryEdit({ + path, + eqlOptionsPath, + fieldsToValidateOnChange, + showEqlSizeOption = false, + showFilterBar = false, + dataView, + required, + loading, + disabled, + skipEqlValidation, + onValidityChange, +}: EqlQueryEditProps): JSX.Element { + const componentProps = useMemo( + () => ({ + isSizeOptionDisabled: !showEqlSizeOption, + isDisabled: disabled, + isLoading: loading, + indexPattern: dataView, + showFilterBar, + idAria: 'ruleEqlQueryBar', + dataTestSubj: 'ruleEqlQueryBar', + onValidityChange, + }), + [showEqlSizeOption, showFilterBar, onValidityChange, dataView, loading, disabled] + ); + const fieldConfig: FieldConfig = useMemo( + () => ({ + label: i18n.EQL_QUERY_BAR_LABEL, + fieldsToValidateOnChange: fieldsToValidateOnChange + ? [path, fieldsToValidateOnChange].flat() + : undefined, + validations: [ + ...(required + ? [ + { + validator: queryRequiredValidatorFactory('eql'), + }, + ] + : []), + ...(!skipEqlValidation + ? [ + { + validator: debounceAsync( + (data: ValidationFuncArg) => { + const { formData } = data; + const eqlOptions = + eqlOptionsPath && formData[eqlOptionsPath] ? formData[eqlOptionsPath] : {}; + + return eqlQueryValidatorFactory( + dataView.id + ? { + dataViewId: dataView.id, + eqlOptions, + } + : { + indexPatterns: dataView.title.split(','), + eqlOptions, + } + )(data); + }, + 300 + ), + }, + ] + : []), + ], + }), + [ + skipEqlValidation, + eqlOptionsPath, + required, + dataView.id, + dataView.title, + path, + fieldsToValidateOnChange, + ] + ); + + return ( + + fields={{ + eqlQuery: { + path, + config: fieldConfig, + }, + eqlOptions: { + path: eqlOptionsPath, + }, + }} + > + {({ eqlQuery, eqlOptions }) => ( + + )} + + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_validator_factory.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_validator_factory.ts new file mode 100644 index 0000000000000..54a0b3e3b6a65 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/eql_query_validator_factory.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isEmpty } from 'lodash'; +import type { FormData, ValidationError, ValidationFunc } from '../../../../shared_imports'; +import { KibanaServices } from '../../../../common/lib/kibana'; +import type { EqlOptions } from '../../../../../common/search_strategy'; +import type { FieldValueQueryBar } from '../../../rule_creation_ui/components/query_bar'; +import type { EqlResponseError } from '../../../../common/hooks/eql/api'; +import { EQL_ERROR_CODES, validateEql } from '../../../../common/hooks/eql/api'; +import { EQL_VALIDATION_REQUEST_ERROR } from './translations'; + +type EqlQueryValidatorFactoryParams = + | { + indexPatterns: string[]; + dataViewId?: never; + eqlOptions: EqlOptions; + } + | { + indexPatterns?: never; + dataViewId: string; + eqlOptions: EqlOptions; + }; + +export function eqlQueryValidatorFactory({ + indexPatterns, + dataViewId, + eqlOptions, +}: EqlQueryValidatorFactoryParams): ValidationFunc { + return async (...args) => { + const [{ value }] = args; + + if (isEmpty(value.query.query)) { + return; + } + + try { + const { data } = KibanaServices.get(); + const dataView = isDataViewIdValid(dataViewId) + ? await data.dataViews.get(dataViewId) + : undefined; + + const dataViewTitle = dataView?.getIndexPattern() ?? indexPatterns?.join(',') ?? ''; + const runtimeMappings = dataView?.getRuntimeMappings() ?? {}; + + const response = await validateEql({ + data, + query: value.query.query as string, + dataViewTitle, + runtimeMappings, + eqlOptions, + }); + + if (response?.valid === false && response.error) { + return transformEqlResponseErrorToValidationError(response.error); + } + } catch (error) { + return { + code: EQL_ERROR_CODES.FAILED_REQUEST, + message: EQL_VALIDATION_REQUEST_ERROR, + error, + }; + } + }; +} + +function transformEqlResponseErrorToValidationError( + responseError: EqlResponseError +): ValidationError { + if (responseError.error) { + return { + code: EQL_ERROR_CODES.FAILED_REQUEST, + message: EQL_VALIDATION_REQUEST_ERROR, + error: responseError.error, + }; + } + + return { + code: responseError.code, + message: '', + messages: responseError.messages, + }; +} + +function isDataViewIdValid(dataViewId: unknown): dataViewId is string { + return typeof dataViewId === 'string' && dataViewId !== ''; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/errors_popover.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/errors_popover.test.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/errors_popover.test.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/errors_popover.test.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/errors_popover.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/errors_popover.tsx similarity index 100% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/errors_popover.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/errors_popover.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.test.tsx similarity index 83% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.test.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.test.tsx index cb15e5002ca4c..ded190cc86de5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.test.tsx @@ -32,7 +32,11 @@ describe('EQL footer', () => { it('EQL settings button is enable when popover is NOT open', () => { const wrapper = mount( - + ); @@ -44,7 +48,11 @@ describe('EQL footer', () => { it('disable EQL settings button when popover is open', () => { const wrapper = mount( - + ); wrapper.find(`[data-test-subj="eql-settings-trigger"]`).first().simulate('click'); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.tsx similarity index 73% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.tsx index 45ab4a1c969c5..fd9431c8d20f5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/footer.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation/components/eql_query_edit/footer.tsx @@ -20,28 +20,27 @@ import { import type { FC } from 'react'; import React, { useCallback, useMemo, useRef, useState } from 'react'; import styled from 'styled-components'; - +import type { DataViewBase } from '@kbn/es-query'; import type { DebouncedFunc } from 'lodash'; -import { debounce } from 'lodash'; -import type { - EqlOptionsData, - EqlOptionsSelected, - FieldsEqlOptions, -} from '../../../../../common/search_strategy'; +import { debounce, isEmpty } from 'lodash'; +import type { EqlOptions } from '../../../../../common/search_strategy'; import * as i18n from './translations'; import { ErrorsPopover } from './errors_popover'; import { EqlOverviewLink } from './eql_overview_link'; -export interface Props { +export interface EqlQueryBarFooterProps { errors: string[]; isLoading?: boolean; isSizeOptionDisabled?: boolean; - optionsData?: EqlOptionsData; - optionsSelected?: EqlOptionsSelected; - onOptionsChange?: (field: FieldsEqlOptions, newValue: string | undefined) => void; + dataView: DataViewBase; + eqlOptions?: EqlOptions; + onEqlOptionsChange?: ( + field: Field, + newValue: EqlOptions[Field] + ) => void; } -type SizeVoidFunc = (newSize: string) => void; +type SizeVoidFunc = (newSize: number) => void; const Container = styled(EuiFlexGroup)` border-radius: 0; @@ -69,18 +68,40 @@ const Spinner = styled(EuiLoadingSpinner)` const singleSelection = { asPlainText: true }; -export const EqlQueryBarFooter: FC = ({ +export const EqlQueryBarFooter: FC = ({ errors, isLoading, isSizeOptionDisabled, - optionsData, - optionsSelected, - onOptionsChange, + dataView, + eqlOptions, + onEqlOptionsChange, }) => { const [openEqlSettings, setIsOpenEqlSettings] = useState(false); - const [localSize, setLocalSize] = useState(optionsSelected?.size ?? 100); + const [localSize, setLocalSize] = useState(eqlOptions?.size ?? 100); const debounceSize = useRef>(); + const { keywordFields, nonDateFields, dateFields } = useMemo( + () => + isEmpty(dataView?.fields) + ? { + keywordFields: [], + dateFields: [], + nonDateFields: [], + } + : { + keywordFields: dataView.fields + .filter((f) => f.esTypes?.includes('keyword')) + .map((f) => ({ label: f.name })), + dateFields: dataView.fields + .filter((f) => f.type === 'date') + .map((f) => ({ label: f.name })), + nonDateFields: dataView.fields + .filter((f) => f.type !== 'date') + .map((f) => ({ label: f.name })), + }, + [dataView] + ); + const openEqlSettingsHandler = useCallback(() => { setIsOpenEqlSettings(true); }, []); @@ -90,74 +111,70 @@ export const EqlQueryBarFooter: FC = ({ const handleEventCategoryField = useCallback( (opt: EuiComboBoxOptionOption[]) => { - if (onOptionsChange) { + if (onEqlOptionsChange) { if (opt.length > 0) { - onOptionsChange('eventCategoryField', opt[0].label); + onEqlOptionsChange('eventCategoryField', opt[0].label); } else { - onOptionsChange('eventCategoryField', undefined); + onEqlOptionsChange('eventCategoryField', undefined); } } }, - [onOptionsChange] + [onEqlOptionsChange] ); const handleTiebreakerField = useCallback( (opt: EuiComboBoxOptionOption[]) => { - if (onOptionsChange) { + if (onEqlOptionsChange) { if (opt.length > 0) { - onOptionsChange('tiebreakerField', opt[0].label); + onEqlOptionsChange('tiebreakerField', opt[0].label); } else { - onOptionsChange('tiebreakerField', undefined); + onEqlOptionsChange('tiebreakerField', undefined); } } }, - [onOptionsChange] + [onEqlOptionsChange] ); const handleTimestampField = useCallback( (opt: EuiComboBoxOptionOption[]) => { - if (onOptionsChange) { + if (onEqlOptionsChange) { if (opt.length > 0) { - onOptionsChange('timestampField', opt[0].label); + onEqlOptionsChange('timestampField', opt[0].label); } else { - onOptionsChange('timestampField', undefined); + onEqlOptionsChange('timestampField', undefined); } } }, - [onOptionsChange] + [onEqlOptionsChange] ); const handleSizeField = useCallback>( (evt) => { - if (onOptionsChange) { + if (onEqlOptionsChange) { setLocalSize(evt?.target?.valueAsNumber); if (debounceSize.current?.cancel) { debounceSize.current?.cancel(); } - debounceSize.current = debounce((newSize) => onOptionsChange('size', newSize), 800); - debounceSize.current(evt?.target?.value); + debounceSize.current = debounce((newSize) => onEqlOptionsChange('size', newSize), 800); + debounceSize.current(evt?.target?.valueAsNumber); } }, - [onOptionsChange] + [onEqlOptionsChange] ); const eventCategoryField = useMemo( () => - optionsSelected?.eventCategoryField != null - ? [{ label: optionsSelected?.eventCategoryField }] + eqlOptions?.eventCategoryField != null + ? [{ label: eqlOptions?.eventCategoryField }] : undefined, - [optionsSelected?.eventCategoryField] + [eqlOptions?.eventCategoryField] ); const tiebreakerField = useMemo( () => - optionsSelected?.tiebreakerField != null - ? [{ label: optionsSelected?.tiebreakerField }] - : undefined, - [optionsSelected?.tiebreakerField] + eqlOptions?.tiebreakerField != null ? [{ label: eqlOptions?.tiebreakerField }] : undefined, + [eqlOptions?.tiebreakerField] ); const timestampField = useMemo( () => - optionsSelected?.timestampField != null - ? [{ label: optionsSelected?.timestampField }] - : undefined, - [optionsSelected?.timestampField] + eqlOptions?.timestampField != null ? [{ label: eqlOptions?.timestampField }] : undefined, + [eqlOptions?.timestampField] ); return ( @@ -183,13 +200,13 @@ export const EqlQueryBarFooter: FC = ({
- {!onOptionsChange && ( + {!onEqlOptionsChange && ( )} - {onOptionsChange && ( + {onEqlOptionsChange && ( <> @@ -232,7 +249,7 @@ export const EqlQueryBarFooter: FC = ({ helpText={i18n.EQL_OPTIONS_EVENT_CATEGORY_FIELD_HELPER} > = ({ helpText={i18n.EQL_OPTIONS_EVENT_TIEBREAKER_FIELD_HELPER} > = ({ helpText={i18n.EQL_OPTIONS_EVENT_TIMESTAMP_FIELD_HELPER} > ( + field: FieldHook +): { isValid: boolean; message: string; messages?: string[]; error?: Error } => { + const hasErrors = field.errors.length > 0; + const isValid = !field.isChangingValue && !hasErrors; + + if (hasErrors) { + const [error] = field.errors; + const message = error.message; + + if (error.code === EQL_ERROR_CODES.FAILED_REQUEST) { + return { isValid, message, error: error.error }; + } else { + return { isValid, message, messages: error.messages }; + } + } else { + return { isValid, message: '' }; + } +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/helpers.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/helpers.tsx index 6740e9fc8d014..57292d91953d8 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/helpers.tsx @@ -32,7 +32,7 @@ import type { } from '../../../../../common/api/detection_engine/model/rule_schema'; import { AlertSuppressionMissingFieldsStrategyEnum } from '../../../../../common/api/detection_engine/model/rule_schema'; import { MATCHES, AND, OR } from '../../../../common/components/threat_match/translations'; -import type { EqlOptionsSelected } from '../../../../../common/search_strategy'; +import type { EqlOptions } from '../../../../../common/search_strategy'; import { assertUnreachable } from '../../../../../common/utility_types'; import * as i18nSeverity from '../severity_mapping/translations'; import * as i18nRiskScore from '../risk_score_mapping/translations'; @@ -147,7 +147,7 @@ export const buildQueryBarDescription = ({ return items; }; -export const buildEqlOptionsDescription = (eqlOptions: EqlOptionsSelected): ListItems[] => { +export const buildEqlOptionsDescription = (eqlOptions: EqlOptions): ListItems[] => { let items: ListItems[] = []; if (!isEmpty(eqlOptions.eventCategoryField)) { items = [ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/index.tsx index 657f592fe47c4..24ad5f4135a14 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/description_step/index.tsx @@ -19,7 +19,7 @@ import type { } from '../../../../../common/api/detection_engine/model/rule_schema'; import { buildRelatedIntegrationsDescription } from '../../../../detections/components/rules/related_integrations/integrations_description'; import { DEFAULT_TIMELINE_TITLE } from '../../../../timelines/components/timeline/translations'; -import type { EqlOptionsSelected } from '../../../../../common/search_strategy'; +import type { EqlOptions } from '../../../../../common/search_strategy'; import { useKibana } from '../../../../common/lib/kibana'; import type { AboutStepRiskScore, @@ -275,7 +275,7 @@ export const getDescriptionItem = ( return []; } } else if (field === 'eqlOptions') { - const eqlOptions: EqlOptionsSelected = get(field, data); + const eqlOptions: EqlOptions = get(field, data); return buildEqlOptionsDescription(eqlOptions); } else if (field === 'threat') { const threats: Threats = get(field, data); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts deleted file mode 100644 index 8cd9a4d60745e..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/eql_query_bar/validators.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isEmpty } from 'lodash'; - -import type { FieldHook, ValidationError, ValidationFunc } from '../../../../shared_imports'; -import { isEqlRule } from '../../../../../common/detection_engine/utils'; -import { KibanaServices } from '../../../../common/lib/kibana'; -import type { DefineStepRule } from '../../../../detections/pages/detection_engine/rules/types'; -import { DataSourceType } from '../../../../detections/pages/detection_engine/rules/types'; -import type { EqlResponseError } from '../../../../common/hooks/eql/api'; -import { validateEql, EQL_ERROR_CODES } from '../../../../common/hooks/eql/api'; -import type { FieldValueQueryBar } from '../query_bar'; -import * as i18n from './translations'; - -/** - * Unlike lodash's debounce, which resolves intermediate calls with the most - * recent value, this implementation waits to resolve intermediate calls until - * the next invocation resolves. - * - * @param fn an async function - * - * @returns A debounced async function that resolves on the next invocation - */ -export const debounceAsync = >( - fn: (...args: Args) => Result, - interval: number -): ((...args: Args) => Result) => { - let handle: ReturnType | undefined; - let resolves: Array<(value?: Result) => void> = []; - - return (...args: Args): Result => { - if (handle) { - clearTimeout(handle); - } - - handle = setTimeout(() => { - const result = fn(...args); - resolves.forEach((resolve) => resolve(result)); - resolves = []; - }, interval); - - return new Promise((resolve) => resolves.push(resolve)) as Result; - }; -}; - -export const transformEqlResponseErrorToValidationError = ( - responseError: EqlResponseError -): ValidationError => { - if (responseError.error) { - return { - code: EQL_ERROR_CODES.FAILED_REQUEST, - message: i18n.EQL_VALIDATION_REQUEST_ERROR, - error: responseError.error, - }; - } - return { - code: responseError.code, - message: '', - messages: responseError.messages, - }; -}; - -export const eqlValidator = async ( - ...args: Parameters -): Promise | void | undefined> => { - const [{ value, formData }] = args; - const { query: queryValue } = value as FieldValueQueryBar; - const query = queryValue.query as string; - const { dataViewId, index, ruleType, eqlOptions } = formData as DefineStepRule; - - const needsValidation = - (ruleType === undefined && !isEmpty(query)) || (isEqlRule(ruleType) && !isEmpty(query)); - if (!needsValidation) { - return; - } - - try { - const { data } = KibanaServices.get(); - let dataViewTitle = index?.join(); - let runtimeMappings = {}; - if ( - dataViewId != null && - dataViewId !== '' && - formData.dataSourceType === DataSourceType.DataView - ) { - const dataView = await data.dataViews.get(dataViewId); - - dataViewTitle = dataView.title; - runtimeMappings = dataView.getRuntimeMappings(); - } - - const signal = new AbortController().signal; - const response = await validateEql({ - data, - query, - signal, - dataViewTitle, - runtimeMappings, - options: eqlOptions, - }); - - if (response?.valid === false && response.error) { - return transformEqlResponseErrorToValidationError(response.error); - } - } catch (error) { - return { - code: EQL_ERROR_CODES.FAILED_REQUEST, - message: i18n.EQL_VALIDATION_REQUEST_ERROR, - error, - }; - } -}; - -export const getValidationResults = ( - field: FieldHook -): { isValid: boolean; message: string; messages?: string[]; error?: Error } => { - const hasErrors = field.errors.length > 0; - const isValid = !field.isChangingValue && !hasErrors; - - if (hasErrors) { - const [error] = field.errors; - const message = error.message; - - if (error.code === EQL_ERROR_CODES.FAILED_REQUEST) { - return { isValid, message, error: error.error }; - } else { - return { isValid, message, messages: error.messages }; - } - } else { - return { isValid, message: '' }; - } -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/query_bar/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/query_bar/index.test.tsx index 0ba6bea89e0fc..7b757f8fc621d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/query_bar/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/query_bar/index.test.tsx @@ -18,6 +18,7 @@ import { mockHistory, Router } from '../../../../common/mock/router'; import { render, act, fireEvent } from '@testing-library/react'; import { resolveTimeline } from '../../../../timelines/containers/api'; import { mockTimeline } from '../../../../../server/lib/timeline/__mocks__/create_timelines'; +import type { ResolveTimelineResponse } from '../../../../../common/api/timeline'; jest.mock('../../../../timelines/containers/api'); jest.mock('../../../../common/lib/kibana', () => { @@ -49,6 +50,11 @@ jest.mock('../../../../timelines/containers/all', () => { }; }); +const resolvedTimeline: ResolveTimelineResponse = { + timeline: { ...mockTimeline, savedObjectId: '1', version: 'abc' }, + outcome: 'exactMatch', +}; + describe('QueryBarDefineRule', () => { beforeEach(() => { jest.clearAllMocks(); @@ -59,11 +65,7 @@ describe('QueryBarDefineRule', () => { totalCount: mockOpenTimelineQueryResults.totalCount, refetch: jest.fn(), }); - (resolveTimeline as jest.Mock).mockResolvedValue({ - data: { - timeline: { mockTimeline }, - }, - }); + (resolveTimeline as jest.Mock).mockResolvedValue(resolvedTimeline); }); it('renders correctly', () => { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx index 50264fffabfb8..364f1b7705732 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { screen, fireEvent, render, within, act, waitFor } from '@testing-library/react'; import type { Type as RuleType } from '@kbn/securitysolution-io-ts-alerting-types'; import type { DataViewBase } from '@kbn/es-query'; @@ -638,7 +638,6 @@ function TestForm({ onSubmit, formProps, }: TestFormProps): JSX.Element { - const [selectedEqlOptions, setSelectedEqlOptions] = useState(stepDefineDefaultValue.eqlOptions); const { form } = useForm({ options: { stripEmptyFields: false }, schema: defineRuleSchema, @@ -653,8 +652,6 @@ function TestForm({ form={form} indicesConfig={[]} threatIndicesConfig={[]} - optionsSelected={selectedEqlOptions} - setOptionsSelected={setSelectedEqlOptions} indexPattern={indexPattern} isIndexPatternLoading={false} isQueryBarValid={true} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx index 7085371eea276..053544e6fdbb5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx @@ -20,7 +20,7 @@ import React, { memo, useCallback, useState, useEffect, useMemo, useRef } from ' import styled from 'styled-components'; import { i18n as i18nCore } from '@kbn/i18n'; -import { isEqual, isEmpty } from 'lodash'; +import { isEqual } from 'lodash'; import type { FieldSpec } from '@kbn/data-plugin/common'; import usePrevious from 'react-use/lib/usePrevious'; import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; @@ -33,7 +33,6 @@ import { useSetFieldValueWithCallback } from '../../../../common/utils/use_set_f import type { SetRuleQuery } from '../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; import { useRuleFromTimeline } from '../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; import { isMlRule } from '../../../../../common/machine_learning/helpers'; -import type { EqlOptionsSelected, FieldsEqlOptions } from '../../../../../common/search_strategy'; import { filterRuleFieldsForType, getStepDataDataSource } from '../../pages/rule_creation/helpers'; import type { DefineStepRule, @@ -74,7 +73,7 @@ import { isEqlSequenceQuery, isSuppressionRuleInGA, } from '../../../../../common/detection_engine/utils'; -import { EqlQueryBar } from '../eql_query_bar'; +import { EqlQueryEdit } from '../../../rule_creation/components/eql_query_edit'; import { DataViewSelectorField } from '../data_view_selector_field'; import { ThreatMatchInput } from '../threatmatch_input'; import { useFetchIndex } from '../../../../common/containers/source'; @@ -91,7 +90,10 @@ import { useAlertSuppression } from '../../../rule_management/logic/use_alert_su import { AiAssistant } from '../ai_assistant'; import { RelatedIntegrations } from '../../../rule_creation/components/related_integrations'; import { useMLRuleConfig } from '../../../../common/components/ml/hooks/use_ml_rule_config'; -import { AlertSuppressionEdit } from '../../../rule_creation/components/alert_suppression_edit'; +import { + ALERT_SUPPRESSION_FIELDS_FIELD_NAME, + AlertSuppressionEdit, +} from '../../../rule_creation/components/alert_suppression_edit'; import { ThresholdAlertSuppressionEdit } from '../../../rule_creation/components/threshold_alert_suppression_edit'; import { usePersistentAlertSuppressionState } from './use_persistent_alert_suppression_state'; @@ -105,8 +107,6 @@ export interface StepDefineRuleProps extends RuleStepProps { threatIndicesConfig: string[]; defaultSavedQuery?: SavedQuery; form: FormHook; - optionsSelected: EqlOptionsSelected; - setOptionsSelected: React.Dispatch>; indexPattern: DataViewBase; isIndexPatternLoading: boolean; isQueryBarValid: boolean; @@ -163,13 +163,11 @@ const StepDefineRuleComponent: FC = ({ isLoading, isQueryBarValid, isUpdateView = false, - optionsSelected, queryBarSavedId, queryBarTitle, ruleType, setIsQueryBarValid, setIsThreatQueryBarValid, - setOptionsSelected, shouldLoadQueryDynamically, threatIndex, threatIndicesConfig, @@ -220,15 +218,12 @@ const StepDefineRuleComponent: FC = ({ }; if (timelineQueryBar.query.language === 'eql') { setRuleTypeCallback('eql', setQuery); - setOptionsSelected((prevOptions) => ({ - ...prevOptions, - ...(eqlOptions != null ? eqlOptions : {}), - })); + setFieldValue('eqlOptions', eqlOptions ?? {}); } else { setQuery(); } }, - [setFieldValue, setRuleTypeCallback, setOptionsSelected] + [setFieldValue, setRuleTypeCallback] ); const { onOpenTimeline, loading: timelineQueryLoading } = @@ -719,43 +714,6 @@ const StepDefineRuleComponent: FC = ({ ] ); - const onOptionsChange = useCallback( - (field: FieldsEqlOptions, value: string | undefined) => { - setOptionsSelected((prevOptions) => { - const newOptions = { - ...prevOptions, - [field]: value, - }; - - setFieldValue('eqlOptions', newOptions); - return newOptions; - }); - }, - [setFieldValue, setOptionsSelected] - ); - - const optionsData = useMemo( - () => - isEmpty(indexPattern.fields) - ? { - keywordFields: [], - dateFields: [], - nonDateFields: [], - } - : { - keywordFields: (indexPattern.fields as FieldSpec[]) - .filter((f) => f.esTypes?.includes('keyword')) - .map((f) => ({ label: f.name })), - dateFields: indexPattern.fields - .filter((f) => f.type === 'date') - .map((f) => ({ label: f.name })), - nonDateFields: indexPattern.fields - .filter((f) => f.type !== 'date') - .map((f) => ({ label: f.name })), - }, - [indexPattern] - ); - const selectRuleTypeProps = useMemo( () => ({ describedByIds: ['detectionEngineStepDefineRuleType'], @@ -794,29 +752,18 @@ const StepDefineRuleComponent: FC = ({ {isEqlRule(ruleType) ? ( <> - - ) : isEsqlRule(ruleType) ? ( EsqlQueryBarMemo diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx index 6563c0d3b175f..835cab7a4cfc2 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx @@ -9,8 +9,7 @@ import { isEmpty } from 'lodash'; import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; import React from 'react'; - -import { fromKueryExpression } from '@kbn/es-query'; +import { debounceAsync } from '@kbn/securitysolution-utils'; import { singleEntryThreat, containsInvalidItems, @@ -27,32 +26,29 @@ import { } from '../../../../../common/detection_engine/utils'; import { MAX_NUMBER_OF_NEW_TERMS_FIELDS } from '../../../../../common/constants'; import { isMlRule } from '../../../../../common/machine_learning/helpers'; -import type { FieldValueQueryBar } from '../query_bar'; import type { ERROR_CODE, FormSchema, ValidationFunc } from '../../../../shared_imports'; import { FIELD_TYPES, fieldValidators } from '../../../../shared_imports'; import type { DefineStepRule } from '../../../../detections/pages/detection_engine/rules/types'; import { DataSourceType } from '../../../../detections/pages/detection_engine/rules/types'; -import { debounceAsync, eqlValidator } from '../eql_query_bar/validators'; import { esqlValidator } from '../../../rule_creation/logic/esql_validator'; import { dataViewIdValidatorFactory } from '../../validators/data_view_id_validator_factory'; import { indexPatternValidatorFactory } from '../../validators/index_pattern_validator_factory'; import { alertSuppressionFieldsValidatorFactory } from '../../validators/alert_suppression_fields_validator_factory'; import { - CUSTOM_QUERY_REQUIRED, - INVALID_CUSTOM_QUERY, INDEX_HELPER_TEXT, THREAT_MATCH_INDEX_HELPER_TEXT, THREAT_MATCH_REQUIRED, THREAT_MATCH_EMPTIES, EQL_SEQUENCE_SUPPRESSION_GROUPBY_VALIDATION_TEXT, } from './translations'; -import { getQueryRequiredMessage } from './utils'; import { ALERT_SUPPRESSION_DURATION_FIELD_NAME, ALERT_SUPPRESSION_FIELDS_FIELD_NAME, ALERT_SUPPRESSION_MISSING_FIELDS_FIELD_NAME, } from '../../../rule_creation/components/alert_suppression_edit'; import * as alertSuppressionEditI81n from '../../../rule_creation/components/alert_suppression_edit/components/translations'; +import { queryRequiredValidatorFactory } from '../../validators/query_required_validator_factory'; +import { kueryValidatorFactory } from '../../validators/kuery_validator_factory'; export const schema: FormSchema = { index: { @@ -68,7 +64,7 @@ export const schema: FormSchema = { helpText: {INDEX_HELPER_TEXT}, validations: [ { - validator: (...args: Parameters) => { + validator: (...args) => { const [{ formData }] = args; if ( @@ -94,7 +90,7 @@ export const schema: FormSchema = { fieldsToValidateOnChange: ['dataViewId'], validations: [ { - validator: (...args: Parameters) => { + validator: (...args) => { const [{ formData }] = args; if (isMlRule(formData.ruleType) || formData.dataSourceType !== DataSourceType.DataView) { @@ -122,55 +118,21 @@ export const schema: FormSchema = { fieldsToValidateOnChange: ['queryBar', ALERT_SUPPRESSION_FIELDS_FIELD_NAME], validations: [ { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { - const [{ value, path, formData }] = args; - const { query, filters, saved_id: savedId } = value as FieldValueQueryBar; - const needsValidation = !isMlRule(formData.ruleType); - if (!needsValidation) { - return undefined; - } - const isFieldEmpty = isEmpty(query.query as string) && isEmpty(filters); - if (!isFieldEmpty) { - return undefined; - } - if (savedId) { + validator: (...args) => { + const [{ value, formData }] = args; + + if (isMlRule(formData.ruleType) || value.saved_id) { // Ignore field validation error in this case. // Instead, we show the error toast when saved query object does not exist. // https://github.com/elastic/kibana/issues/159060 - return undefined; - } - const message = getQueryRequiredMessage(formData.ruleType); - return { code: 'ERR_FIELD_MISSING', path, message }; - }, - }, - { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { - const [{ value, path, formData }] = args; - const { query } = value as FieldValueQueryBar; - const needsValidation = !isMlRule(formData.ruleType); - if (!needsValidation) { return; } - if (!isEmpty(query.query as string) && query.language === 'kuery') { - try { - fromKueryExpression(query.query); - } catch (err) { - return { - code: 'ERR_FIELD_FORMAT', - path, - message: INVALID_CUSTOM_QUERY, - }; - } - } + return queryRequiredValidatorFactory(formData.ruleType)(...args); }, }, { - validator: debounceAsync(eqlValidator, 300), + validator: kueryValidatorFactory(), }, { validator: debounceAsync(esqlValidator, 300), @@ -509,49 +471,17 @@ export const schema: FormSchema = { ), validations: [ { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { - const [{ value, path, formData }] = args; - const needsValidation = isThreatMatchRule(formData.ruleType); - if (!needsValidation) { + validator: (...args) => { + const [{ formData }] = args; + if (!isThreatMatchRule(formData.ruleType)) { return; } - const { query, filters } = value as FieldValueQueryBar; - - return isEmpty(query.query as string) && isEmpty(filters) - ? { - code: 'ERR_FIELD_MISSING', - path, - message: CUSTOM_QUERY_REQUIRED, - } - : undefined; + return queryRequiredValidatorFactory(formData.ruleType)(...args); }, }, { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { - const [{ value, path, formData }] = args; - const needsValidation = isThreatMatchRule(formData.ruleType); - if (!needsValidation) { - return; - } - const { query } = value as FieldValueQueryBar; - - if (!isEmpty(query.query as string) && query.language === 'kuery') { - try { - fromKueryExpression(query.query); - } catch (err) { - return { - code: 'ERR_FIELD_FORMAT', - path, - message: INVALID_CUSTOM_QUERY, - }; - } - } - }, + validator: kueryValidatorFactory(), }, ], }, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/translations.tsx index d8b24f978afd0..7b8063b23e306 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/translations.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/translations.tsx @@ -9,34 +9,6 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -export const CUSTOM_QUERY_REQUIRED = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldRequiredError', - { - defaultMessage: 'A custom query is required.', - } -); - -export const EQL_QUERY_REQUIRED = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlQueryFieldRequiredError', - { - defaultMessage: 'An EQL query is required.', - } -); - -export const ESQL_QUERY_REQUIRED = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryFieldRequiredError', - { - defaultMessage: 'An ES|QL query is required.', - } -); - -export const INVALID_CUSTOM_QUERY = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldInvalidError', - { - defaultMessage: 'The KQL is invalid', - } -); - export const INDEX_HELPER_TEXT = i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.indicesHelperDescription', { @@ -66,13 +38,6 @@ export const QUERY_BAR_LABEL = i18n.translate( } ); -export const EQL_QUERY_BAR_LABEL = i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.EqlQueryBarLabel', - { - defaultMessage: 'EQL query', - } -); - export const SAVED_QUERY_FORM_ROW_LABEL = i18n.translate( 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.SavedQueryFormRowLabel', { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/utils.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/utils.ts index 88592da7ecd8d..baedda1ae1620 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/utils.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/utils.ts @@ -5,13 +5,8 @@ * 2.0. */ -import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; import type { FieldSpec } from '@kbn/data-plugin/common'; -import { CUSTOM_QUERY_REQUIRED, EQL_QUERY_REQUIRED, ESQL_QUERY_REQUIRED } from './translations'; - -import { isEqlRule, isEsqlRule } from '../../../../../common/detection_engine/utils'; - /** * Filters out fields, that are not supported in terms aggregation. * Terms aggregation supports limited number of types: @@ -25,18 +20,3 @@ export const getTermsAggregationFields = (fields: FieldSpec[]): FieldSpec[] => // binary types is excluded, as binary field has property aggregatable === false const ALLOWED_AGGREGATABLE_FIELD_TYPES_SET = new Set(['string', 'number', 'ip', 'boolean']); - -/** - * return query is required message depends on a rule type - */ -export const getQueryRequiredMessage = (ruleType: Type) => { - if (isEsqlRule(ruleType)) { - return ESQL_QUERY_REQUIRED; - } - - if (isEqlRule(ruleType)) { - return EQL_QUERY_REQUIRED; - } - - return CUSTOM_QUERY_REQUIRED; -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.test.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.test.ts index 84d10bae1c5d5..d2bbe9edb1160 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.test.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.test.ts @@ -17,7 +17,6 @@ import type { } from '../../../detections/pages/detection_engine/rules/types'; import { useRuleFormsErrors } from './form'; -import { transformEqlResponseErrorToValidationError } from '../components/eql_query_bar/validators'; import { ALERT_SUPPRESSION_FIELDS_FIELD_NAME } from '../../rule_creation/components/alert_suppression_edit'; const getFormWithErrorsMock = (fields: { @@ -33,13 +32,15 @@ describe('useRuleFormsErrors', () => { it('should return blocking error in case of syntax validation error', async () => { const { result } = renderHook(() => useRuleFormsErrors()); - const validationError = transformEqlResponseErrorToValidationError({ - code: EQL_ERROR_CODES.INVALID_SYNTAX, - messages: ["line 1:5: missing 'where' at 'demo'"], - }); const defineStepForm = getFormWithErrorsMock({ queryBar: { - errors: [validationError], + errors: [ + { + code: EQL_ERROR_CODES.INVALID_SYNTAX, + message: '', + messages: ["line 1:5: missing 'where' at 'demo'"], + }, + ], }, }); @@ -53,13 +54,17 @@ describe('useRuleFormsErrors', () => { it('should return non-blocking error in case of missing data source validation error', async () => { const { result } = renderHook(() => useRuleFormsErrors()); - const validationError = transformEqlResponseErrorToValidationError({ - code: EQL_ERROR_CODES.MISSING_DATA_SOURCE, - messages: ['index_not_found_exception Found 1 problem line -1:-1: Unknown index [*,-*]'], - }); const defineStepForm = getFormWithErrorsMock({ queryBar: { - errors: [validationError], + errors: [ + { + code: EQL_ERROR_CODES.MISSING_DATA_SOURCE, + message: '', + messages: [ + 'index_not_found_exception Found 1 problem line -1:-1: Unknown index [*,-*]', + ], + }, + ], }, }); @@ -75,15 +80,17 @@ describe('useRuleFormsErrors', () => { it('should return non-blocking error in case of missing data field validation error', async () => { const { result } = renderHook(() => useRuleFormsErrors()); - const validationError = transformEqlResponseErrorToValidationError({ - code: EQL_ERROR_CODES.INVALID_EQL, - messages: [ - 'Found 2 problems\nline 1:1: Unknown column [event.category]\nline 1:13: Unknown column [event.name]', - ], - }); const defineStepForm = getFormWithErrorsMock({ queryBar: { - errors: [validationError], + errors: [ + { + code: EQL_ERROR_CODES.INVALID_EQL, + message: '', + messages: [ + 'Found 2 problems\nline 1:1: Unknown column [event.category]\nline 1:13: Unknown column [event.name]', + ], + }, + ], }, }); @@ -99,13 +106,15 @@ describe('useRuleFormsErrors', () => { it('should return non-blocking error in case of failed request error', async () => { const { result } = renderHook(() => useRuleFormsErrors()); - const validationError = transformEqlResponseErrorToValidationError({ - code: EQL_ERROR_CODES.FAILED_REQUEST, - error: new Error('Some internal error'), - }); const defineStepForm = getFormWithErrorsMock({ queryBar: { - errors: [validationError], + errors: [ + { + code: EQL_ERROR_CODES.FAILED_REQUEST, + message: 'An error occurred while validating your EQL query', + error: new Error('Some internal error'), + }, + ], }, }); @@ -121,13 +130,15 @@ describe('useRuleFormsErrors', () => { it('should return blocking and non-blocking errors', async () => { const { result } = renderHook(() => useRuleFormsErrors()); - const validationError = transformEqlResponseErrorToValidationError({ - code: EQL_ERROR_CODES.MISSING_DATA_SOURCE, - messages: ['Missing data source'], - }); const defineStepForm = getFormWithErrorsMock({ queryBar: { - errors: [validationError], + errors: [ + { + code: EQL_ERROR_CODES.MISSING_DATA_SOURCE, + message: '', + messages: ['Missing data source'], + }, + ], }, }); const aboutStepForm = getFormWithErrorsMock({ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx index 9e232e4bff2be..64230fd3a8a23 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx @@ -19,7 +19,6 @@ import { useKibana } from '../../../common/lib/kibana'; import type { FormHook, ValidationError } from '../../../shared_imports'; import { useForm, useFormData } from '../../../shared_imports'; import { schema as defineRuleSchema } from '../components/step_define_rule/schema'; -import type { EqlOptionsSelected } from '../../../../common/search_strategy'; import { schema as aboutRuleSchema, threatMatchAboutSchema, @@ -53,20 +52,14 @@ export const useRuleForms = ({ options: { stripEmptyFields: false }, schema: defineRuleSchema, }); - const [eqlOptionsSelected, setEqlOptionsSelected] = useState( - defineStepDefault.eqlOptions - ); const [defineStepFormData] = useFormData({ form: defineStepForm, }); // FormData doesn't populate on the first render, so we use the defaultValue if the formData // doesn't have what we wanted const defineStepData = useMemo( - () => - 'index' in defineStepFormData - ? { ...defineStepFormData, eqlOptions: eqlOptionsSelected } - : defineStepDefault, - [defineStepDefault, defineStepFormData, eqlOptionsSelected] + () => ('index' in defineStepFormData ? defineStepFormData : defineStepDefault), + [defineStepDefault, defineStepFormData] ); // ABOUT STEP FORM @@ -118,8 +111,6 @@ export const useRuleForms = ({ scheduleStepData, actionsStepForm, actionsStepData, - eqlOptionsSelected, - setEqlOptionsSelected, }; }; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx index d19c9c7c89d0c..01435a2f7c654 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx @@ -171,8 +171,6 @@ const CreateRulePageComponent: React.FC = () => { scheduleStepData, actionsStepForm, actionsStepData, - eqlOptionsSelected, - setEqlOptionsSelected, } = useRuleForms({ defineStepDefault, aboutStepDefault: stepAboutDefaultValue, @@ -392,10 +390,9 @@ const CreateRulePageComponent: React.FC = () => { const createRuleFromFormData = useCallback( async (enabled: boolean) => { - const localDefineStepData: DefineStepRule = defineFieldsTransform({ - ...defineStepForm.getFormData(), - eqlOptions: eqlOptionsSelected, - }); + const localDefineStepData: DefineStepRule = defineFieldsTransform( + defineStepForm.getFormData() + ); const localAboutStepData = aboutStepForm.getFormData(); const localScheduleStepData = scheduleStepForm.getFormData(); const localActionsStepData = actionsStepForm.getFormData(); @@ -435,7 +432,6 @@ const CreateRulePageComponent: React.FC = () => { createRule, defineFieldsTransform, defineStepForm, - eqlOptionsSelected, navigateToApp, ruleType, scheduleStepForm, @@ -556,8 +552,6 @@ const CreateRulePageComponent: React.FC = () => { indicesConfig={indicesConfig} threatIndicesConfig={threatIndicesConfig} form={defineStepForm} - optionsSelected={eqlOptionsSelected} - setOptionsSelected={setEqlOptionsSelected} indexPattern={indexPattern} isIndexPatternLoading={isIndexPatternLoading} isQueryBarValid={isQueryBarValid} @@ -588,7 +582,6 @@ const CreateRulePageComponent: React.FC = () => { defineStepData, memoizedIndex, defineStepForm, - eqlOptionsSelected, indexPattern, indicesConfig, isCreateRuleLoading, @@ -596,7 +589,6 @@ const CreateRulePageComponent: React.FC = () => { isQueryBarValid, loading, memoDefineStepReadOnly, - setEqlOptionsSelected, threatIndicesConfig, ] ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx index 0a1733bd831fd..b09ee5f4e3f43 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx @@ -131,8 +131,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { scheduleStepData, actionsStepForm, actionsStepData, - eqlOptionsSelected, - setEqlOptionsSelected, } = useRuleForms({ defineStepDefault: defineRuleData, aboutStepDefault: aboutRuleData, @@ -232,8 +230,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { threatIndicesConfig={threatIndicesConfig} defaultSavedQuery={savedQuery} form={defineStepForm} - optionsSelected={eqlOptionsSelected} - setOptionsSelected={setEqlOptionsSelected} key="defineStep" indexPattern={indexPattern} isIndexPatternLoading={isIndexPatternLoading} @@ -355,8 +351,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { threatIndicesConfig, savedQuery, defineStepForm, - eqlOptionsSelected, - setEqlOptionsSelected, indexPattern, isIndexPatternLoading, isQueryBarValid, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/kuery_validator_factory.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/kuery_validator_factory.ts new file mode 100644 index 0000000000000..f362acffd3bcf --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/kuery_validator_factory.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 { i18n } from '@kbn/i18n'; +import { isEmpty } from 'lodash'; +import { fromKueryExpression } from '@kbn/es-query'; +import type { FormData, ValidationFunc } from '../../../shared_imports'; +import type { FieldValueQueryBar } from '../components/query_bar'; + +export function kueryValidatorFactory(): ValidationFunc { + return (...args) => { + const [{ path, value }] = args; + + if (isEmpty(value.query.query) || value.query.language !== 'kuery') { + return; + } + + try { + fromKueryExpression(value.query.query); + } catch (err) { + return { + code: 'ERR_FIELD_FORMAT', + path, + message: i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldInvalidError', + { + defaultMessage: 'The KQL is invalid', + } + ), + }; + } + }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/query_required_validator_factory.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/query_required_validator_factory.ts new file mode 100644 index 0000000000000..f06aaa6b312f8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/query_required_validator_factory.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 { i18n } from '@kbn/i18n'; +import { isEmpty } from 'lodash'; +import type { RuleType } from '@kbn/securitysolution-rules'; +import type { FormData, ValidationFunc } from '../../../shared_imports'; +import { isEqlRule, isEsqlRule } from '../../../../common/detection_engine/utils'; +import type { FieldValueQueryBar } from '../components/query_bar'; + +export function queryRequiredValidatorFactory( + ruleType: RuleType +): ValidationFunc { + return (...args) => { + const [{ path, value }] = args; + + if (isEmpty(value.query.query as string) && isEmpty(value.filters)) { + return { + code: 'ERR_FIELD_MISSING', + path, + message: getErrorMessage(ruleType), + }; + } + }; +} + +function getErrorMessage(ruleType: RuleType): string { + if (isEsqlRule(ruleType)) { + return i18n.translate( + 'xpack.securitySolution.ruleManagement.ruleCreation.validation.query.esqlQueryFieldRequiredError', + { + defaultMessage: 'An ES|QL query is required.', + } + ); + } + + if (isEqlRule(ruleType)) { + return i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlQueryFieldRequiredError', + { + defaultMessage: 'An EQL query is required.', + } + ); + } + + return i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldRequiredError', + { + defaultMessage: 'A custom query is required.', + } + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts index 04660191c9cbf..8e159c94aca0e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts @@ -34,9 +34,6 @@ export const DEFINITION_UPGRADE_FIELD_ORDER: Array = [ 'type', 'kql_query', 'eql_query', - 'event_category_override', - 'timestamp_field', - 'tiebreaker_field', 'esql_query', 'anomaly_threshold', 'machine_learning_job_id', diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx index 5e417b3d862ed..701ab18e9a0ab 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_rule_diff_tab.test.tsx @@ -92,16 +92,16 @@ describe('PerFieldRuleDiffTab', () => { }); describe('Undefined values are displayed with empty diffs', () => { - test('Displays only an updated field value when changed from undefined', () => { + test('Displays only an updated field value when changed from an empty value', () => { const mockData: PartialRuleDiff = { ...ruleFieldsDiffMock, fields: { - timestamp_field: { + name: { ...ruleFieldsDiffBaseFieldsMock, base_version: undefined, - current_version: undefined, - merged_version: 'new timestamp field', - target_version: 'new timestamp field', + current_version: '', + merged_version: 'new name', + target_version: 'new name', }, }, }; @@ -109,19 +109,19 @@ describe('PerFieldRuleDiffTab', () => { const diffContent = wrapper.getByTestId('ruleUpgradePerFieldDiffContent').textContent; // Only the new timestamp field should be displayed - expect(diffContent).toEqual('+new timestamp field'); + expect(diffContent).toEqual('+new name'); }); - test('Displays only an outdated field value when incoming update is undefined', () => { + test('Displays only an outdated field value when incoming update is an empty value', () => { const mockData: PartialRuleDiff = { ...ruleFieldsDiffMock, fields: { - timestamp_field: { + name: { ...ruleFieldsDiffBaseFieldsMock, - base_version: 'old timestamp field', - current_version: 'old timestamp field', - merged_version: undefined, - target_version: undefined, + base_version: 'old name', + current_version: 'old name', + merged_version: '', + target_version: '', }, }, }; @@ -129,7 +129,7 @@ describe('PerFieldRuleDiffTab', () => { const diffContent = wrapper.getByTestId('ruleUpgradePerFieldDiffContent').textContent; // Only the old timestamp_field should be displayed - expect(diffContent).toEqual('-old timestamp field'); + expect(diffContent).toEqual('-old name'); }); }); @@ -144,13 +144,6 @@ describe('PerFieldRuleDiffTab', () => { merged_version: 'new setup', target_version: 'new setup', }, - timestamp_field: { - ...ruleFieldsDiffBaseFieldsMock, - base_version: undefined, - current_version: undefined, - merged_version: 'new timestamp', - target_version: 'new timestamp', - }, name: { ...ruleFieldsDiffBaseFieldsMock, base_version: 'old name', @@ -166,11 +159,11 @@ describe('PerFieldRuleDiffTab', () => { const sectionLabels = matchedSectionElements.map((element) => element.textContent); // Schedule doesn't have any fields in the diff and shouldn't be displayed - expect(sectionLabels).toEqual(['About', 'Definition', 'Setup guide']); + expect(sectionLabels).toEqual(['About', 'Setup guide']); const matchedFieldElements = wrapper.queryAllByTestId('ruleUpgradePerFieldDiffLabel'); const fieldLabels = matchedFieldElements.map((element) => element.textContent); - expect(fieldLabels).toEqual(['Name', 'Timestamp Field', 'Setup']); + expect(fieldLabels).toEqual(['Name', 'Setup']); }); }); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx index 623ae20fa484f..295323017f06a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx @@ -27,6 +27,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import { FilterItems } from '@kbn/unified-search-plugin/public'; import type { AlertSuppressionMissingFieldsStrategy, + EqlOptionalFields, RequiredFieldArray, RuleResponse, Threshold as ThresholdType, @@ -59,6 +60,11 @@ import { } from './rule_definition_section.styles'; import { getQueryLanguageLabel } from './helpers'; import { useDefaultIndexPattern } from '../../hooks/use_default_index_pattern'; +import { + EQL_OPTIONS_EVENT_CATEGORY_FIELD_LABEL, + EQL_OPTIONS_EVENT_TIEBREAKER_FIELD_LABEL, + EQL_OPTIONS_EVENT_TIMESTAMP_FIELD_LABEL, +} from '../../../rule_creation/components/eql_query_edit/translations'; interface SavedQueryNameProps { savedQueryName: string; @@ -562,6 +568,51 @@ const prepareDefinitionSectionListItems = ( } } + if ((rule as EqlOptionalFields).event_category_override) { + definitionSectionListItems.push({ + title: ( + + {EQL_OPTIONS_EVENT_CATEGORY_FIELD_LABEL} + + ), + description: ( + + {(rule as EqlOptionalFields).event_category_override} + + ), + }); + } + + if ((rule as EqlOptionalFields).tiebreaker_field) { + definitionSectionListItems.push({ + title: ( + + {EQL_OPTIONS_EVENT_TIEBREAKER_FIELD_LABEL} + + ), + description: ( + + {(rule as EqlOptionalFields).tiebreaker_field} + + ), + }); + } + + if ((rule as EqlOptionalFields).timestamp_field) { + definitionSectionListItems.push({ + title: ( + + {EQL_OPTIONS_EVENT_TIMESTAMP_FIELD_LABEL} + + ), + description: ( + + {(rule as EqlOptionalFields).timestamp_field} + + ), + }); + } + if (rule.type) { definitionSectionListItems.push({ title: i18n.RULE_TYPE_FIELD_LABEL, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/eql_query.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/eql_query.ts index 25a4dff97dd21..b68eb44f7f86f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/eql_query.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/comparison_side/get_subfield_changes/eql_query.ts @@ -15,26 +15,25 @@ export const getSubfieldChangesForEqlQuery = ( ): SubfieldChange[] => { const changes: SubfieldChange[] = []; - const oldQuery = stringifyToSortedJson(oldFieldValue?.query); - const newQuery = stringifyToSortedJson(newFieldValue?.query); + const subFieldNames: Array = [ + 'query', + 'filters', + 'event_category_override', + 'tiebreaker_field', + 'timestamp_field', + ]; - if (oldQuery !== newQuery) { - changes.push({ - subfieldName: 'query', - oldSubfieldValue: oldQuery, - newSubfieldValue: newQuery, - }); - } - - const oldFilters = stringifyToSortedJson(oldFieldValue?.filters); - const newFilters = stringifyToSortedJson(newFieldValue?.filters); + for (const subFieldName of subFieldNames) { + const oldValue = stringifyToSortedJson(oldFieldValue?.[subFieldName]); + const newValue = stringifyToSortedJson(newFieldValue?.[subFieldName]); - if (oldFilters !== newFilters) { - changes.push({ - subfieldName: 'filters', - oldSubfieldValue: oldFilters, - newSubfieldValue: newFilters, - }); + if (newValue !== oldValue) { + changes.push({ + subfieldName: subFieldName, + oldSubfieldValue: oldValue, + newSubfieldValue: newValue, + }); + } } return changes; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx index 69e11c85e4d51..843f128dae8a6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx @@ -6,6 +6,7 @@ */ import React from 'react'; +import { assertUnreachable } from '../../../../../../../common/utility_types'; import type { UpgradeableCustomQueryFields } from '../../../../model/prebuilt_rule_upgrade/fields'; import { KqlQueryEditForm } from './fields/kql_query'; import { DataSourceEditForm } from './fields/data_source'; @@ -24,6 +25,6 @@ export function CustomQueryRuleFieldEdit({ fieldName }: CustomQueryRuleFieldEdit case 'alert_suppression': return ; default: - return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented + return assertUnreachable(fieldName); } } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx index dba33e57d56a7..29fcfdf7d522e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx @@ -6,9 +6,11 @@ */ import React from 'react'; +import { assertUnreachable } from '../../../../../../../common/utility_types'; import type { UpgradeableEqlFields } from '../../../../model/prebuilt_rule_upgrade/fields'; import { DataSourceEditForm } from './fields/data_source'; import { AlertSuppressionEditForm } from './fields/alert_suppression'; +import { EqlQueryEditForm } from './fields/eql_query'; interface EqlRuleFieldEditProps { fieldName: UpgradeableEqlFields; @@ -16,11 +18,13 @@ interface EqlRuleFieldEditProps { export function EqlRuleFieldEdit({ fieldName }: EqlRuleFieldEditProps) { switch (fieldName) { + case 'eql_query': + return ; case 'data_source': return ; case 'alert_suppression': return ; default: - return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented + return assertUnreachable(fieldName); } } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx new file mode 100644 index 0000000000000..787891452f1d7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_adapter.tsx @@ -0,0 +1,40 @@ +/* + * 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 type { DataViewBase } from '@kbn/es-query'; +import { EqlQueryEdit } from '../../../../../../../rule_creation/components/eql_query_edit'; +import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import { useDiffableRuleDataView } from '../hooks/use_diffable_rule_data_view'; + +export function EqlQueryEditAdapter({ + finalDiffableRule, +}: RuleFieldEditComponentProps): JSX.Element | null { + const { dataView, isLoading } = useDiffableRuleDataView(finalDiffableRule); + + // Wait for dataView to be defined to trigger validation with the correct index patterns + if (!dataView) { + return null; + } + + return ( + + ); +} + +const DEFAULT_DATA_VIEW_BASE: DataViewBase = { + title: '', + fields: [], +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx new file mode 100644 index 0000000000000..3a8312897671e --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/eql_query_edit_form.tsx @@ -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 React from 'react'; +import type { Filter } from '@kbn/es-query'; +import type { EqlOptions } from '@kbn/timelines-plugin/common'; +import type { FormData, FormSchema } from '../../../../../../../../shared_imports'; +import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import type { FieldValueQueryBar } from '../../../../../../../rule_creation_ui/components/query_bar'; +import { + type DiffableRule, + RuleEqlQuery, + QueryLanguageEnum, +} from '../../../../../../../../../common/api/detection_engine'; +import { EqlQueryEditAdapter } from './eql_query_edit_adapter'; + +export function EqlQueryEditForm(): JSX.Element { + return ( + + ); +} + +const kqlQuerySchema = {} as FormSchema<{ + eqlQuery: RuleEqlQuery; +}>; + +function deserializer( + fieldValue: FormData, + finalDiffableRule: DiffableRule +): { + eqlQuery: FieldValueQueryBar; + eqlOptions: EqlOptions; +} { + const parsedEqlQuery = + 'eql_query' in finalDiffableRule + ? RuleEqlQuery.parse(fieldValue.eql_query) + : { + query: '', + language: QueryLanguageEnum.eql, + filters: [], + }; + + return { + eqlQuery: { + query: { + query: parsedEqlQuery.query, + language: parsedEqlQuery.language, + }, + // cast to Filter since RuleEqlQuery checks it's an array + // potentially it might be incompatible type + filters: parsedEqlQuery.filters as Filter[], + saved_id: null, + }, + eqlOptions: { + eventCategoryField: parsedEqlQuery.event_category_override, + timestampField: parsedEqlQuery.timestamp_field, + tiebreakerField: parsedEqlQuery.tiebreaker_field, + }, + }; +} + +function serializer(formData: FormData): { + eql_query: RuleEqlQuery; +} { + const formValue = formData as { eqlQuery: FieldValueQueryBar; eqlOptions: EqlOptions }; + + return { + eql_query: { + query: formValue.eqlQuery.query.query as string, + language: QueryLanguageEnum.eql, + filters: formValue.eqlQuery.filters, + event_category_override: formValue.eqlOptions.eventCategoryField, + timestamp_field: formValue.eqlOptions.timestampField, + tiebreaker_field: formValue.eqlOptions.tiebreakerField, + }, + }; +} diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/index.ts similarity index 81% rename from x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/index.ts rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/index.ts index 7d247f755e9da..c11bd722a717d 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/index.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/eql_query/index.ts @@ -4,4 +4,5 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -export { getTranslateQueryNode } from './translate_query'; + +export * from './eql_query_edit_form'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx index b18b3203fdfb5..0c1ba5b1b6f61 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx @@ -6,6 +6,7 @@ */ import React from 'react'; +import { assertUnreachable } from '../../../../../../../common/utility_types'; import type { UpgradeableSavedQueryFields } from '../../../../model/prebuilt_rule_upgrade/fields'; import { KqlQueryEditForm } from './fields/kql_query'; import { DataSourceEditForm } from './fields/data_source'; @@ -24,6 +25,6 @@ export function SavedQueryRuleFieldEdit({ fieldName }: SavedQueryRuleFieldEditPr case 'alert_suppression': return ; default: - return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented + return assertUnreachable(fieldName); } } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx index b72fce91f198c..5fbd9516e78ba 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/eql_rule_field_readonly.tsx @@ -12,9 +12,6 @@ import { EqlQueryReadOnly } from './fields/eql_query/eql_query'; import { TypeReadOnly } from './fields/type/type'; import { AlertSuppressionReadOnly } from './fields/alert_suppression/alert_suppression'; import { assertUnreachable } from '../../../../../../../common/utility_types'; -import { EventCategoryOverrideReadOnly } from './fields/event_category_override/event_category_override'; -import { TimestampFieldReadOnly } from './fields/timestamp_field/timestamp_field'; -import { TiebreakerFieldReadOnly } from './fields/tiebreaker_field/tiebreaker_field'; interface EqlRuleFieldReadOnlyProps { fieldName: keyof DiffableEqlFields; @@ -39,16 +36,6 @@ export function EqlRuleFieldReadOnly({ fieldName, finalDiffableRule }: EqlRuleFi dataSource={finalDiffableRule.data_source} /> ); - case 'event_category_override': - return ( - - ); - case 'tiebreaker_field': - return ; - case 'timestamp_field': - return ; case 'type': return ; default: diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.tsx index f94f0bbfbe6c8..f2c49507b8ad5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/eql_query/eql_query.tsx @@ -6,11 +6,11 @@ */ import React from 'react'; -import { EuiDescriptionList } from '@elastic/eui'; +import { EuiDescriptionList, EuiText } from '@elastic/eui'; import type { EuiDescriptionListProps } from '@elastic/eui'; -import type { - RuleDataSource, - RuleEqlQuery, +import { + type RuleDataSource, + type RuleEqlQuery, } from '../../../../../../../../../common/api/detection_engine'; import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; import { Query, Filters } from '../../../../rule_definition_section'; @@ -38,5 +38,26 @@ export function EqlQueryReadOnly({ eqlQuery, dataSource }: EqlQueryReadOnlyProps }); } + if (eqlQuery.event_category_override) { + listItems.push({ + title: descriptionStepI18n.EQL_EVENT_CATEGORY_FIELD_LABEL, + description: {eqlQuery.event_category_override}, + }); + } + + if (eqlQuery.tiebreaker_field) { + listItems.push({ + title: descriptionStepI18n.EQL_TIEBREAKER_FIELD_LABEL, + description: {eqlQuery.tiebreaker_field}, + }); + } + + if (eqlQuery.timestamp_field) { + listItems.push({ + title: descriptionStepI18n.EQL_TIMESTAMP_FIELD_LABEL, + description: {eqlQuery.timestamp_field}, + }); + } + return ; } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.stories.tsx deleted file mode 100644 index 1f5987287f665..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.stories.tsx +++ /dev/null @@ -1,40 +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 React from 'react'; -import type { Story } from '@storybook/react'; -import { EventCategoryOverrideReadOnly } from './event_category_override'; -import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; -import { mockEqlRule } from '../../storybook/mocks'; -import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; - -export default { - component: EventCategoryOverrideReadOnly, - title: - 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/event_category_override', -}; - -interface TemplateProps { - finalDiffableRule: DiffableRule; -} - -const Template: Story = (args) => { - return ( - - - - ); -}; - -export const Default = Template.bind({}); - -Default.args = { - finalDiffableRule: mockEqlRule({ - event_category_override: 'event.action', - }), -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.tsx deleted file mode 100644 index 910e639049f96..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.tsx +++ /dev/null @@ -1,42 +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 React from 'react'; -import { EuiDescriptionList, EuiText } from '@elastic/eui'; -import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; -import type { EventCategoryOverride as EventCategoryOverrideType } from '../../../../../../../../../common/api/detection_engine'; - -interface EventCategoryOverrideReadOnlyProps { - eventCategoryOverride?: EventCategoryOverrideType; -} - -export function EventCategoryOverrideReadOnly({ - eventCategoryOverride, -}: EventCategoryOverrideReadOnlyProps) { - if (!eventCategoryOverride) { - return null; - } - - return ( - , - }, - ]} - /> - ); -} - -interface EventCategoryOverrideProps { - eventCategoryOverride: EventCategoryOverrideType; -} - -function EventCategoryOverride({ eventCategoryOverride }: EventCategoryOverrideProps) { - return {eventCategoryOverride}; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.stories.tsx deleted file mode 100644 index 3e73afda8f4eb..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.stories.tsx +++ /dev/null @@ -1,40 +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 React from 'react'; -import type { Story } from '@storybook/react'; -import { TiebreakerFieldReadOnly } from './tiebreaker_field'; -import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; -import { mockEqlRule } from '../../storybook/mocks'; -import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; - -export default { - component: TiebreakerFieldReadOnly, - title: - 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/tiebreaker_field', -}; - -interface TemplateProps { - finalDiffableRule: DiffableRule; -} - -const Template: Story = (args) => { - return ( - - - - ); -}; - -export const Default = Template.bind({}); - -Default.args = { - finalDiffableRule: mockEqlRule({ - tiebreaker_field: 'process.name', - }), -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.tsx deleted file mode 100644 index 10e52240748c7..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.tsx +++ /dev/null @@ -1,40 +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 React from 'react'; -import { EuiDescriptionList, EuiText } from '@elastic/eui'; -import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; -import type { TiebreakerField as TiebreakerFieldType } from '../../../../../../../../../common/api/detection_engine'; - -interface TiebreakerFieldReadOnlyProps { - tiebreakerField?: TiebreakerFieldType; -} - -export function TiebreakerFieldReadOnly({ tiebreakerField }: TiebreakerFieldReadOnlyProps) { - if (!tiebreakerField) { - return null; - } - - return ( - , - }, - ]} - /> - ); -} - -interface TiebreakerFieldProps { - tiebreakerField: TiebreakerFieldType; -} - -function TiebreakerField({ tiebreakerField }: TiebreakerFieldProps) { - return {tiebreakerField}; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.stories.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.stories.tsx deleted file mode 100644 index 9b3977c3deeb2..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.stories.tsx +++ /dev/null @@ -1,39 +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 React from 'react'; -import type { Story } from '@storybook/react'; -import { TimestampFieldReadOnly } from './timestamp_field'; -import { FieldReadOnly } from '../../field_readonly'; -import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; -import { mockEqlRule } from '../../storybook/mocks'; -import { ThreeWayDiffStorybookProviders } from '../../storybook/three_way_diff_storybook_providers'; - -export default { - component: TimestampFieldReadOnly, - title: 'Rule Management/Prebuilt Rules/Upgrade Flyout/ThreeWayDiff/FieldReadOnly/timestamp_field', -}; - -interface TemplateProps { - finalDiffableRule: DiffableRule; -} - -const Template: Story = (args) => { - return ( - - - - ); -}; - -export const Default = Template.bind({}); - -Default.args = { - finalDiffableRule: mockEqlRule({ - timestamp_field: 'event.created', - }), -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.tsx deleted file mode 100644 index cd27bfde3db60..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.tsx +++ /dev/null @@ -1,40 +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 React from 'react'; -import { EuiDescriptionList, EuiText } from '@elastic/eui'; -import * as descriptionStepI18n from '../../../../../../../rule_creation_ui/components/description_step/translations'; -import type { TimestampField as TimestampFieldType } from '../../../../../../../../../common/api/detection_engine'; - -interface TimestampFieldReadOnlyProps { - timestampField?: TimestampFieldType; -} - -export function TimestampFieldReadOnly({ timestampField }: TimestampFieldReadOnlyProps) { - if (!timestampField) { - return null; - } - - return ( - , - }, - ]} - /> - ); -} - -interface TimestampFieldProps { - timestampField: TimestampFieldType; -} - -function TimestampField({ timestampField }: TimestampFieldProps) { - return {timestampField}; -} diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx index 74e04a61ae5bd..e34d8be795ba8 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_summary_charts_panel/use_summary_chart_data.test.tsx @@ -5,11 +5,10 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; -import type { PropsWithChildren } from 'react'; +import { renderHook } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; import { ALERTS_QUERY_NAMES } from '../../../containers/detection_engine/alerts/constants'; -import type { UseAlerts, UseAlertsQueryProps } from './use_summary_chart_data'; +import type { UseAlertsQueryProps } from './use_summary_chart_data'; import { useSummaryChartData, getAlertsQuery } from './use_summary_chart_data'; import * as aggregations from './aggregations'; import * as severityMock from '../severity_level_panel/mock_data'; @@ -76,7 +75,7 @@ describe('getAlertsQuery', () => { // helper function to render the hook const renderUseSummaryChartData = (props: Partial = {}) => - renderHook, ReturnType>( + renderHook( () => useSummaryChartData({ aggregations: aggregations.severityAggregations, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/alerts_local_storage/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/alerts_local_storage/index.test.tsx index 303b85a40e6ee..82e8456e28571 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/alerts_local_storage/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/alerts_local_storage/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import React from 'react'; import { useAlertsLocalStorage } from '.'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.test.tsx index c89626b9edcec..f7fd2eced3d3d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/common/hooks.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { FieldSpec } from '@kbn/data-plugin/common'; import type { GetAggregatableFields, UseInspectButtonParams } from './hooks'; @@ -120,7 +120,7 @@ describe('hooks', () => { jest.clearAllMocks(); }); it('returns only aggregateable fields', () => { - const wrapper = ({ children }: { children: JSX.Element }) => ( + const wrapper = ({ children }: React.PropsWithChildren) => ( {children} ); const { result, unmount } = renderHook(() => useStackByFields(), { wrapper }); @@ -137,7 +137,7 @@ describe('hooks', () => { browserFields: { base: mockBrowserFields.base }, }); - const wrapper = ({ children }: { children: JSX.Element }) => ( + const wrapper = ({ children }: React.PropsWithChildren) => ( {children} ); const useLensCompatibleFields = true; @@ -155,7 +155,7 @@ describe('hooks', () => { browserFields: { nestedField: mockBrowserFields.nestedField }, }); - const wrapper = ({ children }: { children: JSX.Element }) => ( + const wrapper = ({ children }: React.PropsWithChildren) => ( {children} ); const useLensCompatibleFields = true; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx index b16d59045d835..e44f3e8785bed 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx @@ -25,7 +25,6 @@ import { getThresholdDetectionAlertAADMock, mockEcsDataWithAlert, mockTimelineDetails, - mockTimelineResult, mockAADEcsDataWithAlert, mockGetOneTimelineResult, mockTimelineData, @@ -283,7 +282,7 @@ describe('alert actions', () => { search: jest.fn().mockImplementation(() => of({ data: mockTimelineDetails })), }; - (getTimelineTemplate as jest.Mock).mockResolvedValue(mockTimelineResult); + (getTimelineTemplate as jest.Mock).mockResolvedValue(mockGetOneTimelineResult); clock = sinon.useFakeTimers(unix); }); @@ -355,7 +354,6 @@ describe('alert actions', () => { eventCategoryField: 'event.category', query: '', size: 100, - tiebreakerField: '', timestampField: '@timestamp', }, eventIdToNoteIds: {}, @@ -442,11 +440,13 @@ describe('alert actions', () => { test('it invokes createTimeline with kqlQuery.filterQuery.kuery.kind as "kuery" if not specified in returned timeline template', async () => { const mockTimelineResultModified = { - ...mockTimelineResult, - kqlQuery: { - filterQuery: { - kuery: { - expression: [''], + body: { + ...mockGetOneTimelineResult, + kqlQuery: { + filterQuery: { + kuery: { + expression: [''], + }, }, }, }, @@ -460,7 +460,6 @@ describe('alert actions', () => { getExceptionFilter: mockGetExceptionFilter, }); const createTimelineArg = (createTimeline as jest.Mock).mock.calls[0][0]; - expect(mockGetExceptionFilter).not.toHaveBeenCalled(); expect(createTimeline).toHaveBeenCalledTimes(1); expect(createTimelineArg.timeline.kqlQuery.filterQuery.kuery.kind).toEqual('kuery'); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx index 3a3e0d0255531..822adecbe8c4d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx @@ -7,7 +7,7 @@ /* eslint-disable complexity */ -import { getOr, isEmpty } from 'lodash/fp'; +import { isEmpty } from 'lodash/fp'; import moment from 'moment'; import dateMath from '@kbn/datemath'; @@ -51,7 +51,6 @@ import { isThresholdRule, } from '../../../../common/detection_engine/utils'; import { TimelineId } from '../../../../common/types/timeline'; -import type { TimelineResponse } from '../../../../common/api/timeline'; import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; import type { SendAlertToTimelineActionProps, @@ -67,10 +66,7 @@ import type { } from '../../../../common/search_strategy/timeline'; import { TimelineEventsQueries } from '../../../../common/search_strategy/timeline'; import { timelineDefaults } from '../../../timelines/store/defaults'; -import { - omitTypenameInTimeline, - formatTimelineResponseToModel, -} from '../../../timelines/components/open_timeline/helpers'; +import { formatTimelineResponseToModel } from '../../../timelines/components/open_timeline/helpers'; import { convertKueryToElasticSearchQuery } from '../../../common/lib/kuery'; import { getField, getFieldKey } from '../../../helpers'; import { @@ -980,15 +976,9 @@ export const sendAlertToTimelineAction = async ({ ) ), ]); - - const resultingTimeline: TimelineResponse = getOr( - {}, - 'data.getOneTimeline', - responseTimeline - ); const eventData: TimelineEventsDetailsItem[] = eventDataResp.data ?? []; - if (!isEmpty(resultingTimeline)) { - const timelineTemplate = omitTypenameInTimeline(resultingTimeline); + if (!isEmpty(responseTimeline)) { + const timelineTemplate = responseTimeline; const { timeline, notes } = formatTimelineResponseToModel( timelineTemplate, true, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.test.tsx index cb1fa0b4ef86e..fe3648c426bc0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.test.tsx @@ -7,7 +7,7 @@ import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; import { useIsInvestigateInResolverActionEnabled } from './investigate_in_resolver'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { TestProviders } from '../../../../common/mock'; describe('InvestigateInResolverAction', () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.test.tsx index b60a7a5644b52..d22520f9f9553 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.test.tsx @@ -7,8 +7,7 @@ import React from 'react'; import { EuiContextMenu, EuiPopover } from '@elastic/eui'; -import { act, renderHook } from '@testing-library/react-hooks'; -import { render, screen } from '@testing-library/react'; +import { render, screen, renderHook, act } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { useAddToCaseActions } from './use_add_to_case_actions'; import { TestProviders } from '../../../../common/mock'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_assignees_actions.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_assignees_actions.test.tsx index a7bde416b7ca0..b3173bcff3770 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_assignees_actions.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_assignees_actions.test.tsx @@ -5,12 +5,11 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; import type { UseAlertAssigneesActionsProps } from './use_alert_assignees_actions'; import { useAlertAssigneesActions } from './use_alert_assignees_actions'; import { useAlertsPrivileges } from '../../../containers/detection_engine/alerts/use_alerts_privileges'; import type { AlertTableContextMenuItem } from '../types'; -import { render } from '@testing-library/react'; +import { render, renderHook } from '@testing-library/react'; import React from 'react'; import type { EuiContextMenuPanelDescriptor } from '@elastic/eui'; import { EuiPopover, EuiContextMenu } from '@elastic/eui'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_tags_actions.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_tags_actions.test.tsx index 4e037467597c9..64461725b8622 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_tags_actions.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_alert_tags_actions.test.tsx @@ -5,12 +5,11 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; import type { UseAlertTagsActionsProps } from './use_alert_tags_actions'; import { useAlertTagsActions } from './use_alert_tags_actions'; import { useAlertsPrivileges } from '../../../containers/detection_engine/alerts/use_alerts_privileges'; import type { AlertTableContextMenuItem } from '../types'; -import { render } from '@testing-library/react'; +import { render, renderHook } from '@testing-library/react'; import React from 'react'; import type { EuiContextMenuPanelDescriptor } from '@elastic/eui'; import { EuiPopover, EuiContextMenu } from '@elastic/eui'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_investigate_in_timeline.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_investigate_in_timeline.test.tsx index 6d20ef3973337..8de172d54a07f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_investigate_in_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_investigate_in_timeline.test.tsx @@ -4,8 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; -import { fireEvent, render, waitFor } from '@testing-library/react'; + +import { fireEvent, render, waitFor, renderHook, act } from '@testing-library/react'; import { of } from 'rxjs'; import { TestProviders } from '../../../../common/mock'; import { useKibana } from '../../../../common/lib/kibana'; @@ -112,114 +112,110 @@ const mockSendAlertToTimeline = jest.spyOn(actions, 'sendAlertToTimelineAction') }); const mockTimelineTemplateResponse = { - data: { - getOneTimeline: { - savedObjectId: '15bc8185-06ef-4956-b7e7-be8e289b13c2', - version: 'WzIzMzUsMl0=', - columns: [ - { - columnHeaderType: 'not-filtered', - id: '@timestamp', - type: 'date', - }, - { - columnHeaderType: 'not-filtered', - id: 'host.name', - }, - { - columnHeaderType: 'not-filtered', - id: 'user.name', - }, - ], - dataProviders: [ - { - and: [], - enabled: true, - id: 'some-random-id', - name: 'host.name', - excluded: false, - kqlQuery: '', - queryMatch: { - field: 'host.name', - value: '{host.name}', - operator: ':', - }, - type: 'template', - }, - ], - dataViewId: 'security-solution-default', - description: '', - eqlOptions: { - eventCategoryField: 'event.category', - tiebreakerField: '', - timestampField: '@timestamp', - query: '', - size: 100, - }, - eventType: 'all', - excludedRowRendererIds: [ - 'alert', - 'alerts', - 'auditd', - 'auditd_file', - 'library', - 'netflow', - 'plain', - 'registry', - 'suricata', - 'system', - 'system_dns', - 'system_endgame_process', - 'system_file', - 'system_fim', - 'system_security_event', - 'system_socket', - 'threat_match', - 'zeek', - ], - favorite: [], - filters: [], - indexNames: ['.alerts-security.alerts-default', 'auditbeat-*', 'filebeat-*', 'packetbeat-*'], - kqlMode: 'filter', - kqlQuery: { - filterQuery: { - kuery: { - kind: 'kuery', - expression: '*', - }, - serializedQuery: '{"query_string":{"query":"*"}}', - }, + savedObjectId: '15bc8185-06ef-4956-b7e7-be8e289b13c2', + version: 'WzIzMzUsMl0=', + columns: [ + { + columnHeaderType: 'not-filtered', + id: '@timestamp', + type: 'date', + }, + { + columnHeaderType: 'not-filtered', + id: 'host.name', + }, + { + columnHeaderType: 'not-filtered', + id: 'user.name', + }, + ], + dataProviders: [ + { + and: [], + enabled: true, + id: 'some-random-id', + name: 'host.name', + excluded: false, + kqlQuery: '', + queryMatch: { + field: 'host.name', + value: '{host.name}', + operator: ':', }, - title: 'Named Template', - templateTimelineId: 'c755cda6-8a65-4ec2-b6ff-35a5356de8b9', - templateTimelineVersion: 1, - dateRange: { - start: '2024-08-13T22:00:00.000Z', - end: '2024-08-14T21:59:59.999Z', + type: 'template', + }, + ], + dataViewId: 'security-solution-default', + description: '', + eqlOptions: { + eventCategoryField: 'event.category', + tiebreakerField: '', + timestampField: '@timestamp', + query: '', + size: 100, + }, + eventType: 'all', + excludedRowRendererIds: [ + 'alert', + 'alerts', + 'auditd', + 'auditd_file', + 'library', + 'netflow', + 'plain', + 'registry', + 'suricata', + 'system', + 'system_dns', + 'system_endgame_process', + 'system_file', + 'system_fim', + 'system_security_event', + 'system_socket', + 'threat_match', + 'zeek', + ], + favorite: [], + filters: [], + indexNames: ['.alerts-security.alerts-default', 'auditbeat-*', 'filebeat-*', 'packetbeat-*'], + kqlMode: 'filter', + kqlQuery: { + filterQuery: { + kuery: { + kind: 'kuery', + expression: '*', }, - savedQueryId: null, - created: 1723625359467, - createdBy: 'elastic', - updated: 1723625359988, - updatedBy: 'elastic', - timelineType: 'template', - status: 'active', - sort: [ - { - columnId: '@timestamp', - columnType: 'date', - sortDirection: 'desc', - esTypes: ['date'], - }, - ], - savedSearchId: null, - eventIdToNoteIds: [], - noteIds: [], - notes: [], - pinnedEventIds: [], - pinnedEventsSaveObject: [], + serializedQuery: '{"query_string":{"query":"*"}}', }, }, + title: 'Named Template', + templateTimelineId: 'c755cda6-8a65-4ec2-b6ff-35a5356de8b9', + templateTimelineVersion: 1, + dateRange: { + start: '2024-08-13T22:00:00.000Z', + end: '2024-08-14T21:59:59.999Z', + }, + savedQueryId: null, + created: 1723625359467, + createdBy: 'elastic', + updated: 1723625359988, + updatedBy: 'elastic', + timelineType: 'template', + status: 'active', + sort: [ + { + columnId: '@timestamp', + columnType: 'date', + sortDirection: 'desc', + esTypes: ['date'], + }, + ], + savedSearchId: null, + eventIdToNoteIds: [], + noteIds: [], + notes: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], }; const props = { diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts index 57a0aa43cdde6..2a07746a6d67a 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts @@ -16,6 +16,7 @@ import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { useAppToastsMock } from '../../../../common/hooks/use_app_toasts.mock'; import { mockTimeline } from '../../../../../server/lib/timeline/__mocks__/create_timelines'; import type { TimelineModel } from '../../../..'; +import type { ResolveTimelineResponse } from '../../../../../common/api/timeline'; jest.mock('../../../../common/hooks/use_experimental_features'); jest.mock('../../../../common/utils/global_query_string/helpers'); @@ -45,53 +46,52 @@ jest.mock('react-redux', () => { const timelineId = 'eb2781c0-1df5-11eb-8589-2f13958b79f7'; -const selectedTimeline = { - data: { - timeline: { - ...mockTimeline, - id: timelineId, - savedObjectId: timelineId, - indexNames: ['awesome-*'], - dataViewId: 'custom-data-view-id', - kqlQuery: { - filterQuery: { - serializedQuery: - '{"bool":{"filter":[{"bool":{"should":[{"exists":{"field":"host.name"}}],"minimum_should_match":1}},{"bool":{"should":[{"exists":{"field":"user.name"}}],"minimum_should_match":1}}]}}', - kuery: { - expression: 'host.name:* AND user.name:*', - kind: 'kuery', - }, +const selectedTimeline: ResolveTimelineResponse = { + outcome: 'exactMatch', + timeline: { + ...mockTimeline, + savedObjectId: timelineId, + version: 'wedwed', + indexNames: ['awesome-*'], + dataViewId: 'custom-data-view-id', + kqlQuery: { + filterQuery: { + serializedQuery: + '{"bool":{"filter":[{"bool":{"should":[{"exists":{"field":"host.name"}}],"minimum_should_match":1}},{"bool":{"should":[{"exists":{"field":"user.name"}}],"minimum_should_match":1}}]}}', + kuery: { + expression: 'host.name:* AND user.name:*', + kind: 'kuery', }, }, - dataProviders: [ - { - excluded: false, - and: [], - kqlQuery: '', - name: 'Stephs-MBP.lan', - queryMatch: { - field: 'host.name', - value: 'Stephs-MBP.lan', - operator: ':', - }, - id: 'draggable-badge-default-draggable-process_stopped-timeline-1-NH9UwoMB2HTqQ3G4wUFM-host_name-Stephs-MBP_lan', - enabled: true, + }, + dataProviders: [ + { + excluded: false, + and: [], + kqlQuery: '', + name: 'Stephs-MBP.lan', + queryMatch: { + field: 'host.name', + value: 'Stephs-MBP.lan', + operator: ':', }, - { - excluded: false, - and: [], - kqlQuery: '', - name: '--lang=en-US', - queryMatch: { - field: 'process.args', - value: '--lang=en-US', - operator: ':', - }, - id: 'draggable-badge-default-draggable-process_started-timeline-1-args-5---lang=en-US-MH9TwoMB2HTqQ3G4_UH--process_args---lang=en-US', - enabled: true, + id: 'draggable-badge-default-draggable-process_stopped-timeline-1-NH9UwoMB2HTqQ3G4wUFM-host_name-Stephs-MBP_lan', + enabled: true, + }, + { + excluded: false, + and: [], + kqlQuery: '', + name: '--lang=en-US', + queryMatch: { + field: 'process.args', + value: '--lang=en-US', + operator: ':', }, - ], - }, + id: 'draggable-badge-default-draggable-process_started-timeline-1-args-5---lang=en-US-MH9TwoMB2HTqQ3G4_UH--process_args---lang=en-US', + enabled: true, + }, + ], }, }; @@ -157,8 +157,8 @@ describe('useRuleFromTimeline', () => { type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', payload: { id: 'timeline', - selectedDataViewId: selectedTimeline.data.timeline.dataViewId, - selectedPatterns: selectedTimeline.data.timeline.indexNames, + selectedDataViewId: selectedTimeline.timeline.dataViewId, + selectedPatterns: selectedTimeline.timeline.indexNames, }, }); }); @@ -220,16 +220,15 @@ describe('useRuleFromTimeline', () => { query: 'find it EQL', size: 100, }; - const eqlTimeline = { - data: { - timeline: { - ...mockTimeline, - id: timelineId, - savedObjectId: timelineId, - indexNames: ['awesome-*'], - dataViewId: 'custom-data-view-id', - eqlOptions, - }, + const eqlTimeline: ResolveTimelineResponse = { + outcome: 'exactMatch', + timeline: { + ...mockTimeline, + version: '123', + savedObjectId: timelineId, + indexNames: ['awesome-*'], + dataViewId: 'custom-data-view-id', + eqlOptions, }, }; (resolveTimeline as jest.Mock).mockResolvedValue(eqlTimeline); @@ -256,7 +255,7 @@ describe('useRuleFromTimeline', () => { const { result } = renderHook(() => useRuleFromTimeline(setRuleQuery)); expect(result.current.loading).toEqual(false); await act(async () => { - result.current.onOpenTimeline(selectedTimeline.data.timeline as unknown as TimelineModel); + result.current.onOpenTimeline(selectedTimeline.timeline as unknown as TimelineModel); }); // not loading anything as an external call to onOpenTimeline provides the timeline @@ -307,7 +306,7 @@ describe('useRuleFromTimeline', () => { const { result } = renderHook(() => useRuleFromTimeline(setRuleQuery)); expect(result.current.loading).toEqual(false); const tl = { - ...selectedTimeline.data.timeline, + ...selectedTimeline.timeline, dataProviders: [ { property: 'bad', diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx index 27c2699cdf195..b72c043ffa408 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.tsx @@ -9,7 +9,7 @@ import { isEmpty } from 'lodash/fp'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import { i18n } from '@kbn/i18n'; -import type { EqlOptionsSelected } from '@kbn/timelines-plugin/common'; +import type { EqlOptions } from '@kbn/timelines-plugin/common'; import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { useSourcererDataView } from '../../../../sourcerer/containers'; @@ -37,7 +37,7 @@ export type SetRuleQuery = ({ }: { index: string[]; queryBar: FieldValueQueryBar; - eqlOptions?: EqlOptionsSelected; + eqlOptions?: EqlOptions; }) => void; export const useRuleFromTimeline = (setRuleQuery: SetRuleQuery): RuleFromTimeline => { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts index cf2c3264f3150..2f0cf92737f4a 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts @@ -50,7 +50,7 @@ import type { RequiredFieldInput, } from '../../../../../common/api/detection_engine/model/rule_schema'; import type { SortOrder } from '../../../../../common/api/detection_engine'; -import type { EqlOptionsSelected } from '../../../../../common/search_strategy'; +import type { EqlOptions } from '../../../../../common/search_strategy'; import type { RuleResponseAction, ResponseAction, @@ -164,7 +164,7 @@ export interface DefineStepRule { threatIndex: ThreatIndex; threatQueryBar: FieldValueQueryBar; threatMapping: ThreatMapping; - eqlOptions: EqlOptionsSelected; + eqlOptions: EqlOptions; dataSourceType: DataSourceType; newTermsFields: string[]; historyWindowSize: string; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx index 6f728d7653783..1073be375b093 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/index.tsx @@ -44,6 +44,6 @@ export const getInsightsInputTab = ({ defaultMessage="Insights" /> ), - content: , + content: , }; }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_fetch_alerts.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_fetch_alerts.test.ts index c4910f5daa42a..9f9d031cc0bf2 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_fetch_alerts.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_fetch_alerts.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { useKibana } from '../../../../common/lib/kibana'; import { createFindAlerts } from '../services/find_alerts'; import { useFetchAlerts, type UseAlertsQueryParams } from './use_fetch_alerts'; @@ -41,15 +41,14 @@ describe('useFetchAlerts', () => { sort: [{ '@timestamp': 'desc' }], }; - const { result, waitFor } = renderHook(() => useFetchAlerts(params), { + const { result } = renderHook(() => useFetchAlerts(params), { wrapper: createReactQueryWrapper(), }); expect(result.current.loading).toBe(true); - await waitFor(() => !result.current.loading); + await waitFor(() => expect(result.current.loading).toBe(false)); - expect(result.current.loading).toBe(false); expect(result.current.error).toBe(false); expect(result.current.totalItemCount).toBe(10); expect(result.current.data).toEqual(['alert1', 'alert2', 'alert3']); @@ -70,13 +69,13 @@ describe('useFetchAlerts', () => { sort: [{ '@timestamp': 'desc' }], }; - const { result, waitFor } = renderHook(() => useFetchAlerts(params), { + const { result } = renderHook(() => useFetchAlerts(params), { wrapper: createReactQueryWrapper(), }); expect(result.current.loading).toBe(true); - await waitFor(() => !result.current.loading); + await waitFor(() => expect(result.current.loading).toBe(false)); expect(result.current.loading).toBe(false); expect(result.current.error).toBe(true); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_response_actions_view.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_response_actions_view.test.ts index cafac9f3a0b9f..5e6469e44a048 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_response_actions_view.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_response_actions_view.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useResponseActionsView } from './use_response_actions_view'; import { mockSearchHit } from '../../shared/mocks/mock_search_hit'; import { mockDataAsNestedObject } from '../../shared/mocks/mock_data_as_nested_object'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts index 17e564a1eb8ab..75b76adae787d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts @@ -6,7 +6,7 @@ */ import { useThreatIntelligenceDetails } from './use_threat_intelligence_details'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { SecurityPageName } from '@kbn/deeplinks-security'; import { useTimelineEventsDetails } from '../../../../timelines/containers/details'; import { useSourcererDataView } from '../../../../sourcerer/containers'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts index ac3c9c8a6be0d..80ac41b539fa1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_accordion_state.test.ts @@ -7,14 +7,14 @@ import type { ToggleReducerAction, UseAccordionStateValue } from './use_accordion_state'; import { useAccordionState, toggleReducer } from './use_accordion_state'; -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import { FLYOUT_STORAGE_KEYS } from '../../shared/constants/local_storage'; const mockSet = jest.fn(); describe('useAccordionState', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return initial value', () => { hookResult = renderHook((props: boolean) => useAccordionState(props), { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_assistant.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_assistant.test.tsx index 9ca0d9fd18e7d..1871c4aad5b8d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_assistant.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_assistant.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseAssistantParams, UseAssistantResult } from './use_assistant'; import { useAssistant } from './use_assistant'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; @@ -25,7 +25,7 @@ const renderUseAssistant = () => }); describe('useAssistant', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it(`should return showAssistant true and a value for promptContextId`, () => { jest.mocked(useAssistantAvailability).mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts index 998f56312b0f0..26c9b36a728aa 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_expand_section.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseExpandSectionParams } from './use_expand_section'; import { useExpandSection } from './use_expand_section'; import { useKibana } from '../../../../common/lib/kibana'; @@ -14,7 +14,7 @@ import { useKibana } from '../../../../common/lib/kibana'; jest.mock('../../../../common/lib/kibana'); describe('useExpandSection', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return default value if nothing in localStorage', () => { (useKibana as jest.Mock).mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_threat_intelligence.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_threat_intelligence.test.tsx index e778552dff613..74672356f0762 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_threat_intelligence.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_threat_intelligence.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseThreatIntelligenceParams, UseThreatIntelligenceResult, @@ -41,7 +41,7 @@ const dataFormattedForFieldBrowser = [ ]; describe('useFetchThreatIntelligence', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('return render 1 match detected and 1 field enriched', () => { (useInvestigationTimeEnrichment as jest.Mock).mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.test.tsx index a67bb675a373a..3611ab6282644 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_flyout_is_expandable.test.tsx @@ -6,7 +6,7 @@ */ import { useFlyoutIsExpandable } from './use_flyout_is_expandable'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_get_flyout_link.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_get_flyout_link.test.tsx index 2db21334e59f3..71b24ab891e78 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_get_flyout_link.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_get_flyout_link.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useGetFlyoutLink } from './use_get_flyout_link'; import { useGetAppUrl } from '@kbn/security-solution-navigation'; import { ALERT_DETAILS_REDIRECT_PATH } from '../../../../../common/constants'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx index d12154a390abf..7fa0741a85118 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx @@ -5,15 +5,15 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseGraphPreviewParams, UseGraphPreviewResult } from './use_graph_preview'; import { useGraphPreview } from './use_graph_preview'; import type { GetFieldsData } from '../../shared/hooks/use_get_fields_data'; import { mockFieldData } from '../../shared/mocks/mock_get_fields_data'; describe('useGraphPreview', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it(`should return false when missing actor`, () => { const getFieldsData: GetFieldsData = (field: string) => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_process_data.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_process_data.test.tsx index 31eb78975d195..6f6085c13ee6f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_process_data.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_process_data.test.tsx @@ -6,7 +6,7 @@ */ import { getUserDisplayName, useProcessData } from './use_process_data'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { FC, PropsWithChildren } from 'react'; import { DocumentDetailsContext } from '../../shared/context'; import React from 'react'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_session_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_session_preview.test.tsx index 0f6f233772626..4e2e19c6b54fa 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_session_preview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_session_preview.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseSessionPreviewParams } from './use_session_preview'; import { useSessionPreview } from './use_session_preview'; import type { SessionViewConfig } from '@kbn/securitysolution-data-table/common/types'; @@ -15,7 +15,7 @@ import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_f import { mockFieldData, mockGetFieldsData } from '../../shared/mocks/mock_get_fields_data'; describe('useSessionPreview', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it(`should return a session view config object if alert ancestor index is available`, () => { const getFieldsData: GetFieldsData = (field: string) => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_tabs.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_tabs.test.tsx index 87a23a06b7ce1..a8a7f61bac26c 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_tabs.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseTabsParams, UseTabsResult } from './use_tabs'; import { allThreeTabs, twoTabs, useTabs } from './use_tabs'; @@ -26,7 +26,7 @@ jest.mock('../../../../common/lib/kibana', () => { }); describe('useTabs', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return 3 tabs to render and the one from path as selected', () => { const initialProps: UseTabsParams = { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_document_analyzer_schema.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_document_analyzer_schema.test.tsx index 3c31720b53f99..8d9cbd958e432 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_document_analyzer_schema.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_document_analyzer_schema.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import { useQuery } from '@tanstack/react-query'; import type { UseAlertDocumentAnalyzerSchemaParams, @@ -20,8 +20,8 @@ jest.mock('@tanstack/react-query'); describe('useAlertPrevalenceFromProcessTree', () => { let hookResult: RenderHookResult< - UseAlertDocumentAnalyzerSchemaParams, - UseAlertDocumentAnalyzerSchemaResult + UseAlertDocumentAnalyzerSchemaResult, + UseAlertDocumentAnalyzerSchemaParams >; beforeEach(() => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence.test.tsx index 231e0e5419441..27b83255443b5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import { ALERT_PREVALENCE_AGG, useAlertPrevalence } from './use_alert_prevalence'; import type { UseAlertPrevalenceParams, UserAlertPrevalenceResult } from './use_alert_prevalence'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; @@ -18,7 +18,7 @@ jest.mock('../../../../common/hooks/use_selector'); jest.mock('../../../../detections/containers/detection_engine/alerts/use_query'); describe('useAlertPrevalence', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; beforeEach(() => { (useDeepEqualSelector as jest.Mock).mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence_from_process_tree.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence_from_process_tree.test.tsx index 94b7cfa623507..668f233e65710 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence_from_process_tree.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_alert_prevalence_from_process_tree.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseAlertPrevalenceFromProcessTreeParams, UserAlertPrevalenceFromProcessTreeResult, @@ -25,8 +25,8 @@ jest.mock('@tanstack/react-query'); describe('useAlertPrevalenceFromProcessTree', () => { let hookResult: RenderHookResult< - UseAlertPrevalenceFromProcessTreeParams, - UserAlertPrevalenceFromProcessTreeResult + UserAlertPrevalenceFromProcessTreeResult, + UseAlertPrevalenceFromProcessTreeParams >; beforeEach(() => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_basic_data_from_details_data.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_basic_data_from_details_data.test.tsx index b4cd7c35824a1..2894cb0d21276 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_basic_data_from_details_data.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_basic_data_from_details_data.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useBasicDataFromDetailsData } from './use_basic_data_from_details_data'; import { mockDataFormattedForFieldBrowser } from '../mocks/mock_data_formatted_for_field_browser'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx index efa56c9e65720..1d9181b8514b1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseEventDetailsParams, UseEventDetailsResult } from './use_event_details'; import { getAlertIndexAlias, useEventDetails } from './use_event_details'; import { useSpaceId } from '../../../../common/hooks/use_space_id'; @@ -45,7 +45,7 @@ describe('getAlertIndexAlias', () => { }); describe('useEventDetails', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return all properties', () => { jest.mocked(useSpaceId).mockReturnValue('default'); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_ancestry.test.tsx index 4d65339c6b41a..7630c260f4c21 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_ancestry.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_ancestry.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseFetchRelatedAlertsByAncestryParams, UseFetchRelatedAlertsByAncestryResult, @@ -22,8 +22,8 @@ const scopeId = 'scopeId'; describe('useFetchRelatedAlertsByAncestry', () => { let hookResult: RenderHookResult< - UseFetchRelatedAlertsByAncestryParams, - UseFetchRelatedAlertsByAncestryResult + UseFetchRelatedAlertsByAncestryResult, + UseFetchRelatedAlertsByAncestryParams >; it('should return loading true while data is loading', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_same_source_event.test.tsx index ff74774068adf..9da01a94d51dc 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_same_source_event.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseFetchRelatedAlertsBySameSourceEventParams, UseFetchRelatedAlertsBySameSourceEventResult, @@ -21,8 +21,8 @@ const scopeId = 'scopeId'; describe('useFetchRelatedAlertsBySameSourceEvent', () => { let hookResult: RenderHookResult< - UseFetchRelatedAlertsBySameSourceEventParams, - UseFetchRelatedAlertsBySameSourceEventResult + UseFetchRelatedAlertsBySameSourceEventResult, + UseFetchRelatedAlertsBySameSourceEventParams >; it('should return loading true while data is loading', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_session.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_session.test.tsx index b38ef44178f9f..27f030cc11e2d 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_session.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_alerts_by_session.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseFetchRelatedAlertsBySessionParams, @@ -22,8 +22,8 @@ const scopeId = 'scopeId'; describe('useFetchRelatedAlertsBySession', () => { let hookResult: RenderHookResult< - UseFetchRelatedAlertsBySessionParams, - UseFetchRelatedAlertsBySessionResult + UseFetchRelatedAlertsBySessionResult, + UseFetchRelatedAlertsBySessionParams >; it('should return loading true while data is loading', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_cases.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_cases.test.ts index 6ebdc2bc4b7c7..9e494ef8e05d0 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_cases.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_fetch_related_cases.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { createReactQueryWrapper } from '../../../../common/mock'; import { useFetchRelatedCases } from './use_fetch_related_cases'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_get_fields_data.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_get_fields_data.test.tsx index fcf370b4bca1a..a91d14c7a84ee 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_get_fields_data.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_get_fields_data.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import { mockSearchHit } from '../mocks/mock_search_hit'; import type { UseGetFieldsDataParams, UseGetFieldsDataResult } from './use_get_fields_data'; import { useGetFieldsData } from './use_get_fields_data'; @@ -17,7 +17,7 @@ const fieldsData = { }; describe('useGetFieldsData', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return the value for a field', () => { hookResult = renderHook(() => useGetFieldsData({ fieldsData })); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx index 6eb8c242c79fe..6bffb7c58ae3f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_highlighted_fields.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { mockDataFormattedForFieldBrowser, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_enrichment.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_enrichment.test.ts index 0e1cdbc845b38..c79e1ec07ce15 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_enrichment.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_enrichment.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useInvestigationTimeEnrichment } from './use_investigation_enrichment'; import { DEFAULT_EVENT_ENRICHMENT_FROM, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_guide.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_guide.test.ts index f7e3a40e60c40..39522df675486 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_guide.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_investigation_guide.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseInvestigationGuideParams, UseInvestigationGuideResult, @@ -22,7 +22,7 @@ jest.mock('../../../../detection_engine/rule_management/logic/use_rule_with_fall const dataFormattedForFieldBrowser = mockDataFormattedForFieldBrowser; describe('useInvestigationGuide', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return loading true', () => { (useBasicDataFromDetailsData as jest.Mock).mockReturnValue({ ruleId: 'ruleId' }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx index 6f578c7cdb95c..334bf5f08721e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_analyzer.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { useNavigateToAnalyzer } from './use_navigate_to_analyzer'; import { mockFlyoutApi } from '../mocks/mock_flyout_context'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx index c0f85e07377df..ac624ce11ce56 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_navigate_to_session_view.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; import { useNavigateToSessionView } from './use_navigate_to_session_view'; import { mockFlyoutApi } from '../mocks/mock_flyout_context'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_prevalence.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_prevalence.test.tsx index a9c12adfc84ca..d4acc0eb0c7f6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_prevalence.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_prevalence.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { usePrevalence } from './use_prevalence'; import { mockDataFormattedForFieldBrowser } from '../mocks/mock_data_formatted_for_field_browser'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_rule_details_link.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_rule_details_link.test.ts index f77b82af80065..ca748433c1931 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_rule_details_link.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_rule_details_link.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseRuleDetailsLinkParams } from './use_rule_details_link'; import { useRuleDetailsLink } from './use_rule_details_link'; @@ -24,7 +24,7 @@ jest.mock('../../../../common/components/link_to', () => ({ })); describe('useRuleDetailsLink', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return null if the ruleId prop is null', () => { const initialProps: UseRuleDetailsLinkParams = { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx index f4be536d5419c..938930496d803 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_ancestry.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseShowRelatedAlertsByAncestryParams, UseShowRelatedAlertsByAncestryResult, @@ -36,8 +36,8 @@ const dataAsNestedObject = mockDataAsNestedObject; describe('useShowRelatedAlertsByAncestry', () => { let hookResult: RenderHookResult< - UseShowRelatedAlertsByAncestryParams, - UseShowRelatedAlertsByAncestryResult + UseShowRelatedAlertsByAncestryResult, + UseShowRelatedAlertsByAncestryParams >; it('should return false if Process Entity Info is not available', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx index dfbfeeccc655a..71f681c64e802 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_same_source_event.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { ShowRelatedAlertsBySameSourceEventParams, @@ -18,8 +18,8 @@ const eventId = 'eventId'; describe('useShowRelatedAlertsBySameSourceEvent', () => { let hookResult: RenderHookResult< - ShowRelatedAlertsBySameSourceEventParams, - ShowRelatedAlertsBySameSourceEventResult + ShowRelatedAlertsBySameSourceEventResult, + ShowRelatedAlertsBySameSourceEventParams >; it('should return eventId if getFieldsData returns null', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_session.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_session.test.tsx index 32595a4c27c6d..92d9c076ab64f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_session.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_alerts_by_session.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { UseShowRelatedAlertsBySessionParams, @@ -16,8 +16,8 @@ import { useShowRelatedAlertsBySession } from './use_show_related_alerts_by_sess describe('useShowRelatedAlertsBySession', () => { let hookResult: RenderHookResult< - UseShowRelatedAlertsBySessionParams, - UseShowRelatedAlertsBySessionResult + UseShowRelatedAlertsBySessionResult, + UseShowRelatedAlertsBySessionParams >; it('should return false if getFieldsData returns null', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_cases.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_cases.test.tsx index cfa9b87d8fcfc..6245e480a35db 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_cases.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_related_cases.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useKibana as mockUseKibana } from '../../../../common/lib/kibana/__mocks__'; import { useShowRelatedCases } from './use_show_related_cases'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_suppressed_alerts.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_suppressed_alerts.test.tsx index 622f37a0997cf..b10e154fed3d5 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_suppressed_alerts.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_show_suppressed_alerts.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import type { ShowSuppressedAlertsParams, ShowSuppressedAlertsResult, @@ -14,7 +14,7 @@ import type { import { useShowSuppressedAlerts } from './use_show_suppressed_alerts'; describe('useShowSuppressedAlerts', () => { - let hookResult: RenderHookResult; + let hookResult: RenderHookResult; it('should return false if getFieldsData returns null', () => { const getFieldsData = () => null; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_which_flyout.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_which_flyout.test.tsx index 76277b8da889b..033fb53a5c029 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_which_flyout.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_which_flyout.test.tsx @@ -5,13 +5,13 @@ * 2.0. */ -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; +import type { RenderHookResult } from '@testing-library/react'; +import { renderHook } from '@testing-library/react'; import { useWhichFlyout } from './use_which_flyout'; import { Flyouts } from '../constants/flyouts'; describe('useWhichFlyout', () => { - let hookResult: RenderHookResult<{}, string | null>; + let hookResult: RenderHookResult; beforeEach(() => { jest.clearAllMocks(); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx index 2e7c14fc38027..9c2ce61dea7fc 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx @@ -64,7 +64,7 @@ export const HostPanelContent = ({ entity={{ name: hostName, type: 'host' }} onChange={onAssetCriticalityChange} /> - + { @@ -101,43 +98,18 @@ export const HostPanel = ({ { onSuccess: refetchRiskScore } ); - const { data } = useMisconfigurationPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', hostName), - sort: [], - enabled: true, - pageSize: 1, - ignore_unavailable: true, - }); - - const passedFindings = data?.count.passed || 0; - const failedFindings = data?.count.failed || 0; - - const hasMisconfigurationFindings = passedFindings > 0 || failedFindings > 0; - - const { data: vulnerabilitiesData } = useVulnerabilitiesPreview({ - query: buildEntityFlyoutPreviewQuery('host.name', hostName), - sort: [], - enabled: true, - pageSize: 1, - }); + const { hasMisconfigurationFindings } = useHasMisconfigurations('host.name', hostName); - const hasVulnerabilitiesFindings = sum(Object.values(vulnerabilitiesData?.count || {})) > 0; + const { hasVulnerabilitiesFindings } = useHasVulnerabilities('host.name', hostName); - const { signalIndexName } = useSignalIndex(); - - const entityFilter = useMemo(() => ({ field: 'host.name', value: hostName }), [hostName]); - - const { items: alertsData } = useAlertsByStatus({ - entityFilter, - signalIndexName, - queryId: `${DETECTION_RESPONSE_ALERTS_BY_STATUS_ID}HOST_NAME_RIGHT`, + const { hasNonClosedAlerts } = useNonClosedAlerts({ + field: 'host.name', + value: hostName, to, from, + queryId: `${DETECTION_RESPONSE_ALERTS_BY_STATUS_ID}HOST_NAME_RIGHT`, }); - const hasNonClosedAlerts = - (alertsData?.acknowledged?.total || 0) + (alertsData?.open?.total || 0) > 0; - useQueryInspector({ deleteQuery, inspect: inspectRiskScore, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx index 0dbc1faa5cb42..08295038a1bd8 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx @@ -73,7 +73,7 @@ export const UserPanelContent = ({ entity={{ name: userName, type: 'user' }} onChange={onAssetCriticalityChange} /> - + 0 || failedFindings > 0; - - const { signalIndexName } = useSignalIndex(); + const { hasMisconfigurationFindings } = useHasMisconfigurations('user.name', userName); - const entityFilter = useMemo(() => ({ field: 'user.name', value: userName }), [userName]); - - const { items: alertsData } = useAlertsByStatus({ - entityFilter, - signalIndexName, - queryId: `${DETECTION_RESPONSE_ALERTS_BY_STATUS_ID}USER_NAME_RIGHT`, + const { hasNonClosedAlerts } = useNonClosedAlerts({ + field: 'user.name', + value: userName, to, from, + queryId: `${DETECTION_RESPONSE_ALERTS_BY_STATUS_ID}USER_NAME_RIGHT`, }); - const hasNonClosedAlerts = - (alertsData?.acknowledged?.total || 0) + (alertsData?.open?.total || 0) > 0; - useQueryInspector({ deleteQuery, inspect, diff --git a/x-pack/plugins/security_solution/public/flyout/shared/hooks/use_on_expandable_flyout_close.test.tsx b/x-pack/plugins/security_solution/public/flyout/shared/hooks/use_on_expandable_flyout_close.test.tsx index 308c1bcfc6cfc..2a4e5576e24bc 100644 --- a/x-pack/plugins/security_solution/public/flyout/shared/hooks/use_on_expandable_flyout_close.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/shared/hooks/use_on_expandable_flyout_close.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useWhichFlyout } from '../../document_details/shared/hooks/use_which_flyout'; import { useOnExpandableFlyoutClose } from './use_on_expandable_flyout_close'; import { Flyouts } from '../../document_details/shared/constants/flyouts'; diff --git a/x-pack/plugins/security_solution/public/notes/api/api.test.ts b/x-pack/plugins/security_solution/public/notes/api/api.test.ts index bc53b7bd78ac5..1b2250a119657 100644 --- a/x-pack/plugins/security_solution/public/notes/api/api.test.ts +++ b/x-pack/plugins/security_solution/public/notes/api/api.test.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { PersistNoteRouteResponse } from '../../../common/api/timeline'; import { KibanaServices } from '../../common/lib/kibana'; import * as api from './api'; @@ -22,22 +21,14 @@ describe('Notes API client', () => { }); describe('create note', () => { it('should throw an error when a response code other than 200 is returned', async () => { - const errorResponse: PersistNoteRouteResponse = { - data: { - persistNote: { - code: 500, - message: 'Internal server error', - note: { - timelineId: '1', - noteId: '2', - version: '3', - }, - }, - }, - }; (KibanaServices.get as jest.Mock).mockReturnValue({ http: { - patch: jest.fn().mockReturnValue(errorResponse), + patch: jest.fn().mockRejectedValue({ + body: { + status_code: 500, + message: 'Internal server error', + }, + }), }, }); diff --git a/x-pack/plugins/security_solution/public/notes/api/api.ts b/x-pack/plugins/security_solution/public/notes/api/api.ts index 892b01e3d17f0..5f380d0ae3044 100644 --- a/x-pack/plugins/security_solution/public/notes/api/api.ts +++ b/x-pack/plugins/security_solution/public/notes/api/api.ts @@ -7,7 +7,6 @@ import type { BareNote, - DeleteNoteResponse, GetNotesResponse, PersistNoteRouteResponse, } from '../../../common/api/timeline'; @@ -27,11 +26,7 @@ export const createNote = async ({ note }: { note: BareNote }) => { body: JSON.stringify({ note }), version: '2023-10-31', }); - const noteResponse = response.data.persistNote; - if (noteResponse.code !== 200) { - throw new Error(noteResponse.message); - } - return noteResponse.note; + return response.note; } catch (err) { throw new Error(('message' in err && err.message) || 'Request failed'); } @@ -98,7 +93,7 @@ export const fetchNotesBySaveObjectIds = async (savedObjectIds: string[]) => { * Deletes multiple notes */ export const deleteNotes = async (noteIds: string[]) => { - const response = await KibanaServices.get().http.delete(NOTE_URL, { + const response = await KibanaServices.get().http.delete(NOTE_URL, { body: JSON.stringify({ noteIds }), version: '2023-10-31', }); diff --git a/x-pack/plugins/security_solution/public/notes/hooks/use_fetch_notes.test.ts b/x-pack/plugins/security_solution/public/notes/hooks/use_fetch_notes.test.ts index 7498a6f40c6b6..b7fa3ab3fc519 100644 --- a/x-pack/plugins/security_solution/public/notes/hooks/use_fetch_notes.test.ts +++ b/x-pack/plugins/security_solution/public/notes/hooks/use_fetch_notes.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useDispatch } from 'react-redux'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { fetchNotesByDocumentIds } from '../store/notes.slice'; diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts index 87345f80ef701..bf687fa361db5 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts +++ b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts @@ -6,7 +6,7 @@ */ import { DataView } from '@kbn/data-views-plugin/common'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useSourcererDataView } from '../containers'; import { mockSourcererScope } from '../containers/mocks'; import { SourcererScopeName } from '../store/model'; @@ -14,14 +14,11 @@ import type { UseGetScopedSourcererDataViewArgs } from './use_get_sourcerer_data import { useGetScopedSourcererDataView } from './use_get_sourcerer_data_view'; const renderHookCustom = (args: UseGetScopedSourcererDataViewArgs) => { - return renderHook( - ({ sourcererScope }) => useGetScopedSourcererDataView({ sourcererScope }), - { - initialProps: { - ...args, - }, - } - ); + return renderHook(({ sourcererScope }) => useGetScopedSourcererDataView({ sourcererScope }), { + initialProps: { + ...args, + }, + }); }; jest.mock('../containers'); diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/use_update_data_view.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/use_update_data_view.test.tsx index b37565f3eb912..bb4d935dbdc99 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/use_update_data_view.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/use_update_data_view.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useUpdateDataView } from './use_update_data_view'; import { useKibana as mockUseKibana } from '../../common/lib/kibana/__mocks__'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx index e712e780636e4..83019347d309f 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { act, renderHook } from '@testing-library/react-hooks'; -import { waitFor } from '@testing-library/react'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { Provider } from 'react-redux'; import { useSourcererDataView } from '.'; @@ -137,8 +136,12 @@ jest.mock('../../common/lib/kibana', () => ({ type: 'keyword', }, }), + toSpec: () => ({ + id: dataViewId, + }), }) ), + getExistingIndices: jest.fn(() => [] as string[]), }, indexPatterns: { getTitles: jest.fn().mockImplementation(() => Promise.resolve(mockPatterns)), @@ -153,34 +156,35 @@ jest.mock('../../common/lib/kibana', () => ({ describe('Sourcerer Hooks', () => { let store = createMockStore(); + const StoreProvider: React.FC = ({ children }) => ( + {children} + ); + const Wrapper: React.FC = ({ children }) => ( + {children} + ); + beforeEach(() => { jest.clearAllMocks(); store = createMockStore(); mockUseUserInfo.mockImplementation(() => userInfoState); }); it('initializes loading default and timeline index patterns', async () => { - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - expect(mockDispatch).toBeCalledTimes(3); - expect(mockDispatch.mock.calls[0][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_DATA_VIEW_LOADING', - payload: { id: 'security-solution', loading: true }, - }); - expect(mockDispatch.mock.calls[1][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', - payload: { - id: 'timeline', - selectedDataViewId: 'security-solution', - selectedPatterns: ['.siem-signals-spacename', ...DEFAULT_INDEX_PATTERN], - }, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + expect(mockDispatch.mock.calls[0][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_DATA_VIEW_LOADING', + payload: { id: 'security-solution', loading: true }, + }); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', + payload: { + id: 'timeline', + selectedDataViewId: 'security-solution', + selectedPatterns: ['.siem-signals-spacename', ...DEFAULT_INDEX_PATTERN], + }, }); }); it('sets signal index name', async () => { @@ -202,47 +206,42 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - mockUseUserInfo.mockImplementation(() => ({ - ...userInfoState, - loading: false, - signalIndexName: mockSourcererState.signalIndexName, - })); - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockDispatch.mock.calls[3][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', - payload: { loading: true }, - }); - expect(mockDispatch.mock.calls[4][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SIGNAL_INDEX_NAME', - payload: { signalIndexName: mockSourcererState.signalIndexName }, - }); - expect(mockDispatch.mock.calls[5][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_DATA_VIEW_LOADING', - payload: { - id: mockSourcererState.defaultDataView.id, - loading: true, - }, - }); - expect(mockDispatch.mock.calls[6][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_DATA_VIEWS', - payload: mockNewDataViews, - }); - expect(mockDispatch.mock.calls[7][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', - payload: { loading: false }, - }); - expect(mockDispatch).toHaveBeenCalledTimes(8); - expect(mockSearch).toHaveBeenCalledTimes(2); + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + loading: false, + signalIndexName: mockSourcererState.signalIndexName, + })); + const { rerender } = renderHook(useInitSourcerer, { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockDispatch.mock.calls[3][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', + payload: { loading: true }, + }); + expect(mockDispatch.mock.calls[4][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SIGNAL_INDEX_NAME', + payload: { signalIndexName: mockSourcererState.signalIndexName }, + }); + expect(mockDispatch.mock.calls[5][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_DATA_VIEW_LOADING', + payload: { + id: mockSourcererState.defaultDataView.id, + loading: true, + }, + }); + expect(mockDispatch.mock.calls[6][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_DATA_VIEWS', + payload: mockNewDataViews, }); + expect(mockDispatch.mock.calls[7][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', + payload: { loading: false }, + }); + + expect(mockSearch).toHaveBeenCalledTimes(2); }); }); @@ -258,8 +257,8 @@ describe('Sourcerer Hooks', () => { }) ); - renderHook, void>(() => useInitSourcerer(), { - wrapper: ({ children }) => {children}, + renderHook(() => useInitSourcerer(), { + wrapper: Wrapper, }); expect(mockDispatch).toHaveBeenCalledWith( @@ -278,8 +277,8 @@ describe('Sourcerer Hooks', () => { onInitialize(null) ); - renderHook, void>(() => useInitSourcerer(), { - wrapper: ({ children }) => {children}, + renderHook(() => useInitSourcerer(), { + wrapper: Wrapper, }); expect(updateUrlParam).toHaveBeenCalledWith({ @@ -302,16 +301,14 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - renderHook, void>(() => useInitSourcerer(), { - wrapper: ({ children }) => {children}, - }); + renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); - await waitFor(() => { - expect(mockAddWarning).toHaveBeenNthCalledWith(1, { - text: 'Users with write permission need to access the Elastic Security app to initialize the app source data.', - title: 'Write role required to generate data', - }); + await waitFor(() => { + expect(mockAddWarning).toHaveBeenNthCalledWith(1, { + text: 'Users with write permission need to access the Elastic Security app to initialize the app source data.', + title: 'Write role required to generate data', }); }); }); @@ -333,27 +330,25 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - mockUseUserInfo.mockImplementation(() => ({ - ...userInfoState, - loading: false, - signalIndexName: mockSourcererState.signalIndexName, - })); - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + loading: false, + signalIndexName: mockSourcererState.signalIndexName, + })); - await waitFor(() => { - expect(mockCreateSourcererDataView).toHaveBeenCalled(); - expect(mockAddError).not.toHaveBeenCalled(); - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, }); + + await waitFor(() => new Promise((resolve) => resolve(null))); + + rerender(); + + await waitFor(() => new Promise((resolve) => resolve(null))); + + expect(mockCreateSourcererDataView).toHaveBeenCalled(); + expect(mockAddError).not.toHaveBeenCalled(); }); it('does call addError if updateSourcererDataView receives a non-abort error', async () => { @@ -375,66 +370,51 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - mockUseUserInfo.mockImplementation(() => ({ - ...userInfoState, - loading: false, - signalIndexName: mockSourcererState.signalIndexName, - })); - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + loading: false, + signalIndexName: mockSourcererState.signalIndexName, + })); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); - await waitForNextUpdate(); - rerender(); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); - await waitFor(() => { - expect(mockAddError).toHaveBeenCalled(); - }); + await waitFor(() => { + expect(mockAddError).toHaveBeenCalled(); }); }); it('handles detections page', async () => { - await act(async () => { - mockUseUserInfo.mockImplementation(() => ({ - ...userInfoState, - signalIndexName: mockSourcererState.signalIndexName, - isSignalIndexExists: true, - })); - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(SourcererScopeName.detections), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - expect(mockDispatch.mock.calls[3][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', - payload: { - id: 'detections', - selectedDataViewId: mockSourcererState.defaultDataView.id, - selectedPatterns: [mockSourcererState.signalIndexName], - }, - }); + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + signalIndexName: mockSourcererState.signalIndexName, + isSignalIndexExists: true, + })); + const { rerender } = renderHook(() => useInitSourcerer(SourcererScopeName.detections), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + expect(mockDispatch.mock.calls[3][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_DATA_VIEW', + payload: { + id: 'detections', + selectedDataViewId: mockSourcererState.defaultDataView.id, + selectedPatterns: [mockSourcererState.signalIndexName], + }, }); }); it('index field search is not repeated when default and timeline have same dataViewId', async () => { - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockSearch).toHaveBeenCalledTimes(1); - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockSearch).toHaveBeenCalledTimes(1); }); }); it('index field search called twice when default and timeline have different dataViewId', async () => { @@ -451,18 +431,13 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockSearch).toHaveBeenCalledTimes(2); - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockSearch).toHaveBeenCalledTimes(2); }); }); describe('initialization settings', () => { @@ -476,21 +451,16 @@ describe('Sourcerer Hooks', () => { })); }); it('does not needToBeInit if scope is default and selectedPatterns/missingPatterns have values', async () => { - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockIndexFieldsSearch).toHaveBeenCalledWith({ - dataViewId: mockSourcererState.defaultDataView.id, - needToBeInit: false, - scopeId: SourcererScopeName.default, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockIndexFieldsSearch).toHaveBeenCalledWith({ + dataViewId: mockSourcererState.defaultDataView.id, + needToBeInit: false, + scopeId: SourcererScopeName.default, }); }); }); @@ -510,21 +480,16 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockIndexFieldsSearch).toHaveBeenCalledWith({ - dataViewId: mockSourcererState.defaultDataView.id, - needToBeInit: true, - scopeId: SourcererScopeName.default, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockIndexFieldsSearch).toHaveBeenCalledWith({ + dataViewId: mockSourcererState.defaultDataView.id, + needToBeInit: true, + scopeId: SourcererScopeName.default, }); }); }); @@ -549,22 +514,17 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { - dataViewId: 'something-weird', - needToBeInit: true, - scopeId: SourcererScopeName.timeline, - skipScopeUpdate: false, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { + dataViewId: 'something-weird', + needToBeInit: true, + scopeId: SourcererScopeName.timeline, + skipScopeUpdate: false, }); }); }); @@ -589,22 +549,17 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { - dataViewId: 'something-weird', - needToBeInit: true, - scopeId: SourcererScopeName.timeline, - skipScopeUpdate: true, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { + dataViewId: 'something-weird', + needToBeInit: true, + scopeId: SourcererScopeName.timeline, + skipScopeUpdate: true, }); }); }); @@ -633,21 +588,16 @@ describe('Sourcerer Hooks', () => { }, }, }); - await act(async () => { - const { rerender, waitForNextUpdate } = renderHook, void>( - () => useInitSourcerer(), - { - wrapper: ({ children }) => {children}, - } - ); - await waitForNextUpdate(); - rerender(); - await waitFor(() => { - expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { - dataViewId: 'something-weird', - needToBeInit: false, - scopeId: SourcererScopeName.timeline, - }); + const { rerender } = renderHook(() => useInitSourcerer(), { + wrapper: StoreProvider, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => { + expect(mockIndexFieldsSearch).toHaveBeenNthCalledWith(2, { + dataViewId: 'something-weird', + needToBeInit: false, + scopeId: SourcererScopeName.timeline, }); }); }); @@ -655,38 +605,39 @@ describe('Sourcerer Hooks', () => { describe('useSourcererDataView', () => { it('Should put any excludes in the index pattern at the end of the pattern list, and sort both the includes and excludes', async () => { - await act(async () => { - store = createMockStore({ - ...mockGlobalState, - sourcerer: { - ...mockGlobalState.sourcerer, - sourcererScopes: { - ...mockGlobalState.sourcerer.sourcererScopes, - [SourcererScopeName.default]: { - ...mockGlobalState.sourcerer.sourcererScopes[SourcererScopeName.default], - selectedPatterns: [ - '-packetbeat-*', - 'endgame-*', - 'auditbeat-*', - 'filebeat-*', - 'winlogbeat-*', - '-filebeat-*', - 'packetbeat-*', - 'traces-apm*', - 'apm-*-transaction*', - ], - }, + store = createMockStore({ + ...mockGlobalState, + sourcerer: { + ...mockGlobalState.sourcerer, + sourcererScopes: { + ...mockGlobalState.sourcerer.sourcererScopes, + [SourcererScopeName.default]: { + ...mockGlobalState.sourcerer.sourcererScopes[SourcererScopeName.default], + selectedPatterns: [ + '-packetbeat-*', + 'endgame-*', + 'auditbeat-*', + 'filebeat-*', + 'winlogbeat-*', + '-filebeat-*', + 'packetbeat-*', + 'traces-apm*', + 'apm-*-transaction*', + ], }, }, - }); - const { result, rerender, waitForNextUpdate } = renderHook< - React.PropsWithChildren<{}>, - SelectedDataView - >(() => useSourcererDataView(), { - wrapper: ({ children }) => {children}, - }); - await waitForNextUpdate(); - rerender(); + }, + }); + + const { result, rerender } = renderHook( + useSourcererDataView, + { + wrapper: StoreProvider, + } + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender(); + await waitFor(() => expect(result.current.selectedPatterns).toEqual([ 'apm-*-transaction*', 'auditbeat-*', @@ -697,17 +648,14 @@ describe('Sourcerer Hooks', () => { 'winlogbeat-*', '-filebeat-*', '-packetbeat-*', - ]); - }); + ]) + ); }); it('should update the title and name of the data view according to the selected patterns', async () => { - const { result, rerender } = renderHook, SelectedDataView>( - () => useSourcererDataView(), - { - wrapper: ({ children }) => {children}, - } - ); + const { result, rerender } = renderHook(() => useSourcererDataView(), { + wrapper: StoreProvider, + }); expect(result.current.sourcererDataView.title).toBe( 'apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*' @@ -724,7 +672,7 @@ describe('Sourcerer Hooks', () => { ); }); - await rerender(); + rerender(); expect(result.current.sourcererDataView.title).toBe(testPatterns.join(',')); expect(result.current.sourcererDataView.name).toBe(testPatterns.join(',')); diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.test.tsx index 5bb0cc11ebffb..43f6f5d8a0a1f 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { createMockStore, mockGlobalState, TestProviders } from '../../common/mock'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useSignalHelpers } from './use_signal_helpers'; import type { State } from '../../common/store'; import { createSourcererDataView } from './create_sourcerer_data_view'; @@ -41,14 +41,12 @@ describe('useSignalHelpers', () => { ); test('Default state, does not need init and does not need poll', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSignalHelpers(), { - wrapper: wrapperContainer, - }); - await waitForNextUpdate(); - expect(result.current.signalIndexNeedsInit).toEqual(false); - expect(result.current.pollForSignalIndex).toEqual(undefined); + const { result } = renderHook(() => useSignalHelpers(), { + wrapper: wrapperContainer, }); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(result.current.signalIndexNeedsInit).toEqual(false); + expect(result.current.pollForSignalIndex).toEqual(undefined); }); test('Needs init and does not need poll when signal index is not yet in default data view', async () => { const state: State = { @@ -70,16 +68,14 @@ describe('useSignalHelpers', () => { }, }; const store = createMockStore(state); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSignalHelpers(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - {children} - ), - }); - await waitForNextUpdate(); - expect(result.current.signalIndexNeedsInit).toEqual(true); - expect(result.current.pollForSignalIndex).toEqual(undefined); + const { result } = renderHook(() => useSignalHelpers(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + {children} + ), }); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(result.current.signalIndexNeedsInit).toEqual(true); + expect(result.current.pollForSignalIndex).toEqual(undefined); }); test('Init happened and signal index does not have data yet, poll function becomes available', async () => { const state: State = { @@ -101,16 +97,14 @@ describe('useSignalHelpers', () => { }, }; const store = createMockStore(state); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSignalHelpers(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - {children} - ), - }); - await waitForNextUpdate(); - expect(result.current.signalIndexNeedsInit).toEqual(false); - expect(result.current.pollForSignalIndex).not.toEqual(undefined); + const { result } = renderHook(() => useSignalHelpers(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + {children} + ), }); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(result.current.signalIndexNeedsInit).toEqual(false); + expect(result.current.pollForSignalIndex).not.toEqual(undefined); }); test('Init happened and signal index does not have data yet, poll function becomes available but createSourcererDataView throws an abort error', async () => { @@ -134,17 +128,15 @@ describe('useSignalHelpers', () => { }, }; const store = createMockStore(state); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSignalHelpers(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - {children} - ), - }); - await waitForNextUpdate(); - expect(result.current.signalIndexNeedsInit).toEqual(false); - expect(result.current.pollForSignalIndex).not.toEqual(undefined); - expect(mockAddError).not.toHaveBeenCalled(); + const { result } = renderHook(() => useSignalHelpers(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + {children} + ), }); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(result.current.signalIndexNeedsInit).toEqual(false); + expect(result.current.pollForSignalIndex).not.toEqual(undefined); + expect(mockAddError).not.toHaveBeenCalled(); }); test('Init happened and signal index does not have data yet, poll function becomes available but createSourcererDataView throws a non-abort error', async () => { @@ -170,17 +162,15 @@ describe('useSignalHelpers', () => { }, }; const store = createMockStore(state); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useSignalHelpers(), { - wrapper: ({ children }: React.PropsWithChildren<{}>) => ( - {children} - ), - }); - await waitForNextUpdate(); - expect(result.current.signalIndexNeedsInit).toEqual(false); - expect(result.current.pollForSignalIndex).not.toEqual(undefined); - result.current.pollForSignalIndex?.(); - expect(mockAddError).toHaveBeenCalled(); + const { result } = renderHook(() => useSignalHelpers(), { + wrapper: ({ children }: React.PropsWithChildren<{}>) => ( + {children} + ), }); + await waitFor(() => new Promise((resolve) => resolve(null))); + expect(result.current.signalIndexNeedsInit).toEqual(false); + expect(result.current.pollForSignalIndex).not.toEqual(undefined); + result.current.pollForSignalIndex?.(); + expect(mockAddError).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/create_field_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/create_field_button/index.test.tsx index 4c1c72500ae8b..01c9dd701292a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/create_field_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/create_field_button/index.test.tsx @@ -5,19 +5,18 @@ * 2.0. */ -import { render } from '@testing-library/react'; +import { render, renderHook } from '@testing-library/react'; import React from 'react'; -import type { UseCreateFieldButton, UseCreateFieldButtonProps } from '.'; +import type { UseCreateFieldButtonProps } from '.'; import { useCreateFieldButton } from '.'; import { TestProviders } from '../../../../common/mock'; -import { renderHook } from '@testing-library/react-hooks'; const mockOpenFieldEditor = jest.fn(); const mockOnHide = jest.fn(); const renderUseCreateFieldButton = (props: Partial = {}) => - renderHook, ReturnType>( + renderHook( () => useCreateFieldButton({ isAllowed: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_table_columns/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_table_columns/index.test.tsx index 8d82c3402af7c..a565a31ef67a7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_table_columns/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_table_columns/index.test.tsx @@ -6,12 +6,11 @@ */ import React from 'react'; -import { render } from '@testing-library/react'; -import type { UseFieldTableColumnsProps, UseFieldTableColumns } from '.'; +import { render, renderHook } from '@testing-library/react'; +import type { UseFieldTableColumnsProps } from '.'; import { useFieldTableColumns } from '.'; import { TestProviders } from '../../../../common/mock'; -import { renderHook } from '@testing-library/react-hooks'; import { EuiInMemoryTable } from '@elastic/eui'; import type { BrowserFieldItem } from '@kbn/triggers-actions-ui-plugin/public/types'; @@ -21,7 +20,7 @@ const mockOpenDeleteFieldModal = jest.fn(); // helper function to render the hook const renderUseFieldTableColumns = (props: Partial = {}) => - renderHook, ReturnType>( + renderHook( () => useFieldTableColumns({ hasFieldEditPermission: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.test.tsx index 67094a18cf327..7b67fb6614adf 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/index.test.tsx @@ -6,7 +6,8 @@ */ import React from 'react'; -import { render, act } from '@testing-library/react'; +import type { RenderHookResult } from '@testing-library/react'; +import { render, act, waitFor, renderHook } from '@testing-library/react'; import type { Store } from 'redux'; import type { UseFieldBrowserOptionsProps, UseFieldBrowserOptions, FieldEditorActionsRef } from '.'; import { useFieldBrowserOptions } from '.'; @@ -16,8 +17,6 @@ import { indexPatternFieldEditorPluginMock } from '@kbn/data-view-field-editor-p import { TestProviders } from '../../../common/mock'; import { useKibana } from '../../../common/lib/kibana'; import type { DataView, DataViewField } from '@kbn/data-plugin/common'; -import type { RenderHookResult } from '@testing-library/react-hooks'; -import { renderHook } from '@testing-library/react-hooks'; import { SourcererScopeName } from '../../../sourcerer/store/model'; import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH } from '../timeline/body/constants'; @@ -42,12 +41,13 @@ const mockOnHide = jest.fn(); const runAllPromises = () => new Promise(setImmediate); // helper function to render the hook -const renderUseFieldBrowserOptions = ( - props: Partial = {} -) => +const renderUseFieldBrowserOptions = ({ + store, + ...props +}: Partial = {}) => renderHook< - React.PropsWithChildren, - ReturnType + ReturnType, + React.PropsWithChildren >( () => useFieldBrowserOptions({ @@ -57,7 +57,7 @@ const renderUseFieldBrowserOptions = ( ...props, }), { - wrapper: ({ children, store }) => { + wrapper: ({ children }) => { if (store) { return {children}; } @@ -71,12 +71,12 @@ const renderUpdatedUseFieldBrowserOptions = async ( props: Partial = {} ) => { let renderHookResult: RenderHookResult< - UseFieldBrowserOptionsProps, - ReturnType + ReturnType, + UseFieldBrowserOptionsProps > | null = null; await act(async () => { renderHookResult = renderUseFieldBrowserOptions(props); - await renderHookResult.waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); }); return renderHookResult!; }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/__mocks__/index.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/__mocks__/index.ts index df761c8854f41..ecd028c3d4ca9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/__mocks__/index.ts @@ -5,421 +5,384 @@ * 2.0. */ -import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../../common/api/timeline'; +import { + DataProviderTypeEnum, + type ResolveTimelineResponse, + TimelineStatusEnum, + TimelineTypeEnum, +} from '../../../../../common/api/timeline'; -export const mockTimeline = { - data: { - timeline: { - savedObjectId: 'eb2781c0-1df5-11eb-8589-2f13958b79f7', - columns: [ - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: '@timestamp', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'message', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'event.category', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'event.action', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'host.name', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'source.ip', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'destination.ip', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'user.name', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - ], - dataProviders: [], - dateRange: { - start: '2020-11-01T14:30:59.935Z', - end: '2020-11-03T14:31:11.417Z', - __typename: 'DateRangePickerResult', +export const mockTimeline: ResolveTimelineResponse = { + timeline: { + savedObjectId: 'eb2781c0-1df5-11eb-8589-2f13958b79f7', + columns: [ + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: '@timestamp', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'message', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'event.category', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'event.action', + name: null, + searchable: null, + type: null, }, - description: '', - eventType: 'all', - eventIdToNoteIds: [], - excludedRowRendererIds: [], - favorite: [], - filters: [], - kqlMode: 'filter', - kqlQuery: { filterQuery: null, __typename: 'SerializedFilterQueryResult' }, - indexNames: [ - 'auditbeat-*', - 'endgame-*', - 'filebeat-*', - 'logs-*', - 'packetbeat-*', - 'winlogbeat-*', - '.siem-signals-angelachuang-default', - ], - notes: [], - noteIds: [], - pinnedEventIds: [], - pinnedEventsSaveObject: [], - status: TimelineStatusEnum.active, - title: 'my timeline', - timelineType: TimelineTypeEnum.default, - templateTimelineId: null, - templateTimelineVersion: null, - savedQueryId: null, - sort: { - columnId: '@timestamp', - columnType: 'number', - sortDirection: 'desc', - __typename: 'SortTimelineResult', + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'host.name', + name: null, + searchable: null, + type: null, }, - created: 1604497127973, - createdBy: 'elastic', - updated: 1604500278364, - updatedBy: 'elastic', - version: 'WzQ4NSwxXQ==', - __typename: 'TimelineResult', + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'source.ip', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'destination.ip', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'user.name', + name: null, + searchable: null, + type: null, + }, + ], + dataProviders: [], + dateRange: { + start: '2020-11-01T14:30:59.935Z', + end: '2020-11-03T14:31:11.417Z', }, - outcome: 'exactMatch', + description: '', + eventType: 'all', + eventIdToNoteIds: [], + excludedRowRendererIds: [], + favorite: [], + filters: [], + kqlMode: 'filter', + kqlQuery: { filterQuery: null }, + indexNames: [ + 'auditbeat-*', + 'endgame-*', + 'filebeat-*', + 'logs-*', + 'packetbeat-*', + 'winlogbeat-*', + '.siem-signals-angelachuang-default', + ], + notes: [], + noteIds: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + status: TimelineStatusEnum.active, + title: 'my timeline', + timelineType: TimelineTypeEnum.default, + templateTimelineId: null, + templateTimelineVersion: null, + savedQueryId: null, + sort: { + columnId: '@timestamp', + columnType: 'number', + sortDirection: 'desc', + }, + created: 1604497127973, + createdBy: 'elastic', + updated: 1604500278364, + updatedBy: 'elastic', + version: 'WzQ4NSwxXQ==', }, - loading: false, - networkStatus: 7, - stale: false, + outcome: 'exactMatch', }; -export const mockTemplate = { - data: { - timeline: { - savedObjectId: '0c70a200-1de0-11eb-885c-6fc13fca1850', - columns: [ - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: '@timestamp', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'signal.rule.description', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'event.action', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'process.name', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'process', - columnHeaderType: 'not-filtered', - description: 'The working directory of the process.', - example: '/home/alice', - indexes: null, - id: 'process.working_directory', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'process', - columnHeaderType: 'not-filtered', - description: - 'Array of process arguments, starting with the absolute path to\nthe executable.\n\nMay be filtered to protect sensitive information.', - example: '["/usr/bin/ssh","-l","user","10.0.0.16"]', - indexes: null, - id: 'process.args', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: null, - category: null, - columnHeaderType: 'not-filtered', - description: null, - example: null, - indexes: null, - id: 'process.pid', - name: null, - searchable: null, - type: null, - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'process', - columnHeaderType: 'not-filtered', - description: 'Absolute path to the process executable.', - example: '/usr/bin/ssh', - indexes: null, - id: 'process.parent.executable', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'process', - columnHeaderType: 'not-filtered', - description: - 'Array of process arguments.\n\nMay be filtered to protect sensitive information.', - example: '["ssh","-l","user","10.0.0.16"]', - indexes: null, - id: 'process.parent.args', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'process', - columnHeaderType: 'not-filtered', - description: 'Process id.', - example: '4242', - indexes: null, - id: 'process.parent.pid', - name: null, - searchable: null, - type: 'number', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'user', - columnHeaderType: 'not-filtered', - description: 'Short name or login of the user.', - example: 'albert', - indexes: null, - id: 'user.name', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - { - aggregatable: true, - category: 'host', - columnHeaderType: 'not-filtered', - description: - 'Name of the host.\n\nIt can contain what `hostname` returns on Unix systems, the fully qualified\ndomain name, or a name specified by the user. The sender decides which value\nto use.', - example: null, - indexes: null, - id: 'host.name', - name: null, - searchable: null, - type: 'string', - __typename: 'ColumnHeaderResult', - }, - ], - dataProviders: [ - { - id: 'timeline-1-8622010a-61fb-490d-b162-beac9c36a853', - name: '{process.name}', - enabled: true, - excluded: false, - kqlQuery: '', - type: 'template', - queryMatch: { - field: 'process.name', - displayField: null, - value: '{process.name}', - displayValue: null, - operator: ':', - __typename: 'QueryMatchResult', - }, - and: [], - __typename: 'DataProviderResult', - }, - { - id: 'timeline-1-4685da24-35c1-43f3-892d-1f926dbf5568', - name: '{event.type}', - enabled: true, - excluded: false, - kqlQuery: '', - type: 'template', - queryMatch: { - field: 'event.type', - displayField: null, - value: '{event.type}', - displayValue: null, - operator: ':*', - __typename: 'QueryMatchResult', - }, - and: [], - __typename: 'DataProviderResult', +export const mockTemplate: ResolveTimelineResponse = { + timeline: { + savedObjectId: '0c70a200-1de0-11eb-885c-6fc13fca1850', + columns: [ + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: '@timestamp', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'signal.rule.description', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'event.action', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'process.name', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: true, + category: 'process', + columnHeaderType: 'not-filtered', + description: 'The working directory of the process.', + example: '/home/alice', + indexes: null, + id: 'process.working_directory', + name: null, + searchable: null, + type: 'string', + }, + { + aggregatable: true, + category: 'process', + columnHeaderType: 'not-filtered', + description: + 'Array of process arguments, starting with the absolute path to\nthe executable.\n\nMay be filtered to protect sensitive information.', + example: '["/usr/bin/ssh","-l","user","10.0.0.16"]', + indexes: null, + id: 'process.args', + name: null, + searchable: null, + type: 'string', + }, + { + aggregatable: null, + category: null, + columnHeaderType: 'not-filtered', + description: null, + example: null, + indexes: null, + id: 'process.pid', + name: null, + searchable: null, + type: null, + }, + { + aggregatable: true, + category: 'process', + columnHeaderType: 'not-filtered', + description: 'Absolute path to the process executable.', + example: '/usr/bin/ssh', + indexes: null, + id: 'process.parent.executable', + name: null, + searchable: null, + type: 'string', + }, + { + aggregatable: true, + category: 'process', + columnHeaderType: 'not-filtered', + description: + 'Array of process arguments.\n\nMay be filtered to protect sensitive information.', + example: '["ssh","-l","user","10.0.0.16"]', + indexes: null, + id: 'process.parent.args', + name: null, + searchable: null, + type: 'string', + }, + { + aggregatable: true, + category: 'process', + columnHeaderType: 'not-filtered', + description: 'Process id.', + example: '4242', + indexes: null, + id: 'process.parent.pid', + name: null, + searchable: null, + type: 'number', + }, + { + aggregatable: true, + category: 'user', + columnHeaderType: 'not-filtered', + description: 'Short name or login of the user.', + example: 'albert', + indexes: null, + id: 'user.name', + name: null, + searchable: null, + type: 'string', + }, + { + aggregatable: true, + category: 'host', + columnHeaderType: 'not-filtered', + description: + 'Name of the host.\n\nIt can contain what `hostname` returns on Unix systems, the fully qualified\ndomain name, or a name specified by the user. The sender decides which value\nto use.', + example: null, + indexes: null, + id: 'host.name', + name: null, + searchable: null, + type: 'string', + }, + ], + dataProviders: [ + { + id: 'timeline-1-8622010a-61fb-490d-b162-beac9c36a853', + name: '{process.name}', + enabled: true, + excluded: false, + kqlQuery: '', + type: DataProviderTypeEnum.template, + queryMatch: { + field: 'process.name', + displayField: null, + value: '{process.name}', + displayValue: null, + operator: ':', }, - ], - dateRange: { - start: '2020-10-27T14:22:11.809Z', - end: '2020-11-03T14:22:11.809Z', - __typename: 'DateRangePickerResult', + and: [], }, - description: '', - eventType: 'all', - eventIdToNoteIds: [], - excludedRowRendererIds: [], - favorite: [], - filters: [], - kqlMode: 'filter', - kqlQuery: { - filterQuery: { - kuery: { kind: 'kuery', expression: '', __typename: 'KueryFilterQueryResult' }, - serializedQuery: '', - __typename: 'SerializedKueryQueryResult', + { + id: 'timeline-1-4685da24-35c1-43f3-892d-1f926dbf5568', + name: '{event.type}', + enabled: true, + excluded: false, + kqlQuery: '', + type: DataProviderTypeEnum.template, + queryMatch: { + field: 'event.type', + displayField: null, + value: '{event.type}', + displayValue: null, + operator: ':*', }, - __typename: 'SerializedFilterQueryResult', + and: [], }, - indexNames: [], - notes: [], - noteIds: [], - pinnedEventIds: [], - pinnedEventsSaveObject: [], - status: TimelineStatusEnum.immutable, - title: 'Generic Process Timeline', - timelineType: 'template', - templateTimelineId: 'cd55e52b-7bce-4887-88e2-f1ece4c75447', - templateTimelineVersion: 1, - savedQueryId: null, - sort: { - columnId: '@timestamp', - columnType: 'number', - sortDirection: 'desc', - __typename: 'SortTimelineResult', + ], + dateRange: { + start: '2020-10-27T14:22:11.809Z', + end: '2020-11-03T14:22:11.809Z', + }, + description: '', + eventType: 'all', + eventIdToNoteIds: [], + excludedRowRendererIds: [], + favorite: [], + filters: [], + kqlMode: 'filter', + kqlQuery: { + filterQuery: { + kuery: { kind: 'kuery', expression: '' }, + serializedQuery: '', }, - created: 1604413368243, - createdBy: 'angela', - updated: 1604413368243, - updatedBy: 'angela', - version: 'WzQwMywxXQ==', - __typename: 'TimelineResult', }, - outcome: 'exactMatch', + indexNames: [], + notes: [], + noteIds: [], + pinnedEventIds: [], + pinnedEventsSaveObject: [], + status: TimelineStatusEnum.immutable, + title: 'Generic Process Timeline', + timelineType: TimelineTypeEnum.template, + templateTimelineId: 'cd55e52b-7bce-4887-88e2-f1ece4c75447', + templateTimelineVersion: 1, + savedQueryId: null, + sort: { + columnId: '@timestamp', + columnType: 'number', + sortDirection: 'desc', + }, + created: 1604413368243, + createdBy: 'angela', + updated: 1604413368243, + updatedBy: 'angela', + version: 'WzQwMywxXQ==', }, - loading: false, - networkStatus: 7, - stale: false, + outcome: 'exactMatch', }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts index 525d8bba3d909..0d5e013e30380 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts @@ -5,11 +5,10 @@ * 2.0. */ -import { cloneDeep, getOr, omit } from 'lodash/fp'; -import { renderHook } from '@testing-library/react-hooks'; -import { waitFor } from '@testing-library/react'; +import { cloneDeep, omit } from 'lodash/fp'; +import { waitFor, renderHook } from '@testing-library/react'; -import { mockTimelineResults, mockGetOneTimelineResult } from '../../../common/mock'; +import { mockTimelineResults } from '../../../common/mock'; import { timelineDefaults } from '../../store/defaults'; import type { QueryTimelineById } from './helpers'; import { @@ -17,7 +16,6 @@ import { getNotesCount, getPinnedEventCount, isUntitled, - omitTypenameInTimeline, useQueryTimelineById, formatTimelineResponseToModel, } from './helpers'; @@ -655,7 +653,7 @@ describe('helpers', () => { test('Do not override daterange if TimelineStatus is active', () => { const { timeline } = formatTimelineResponseToModel( - omitTypenameInTimeline(getOr({}, 'data.timeline', selectedTimeline)), + selectedTimeline.timeline, args.duplicate, args.timelineType ); @@ -667,7 +665,7 @@ describe('helpers', () => { describe('update a timeline', () => { const selectedTimeline = { ...mockSelectedTimeline }; - const untitledTimeline = { ...mockSelectedTimeline, title: '' }; + const untitledTimeline = { timeline: { ...mockSelectedTimeline.timeline, title: '' } }; const onOpenTimeline = jest.fn(); const args: QueryTimelineById = { duplicate: false, @@ -684,7 +682,6 @@ describe('helpers', () => { afterEach(() => { jest.clearAllMocks(); }); - test('should get timeline by Id with correct statuses', async () => { renderHook(async () => { const queryTimelineById = useQueryTimelineById(); @@ -693,7 +690,7 @@ describe('helpers', () => { // expect(resolveTimeline).toHaveBeenCalled(); const { timeline } = formatTimelineResponseToModel( - omitTypenameInTimeline(getOr({}, 'data.timeline', selectedTimeline)), + selectedTimeline.timeline, args.duplicate, args.timelineType ); @@ -751,7 +748,7 @@ describe('helpers', () => { }); test('should update timeline correctly when timeline is already saved and onOpenTimeline is not provided', async () => { - (resolveTimeline as jest.Mock).mockResolvedValue(mockSelectedTimeline); + (resolveTimeline as jest.Mock).mockResolvedValue(selectedTimeline); renderHook(async () => { const queryTimelineById = useQueryTimelineById(); queryTimelineById(args); @@ -762,7 +759,7 @@ describe('helpers', () => { 1, expect.objectContaining({ timeline: expect.objectContaining({ - columns: mockSelectedTimeline.data.timeline.columns.map((col) => ({ + columns: selectedTimeline.timeline.columns!.map((col) => ({ columnHeaderType: col.columnHeaderType, id: col.id, initialWidth: defaultUdtHeaders.find((defaultCol) => col.id === defaultCol.id) @@ -784,7 +781,7 @@ describe('helpers', () => { waitFor(() => { expect(onOpenTimeline).toHaveBeenCalledWith( expect.objectContaining({ - columns: mockSelectedTimeline.data.timeline.columns.map((col) => ({ + columns: mockSelectedTimeline.timeline.columns!.map((col) => ({ columnHeaderType: col.columnHeaderType, id: col.id, initialWidth: defaultUdtHeaders.find((defaultCol) => col.id === defaultCol.id) @@ -827,7 +824,7 @@ describe('helpers', () => { test('override daterange if TimelineStatus is immutable', () => { const { timeline } = formatTimelineResponseToModel( - omitTypenameInTimeline(getOr({}, 'data.timeline', template)), + template.timeline, args.duplicate, args.timelineType ); @@ -841,26 +838,4 @@ describe('helpers', () => { }); }); }); - - describe('omitTypenameInTimeline', () => { - test('should not modify the passed in timeline if no __typename exists', () => { - const result = omitTypenameInTimeline(mockGetOneTimelineResult); - - expect(result).toEqual(mockGetOneTimelineResult); - }); - - test('should return timeline with __typename removed when it exists', () => { - const mockTimeline = { - ...mockGetOneTimelineResult, - __typename: 'something, something', - }; - const result = omitTypenameInTimeline(mockTimeline); - const expectedTimeline = { - ...mockTimeline, - __typename: undefined, - }; - - expect(result).toEqual(expectedTimeline); - }); - }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts index d3ca6c4654ff3..46ab60d9324be 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts @@ -13,7 +13,6 @@ import { useDiscoverInTimelineContext } from '../../../common/components/discove import type { ColumnHeaderOptions } from '../../../../common/types/timeline'; import type { TimelineResponse, - ResolvedTimeline, ColumnHeaderResult, FilterTimelineResult, DataProviderResult, @@ -73,12 +72,6 @@ export const getNotesCount = ({ eventIdToNoteIds, noteIds }: OpenTimelineResult) export const isUntitled = ({ title }: OpenTimelineResult): boolean => title == null || title.trim().length === 0; -const omitTypename = (key: string, value: keyof TimelineModel) => - key === '__typename' ? undefined : value; - -export const omitTypenameInTimeline = (timeline: TimelineResponse): TimelineResponse => - JSON.parse(JSON.stringify(timeline), omitTypename); - const parseString = (params: string) => { try { return JSON.parse(params); @@ -348,13 +341,10 @@ export const useQueryTimelineById = () => { } else { return Promise.resolve(resolveTimeline(timelineId)) .then((result) => { - const data: ResolvedTimeline | null = getOr(null, 'data', result); - if (!data) return; - - const timelineToOpen = omitTypenameInTimeline(data.timeline); + if (!result) return; const { timeline, notes } = formatTimelineResponseToModel( - timelineToOpen, + result.timeline, duplicate, timelineType ); @@ -372,9 +362,9 @@ export const useQueryTimelineById = () => { id: TimelineId.active, notes, resolveTimelineConfig: { - outcome: data.outcome, - alias_target_id: data.alias_target_id, - alias_purpose: data.alias_purpose, + outcome: result.outcome, + alias_target_id: result.alias_target_id, + alias_purpose: result.alias_purpose, }, timeline: { ...timeline, diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx index da56cb12b4a00..5a3ba28a82767 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx @@ -6,9 +6,8 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; import { mount } from 'enzyme'; -import { fireEvent, render, waitFor } from '@testing-library/react'; +import { fireEvent, render, waitFor, renderHook } from '@testing-library/react'; import { useHistory, useParams } from 'react-router-dom'; import '../../../common/mock/formatted_relative'; @@ -30,7 +29,6 @@ import { NotePreviews } from './note_previews'; import { OPEN_TIMELINE_CLASS_NAME } from './helpers'; import { StatefulOpenTimeline } from '.'; import { TimelineTabsStyle } from './types'; -import type { UseTimelineTypesArgs, UseTimelineTypesResult } from './use_timeline_types'; import { useTimelineTypes } from './use_timeline_types'; import { deleteTimelinesByIds } from '../../containers/api'; import { useUserPrivileges } from '../../../common/components/user_privileges'; @@ -165,12 +163,12 @@ describe('StatefulOpenTimeline', () => { describe("Template timelines' tab", () => { test("should land on correct timelines' tab with url timelines/default", () => { - const { result } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), { - wrapper: ({ children }) => {children}, - }); + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), + { + wrapper: ({ children }) => {children}, + } + ); expect(result.current.timelineType).toBe(TimelineTypeEnum.default); }); @@ -181,12 +179,12 @@ describe('StatefulOpenTimeline', () => { pageName: SecurityPageName.timelines, }); - const { result } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), { - wrapper: ({ children }) => {children}, - }); + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), + { + wrapper: ({ children }) => {children}, + } + ); expect(result.current.timelineType).toBe(TimelineTypeEnum.template); }); @@ -223,12 +221,12 @@ describe('StatefulOpenTimeline', () => { pageName: SecurityPageName.case, }); - const { result } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), { - wrapper: ({ children }) => {children}, - }); + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 0 }), + { + wrapper: ({ children }) => {children}, + } + ); expect(result.current.timelineType).toBe(TimelineTypeEnum.default); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/hooks/use_delete_note.test.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/hooks/use_delete_note.test.ts index b2c88364a8209..d9dd243357d5b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/hooks/use_delete_note.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/note_previews/hooks/use_delete_note.test.ts @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { useKibana } from '../../../../../common/lib/kibana'; import { useAppToasts } from '../../../../../common/hooks/use_app_toasts'; import { appActions } from '../../../../../common/store/app'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx index 66d3a41bc0d48..22e03955afbc2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx @@ -6,9 +6,7 @@ */ import React from 'react'; -import { fireEvent, render } from '@testing-library/react'; -import { renderHook, act } from '@testing-library/react-hooks'; -import type { UseTimelineTypesArgs, UseTimelineTypesResult } from './use_timeline_types'; +import { fireEvent, render, waitFor, screen, renderHook } from '@testing-library/react'; import { useTimelineTypes } from './use_timeline_types'; import { TestProviders } from '../../../common/mock'; @@ -31,12 +29,14 @@ jest.mock('../../../common/components/link_to', () => { }; }); +const mockNavigateToUrl = jest.fn(); + jest.mock('@kbn/kibana-react-plugin/public', () => { const originalModule = jest.requireActual('@kbn/kibana-react-plugin/public'); const useKibana = jest.fn().mockImplementation(() => ({ services: { application: { - navigateToUrl: jest.fn(), + navigateToUrl: mockNavigateToUrl, }, }, })); @@ -48,92 +48,83 @@ jest.mock('@kbn/kibana-react-plugin/public', () => { }); describe('useTimelineTypes', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + it('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); - expect(result.current).toEqual({ - timelineType: 'default', - timelineTabs: result.current.timelineTabs, - timelineFilters: result.current.timelineFilters, - }); + } + ); + + expect(result.current).toEqual({ + timelineType: 'default', + timelineTabs: result.current.timelineTabs, + timelineFilters: result.current.timelineFilters, }); }); describe('timelineTabs', () => { it('render timelineTabs', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); - - const { container } = render(result.current.timelineTabs); - expect( - container.querySelector('[data-test-subj="timeline-tab-default"]') - ).toHaveTextContent('Timelines'); - expect( - container.querySelector('[data-test-subj="timeline-tab-template"]') - ).toHaveTextContent('Templates'); - }); + } + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + + render(result.current.timelineTabs); + expect(screen.getByTestId('timeline-tab-default')).toHaveTextContent('Timelines'); + expect(screen.getByTestId('timeline-tab-template')).toHaveTextContent('Templates'); }); it('set timelineTypes correctly', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); + } + ); - const { container } = render(result.current.timelineTabs); + await waitFor(() => expect(result.current.timelineTabs).toBeDefined()); - fireEvent( - container.querySelector('[data-test-subj="timeline-tab-template"]')!, - new MouseEvent('click', { - bubbles: true, - cancelable: true, - }) - ); + const { container } = render(result.current.timelineTabs); - expect(result.current).toEqual({ - timelineType: 'template', - timelineTabs: result.current.timelineTabs, - timelineFilters: result.current.timelineFilters, - }); - }); + fireEvent( + container.querySelector('[data-test-subj="timeline-tab-template"]')!, + new MouseEvent('click', { + bubbles: true, + cancelable: true, + }) + ); + + expect(mockNavigateToUrl).toHaveBeenCalled(); }); it('stays in the same tab if clicking again on current tab', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); + } + ); + await waitFor(() => new Promise((resolve) => resolve(null))); - const { container } = render(result.current.timelineTabs); + render(result.current.timelineTabs); - fireEvent( - container.querySelector('[data-test-subj="timeline-tab-default"]')!, - new MouseEvent('click', { - bubbles: true, - cancelable: true, - }) - ); + fireEvent( + screen.getByTestId('timeline-tab-default'), + new MouseEvent('click', { + bubbles: true, + cancelable: true, + }) + ); + await waitFor(() => { expect(result.current).toEqual({ timelineType: 'default', timelineTabs: result.current.timelineTabs, @@ -145,79 +136,77 @@ describe('useTimelineTypes', () => { describe('timelineFilters', () => { it('render timelineFilters', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); - - const { container } = render(<>{result.current.timelineFilters}); - expect( - container.querySelector('[data-test-subj="open-timeline-modal-body-filter-default"]') - ).toHaveTextContent('Timelines'); - expect( - container.querySelector('[data-test-subj="open-timeline-modal-body-filter-template"]') - ).toHaveTextContent('Templates'); - }); + } + ); + await waitFor(() => new Promise((resolve) => resolve(null))); + + const { container } = render(<>{result.current.timelineFilters}); + + expect( + container.querySelector('[data-test-subj="open-timeline-modal-body-filter-default"]') + ).toHaveTextContent('Timelines'); + expect( + container.querySelector('[data-test-subj="open-timeline-modal-body-filter-template"]') + ).toHaveTextContent('Templates'); }); it('set timelineTypes correctly', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); + } + ); - const { container } = render(<>{result.current.timelineFilters}); + await waitFor(() => expect(result.current.timelineFilters).toBeDefined()); - fireEvent( - container.querySelector('[data-test-subj="open-timeline-modal-body-filter-template"]')!, - new MouseEvent('click', { - bubbles: true, - cancelable: true, - }) - ); + render(<>{result.current.timelineFilters}); - expect(result.current).toEqual({ - timelineType: 'template', + await waitFor(() => new Promise((resolve) => resolve(null))); + + fireEvent.click(screen.getByTestId('open-timeline-modal-body-filter-template')); + + await waitFor(() => expect(result.current.timelineType).toEqual('template')); + + expect(result.current).toEqual( + expect.objectContaining({ timelineTabs: result.current.timelineTabs, timelineFilters: result.current.timelineFilters, - }); - }); + }) + ); }); it('stays in the same tab if clicking again on current tab', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - React.PropsWithChildren, - UseTimelineTypesResult - >(() => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), { + const { result } = renderHook( + () => useTimelineTypes({ defaultTimelineCount: 0, templateTimelineCount: 3 }), + { wrapper: TestProviders, - }); - await waitForNextUpdate(); + } + ); - const { container } = render(<>{result.current.timelineFilters}); + await waitFor(() => new Promise((resolve) => resolve(null))); - fireEvent( - container.querySelector('[data-test-subj="open-timeline-modal-body-filter-default"]')!, - new MouseEvent('click', { - bubbles: true, - cancelable: true, - }) - ); + const { container } = render(<>{result.current.timelineFilters}); + fireEvent( + container.querySelector('[data-test-subj="open-timeline-modal-body-filter-default"]')!, + new MouseEvent('click', { + bubbles: true, + cancelable: true, + }) + ); + + await waitFor(() => expect(result.current).toEqual({ timelineType: 'default', timelineTabs: result.current.timelineTabs, timelineFilters: result.current.timelineFilters, - }); - }); + }) + ); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_update_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_update_timeline.test.tsx index b2c990b12eced..6d052a3f8b2d2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_update_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_update_timeline.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { mockTimelineModel, TestProviders } from '../../../common/mock'; import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../common/store/inputs/actions'; import { @@ -79,7 +79,10 @@ describe('dispatchUpdateTimeline', () => { beforeEach(() => { jest.clearAllMocks(); - clock = sinon.useFakeTimers(unix); + clock = sinon.useFakeTimers({ + now: unix, + toFake: ['Date'], + }); }); afterEach(function () { @@ -87,128 +90,134 @@ describe('dispatchUpdateTimeline', () => { }); it('it invokes date range picker dispatch', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { result.current(defaultArgs); + }); - expect(dispatchSetTimelineRangeDatePicker).toHaveBeenCalledWith({ - from: '2020-03-26T14:35:56.356Z', - to: '2020-03-26T14:41:56.356Z', - }); + expect(dispatchSetTimelineRangeDatePicker).toHaveBeenCalledWith({ + from: '2020-03-26T14:35:56.356Z', + to: '2020-03-26T14:41:56.356Z', }); }); it('it invokes add timeline dispatch', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { result.current(defaultArgs); + }); - expect(dispatchAddTimeline).toHaveBeenCalledWith({ - id: TimelineId.active, - savedTimeline: true, - timeline: { - ...mockTimelineModel, - version: null, - updated: undefined, - changed: true, - }, - }); + expect(dispatchAddTimeline).toHaveBeenCalledWith({ + id: TimelineId.active, + savedTimeline: true, + timeline: { + ...mockTimelineModel, + version: null, + updated: undefined, + changed: true, + }, }); }); it('it does not invoke kql filter query dispatches if timeline.kqlQuery.filterQuery is null', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); - result.current(defaultArgs); + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); - expect(dispatchApplyKqlFilterQuery).not.toHaveBeenCalled(); + act(() => { + result.current(defaultArgs); }); + + expect(dispatchApplyKqlFilterQuery).not.toHaveBeenCalled(); }); it('it does not invoke notes dispatch if duplicate is true', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + act(() => { result.current(defaultArgs); - - expect(dispatchAddNotes).not.toHaveBeenCalled(); }); + + expect(dispatchAddNotes).not.toHaveBeenCalled(); }); it('it does not invoke kql filter query dispatches if timeline.kqlQuery.kuery is null', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); - const mockTimeline = { - ...mockTimelineModel, - kqlQuery: { - filterQuery: { - kuery: null, - serializedQuery: 'some-serialized-query', - }, + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + const mockTimeline = { + ...mockTimelineModel, + kqlQuery: { + filterQuery: { + kuery: null, + serializedQuery: 'some-serialized-query', }, - }; + }, + }; + + act(() => { result.current({ ...defaultArgs, timeline: mockTimeline, }); - - expect(dispatchApplyKqlFilterQuery).not.toHaveBeenCalled(); }); + + expect(dispatchApplyKqlFilterQuery).not.toHaveBeenCalled(); }); it('it invokes kql filter query dispatches if timeline.kqlQuery.filterQuery.kuery is not null', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); - const mockTimeline = { - ...mockTimelineModel, - kqlQuery: { - filterQuery: { - kuery: { expression: 'expression', kind: 'kuery' as KueryFilterQueryKind }, - serializedQuery: 'some-serialized-query', - }, + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + const mockTimeline = { + ...mockTimelineModel, + kqlQuery: { + filterQuery: { + kuery: { expression: 'expression', kind: 'kuery' as KueryFilterQueryKind }, + serializedQuery: 'some-serialized-query', }, - }; + }, + }; + + act(() => { result.current({ ...defaultArgs, timeline: mockTimeline, }); + }); - expect(dispatchApplyKqlFilterQuery).toHaveBeenCalledWith({ - id: TimelineId.active, - filterQuery: { - kuery: { - kind: 'kuery', - expression: 'expression', - }, - serializedQuery: 'some-serialized-query', + expect(dispatchApplyKqlFilterQuery).toHaveBeenCalledWith({ + id: TimelineId.active, + filterQuery: { + kuery: { + kind: 'kuery', + expression: 'expression', }, - }); + serializedQuery: 'some-serialized-query', + }, }); }); it('it invokes dispatchAddNotes if duplicate is false', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + + act(() => { result.current({ ...defaultArgs, duplicate: false, @@ -223,53 +232,55 @@ describe('dispatchUpdateTimeline', () => { }, ], }); + }); - expect(dispatchAddGlobalTimelineNote).not.toHaveBeenCalled(); - expect(dispatchUpdateNote).not.toHaveBeenCalled(); - expect(dispatchAddNotes).toHaveBeenCalledWith({ - notes: [ - { - created: new Date('2020-03-26T14:35:56.356Z'), - eventId: null, - id: 'note-id', - lastEdit: new Date('2020-03-26T14:35:56.356Z'), - note: 'I am a note', - user: 'unknown', - saveObjectId: 'note-id', - timelineId: 'abc', - version: 'testVersion', - }, - ], - }); + expect(dispatchAddGlobalTimelineNote).not.toHaveBeenCalled(); + expect(dispatchUpdateNote).not.toHaveBeenCalled(); + expect(dispatchAddNotes).toHaveBeenCalledWith({ + notes: [ + { + created: new Date('2020-03-26T14:35:56.356Z'), + eventId: null, + id: 'note-id', + lastEdit: new Date('2020-03-26T14:35:56.356Z'), + note: 'I am a note', + user: 'unknown', + saveObjectId: 'note-id', + timelineId: 'abc', + version: 'testVersion', + }, + ], }); }); it('it invokes dispatch to create a timeline note if duplicate is true and ruleNote exists', async () => { + const { result } = renderHook(() => useUpdateTimeline(), { + wrapper: TestProviders, + }); + await waitFor(() => new Promise((resolve) => resolve(null))); + await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => useUpdateTimeline(), { - wrapper: TestProviders, - }); - await waitForNextUpdate(); result.current({ ...defaultArgs, ruleNote: '# this would be some markdown', }); - const expectedNote: Note = { - created: new Date(anchor), - id: 'uuidv4()', - lastEdit: null, - note: '# this would be some markdown', - saveObjectId: null, - user: 'elastic', - version: null, - }; + }); - expect(dispatchAddNotes).not.toHaveBeenCalled(); - expect(dispatchUpdateNote).toHaveBeenCalledWith({ note: expectedNote }); - expect(dispatchAddGlobalTimelineNote).toHaveBeenLastCalledWith({ - id: TimelineId.active, - noteId: 'uuidv4()', - }); + const expectedNote: Note = { + created: new Date(anchor), + id: 'uuidv4()', + lastEdit: null, + note: '# this would be some markdown', + saveObjectId: null, + user: 'elastic', + version: null, + }; + + expect(dispatchAddNotes).not.toHaveBeenCalled(); + expect(dispatchUpdateNote).toHaveBeenCalledWith({ note: expectedNote }); + expect(dispatchAddGlobalTimelineNote).toHaveBeenLastCalledWith({ + id: TimelineId.active, + noteId: 'uuidv4()', }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_notes_in_flyout.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_notes_in_flyout.test.tsx index 32b5b8bc3c129..fd50be53c6a85 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_notes_in_flyout.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/use_notes_in_flyout.test.tsx @@ -7,11 +7,10 @@ import React from 'react'; import { TimelineId, TimelineTabs } from '../../../../../common/types'; -import { renderHook, act } from '@testing-library/react-hooks/dom'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { createMockStore, mockGlobalState, TestProviders } from '../../../../common/mock'; import type { UseNotesInFlyoutArgs } from './use_notes_in_flyout'; import { useNotesInFlyout } from './use_notes_in_flyout'; -import { waitFor } from '@testing-library/react'; import { useDispatch } from 'react-redux'; jest.mock('react-redux', () => ({ @@ -202,8 +201,8 @@ describe('useNotesInFlyout', () => { expect(result.current.isNotesFlyoutVisible).toBe(false); }); - it('should close the flyout when activeTab is changed', () => { - const { result, rerender, waitForNextUpdate } = renderTestHook(); + it('should close the flyout when activeTab is changed', async () => { + const { result, rerender } = renderTestHook(); act(() => { result.current.setNotesEventId('event-1'); @@ -226,8 +225,6 @@ describe('useNotesInFlyout', () => { rerender({ activeTab: TimelineTabs.eql }); }); - waitForNextUpdate(); - - expect(result.current.isNotesFlyoutVisible).toBe(false); + await waitFor(() => expect(result.current.isNotesFlyoutVisible).toBe(false)); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx index 54b5a4a9aae2f..f925a1d83d136 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx @@ -5,36 +5,28 @@ * 2.0. */ -import { isEmpty, isEqual } from 'lodash'; -import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { isEqual } from 'lodash'; +import React, { memo, useCallback, useEffect, useMemo } from 'react'; +import { EuiOutsideClickDetector } from '@elastic/eui'; import { useDispatch } from 'react-redux'; import { css } from '@emotion/css'; -import type { - EqlOptionsSelected, - FieldsEqlOptions, -} from '../../../../../../common/search_strategy'; +import type { EqlOptions } from '../../../../../../common/search_strategy'; import { useSourcererDataView } from '../../../../../sourcerer/containers'; import { useDeepEqualSelector } from '../../../../../common/hooks/use_selector'; import { SourcererScopeName } from '../../../../../sourcerer/store/model'; -import { EqlQueryBar } from '../../../../../detection_engine/rule_creation_ui/components/eql_query_bar'; - -import { - debounceAsync, - eqlValidator, -} from '../../../../../detection_engine/rule_creation_ui/components/eql_query_bar/validators'; +import { EqlQueryEdit } from '../../../../../detection_engine/rule_creation/components/eql_query_edit'; import type { FieldValueQueryBar } from '../../../../../detection_engine/rule_creation_ui/components/query_bar'; -import type { FormSchema } from '../../../../../shared_imports'; -import { Form, UseField, useForm, useFormData } from '../../../../../shared_imports'; +import type { FormSchema, FormSubmitHandler } from '../../../../../shared_imports'; +import { Form, UseField, useForm } from '../../../../../shared_imports'; import { timelineActions } from '../../../../store'; -import * as i18n from '../translations'; import { getEqlOptions } from './selectors'; interface TimelineEqlQueryBar { index: string[]; eqlQueryBar: FieldValueQueryBar; - eqlOptions: EqlOptionsSelected; + eqlOptions: EqlOptions; } const defaultValues = { @@ -55,13 +47,6 @@ const schema: FormSchema = { eqlOptions: { fieldsToValidateOnChange: ['eqlOptions', 'eqlQueryBar'], }, - eqlQueryBar: { - validations: [ - { - validator: debounceAsync(eqlValidator, 300), - }, - ], - }, }; const hiddenUseFieldClassName = css` @@ -71,11 +56,8 @@ const hiddenUseFieldClassName = css` // eslint-disable-next-line react/display-name export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) => { const dispatch = useDispatch(); - const isInit = useRef(true); - const [isQueryBarValid, setIsQueryBarValid] = useState(false); - const [isQueryBarValidating, setIsQueryBarValidating] = useState(false); const getOptionsSelected = useMemo(() => getEqlOptions(), []); - const optionsSelected = useDeepEqualSelector((state) => getOptionsSelected(state, timelineId)); + const eqlOptions = useDeepEqualSelector((state) => getOptionsSelected(state, timelineId)); const { loading: indexPatternsLoading, @@ -89,127 +71,117 @@ export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) index: [...selectedPatterns].sort(), eqlQueryBar: { ...defaultValues.eqlQueryBar, - query: { query: optionsSelected.query ?? '', language: 'eql' }, + query: { query: eqlOptions.query ?? '', language: 'eql' }, }, + eqlOptions, }), - [optionsSelected.query, selectedPatterns] + [eqlOptions, selectedPatterns] + ); + + const handleSubmit = useCallback>( + async (formData, isValid) => { + if (!isValid) { + return; + } + + if (eqlOptions.query !== `${formData.eqlQueryBar.query.query}`) { + dispatch( + timelineActions.updateEqlOptions({ + id: timelineId, + field: 'query', + value: `${formData.eqlQueryBar.query.query}`, + }) + ); + } + + for (const fieldName of Object.keys(formData.eqlOptions) as Array< + keyof typeof formData.eqlOptions + >) { + if (formData.eqlOptions[fieldName] !== eqlOptions[fieldName]) { + dispatch( + timelineActions.updateEqlOptions({ + id: timelineId, + field: fieldName, + value: formData.eqlOptions[fieldName], + }) + ); + } + } + }, + [dispatch, timelineId, eqlOptions] ); const { form } = useForm({ defaultValue: initialState, options: { stripEmptyFields: false }, schema, + onSubmit: handleSubmit, }); - const { getFields, setFieldValue } = form; - - const onOptionsChange = useCallback( - (field: FieldsEqlOptions, value: string | undefined) => { - dispatch( - timelineActions.updateEqlOptions({ - id: timelineId, - field, - value, - }) - ); - setFieldValue('eqlOptions', { ...optionsSelected, [field]: value }); - }, - [dispatch, optionsSelected, setFieldValue, timelineId] - ); - - const [{ eqlQueryBar: formEqlQueryBar }] = useFormData({ - form, - watch: ['eqlQueryBar'], - }); - - const prevEqlQuery = useRef(''); + const { getFields } = form; + const handleOutsideEqlQueryEditClick = useCallback(() => form.submit(), [form]); - const optionsData = useMemo(() => { - const fields = Object.values(sourcererDataView.fields || {}); + // Reset the form when new EQL Query came from the state + useEffect(() => { + getFields().eqlQueryBar.setValue({ + ...defaultValues.eqlQueryBar, + query: { query: eqlOptions.query ?? '', language: 'eql' }, + }); + }, [getFields, eqlOptions.query]); - return isEmpty(fields) - ? { - keywordFields: [], - dateFields: [], - nonDateFields: [], - } - : { - keywordFields: fields - .filter((f) => f.esTypes?.includes('keyword')) - .map((f) => ({ label: f.name })), - dateFields: fields.filter((f) => f.type === 'date').map((f) => ({ label: f.name })), - nonDateFields: fields.filter((f) => f.type !== 'date').map((f) => ({ label: f.name })), - }; - }, [sourcererDataView]); + // Reset the form when new EQL Options came from the state + useEffect(() => { + getFields().eqlOptions.setValue({ + eventCategoryField: eqlOptions.eventCategoryField, + tiebreakerField: eqlOptions.tiebreakerField, + timestampField: eqlOptions.timestampField, + size: eqlOptions.size, + }); + }, [ + getFields, + eqlOptions.eventCategoryField, + eqlOptions.tiebreakerField, + eqlOptions.timestampField, + eqlOptions.size, + ]); useEffect(() => { const { index: indexField } = getFields(); const newIndexValue = [...selectedPatterns].sort(); const indexFieldValue = (indexField.value as string[]).sort(); + if (!isEqual(indexFieldValue, newIndexValue)) { indexField.setValue(newIndexValue); } }, [getFields, selectedPatterns]); - useEffect(() => { - const { eqlQueryBar } = getFields(); - if (isInit.current) { - isInit.current = false; - setIsQueryBarValidating(true); - eqlQueryBar.setValue({ - ...defaultValues.eqlQueryBar, - query: { query: optionsSelected.query ?? '', language: 'eql' }, - }); - } - return () => { - isInit.current = true; - }; - }, [getFields, optionsSelected.query]); - - useEffect(() => { - if ( - formEqlQueryBar != null && - prevEqlQuery.current !== formEqlQueryBar.query.query && - isQueryBarValid && - !isQueryBarValidating - ) { - prevEqlQuery.current = formEqlQueryBar.query.query; - dispatch( - timelineActions.updateEqlOptions({ - id: timelineId, - field: 'query', - value: `${formEqlQueryBar.query.query}`, - }) - ); - setIsQueryBarValid(false); - setIsQueryBarValidating(false); - } - }, [dispatch, formEqlQueryBar, isQueryBarValid, isQueryBarValidating, timelineId]); + const dataView = useMemo( + () => ({ + ...sourcererDataView, + title: sourcererDataView.title ?? '', + fields: Object.values(sourcererDataView.fields || {}), + }), + [sourcererDataView] + ); + /* Force casting `sourcererDataView` to `DataViewBase` is required since EqlQueryEdit + accepts DataViewBase but `useSourcererDataView()` returns `DataViewSpec`. + + When using `UseField` with `EqlQueryBar` such casting isn't required by TS since + `UseField` component props are types as `Record`. */ return (
- - + + + ); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/selectors.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/selectors.tsx index e533ef9175178..eccaf88591983 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/selectors.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/selectors.tsx @@ -13,12 +13,7 @@ export const getEqlOptions = () => selectTimeline, (timeline) => timeline?.eqlOptions ?? { - eventCategoryField: [{ label: 'event.category' }], - tiebreakerField: [ - { - label: '', - }, - ], + eventCategoryField: 'event.category', timestampField: [ { label: '@timestamp', diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/customizations/use_histogram_customizations.test.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/customizations/use_histogram_customizations.test.ts index d40b417b95218..10dfa97f35bdc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/customizations/use_histogram_customizations.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/customizations/use_histogram_customizations.test.ts @@ -11,7 +11,7 @@ import type { ClickTriggerEvent, MultiClickTriggerEvent, } from '@kbn/charts-plugin/public'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { DiscoverStateContainer, UnifiedHistogramCustomization, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/use_get_stateful_query_bar.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/use_get_stateful_query_bar.test.tsx index 17b018ffea99d..fe26d8780a903 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/use_get_stateful_query_bar.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/use_get_stateful_query_bar.test.tsx @@ -6,7 +6,7 @@ */ import { TestProviders } from '../../../../../common/mock'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useGetStatefulQueryBar } from './use_get_stateful_query_bar'; describe('useGetStatefulQueryBar', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/session/use_session_view.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/session/use_session_view.test.tsx index 9c4b135b5e774..54155a493da64 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/session/use_session_view.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/session/use_session_view.test.tsx @@ -8,8 +8,7 @@ import type { PropsWithChildren } from 'react'; import React, { memo } from 'react'; -import { render } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, renderHook } from '@testing-library/react'; import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; import { mockTimelineModel, TestProviders } from '../../../../../common/mock'; import { useKibana } from '../../../../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_columns.test.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_columns.test.ts index 926082ff9ed41..66162fe82e458 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_columns.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_columns.test.ts @@ -6,7 +6,7 @@ */ import { TestProviders } from '../../../../../common/mock'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useTimelineColumns } from './use_timeline_columns'; import { defaultUdtHeaders } from '../../body/column_headers/default_headers'; import type { ColumnHeaderOptions } from '../../../../../../common/types/timeline/columns'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_control_columns.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_control_columns.test.tsx index efbe954250037..8168742d4e08d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_control_columns.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/shared/use_timeline_control_columns.test.tsx @@ -6,7 +6,7 @@ */ import type { EuiDataGridControlColumn } from '@elastic/eui'; import { TestProviders } from '../../../../../common/mock'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useLicense } from '../../../../../common/hooks/use_license'; import { useTimelineControlColumn } from './use_timeline_control_columns'; import type { ColumnHeaderOptions } from '../../../../../../common/types/timeline/columns'; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts index ba76f857dc34c..7640b74d1d253 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.test.ts @@ -88,17 +88,9 @@ const timelineData = { savedSearchId: null, }; const mockPatchTimelineResponse = { - data: { - persistTimeline: { - code: 200, - message: 'success', - timeline: { - ...timelineData, - savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', - version: 'WzM0NSwxXQ==', - }, - }, - }, + ...timelineData, + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzM0NSwxXQ==', }; describe('persistTimeline', () => { describe('create draft timeline', () => { @@ -108,15 +100,9 @@ describe('persistTimeline', () => { status: TimelineStatusEnum.draft, }; const mockDraftResponse = { - data: { - persistTimeline: { - timeline: { - ...initialDraftTimeline, - savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', - version: 'WzMzMiwxXQ==', - }, - }, - }, + ...initialDraftTimeline, + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', }; const version = null; @@ -161,14 +147,13 @@ describe('persistTimeline', () => { test("it should update timeline from clean draft timeline's response", () => { expect(JSON.parse(patchMock.mock.calls[0][1].body)).toEqual({ - timelineId: mockDraftResponse.data.persistTimeline.timeline.savedObjectId, + timelineId: mockDraftResponse.savedObjectId, timeline: { ...initialDraftTimeline, - templateTimelineId: mockDraftResponse.data.persistTimeline.timeline.templateTimelineId, - templateTimelineVersion: - mockDraftResponse.data.persistTimeline.timeline.templateTimelineVersion, + templateTimelineId: mockDraftResponse.templateTimelineId, + templateTimelineVersion: mockDraftResponse.templateTimelineVersion, }, - version: mockDraftResponse.data.persistTimeline.timeline.version ?? '', + version: mockDraftResponse.version ?? '', }); }); }); @@ -211,13 +196,8 @@ describe('persistTimeline', () => { version, }); expect(persist).toEqual({ - data: { - persistTimeline: { - code: 403, - message: 'you do not have the permission', - timeline: { ...initialDraftTimeline, savedObjectId: '', version: '' }, - }, - }, + statusCode: 403, + message: 'you do not have the permission', }); }); }); @@ -226,15 +206,9 @@ describe('persistTimeline', () => { const timelineId = null; const importTimeline = timelineData; const mockPostTimelineResponse = { - data: { - persistTimeline: { - timeline: { - ...timelineData, - savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', - version: 'WzMzMiwxXQ==', - }, - }, - }, + ...timelineData, + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', }; const version = null; @@ -273,17 +247,11 @@ describe('persistTimeline', () => { const timelineId = '9d5693e0-a42a-11ea-b8f4-c5434162742a'; const inputTimeline = timelineData; const mockPatchTimelineResponseNew = { - data: { - persistTimeline: { - timeline: { - ...mockPatchTimelineResponse.data.persistTimeline.timeline, - version: 'WzMzMiwxXQ==', - description: 'x', - created: 1591092702804, - updated: 1591092705206, - }, - }, - }, + ...mockPatchTimelineResponse, + version: 'WzMzMiwxXQ==', + description: 'x', + created: 1591092702804, + updated: 1591092705206, }; const version = 'initial version'; @@ -454,15 +422,9 @@ describe('cleanDraftTimeline', () => { describe('copyTimeline', () => { const mockPostTimelineResponse = { - data: { - persistTimeline: { - timeline: { - ...timelineData, - savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', - version: 'WzMzMiwxXQ==', - }, - }, - }, + ...timelineData, + savedObjectId: '9d5693e0-a42a-11ea-b8f4-c5434162742a', + version: 'WzMzMiwxXQ==', }; const saveSavedSearchMock = jest.fn(); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index fa006293719d5..03f3d3ff2ff2d 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -67,26 +67,30 @@ const createToasterPlainError = (message: string) => new ToasterError([message]) const parseOrThrow = parseOrThrowErrorFactory(createToasterPlainError); -const decodeTimelineResponse = (respTimeline?: PersistTimelineResponse | TimelineErrorResponse) => - parseOrThrow(PersistTimelineResponse)(respTimeline); +const decodeTimelineResponse = ( + respTimeline?: PersistTimelineResponse | TimelineErrorResponse +): PersistTimelineResponse => parseOrThrow(PersistTimelineResponse)(respTimeline); -const decodeSingleTimelineResponse = (respTimeline?: GetTimelineResponse) => +const decodeSingleTimelineResponse = (respTimeline?: GetTimelineResponse): GetTimelineResponse => parseOrThrow(GetTimelineResponse)(respTimeline); -const decodeResolvedSingleTimelineResponse = (respTimeline?: ResolveTimelineResponse) => - parseOrThrow(ResolveTimelineResponse)(respTimeline); +const decodeResolvedSingleTimelineResponse = ( + respTimeline?: ResolveTimelineResponse +): ResolveTimelineResponse => parseOrThrow(ResolveTimelineResponse)(respTimeline); -const decodeGetTimelinesResponse = (respTimeline: GetTimelinesResponse) => +const decodeGetTimelinesResponse = (respTimeline: GetTimelinesResponse): GetTimelinesResponse => parseOrThrow(GetTimelinesResponse)(respTimeline); -const decodeTimelineErrorResponse = (respTimeline?: TimelineErrorResponse) => +const decodeTimelineErrorResponse = (respTimeline?: TimelineErrorResponse): TimelineErrorResponse => parseOrThrow(TimelineErrorResponse)(respTimeline); -const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResult) => - parseOrThrow(ImportTimelineResult)(respTimeline); +const decodePrepackedTimelineResponse = ( + respTimeline?: ImportTimelineResult +): ImportTimelineResult => parseOrThrow(ImportTimelineResult)(respTimeline); -const decodeResponseFavoriteTimeline = (respTimeline?: PersistFavoriteRouteResponse) => - parseOrThrow(PersistFavoriteRouteResponse)(respTimeline); +const decodeResponseFavoriteTimeline = ( + respTimeline?: PersistFavoriteRouteResponse +): PersistFavoriteRouteResponse => parseOrThrow(PersistFavoriteRouteResponse)(respTimeline); const postTimeline = async ({ timeline, @@ -219,22 +223,19 @@ export const persistTimeline = async ({ const templateTimelineInfo = timeline.timelineType === TimelineTypeEnum.template ? { - templateTimelineId: - draftTimeline.data.persistTimeline.timeline.templateTimelineId ?? - timeline.templateTimelineId, + templateTimelineId: draftTimeline.templateTimelineId ?? timeline.templateTimelineId, templateTimelineVersion: - draftTimeline.data.persistTimeline.timeline.templateTimelineVersion ?? - timeline.templateTimelineVersion, + draftTimeline.templateTimelineVersion ?? timeline.templateTimelineVersion, } : {}; return patchTimeline({ - timelineId: draftTimeline.data.persistTimeline.timeline.savedObjectId, + timelineId: draftTimeline.savedObjectId, timeline: { ...timeline, ...templateTimelineInfo, }, - version: draftTimeline.data.persistTimeline.timeline.version ?? '', + version: draftTimeline.version ?? '', savedSearch, }); } @@ -250,19 +251,10 @@ export const persistTimeline = async ({ savedSearch, }); } catch (err) { - if (err.status_code === 403 || err.body.status_code === 403) { + if (err.status_code === 403 || err.body?.status_code === 403) { return Promise.resolve({ - data: { - persistTimeline: { - code: 403, - message: err.message || err.body.message, - timeline: { - ...timeline, - savedObjectId: '', - version: '', - }, - }, - }, + statusCode: 403, + message: err.message || err.body.message, }); } return Promise.resolve(err); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.test.tsx index 68846de0fed37..f00ca0551a9a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.test.tsx @@ -6,7 +6,7 @@ */ import { DataLoadingState } from '@kbn/unified-data-table'; -import { renderHook, act } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import type { TimelineArgs, UseTimelineEventsProps } from '.'; import { initSortDefault, useTimelineEvents } from '.'; import { SecurityPageName } from '../../../common/constants'; @@ -60,21 +60,23 @@ jest.mock('../../common/lib/kibana', () => ({ mockSearch(); return { subscribe: jest.fn().mockImplementation(({ next }) => { - next({ - isRunning: false, - isPartial: false, - inspect: { - dsl: [], - response: [], - }, - edges: mockEvents.map((item) => ({ node: item })), - pageInfo: { - activePage: 0, - totalPages: 10, - }, - rawResponse: {}, - totalCount: mockTimelineData.length, - }); + setTimeout(() => { + next({ + isRunning: false, + isPartial: false, + inspect: { + dsl: [], + response: [], + }, + edges: mockEvents.map((item) => ({ node: item })), + pageInfo: { + activePage: 0, + totalPages: 10, + }, + rawResponse: {}, + totalCount: mockTimelineData.length, + }); + }, 0); return { unsubscribe: jest.fn() }; }), }; @@ -135,47 +137,41 @@ describe('useTimelineEvents', () => { }; test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); - - // useEffect on params request - await waitForNextUpdate(); - expect(result.current).toEqual([ - DataLoadingState.loaded, - { - events: [], - id: TimelineId.active, - inspect: result.current[1].inspect, - loadPage: result.current[1].loadPage, - pageInfo: result.current[1].pageInfo, - refetch: result.current[1].refetch, - totalCount: -1, - refreshedAt: 0, - }, - ]); + const { result } = renderHook((args) => useTimelineEvents(args), { + initialProps: props, }); + + expect(result.current).toEqual([ + DataLoadingState.loading, + { + events: [], + id: TimelineId.active, + inspect: expect.objectContaining({ dsl: [], response: [] }), + loadPage: expect.any(Function), + pageInfo: expect.objectContaining({ + activePage: 0, + querySize: 0, + }), + refetch: expect.any(Function), + totalCount: -1, + refreshedAt: 0, + }, + ]); }); test('happy path query', async () => { - await act(async () => { - const { result, waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); - - // useEffect on params request - await waitForNextUpdate(); - rerender({ ...props, startDate, endDate }); - // useEffect on params request - await waitForNextUpdate(); + const { result, rerender } = renderHook< + [DataLoadingState, TimelineArgs], + UseTimelineEventsProps + >((args) => useTimelineEvents(args), { + initialProps: props, + }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ ...props, startDate, endDate }); + // useEffect on params request + await waitFor(() => { expect(mockSearch).toHaveBeenCalledTimes(2); expect(result.current).toEqual([ DataLoadingState.loaded, @@ -194,73 +190,53 @@ describe('useTimelineEvents', () => { }); test('Mock cache for active timeline when switching page', async () => { - await act(async () => { - const { result, waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); - - // useEffect on params request - await waitForNextUpdate(); - rerender({ ...props, startDate, endDate }); - // useEffect on params request - await waitForNextUpdate(); - - mockUseRouteSpy.mockReturnValue([ - { - pageName: SecurityPageName.timelines, - detailName: undefined, - tabName: undefined, - search: '', - pathName: '/timelines', - }, - ]); - - expect(mockSearch).toHaveBeenCalledTimes(2); - - expect(result.current).toEqual([ - DataLoadingState.loaded, - { - events: mockEvents, - id: TimelineId.active, - inspect: result.current[1].inspect, - loadPage: result.current[1].loadPage, - pageInfo: result.current[1].pageInfo, - refetch: result.current[1].refetch, - totalCount: 32, - refreshedAt: result.current[1].refreshedAt, - }, - ]); + const { result, rerender } = renderHook< + [DataLoadingState, TimelineArgs], + UseTimelineEventsProps + >((args) => useTimelineEvents(args), { + initialProps: props, }); + + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ ...props, startDate, endDate }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + + mockUseRouteSpy.mockReturnValue([ + { + pageName: SecurityPageName.timelines, + detailName: undefined, + tabName: undefined, + search: '', + pathName: '/timelines', + }, + ]); + + expect(mockSearch).toHaveBeenCalledTimes(2); + + expect(result.current).toEqual([ + DataLoadingState.loaded, + { + events: mockEvents, + id: TimelineId.active, + inspect: result.current[1].inspect, + loadPage: result.current[1].loadPage, + pageInfo: result.current[1].pageInfo, + refetch: result.current[1].refetch, + totalCount: 32, + refreshedAt: result.current[1].refreshedAt, + }, + ]); }); test('Correlation pagination is calling search strategy when switching page', async () => { - await act(async () => { - const { result, waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { - ...props, - language: 'eql', - eqlOptions: { - eventCategoryField: 'category', - tiebreakerField: '', - timestampField: '@timestamp', - query: 'find it EQL', - size: 100, - }, - }, - }); - - // useEffect on params request - await waitForNextUpdate(); - rerender({ + const { result, rerender } = renderHook< + [DataLoadingState, TimelineArgs], + UseTimelineEventsProps + >((args) => useTimelineEvents(args), { + initialProps: { ...props, - startDate, - endDate, language: 'eql', eqlOptions: { eventCategoryField: 'category', @@ -269,123 +245,113 @@ describe('useTimelineEvents', () => { query: 'find it EQL', size: 100, }, - }); - // useEffect on params request - await waitForNextUpdate(); - mockSearch.mockReset(); + }, + }); + + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ + ...props, + startDate, + endDate, + language: 'eql', + eqlOptions: { + eventCategoryField: 'category', + tiebreakerField: '', + timestampField: '@timestamp', + query: 'find it EQL', + size: 100, + }, + }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + mockSearch.mockReset(); + act(() => { result.current[1].loadPage(4); - await waitForNextUpdate(); - expect(mockSearch).toHaveBeenCalledTimes(1); }); + await waitFor(() => expect(mockSearch).toHaveBeenCalledTimes(1)); }); test('should query again when a new field is added', async () => { - await act(async () => { - const { waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); - - // useEffect on params request - await waitForNextUpdate(); - rerender({ ...props, startDate, endDate }); - // useEffect on params request - await waitForNextUpdate(); - - expect(mockSearch).toHaveBeenCalledTimes(2); - mockSearch.mockClear(); + const { rerender } = renderHook((args) => useTimelineEvents(args), { + initialProps: props, + }); - rerender({ - ...props, - startDate, - endDate, - fields: ['@timestamp', 'event.kind', 'event.category'], - }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ ...props, startDate, endDate }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); - await waitForNextUpdate(); + expect(mockSearch).toHaveBeenCalledTimes(2); + mockSearch.mockClear(); - expect(mockSearch).toHaveBeenCalledTimes(1); + rerender({ + ...props, + startDate, + endDate, + fields: ['@timestamp', 'event.kind', 'event.category'], }); + + await waitFor(() => expect(mockSearch).toHaveBeenCalledTimes(1)); }); test('should not query again when a field is removed', async () => { - await act(async () => { - const { waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); - - // useEffect on params request - await waitForNextUpdate(); - rerender({ ...props, startDate, endDate }); - // useEffect on params request - await waitForNextUpdate(); + const { rerender } = renderHook((args) => useTimelineEvents(args), { + initialProps: props, + }); - expect(mockSearch).toHaveBeenCalledTimes(2); - mockSearch.mockClear(); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ ...props, startDate, endDate }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); - rerender({ ...props, startDate, endDate, fields: ['@timestamp'] }); + expect(mockSearch).toHaveBeenCalledTimes(2); + mockSearch.mockClear(); - // since there is no new update in useEffect, it should throw an timeout error - await expect(waitForNextUpdate()).rejects.toThrowError(); + rerender({ ...props, startDate, endDate, fields: ['@timestamp'] }); - expect(mockSearch).toHaveBeenCalledTimes(0); - }); + await waitFor(() => expect(mockSearch).toHaveBeenCalledTimes(0)); }); test('should not query again when a removed field is added back', async () => { - await act(async () => { - const { waitForNextUpdate, rerender } = renderHook< - UseTimelineEventsProps, - [DataLoadingState, TimelineArgs] - >((args) => useTimelineEvents(args), { - initialProps: { ...props }, - }); + const { rerender } = renderHook((args) => useTimelineEvents(args), { + initialProps: props, + }); - // useEffect on params request - await waitForNextUpdate(); - rerender({ ...props, startDate, endDate }); - // useEffect on params request - await waitForNextUpdate(); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); + rerender({ ...props, startDate, endDate }); + // useEffect on params request + await waitFor(() => new Promise((resolve) => resolve(null))); - expect(mockSearch).toHaveBeenCalledTimes(2); - mockSearch.mockClear(); + expect(mockSearch).toHaveBeenCalledTimes(2); + mockSearch.mockClear(); - // remove `event.kind` from default fields - rerender({ ...props, startDate, endDate, fields: ['@timestamp'] }); + // remove `event.kind` from default fields + rerender({ ...props, startDate, endDate, fields: ['@timestamp'] }); - // since there is no new update in useEffect, it should throw an timeout error - await expect(waitForNextUpdate()).rejects.toThrowError(); + await waitFor(() => new Promise((resolve) => resolve(null))); - expect(mockSearch).toHaveBeenCalledTimes(0); + expect(mockSearch).toHaveBeenCalledTimes(0); - // request default Fields - rerender({ ...props, startDate, endDate }); + // request default Fields + rerender({ ...props, startDate, endDate }); - // since there is no new update in useEffect, it should throw an timeout error - await expect(waitForNextUpdate()).rejects.toThrowError(); - - expect(mockSearch).toHaveBeenCalledTimes(0); - }); + // since there is no new update in useEffect, it should throw an timeout error + // await expect(waitFor(() => null)).rejects.toThrowError(); + await waitFor(() => expect(mockSearch).toHaveBeenCalledTimes(0)); }); describe('Fetch Notes', () => { test('should call onLoad for notes when events are fetched', async () => { - await act(async () => { - const { waitFor } = renderHook( - (args) => useTimelineEvents(args), - { - initialProps: { ...props }, - } - ); - - await waitFor(() => { - expect(mockSearch).toHaveBeenCalledTimes(1); - expect(onLoadMock).toHaveBeenNthCalledWith(1, expect.objectContaining(mockEvents)); - }); + renderHook((args) => useTimelineEvents(args), { + initialProps: props, + }); + + await waitFor(() => { + expect(mockSearch).toHaveBeenCalledTimes(1); + expect(onLoadMock).toHaveBeenNthCalledWith(1, expect.objectContaining(mockEvents)); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 6c40ca1b7dfd1..0301f0123c30f 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -41,7 +41,7 @@ import { TimelineId } from '../../../common/types/timeline'; import { useRouteSpy } from '../../common/utils/route/use_route_spy'; import { activeTimeline } from './active_timeline_context'; import type { - EqlOptionsSelected, + EqlOptions, TimelineEqlResponse, } from '../../../common/search_strategy/timeline/events/eql'; import { useTrackHttpRequest } from '../../common/lib/apm/use_track_http_request'; @@ -84,7 +84,7 @@ type TimelineResponse = T extends 'kuery' export interface UseTimelineEventsProps { dataViewId: string | null; endDate?: string; - eqlOptions?: EqlOptionsSelected; + eqlOptions?: EqlOptions; fields: string[]; filterQuery?: ESQuery | string; id: string; @@ -112,7 +112,7 @@ export const initSortDefault: TimelineRequestSortField[] = [ }, ]; -const deStructureEqlOptions = (eqlOptions?: EqlOptionsSelected) => ({ +const deStructureEqlOptions = (eqlOptions?: EqlOptions) => ({ ...(!isEmpty(eqlOptions?.eventCategoryField) ? { eventCategoryField: eqlOptions?.eventCategoryField, diff --git a/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.test.tsx b/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.test.tsx index 9142aca78424c..db9413df30595 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/use_timeline_data_filters.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { mockGlobalState, TestProviders, createMockStore } from '../../common/mock'; import { useTimelineDataFilters } from './use_timeline_data_filters'; import React from 'react'; diff --git a/x-pack/plugins/security_solution/public/timelines/hooks/use_create_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/hooks/use_create_timeline.test.tsx index a4c054371a316..0864c2bb024bd 100644 --- a/x-pack/plugins/security_solution/public/timelines/hooks/use_create_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/hooks/use_create_timeline.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useCreateTimeline } from './use_create_timeline'; import type { TimeRange } from '../../common/store/inputs/model'; import { RowRendererCount, TimelineTypeEnum } from '../../../common/api/timeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/store/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/actions.ts index 976d35c030651..78f74ef4670e7 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/actions.ts @@ -188,7 +188,7 @@ export const toggleModalSaveTimeline = actionCreator<{ export const updateEqlOptions = actionCreator<{ id: string; field: FieldsEqlOptions; - value: string | undefined; + value: string | number | undefined; }>('UPDATE_EQL_OPTIONS_TIMELINE'); export const setEventsLoading = actionCreator<{ diff --git a/x-pack/plugins/security_solution/public/timelines/store/defaults.ts b/x-pack/plugins/security_solution/public/timelines/store/defaults.ts index 5dbe2d1b9c1e8..69d306be9b85f 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/defaults.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/defaults.ts @@ -32,7 +32,6 @@ export const timelineDefaults: SubsetTimelineModel & description: '', eqlOptions: { eventCategoryField: 'event.category', - tiebreakerField: '', timestampField: '@timestamp', query: '', size: 100, diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.test.ts index 85bf3652ab0b9..8ae986e95c4a9 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.test.ts @@ -39,16 +39,8 @@ describe('Timeline middleware helpers', () => { it('should return a draft timeline with a savedObjectId when an unsaved timeline is passed', async () => { const mockSavedObjectId = 'mockSavedObjectId'; (persistTimeline as jest.Mock).mockResolvedValue({ - data: { - persistTimeline: { - code: 200, - message: 'success', - timeline: { - ...mockGlobalState.timeline.timelineById[TimelineId.test], - savedObjectId: mockSavedObjectId, - }, - }, - }, + ...mockGlobalState.timeline.timelineById[TimelineId.test], + savedObjectId: mockSavedObjectId, }); const returnedTimeline = await ensureTimelineIsSaved({ diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts index c5cb62b523bb8..adeca92795178 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/helpers.ts @@ -6,6 +6,7 @@ */ import type { MiddlewareAPI, Dispatch, AnyAction } from 'redux'; +import type { IHttpFetchError } from '@kbn/core/public'; import type { State } from '../../../common/store/types'; import { ALL_TIMELINE_QUERY_ID } from '../../containers/all'; import type { inputsModel } from '../../../common/store/inputs'; @@ -62,3 +63,17 @@ export async function ensureTimelineIsSaved({ // Make sure we're returning the most updated version of the timeline return selectTimelineById(store.getState(), localTimelineId); } + +export function isHttpFetchError( + error: unknown +): error is IHttpFetchError<{ status_code: number }> { + return ( + error !== null && + typeof error === 'object' && + 'body' in error && + error.body !== null && + typeof error.body === 'object' && + `status_code` in error.body && + typeof error.body.status_code === 'number' + ); +} diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.test.ts index 50a0ed53c4913..01be4f72c83f4 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.test.ts @@ -35,7 +35,14 @@ jest.mock('../actions', () => { }; }); jest.mock('../../containers/api'); -jest.mock('./helpers'); +jest.mock('./helpers', () => { + const actual = jest.requireActual('./helpers'); + + return { + ...actual, + refreshTimelines: jest.fn(), + }; +}); const startTimelineSavingMock = startTimelineSaving as unknown as jest.Mock; const endTimelineSavingMock = endTimelineSaving as unknown as jest.Mock; @@ -53,14 +60,9 @@ describe('Timeline favorite middleware', () => { it('should persist a timeline favorite when a favorite action is dispatched', async () => { (persistFavorite as jest.Mock).mockResolvedValue({ - data: { - persistFavorite: { - code: 200, - favorite: [{}], - savedObjectId: newSavedObjectId, - version: newVersion, - }, - }, + favorite: [{}], + savedObjectId: newSavedObjectId, + version: newVersion, }); expect(selectTimelineById(store.getState(), TimelineId.test).isFavorite).toEqual(false); await store.dispatch(updateIsFavorite({ id: TimelineId.test, isFavorite: true })); @@ -88,14 +90,9 @@ describe('Timeline favorite middleware', () => { }) ); (persistFavorite as jest.Mock).mockResolvedValue({ - data: { - persistFavorite: { - code: 200, - favorite: [], - savedObjectId: newSavedObjectId, - version: newVersion, - }, - }, + favorite: [], + savedObjectId: newSavedObjectId, + version: newVersion, }); expect(selectTimelineById(store.getState(), TimelineId.test).isFavorite).toEqual(true); await store.dispatch(updateIsFavorite({ id: TimelineId.test, isFavorite: false })); @@ -113,12 +110,8 @@ describe('Timeline favorite middleware', () => { }); it('should show an error message when the call is unauthorized', async () => { - (persistFavorite as jest.Mock).mockResolvedValue({ - data: { - persistFavorite: { - code: 403, - }, - }, + (persistFavorite as jest.Mock).mockRejectedValue({ + body: { status_code: 403 }, }); await store.dispatch(updateIsFavorite({ id: TimelineId.test, isFavorite: true })); diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts index bf4854e60666b..4f195e5fa13f6 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { get } from 'lodash/fp'; import type { Action, Middleware } from 'redux'; import type { CoreStart } from '@kbn/core/public'; @@ -17,12 +16,11 @@ import { startTimelineSaving, showCallOutUnauthorizedMsg, } from '../actions'; -import type { FavoriteTimelineResponse } from '../../../../common/api/timeline'; import { TimelineTypeEnum } from '../../../../common/api/timeline'; import { persistFavorite } from '../../containers/api'; import { selectTimelineById } from '../selectors'; import * as i18n from '../../pages/translations'; -import { refreshTimelines } from './helpers'; +import { isHttpFetchError, refreshTimelines } from './helpers'; type FavoriteTimelineAction = ReturnType; @@ -42,19 +40,13 @@ export const favoriteTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, S store.dispatch(startTimelineSaving({ id })); try { - const result = await persistFavorite({ + const response = await persistFavorite({ timelineId: timeline.id, templateTimelineId: timeline.templateTimelineId, templateTimelineVersion: timeline.templateTimelineVersion, timelineType: timeline.timelineType ?? TimelineTypeEnum.default, }); - const response: FavoriteTimelineResponse = get('data.persistFavorite', result); - - if (response.code === 403) { - store.dispatch(showCallOutUnauthorizedMsg()); - } - refreshTimelines(store.getState()); store.dispatch( @@ -69,10 +61,14 @@ export const favoriteTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, S }) ); } catch (error) { - kibana.notifications.toasts.addDanger({ - title: i18n.UPDATE_TIMELINE_ERROR_TITLE, - text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, - }); + if (isHttpFetchError(error) && error.body?.status_code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } else { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } } finally { store.dispatch( endTimelineSaving({ diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.test.ts index 9fb0585601042..f6f3a0d0dc151 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.test.ts @@ -70,14 +70,8 @@ describe('Timeline note middleware', () => { it('should persist a timeline note', async () => { (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 200, - message: 'success', - note: { - noteId: testNote.id, - }, - }, + note: { + noteId: testNote.id, }, }); expect(selectTimelineById(store.getState(), TimelineId.test).noteIds).toEqual([]); @@ -92,14 +86,8 @@ describe('Timeline note middleware', () => { it('should persist a note on an event of a timeline', async () => { (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 200, - message: 'success', - note: { - noteId: testNote.id, - }, - }, + note: { + noteId: testNote.id, }, }); expect(selectTimelineById(store.getState(), TimelineId.test).eventIdToNoteIds).toEqual({ @@ -123,14 +111,8 @@ describe('Timeline note middleware', () => { it('should ensure the timeline is saved or in draft mode before creating a note', async () => { (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 200, - message: 'success', - note: { - noteId: testNote.id, - }, - }, + note: { + noteId: testNote.id, }, }); @@ -159,15 +141,9 @@ describe('Timeline note middleware', () => { it('should pin the event when the event is not pinned yet', async () => { const testTimelineId = 'testTimelineId'; (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 200, - message: 'success', - note: { - noteId: testNote.id, - timelineId: testTimelineId, - }, - }, + note: { + noteId: testNote.id, + timelineId: testTimelineId, }, }); @@ -207,15 +183,9 @@ describe('Timeline note middleware', () => { ); const testTimelineId = 'testTimelineId'; (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 200, - message: 'success', - note: { - noteId: testNote.id, - timelineId: testTimelineId, - }, - }, + note: { + noteId: testNote.id, + timelineId: testTimelineId, }, }); @@ -232,12 +202,8 @@ describe('Timeline note middleware', () => { }); it('should show an error message when the call is unauthorized', async () => { - (persistNote as jest.Mock).mockResolvedValue({ - data: { - persistNote: { - code: 403, - }, - }, + (persistNote as jest.Mock).mockRejectedValue({ + body: { status_code: 403 }, }); await store.dispatch(updateNote({ note: testNote })); diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts index 876fd613d0791..44b6e6d872037 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_note.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { get } from 'lodash/fp'; import type { Action, Middleware } from 'redux'; import type { CoreStart } from '@kbn/core/public'; @@ -22,10 +21,9 @@ import { pinEvent, } from '../actions'; import { persistNote } from '../../containers/notes/api'; -import type { ResponseNote } from '../../../../common/api/timeline'; import { selectTimelineById } from '../selectors'; import * as i18n from '../../pages/translations'; -import { ensureTimelineIsSaved, refreshTimelines } from './helpers'; +import { ensureTimelineIsSaved, isHttpFetchError, refreshTimelines } from './helpers'; type NoteAction = ReturnType; @@ -64,7 +62,7 @@ export const addNoteToTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, throw new Error('Cannot create note without a timelineId'); } - const result = await persistNote({ + const response = await persistNote({ noteId: null, version: null, note: { @@ -74,11 +72,6 @@ export const addNoteToTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, }, }); - const response: ResponseNote = get('data.persistNote', result); - if (response.code === 403) { - store.dispatch(showCallOutUnauthorizedMsg()); - } - refreshTimelines(store.getState()); await store.dispatch( @@ -112,10 +105,14 @@ export const addNoteToTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, } } } catch (error) { - kibana.notifications.toasts.addDanger({ - title: i18n.UPDATE_TIMELINE_ERROR_TITLE, - text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, - }); + if (isHttpFetchError(error) && error.body?.status_code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } else { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } } finally { store.dispatch( endTimelineSaving({ diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts index 67374a66019db..7108ecfc4a616 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.test.ts @@ -63,12 +63,7 @@ describe('Timeline pinned event middleware', () => { it('should persist a timeline pin event action', async () => { (persistPinnedEvent as jest.Mock).mockResolvedValue({ - data: { - persistPinnedEventOnTimeline: { - code: 200, - eventId: testEventId, - }, - }, + eventId: testEventId, }); expect(selectTimelineById(store.getState(), TimelineId.test).pinnedEventIds).toEqual({}); await store.dispatch(pinEvent({ id: TimelineId.test, eventId: testEventId })); @@ -103,7 +98,7 @@ describe('Timeline pinned event middleware', () => { ); (persistPinnedEvent as jest.Mock).mockResolvedValue({ - data: {}, + unpinned: true, }); expect(selectTimelineById(store.getState(), TimelineId.test).pinnedEventIds).toEqual({ [testEventId]: true, @@ -117,13 +112,7 @@ describe('Timeline pinned event middleware', () => { }); it('should ensure the timeline is saved or in draft mode before pinning an event', async () => { - (persistPinnedEvent as jest.Mock).mockResolvedValue({ - data: { - persistPinnedEventOnTimeline: { - code: 200, - }, - }, - }); + (persistPinnedEvent as jest.Mock).mockResolvedValue({}); expect(selectTimelineById(store.getState(), TimelineId.test).pinnedEventIds).toEqual({}); await store.dispatch(pinEvent({ id: TimelineId.test, eventId: testEventId })); @@ -139,12 +128,8 @@ describe('Timeline pinned event middleware', () => { }); it('should show an error message when the call is unauthorized', async () => { - (persistPinnedEvent as jest.Mock).mockResolvedValue({ - data: { - persistPinnedEventOnTimeline: { - code: 403, - }, - }, + (persistPinnedEvent as jest.Mock).mockRejectedValue({ + body: { status_code: 403 }, }); await store.dispatch(unPinEvent({ id: TimelineId.test, eventId: testEventId })); diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts index 38e00af3f5f8e..8ef7a661cc6eb 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts @@ -21,7 +21,7 @@ import { showCallOutUnauthorizedMsg, } from '../actions'; import { persistPinnedEvent } from '../../containers/pinned_event/api'; -import { ensureTimelineIsSaved, refreshTimelines } from './helpers'; +import { ensureTimelineIsSaved, isHttpFetchError, refreshTimelines } from './helpers'; type PinnedEventAction = ReturnType; @@ -55,7 +55,7 @@ export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middlewa throw new Error('Cannot create a pinned event without a timelineId'); } - const result = await persistPinnedEvent({ + const response = await persistPinnedEvent({ pinnedEventId: timeline.pinnedEventsSaveObject[eventId] != null ? timeline.pinnedEventsSaveObject[eventId].pinnedEventId @@ -64,17 +64,10 @@ export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middlewa timelineId: timeline.savedObjectId, }); - const response = result.data.persistPinnedEventOnTimeline; - if (response && 'code' in response && response.code === 403) { - store.dispatch(showCallOutUnauthorizedMsg()); - } - refreshTimelines(store.getState()); const currentTimeline = selectTimelineById(store.getState(), action.payload.id); - // The response is null or empty in case we unpinned an event. - // In that case we want to remove the locally pinned event. - if (!response || !('eventId' in response)) { + if ('unpinned' in response) { return store.dispatch( updateTimeline({ id: action.payload.id, @@ -106,10 +99,14 @@ export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middlewa ); } } catch (error) { - kibana.notifications.toasts.addDanger({ - title: i18n.UPDATE_TIMELINE_ERROR_TITLE, - text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, - }); + if (isHttpFetchError(error) && error.body?.status_code === 403) { + store.dispatch(showCallOutUnauthorizedMsg()); + } else { + kibana.notifications.toasts.addDanger({ + title: i18n.UPDATE_TIMELINE_ERROR_TITLE, + text: error?.message ?? i18n.UPDATE_TIMELINE_ERROR_TEXT, + }); + } } finally { store.dispatch( endTimelineSaving({ diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts index c3d7a26d7b027..29c2ad49ba3a7 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.test.ts @@ -58,16 +58,8 @@ describe('Timeline save middleware', () => { it('should persist a timeline', async () => { (persistTimeline as jest.Mock).mockResolvedValue({ - data: { - persistTimeline: { - code: 200, - message: 'success', - timeline: { - savedObjectId: 'soid', - version: 'newVersion', - }, - }, - }, + savedObjectId: 'soid', + version: 'newVersion', }); await store.dispatch(setChanged({ id: TimelineId.test, changed: true })); expect(selectTimelineById(store.getState(), TimelineId.test)).toEqual( @@ -92,16 +84,8 @@ describe('Timeline save middleware', () => { it('should copy a timeline', async () => { (copyTimeline as jest.Mock).mockResolvedValue({ - data: { - persistTimeline: { - code: 200, - message: 'success', - timeline: { - savedObjectId: 'soid', - version: 'newVersion', - }, - }, - }, + savedObjectId: 'soid', + version: 'newVersion', }); await store.dispatch(setChanged({ id: TimelineId.test, changed: true })); expect(selectTimelineById(store.getState(), TimelineId.test)).toEqual( diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts index a0d0ab4dd1061..08cbb6bfa3ea0 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_save.ts @@ -63,7 +63,7 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State store.dispatch(startTimelineSaving({ id: localTimelineId })); try { - const result = await (action.payload.saveAsNew && timeline.id + const response = await (action.payload.saveAsNew && timeline.id ? copyTimeline({ timelineId, timeline: { @@ -84,8 +84,8 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State savedSearch: timeline.savedSearch, })); - if (isTimelineErrorResponse(result)) { - const error = getErrorFromResponse(result); + if (isTimelineErrorResponse(response)) { + const error = getErrorFromResponse(response); switch (error?.errorCode) { case 403: store.dispatch(showCallOutUnauthorizedMsg()); @@ -106,7 +106,6 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State return; } - const response = result?.data?.persistTimeline; if (response == null) { kibana.notifications.toasts.addDanger({ title: i18n.UPDATE_TIMELINE_ERROR_TITLE, @@ -122,15 +121,15 @@ export const saveTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, State id: localTimelineId, timeline: { ...timeline, - id: response.timeline.savedObjectId, - updated: response.timeline.updated ?? undefined, - savedObjectId: response.timeline.savedObjectId, - version: response.timeline.version, - status: response.timeline.status ?? TimelineStatusEnum.active, - timelineType: response.timeline.timelineType ?? TimelineTypeEnum.default, - templateTimelineId: response.timeline.templateTimelineId ?? null, - templateTimelineVersion: response.timeline.templateTimelineVersion ?? null, - savedSearchId: response.timeline.savedSearchId ?? null, + id: response.savedObjectId, + updated: response.updated ?? undefined, + savedObjectId: response.savedObjectId, + version: response.version, + status: response.status ?? TimelineStatusEnum.active, + timelineType: response.timelineType ?? TimelineTypeEnum.default, + templateTimelineId: response.templateTimelineId ?? null, + templateTimelineVersion: response.templateTimelineVersion ?? null, + savedSearchId: response.savedSearchId ?? null, isSaving: false, }, }) diff --git a/x-pack/plugins/security_solution/public/timelines/store/model.ts b/x-pack/plugins/security_solution/public/timelines/store/model.ts index 92c435f93cb43..f93d6b3f6b649 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/model.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/model.ts @@ -8,10 +8,7 @@ import type { Filter } from '@kbn/es-query'; import type { SavedSearch } from '@kbn/saved-search-plugin/common'; import type { SessionViewConfig } from '../../../common/types'; -import type { - EqlOptionsSelected, - TimelineNonEcsData, -} from '../../../common/search_strategy/timeline'; +import type { EqlOptions, TimelineNonEcsData } from '../../../common/search_strategy/timeline'; import type { TimelineTabs, ScrollToTopEvent, @@ -42,7 +39,7 @@ export interface TimelineModel { createdBy?: string; /** A summary of the events and notes in this timeline */ description: string; - eqlOptions: EqlOptionsSelected; + eqlOptions: EqlOptions; /** Type of event you want to see in this timeline */ eventType?: TimelineEventsType; /** A map of events in this timeline to the chronologically ordered notes (in this timeline) associated with the event */ diff --git a/x-pack/plugins/security_solution/server/endpoint/services/saved_objects/saved_objects_client_factory.ts b/x-pack/plugins/security_solution/server/endpoint/services/saved_objects/saved_objects_client_factory.ts index c925c666d6957..560873d0a69e6 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/saved_objects/saved_objects_client_factory.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/saved_objects/saved_objects_client_factory.ts @@ -9,10 +9,10 @@ import type { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server'; import { SECURITY_EXTENSION_ID, SPACES_EXTENSION_ID } from '@kbn/core-saved-objects-server'; -import type { HttpServiceSetup } from '@kbn/core/server'; -import { type SavedObjectsClientContract } from '@kbn/core/server'; -import { CoreKibanaRequest } from '@kbn/core-http-router-server-internal'; +import type { HttpServiceSetup, KibanaRequest } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import { DEFAULT_SPACE_ID, addSpaceIdToPath } from '@kbn/spaces-plugin/common'; +import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { EndpointError } from '../../../../common/endpoint/errors'; type SavedObjectsClientContractKeys = keyof SavedObjectsClientContract; @@ -39,8 +39,8 @@ export class SavedObjectsClientFactory { private readonly httpServiceSetup: HttpServiceSetup ) {} - protected createFakeHttpRequest(spaceId: string = DEFAULT_SPACE_ID): CoreKibanaRequest { - const fakeRequest = CoreKibanaRequest.from({ + protected createFakeHttpRequest(spaceId: string = DEFAULT_SPACE_ID): KibanaRequest { + const fakeRequest = kibanaRequestFactory({ headers: {}, path: '/', route: { settings: {} }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts index 8a796b5db1e28..7caa0469eebeb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/diffable_rule_fields_mappings.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { get } from 'lodash'; +import { get, has } from 'lodash'; import type { RuleSchedule, DataSourceIndexPatterns, @@ -48,9 +48,13 @@ export const mapDiffableRuleFieldValueToRuleSchemaFormat = ( return transformedValue.value; } + if (!SUBFIELD_MAPPING[fieldName] && !has(diffableField, diffableRuleSubfieldName)) { + return diffableField; + } + // From the ThreeWayDiff, get the specific field that maps to the diffable rule field // Otherwise, the diffableField itself already matches the rule field, so retrieve that value. - const mappedField = get(diffableField, diffableRuleSubfieldName, diffableField); + const mappedField = get(diffableField, diffableRuleSubfieldName); return mappedField; }; @@ -81,9 +85,27 @@ export function mapRuleFieldToDiffableRuleField({ ruleType, fieldName, }: MapRuleFieldToDiffableRuleFieldParams): keyof AllFieldsDiff { + // Handle query, filters and language fields based on rule type + if (fieldName === 'query' || fieldName === 'language' || fieldName === 'filters') { + switch (ruleType) { + case 'query': + case 'saved_query': + return 'kql_query' as const; + case 'eql': + return 'eql_query'; + case 'esql': + return 'esql_query'; + default: + return 'kql_query'; + } + } + const diffableRuleFieldMap: Record = { building_block_type: 'building_block', saved_id: 'kql_query', + event_category_override: 'eql_query', + tiebreaker_field: 'eql_query', + timestamp_field: 'eql_query', threat_query: 'threat_query', threat_language: 'threat_query', threat_filters: 'threat_query', @@ -99,24 +121,27 @@ export function mapRuleFieldToDiffableRuleField({ timestamp_override_fallback_disabled: 'timestamp_override', }; - // Handle query, filters and language fields based on rule type - if (fieldName === 'query' || fieldName === 'language' || fieldName === 'filters') { - switch (ruleType) { - case 'query': - case 'saved_query': - return 'kql_query' as const; - case 'eql': - return 'eql_query'; - case 'esql': - return 'esql_query'; - default: - return 'kql_query'; - } - } - return diffableRuleFieldMap[fieldName] || fieldName; } +const SUBFIELD_MAPPING: Record = { + index: 'index_patterns', + data_view_id: 'data_view_id', + saved_id: 'saved_query_id', + event_category_override: 'event_category_override', + tiebreaker_field: 'tiebreaker_field', + timestamp_field: 'timestamp_field', + building_block_type: 'type', + rule_name_override: 'field_name', + timestamp_override: 'field_name', + timestamp_override_fallback_disabled: 'fallback_disabled', + timeline_id: 'timeline_id', + timeline_title: 'timeline_title', + interval: 'interval', + from: 'lookback', + to: 'lookback', +}; + /** * Maps a PrebuiltRuleAsset schema field name to its corresponding property * name within a DiffableRule group. @@ -134,22 +159,7 @@ export function mapRuleFieldToDiffableRuleField({ * */ export function mapRuleFieldToDiffableRuleSubfield(fieldName: string): string { - const fieldMapping: Record = { - index: 'index_patterns', - data_view_id: 'data_view_id', - saved_id: 'saved_query_id', - building_block_type: 'type', - rule_name_override: 'field_name', - timestamp_override: 'field_name', - timestamp_override_fallback_disabled: 'fallback_disabled', - timeline_id: 'timeline_id', - timeline_title: 'timeline_title', - interval: 'interval', - from: 'lookback', - to: 'lookback', - }; - - return fieldMapping[fieldName] || fieldName; + return SUBFIELD_MAPPING[fieldName] || fieldName; } type TransformValuesReturnType = diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts index bde52596667d2..5730af03789d1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts @@ -239,9 +239,6 @@ const eqlFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { type: ruleTypeDiffAlgorithm, eql_query: eqlQueryDiffAlgorithm, data_source: dataSourceDiffAlgorithm, - event_category_override: singleLineStringDiffAlgorithm, - timestamp_field: singleLineStringDiffAlgorithm, - tiebreaker_field: singleLineStringDiffAlgorithm, alert_suppression: simpleDiffAlgorithm, }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/helpers.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/helpers.ts index 0fbb0ef2c8652..9070f1b4070b3 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/helpers.ts @@ -6,14 +6,12 @@ */ import datemath from '@kbn/datemath'; -import { - CoreKibanaRequest, - type KibanaRequest, - SECURITY_EXTENSION_ID, - type CoreStart, -} from '@kbn/core/server'; import { addSpaceIdToPath } from '@kbn/spaces-plugin/server'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; +import type { CoreStart } from '@kbn/core-lifecycle-server'; +import { SECURITY_EXTENSION_ID } from '@kbn/core-saved-objects-server'; import type { Range } from '../../../../../common/entity_analytics/risk_engine'; export const convertDateToISOString = (dateString: string): string => { @@ -43,7 +41,7 @@ const buildFakeScopedRequest = ({ path: '/', }; - const request = CoreKibanaRequest.from(rawRequest); + const request = kibanaRequestFactory(rawRequest); const scopedPath = addSpaceIdToPath('/', namespace); coreStart.http.basePath.set(request, scopedPath); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts index a937560842f74..21a17bb7834a1 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts @@ -8,11 +8,11 @@ import type { IKibanaResponse, Logger } from '@kbn/core/server'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import { v4 as uuidV4 } from 'uuid'; +import { SIEM_RULE_MIGRATIONS_PATH } from '../../../../../common/siem_migrations/constants'; import { CreateRuleMigrationRequestBody, type CreateRuleMigrationResponse, } from '../../../../../common/siem_migrations/model/api/rules/rule_migration.gen'; -import { SIEM_RULE_MIGRATIONS_PATH } from '../../../../../common/siem_migrations/constants'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import type { CreateRuleMigrationInput } from '../data/rule_migrations_data_rules_client'; import { withLicense } from './util/with_license'; @@ -47,7 +47,7 @@ export const registerSiemRuleMigrationsCreateRoute = ( migration_id: migrationId, original_rule: originalRule, })); - + await ruleMigrationsClient.data.integrations.create(); await ruleMigrationsClient.data.rules.create(ruleMigrations); return res.ok({ body: { migration_id: migrationId } }); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/__mocks__/mocks.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/__mocks__/mocks.ts index 34e68d8a47369..d8dc1bb168a72 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/__mocks__/mocks.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/__mocks__/mocks.ts @@ -32,10 +32,15 @@ export const MockRuleMigrationsDataResourcesClient = jest .fn() .mockImplementation(() => mockRuleMigrationsDataResourcesClient); +export const mockRuleMigrationsDataIntegrationsClient = { + retrieveIntegrations: jest.fn().mockResolvedValue([]), +}; + // Rule migrations data client export const mockRuleMigrationsDataClient = { rules: mockRuleMigrationsDataRulesClient, resources: mockRuleMigrationsDataResourcesClient, + integrations: mockRuleMigrationsDataIntegrationsClient, }; export const MockRuleMigrationsDataClient = jest diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/integrations_temp.json b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/integrations_temp.json new file mode 100644 index 0000000000000..9c312bb38e3d6 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/integrations_temp.json @@ -0,0 +1,6881 @@ +[ + { + "title": "Containerd", + "id": "containerd", + "description": "Collect metrics from containerd containers.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-containerd.memory-*", + "title": "Containerd memory metrics" + }, + { + "dataset": "blkio", + "index_pattern": "logs-containerd.blkio-*", + "title": "Containerd blkio metrics" + }, + { + "dataset": "cpu", + "index_pattern": "logs-containerd.cpu-*", + "title": "Containerd cpu metrics" + } + ], + "elser_embedding": "Containerd - Collect metrics from containerd containers. - Containerd memory metrics Containerd blkio metrics Containerd cpu metrics" + }, + { + "title": "Google Santa", + "id": "santa", + "description": "Collect logs from Google Santa with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-santa.log-*", + "title": "Google Santa log logs" + } + ], + "elser_embedding": "Google Santa - Collect logs from Google Santa with Elastic Agent. - Google Santa log logs" + }, + { + "title": "Keycloak", + "id": "keycloak", + "description": "Collect logs from Keycloak with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-keycloak.log-*", + "title": "Keycloak" + } + ], + "elser_embedding": "Keycloak - Collect logs from Keycloak with Elastic Agent. - Keycloak" + }, + { + "title": "Infoblox NIOS", + "id": "infoblox_nios", + "description": "Collect logs from Infoblox NIOS with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-infoblox_nios.log-*", + "title": "Infoblox NIOS logs" + } + ], + "elser_embedding": "Infoblox NIOS - Collect logs from Infoblox NIOS with Elastic Agent. - Infoblox NIOS logs" + }, + { + "title": "LastPass", + "id": "lastpass", + "description": "Collect logs from LastPass with Elastic Agent.", + "data_streams": [ + { + "dataset": "detailed_shared_folder", + "index_pattern": "logs-lastpass.detailed_shared_folder-*", + "title": "Collect Detailed Shared Folder logs from LastPass" + }, + { + "dataset": "user", + "index_pattern": "logs-lastpass.user-*", + "title": "Collect User logs from LastPass" + }, + { + "dataset": "event_report", + "index_pattern": "logs-lastpass.event_report-*", + "title": "Collect Event Report logs from LastPass" + } + ], + "elser_embedding": "LastPass - Collect logs from LastPass with Elastic Agent. - Collect Detailed Shared Folder logs from LastPass Collect User logs from LastPass Collect Event Report logs from LastPass" + }, + { + "title": "IBM MQ", + "id": "ibmmq", + "description": "Collect logs and metrics from IBM MQ with Elastic Agent.", + "data_streams": [ + { + "dataset": "qmgr", + "index_pattern": "logs-ibmmq.qmgr-*", + "title": "IBM MQ Queue Manager performance metrics" + }, + { + "dataset": "errorlog", + "index_pattern": "logs-ibmmq.errorlog-*", + "title": "IBM MQ Error logs" + } + ], + "elser_embedding": "IBM MQ - Collect logs and metrics from IBM MQ with Elastic Agent. - IBM MQ Queue Manager performance metrics IBM MQ Error logs" + }, + { + "title": "Jamf Protect", + "id": "jamf_protect", + "description": "Receives events from Jamf Protect with Elastic Agent.", + "data_streams": [ + { + "dataset": "web_traffic_events", + "index_pattern": "logs-jamf_protect.web_traffic_events-*", + "title": "Receives Web Traffic Events from Jamf Protect with Elastic Agent." + }, + { + "dataset": "telemetry_legacy", + "index_pattern": "logs-jamf_protect.telemetry_legacy-*", + "title": "Jamf Protect Telemetry (Legacy)." + }, + { + "dataset": "web_threat_events", + "index_pattern": "logs-jamf_protect.web_threat_events-*", + "title": "Receives Web Threat Events from Jamf Protect with Elastic Agent." + }, + { + "dataset": "telemetry", + "index_pattern": "logs-jamf_protect.telemetry-*", + "title": "Receives Telemetry from Jamf Protect with Elastic Agent." + }, + { + "dataset": "alerts", + "index_pattern": "logs-jamf_protect.alerts-*", + "title": "Receives Alerts from Jamf Protect with Elastic Agent." + } + ], + "elser_embedding": "Jamf Protect - Receives events from Jamf Protect with Elastic Agent. - Receives Web Traffic Events from Jamf Protect with Elastic Agent. Jamf Protect Telemetry (Legacy). Receives Web Threat Events from Jamf Protect with Elastic Agent. Receives Telemetry from Jamf Protect with Elastic Agent. Receives Alerts from Jamf Protect with Elastic Agent." + }, + { + "title": "Sysmon for Linux", + "id": "sysmon_linux", + "description": "Collect Sysmon Linux logs with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-sysmon_linux.log-*", + "title": "Sysmon for Linux logs" + } + ], + "elser_embedding": "Sysmon for Linux - Collect Sysmon Linux logs with Elastic Agent. - Sysmon for Linux logs" + }, + { + "title": "Trend Micro Deep Security", + "id": "trendmicro", + "description": "Collect logs from Trend Micro Deep Security with Elastic Agent.", + "data_streams": [ + { + "dataset": "deep_security", + "index_pattern": "logs-trendmicro.deep_security-*", + "title": "Collect logs from Trend Micro Deep Security" + } + ], + "elser_embedding": "Trend Micro Deep Security - Collect logs from Trend Micro Deep Security with Elastic Agent. - Collect logs from Trend Micro Deep Security" + }, + { + "title": "HAProxy", + "id": "haproxy", + "description": "Collect logs and metrics from HAProxy servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "info", + "index_pattern": "logs-haproxy.info-*", + "title": "HAProxy info metrics" + }, + { + "dataset": "stat", + "index_pattern": "logs-haproxy.stat-*", + "title": "HAProxy stat metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-haproxy.log-*", + "title": "HAProxy logs" + } + ], + "elser_embedding": "HAProxy - Collect logs and metrics from HAProxy servers with Elastic Agent. - HAProxy info metrics HAProxy stat metrics HAProxy logs" + }, + { + "title": "ESET Threat Intelligence", + "id": "ti_eset", + "description": "Ingest threat intelligence indicators from ESET Threat Intelligence with Elastic Agent.", + "data_streams": [ + { + "dataset": "cc", + "index_pattern": "logs-ti_eset.cc-*", + "title": "Botnet C&C" + }, + { + "dataset": "url", + "index_pattern": "logs-ti_eset.url-*", + "title": "URL" + }, + { + "dataset": "domains", + "index_pattern": "logs-ti_eset.domains-*", + "title": "Domain" + }, + { + "dataset": "files", + "index_pattern": "logs-ti_eset.files-*", + "title": "Malicious files" + }, + { + "dataset": "apt", + "index_pattern": "logs-ti_eset.apt-*", + "title": "APT" + }, + { + "dataset": "ip", + "index_pattern": "logs-ti_eset.ip-*", + "title": "IP" + }, + { + "dataset": "botnet", + "index_pattern": "logs-ti_eset.botnet-*", + "title": "Botnet" + } + ], + "elser_embedding": "ESET Threat Intelligence - Ingest threat intelligence indicators from ESET Threat Intelligence with Elastic Agent. - Botnet C&C URL Domain Malicious files APT IP Botnet" + }, + { + "title": "Lyve Cloud", + "id": "lyve_cloud", + "description": "Collect S3 API audit log from Lyve Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-lyve_cloud.audit-*", + "title": "Lyve Cloud logs" + } + ], + "elser_embedding": "Lyve Cloud - Collect S3 API audit log from Lyve Cloud with Elastic Agent. - Lyve Cloud logs" + }, + { + "title": "Tanium", + "id": "tanium", + "description": "This Elastic integration collects logs from Tanium with Elastic Agent.", + "data_streams": [ + { + "dataset": "discover", + "index_pattern": "logs-tanium.discover-*", + "title": "Collect Tanium Discover logs from Tanium" + }, + { + "dataset": "threat_response", + "index_pattern": "logs-tanium.threat_response-*", + "title": "Collect Threat Response logs from Tanium." + }, + { + "dataset": "client_status", + "index_pattern": "logs-tanium.client_status-*", + "title": "Client Status" + }, + { + "dataset": "reporting", + "index_pattern": "logs-tanium.reporting-*", + "title": "Reporting" + }, + { + "dataset": "action_history", + "index_pattern": "logs-tanium.action_history-*", + "title": "Collect Action History logs from Tanium." + }, + { + "dataset": "endpoint_config", + "index_pattern": "logs-tanium.endpoint_config-*", + "title": "Collect Endpoint Config logs from Tanium" + } + ], + "elser_embedding": "Tanium - This Elastic integration collects logs from Tanium with Elastic Agent. - Collect Tanium Discover logs from Tanium Collect Threat Response logs from Tanium. Client Status Reporting Collect Action History logs from Tanium. Collect Endpoint Config logs from Tanium" + }, + { + "title": "SonicWall Firewall", + "id": "sonicwall_firewall", + "description": "Integration for SonicWall firewall logs", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-sonicwall_firewall.log-*", + "title": "SonicWall Firewall logs" + } + ], + "elser_embedding": "SonicWall Firewall - Integration for SonicWall firewall logs - SonicWall Firewall logs" + }, + { + "title": "STAN", + "id": "stan", + "description": "Collect logs and metrics from STAN servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "stats", + "index_pattern": "logs-stan.stats-*", + "title": "Stan stats metrics" + }, + { + "dataset": "subscriptions", + "index_pattern": "logs-stan.subscriptions-*", + "title": "Stan subscriptions metrics" + }, + { + "dataset": "channels", + "index_pattern": "logs-stan.channels-*", + "title": "Stan channels metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-stan.log-*", + "title": "STAN logs" + } + ], + "elser_embedding": "STAN - Collect logs and metrics from STAN servers with Elastic Agent. - Stan stats metrics Stan subscriptions metrics Stan channels metrics STAN logs" + }, + { + "title": "Amazon Bedrock", + "id": "aws_bedrock", + "description": "Collect Amazon Bedrock model invocation logs and runtime metrics with Elastic Agent.", + "data_streams": [ + { + "dataset": "runtime", + "index_pattern": "logs-aws_bedrock.runtime-*", + "title": "Amazon Bedrock Runtime Metrics" + }, + { + "dataset": "invocation", + "index_pattern": "logs-aws_bedrock.invocation-*", + "title": "Amazon Bedrock model invocation logs" + } + ], + "elser_embedding": "Amazon Bedrock - Collect Amazon Bedrock model invocation logs and runtime metrics with Elastic Agent. - Amazon Bedrock Runtime Metrics Amazon Bedrock model invocation logs" + }, + { + "title": "Microsoft M365 Defender", + "id": "m365_defender", + "description": "Collect logs from Microsoft M365 Defender with Elastic Agent.", + "data_streams": [ + { + "dataset": "alert", + "index_pattern": "logs-m365_defender.alert-*", + "title": "Collect Alert logs from Microsoft 365 Defender" + }, + { + "dataset": "log", + "index_pattern": "logs-m365_defender.log-*", + "title": "M365 Defender Logs" + }, + { + "dataset": "incident", + "index_pattern": "logs-m365_defender.incident-*", + "title": "Collect Incident logs from Microsoft 365 Defender" + }, + { + "dataset": "event", + "index_pattern": "logs-m365_defender.event-*", + "title": "Collect Event logs from Microsoft 365 Defender." + } + ], + "elser_embedding": "Microsoft M365 Defender - Collect logs from Microsoft M365 Defender with Elastic Agent. - Collect Alert logs from Microsoft 365 Defender M365 Defender Logs Collect Incident logs from Microsoft 365 Defender Collect Event logs from Microsoft 365 Defender." + }, + { + "title": "NATS", + "id": "nats", + "description": "Collect logs and metrics from NATS servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "stats", + "index_pattern": "logs-nats.stats-*", + "title": "NATS stats metrics" + }, + { + "dataset": "route", + "index_pattern": "logs-nats.route-*", + "title": "NATS route metrics" + }, + { + "dataset": "connection", + "index_pattern": "logs-nats.connection-*", + "title": "NATS connection metrics" + }, + { + "dataset": "subscriptions", + "index_pattern": "logs-nats.subscriptions-*", + "title": "NATS subscriptions metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-nats.log-*", + "title": "NATS logs" + }, + { + "dataset": "routes", + "index_pattern": "logs-nats.routes-*", + "title": "NATS routes metrics" + }, + { + "dataset": "connections", + "index_pattern": "logs-nats.connections-*", + "title": "NATS connections metrics" + } + ], + "elser_embedding": "NATS - Collect logs and metrics from NATS servers with Elastic Agent. - NATS stats metrics NATS route metrics NATS connection metrics NATS subscriptions metrics NATS logs NATS routes metrics NATS connections metrics" + }, + { + "title": "GoFlow2 logs", + "id": "goflow2", + "description": "Collect logs from goflow2 with Elastic Agent.", + "data_streams": [ + { + "dataset": "sflow", + "index_pattern": "logs-goflow2.sflow-*", + "title": "Goflow2 sFlow" + } + ], + "elser_embedding": "GoFlow2 logs - Collect logs from goflow2 with Elastic Agent. - Goflow2 sFlow" + }, + { + "title": "Microsoft Defender for Cloud", + "id": "microsoft_defender_cloud", + "description": "Collect logs from Microsoft Defender for Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-microsoft_defender_cloud.event-*", + "title": "Collect Event(Alert and Recommendation) logs from Microsoft Defender for Cloud." + } + ], + "elser_embedding": "Microsoft Defender for Cloud - Collect logs from Microsoft Defender for Cloud with Elastic Agent. - Collect Event(Alert and Recommendation) logs from Microsoft Defender for Cloud." + }, + { + "title": "RabbitMQ Logs and Metrics", + "id": "rabbitmq", + "description": "Collect and parse logs from RabbitMQ servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "queue", + "index_pattern": "logs-rabbitmq.queue-*", + "title": "RabbitMQ queue metrics" + }, + { + "dataset": "exchange", + "index_pattern": "logs-rabbitmq.exchange-*", + "title": "RabbitMQ exchange metrics" + }, + { + "dataset": "connection", + "index_pattern": "logs-rabbitmq.connection-*", + "title": "RabbitMQ connection metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-rabbitmq.log-*", + "title": "RabbitMQ application logs" + }, + { + "dataset": "node", + "index_pattern": "logs-rabbitmq.node-*", + "title": "RabbitMQ node metrics" + } + ], + "elser_embedding": "RabbitMQ Logs and Metrics - Collect and parse logs from RabbitMQ servers with Elastic Agent. - RabbitMQ queue metrics RabbitMQ exchange metrics RabbitMQ connection metrics RabbitMQ application logs RabbitMQ node metrics" + }, + { + "title": "Apache Tomcat", + "id": "apache_tomcat", + "description": "Collect and parse logs and metrics from Apache Tomcat servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "catalina", + "index_pattern": "logs-apache_tomcat.catalina-*", + "title": "Apache Tomcat Catalina logs" + }, + { + "dataset": "memory", + "index_pattern": "logs-apache_tomcat.memory-*", + "title": "Apache Tomcat Memory metrics" + }, + { + "dataset": "access", + "index_pattern": "logs-apache_tomcat.access-*", + "title": "Apache Tomcat Access logs" + }, + { + "dataset": "cache", + "index_pattern": "logs-apache_tomcat.cache-*", + "title": "Apache Tomcat Cache metrics" + }, + { + "dataset": "request", + "index_pattern": "logs-apache_tomcat.request-*", + "title": "Apache Tomcat Request metrics" + }, + { + "dataset": "session", + "index_pattern": "logs-apache_tomcat.session-*", + "title": "Apache Tomcat Session metrics" + }, + { + "dataset": "localhost", + "index_pattern": "logs-apache_tomcat.localhost-*", + "title": "Apache Tomcat Localhost logs" + }, + { + "dataset": "connection_pool", + "index_pattern": "logs-apache_tomcat.connection_pool-*", + "title": "Apache Tomcat Connection Pool metrics" + }, + { + "dataset": "thread_pool", + "index_pattern": "logs-apache_tomcat.thread_pool-*", + "title": "Apache Tomcat Thread Pool metrics" + } + ], + "elser_embedding": "Apache Tomcat - Collect and parse logs and metrics from Apache Tomcat servers with Elastic Agent. - Apache Tomcat Catalina logs Apache Tomcat Memory metrics Apache Tomcat Access logs Apache Tomcat Cache metrics Apache Tomcat Request metrics Apache Tomcat Session metrics Apache Tomcat Localhost logs Apache Tomcat Connection Pool metrics Apache Tomcat Thread Pool metrics" + }, + { + "title": "CylanceProtect Logs", + "id": "cylance", + "description": "Collect logs from CylanceProtect devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "protect", + "index_pattern": "logs-cylance.protect-*", + "title": "CylanceProtect logs" + } + ], + "elser_embedding": "CylanceProtect Logs - Collect logs from CylanceProtect devices with Elastic Agent. - CylanceProtect logs" + }, + { + "title": "Rapid7 InsightVM", + "id": "rapid7_insightvm", + "description": "Collect logs from Rapid7 InsightVM with Elastic Agent.", + "data_streams": [ + { + "dataset": "vulnerability", + "index_pattern": "logs-rapid7_insightvm.vulnerability-*", + "title": "Collect Vulnerability logs from Rapid7 InsightVM" + }, + { + "dataset": "asset", + "index_pattern": "logs-rapid7_insightvm.asset-*", + "title": "Collect Asset logs from Rapid7 InsightVM" + } + ], + "elser_embedding": "Rapid7 InsightVM - Collect logs from Rapid7 InsightVM with Elastic Agent. - Collect Vulnerability logs from Rapid7 InsightVM Collect Asset logs from Rapid7 InsightVM" + }, + { + "title": "Symantec EDR Cloud", + "id": "symantec_edr_cloud", + "description": "Collect logs from Symantec EDR Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "incident", + "index_pattern": "logs-symantec_edr_cloud.incident-*", + "title": "Collect Incident logs from Symantec EDR Cloud" + } + ], + "elser_embedding": "Symantec EDR Cloud - Collect logs from Symantec EDR Cloud with Elastic Agent. - Collect Incident logs from Symantec EDR Cloud" + }, + { + "title": "Nginx Ingress Controller OpenTelemetry Logs", + "id": "nginx_ingress_controller_otel", + "description": "Collect Nginx Ingress Controller logs using the OpenTelemetry collector.", + "data_streams": [], + "elser_embedding": "Nginx Ingress Controller OpenTelemetry Logs - Collect Nginx Ingress Controller logs using the OpenTelemetry collector. - " + }, + { + "title": "OpenCTI", + "id": "ti_opencti", + "description": "Ingest threat intelligence indicators from OpenCTI with Elastic Agent.", + "data_streams": [ + { + "dataset": "indicator", + "index_pattern": "logs-ti_opencti.indicator-*", + "title": "Indicator" + } + ], + "elser_embedding": "OpenCTI - Ingest threat intelligence indicators from OpenCTI with Elastic Agent. - Indicator" + }, + { + "title": "Windows", + "id": "windows", + "description": "Collect logs and metrics from Windows OS and services with Elastic Agent.", + "data_streams": [ + { + "dataset": "applocker_packaged_app_deployment", + "index_pattern": "logs-windows.applocker_packaged_app_deployment-*", + "title": "Windows AppLocker/Packaged app-Deployment logs" + }, + { + "dataset": "applocker_msi_and_script", + "index_pattern": "logs-windows.applocker_msi_and_script-*", + "title": "Windows AppLocker/MSI and Script logs" + }, + { + "dataset": "powershell_operational", + "index_pattern": "logs-windows.powershell_operational-*", + "title": "Windows Powershell/Operational logs" + }, + { + "dataset": "perfmon", + "index_pattern": "logs-windows.perfmon-*", + "title": "Windows perfmon metrics" + }, + { + "dataset": "windows_defender", + "index_pattern": "logs-windows.windows_defender-*", + "title": "Windows Defender logs" + }, + { + "dataset": "sysmon_operational", + "index_pattern": "logs-windows.sysmon_operational-*", + "title": "Windows Sysmon/Operational events" + }, + { + "dataset": "service", + "index_pattern": "logs-windows.service-*", + "title": "Windows service metrics" + }, + { + "dataset": "forwarded", + "index_pattern": "logs-windows.forwarded-*", + "title": "Windows forwarded events" + }, + { + "dataset": "powershell", + "index_pattern": "logs-windows.powershell-*", + "title": "Windows Powershell logs" + }, + { + "dataset": "applocker_exe_and_dll", + "index_pattern": "logs-windows.applocker_exe_and_dll-*", + "title": "Windows AppLocker/EXE and DLL logs" + }, + { + "dataset": "applocker_packaged_app_execution", + "index_pattern": "logs-windows.applocker_packaged_app_execution-*", + "title": "Windows AppLocker/Packaged app-Execution logs" + } + ], + "elser_embedding": "Windows - Collect logs and metrics from Windows OS and services with Elastic Agent. - Windows AppLocker/Packaged app-Deployment logs Windows AppLocker/MSI and Script logs Windows Powershell/Operational logs Windows perfmon metrics Windows Defender logs Windows Sysmon/Operational events Windows service metrics Windows forwarded events Windows Powershell logs Windows AppLocker/EXE and DLL logs Windows AppLocker/Packaged app-Execution logs" + }, + { + "title": "CouchDB", + "id": "couchdb", + "description": "Collect metrics from CouchDB with Elastic Agent.", + "data_streams": [ + { + "dataset": "server", + "index_pattern": "logs-couchdb.server-*", + "title": "Server" + } + ], + "elser_embedding": "CouchDB - Collect metrics from CouchDB with Elastic Agent. - Server" + }, + { + "title": "Custom UDP Logs", + "id": "udp", + "description": "Collect raw UDP data from listening UDP port with Elastic Agent.", + "data_streams": [ + { + "dataset": "generic", + "index_pattern": "logs-udp.generic-*", + "title": "Custom UDP Logs" + } + ], + "elser_embedding": "Custom UDP Logs - Collect raw UDP data from listening UDP port with Elastic Agent. - Custom UDP Logs" + }, + { + "title": "Cassandra", + "id": "cassandra", + "description": "This Elastic integration collects logs and metrics from cassandra.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cassandra.log-*", + "title": "Cassandra System Logs" + }, + { + "dataset": "metrics", + "index_pattern": "logs-cassandra.metrics-*", + "title": "Metrics" + } + ], + "elser_embedding": "Cassandra - This Elastic integration collects logs and metrics from cassandra. - Cassandra System Logs Metrics" + }, + { + "title": "Gigamon", + "id": "gigamon", + "description": "Collect logs from Gigamon with Elastic Agent.", + "data_streams": [ + { + "dataset": "ami", + "index_pattern": "logs-gigamon.ami-*", + "title": "Gigamon Application Metadata Intelligence (AMI) Logs" + } + ], + "elser_embedding": "Gigamon - Collect logs from Gigamon with Elastic Agent. - Gigamon Application Metadata Intelligence (AMI) Logs" + }, + { + "title": "Hashicorp Vault", + "id": "hashicorp_vault", + "description": "Collect logs and metrics from Hashicorp Vault with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-hashicorp_vault.audit-*", + "title": "Hashicorp Vault Audit Logs" + }, + { + "dataset": "log", + "index_pattern": "logs-hashicorp_vault.log-*", + "title": "Hashicorp Vault Operational Logs" + }, + { + "dataset": "metrics", + "index_pattern": "logs-hashicorp_vault.metrics-*", + "title": "Hashicorp Vault Metrics" + } + ], + "elser_embedding": "Hashicorp Vault - Collect logs and metrics from Hashicorp Vault with Elastic Agent. - Hashicorp Vault Audit Logs Hashicorp Vault Operational Logs Hashicorp Vault Metrics" + }, + { + "title": "Okta", + "id": "okta", + "description": "Collect and parse event logs from Okta API with Elastic Agent.", + "data_streams": [ + { + "dataset": "system", + "index_pattern": "logs-okta.system-*", + "title": "Okta system logs" + } + ], + "elser_embedding": "Okta - Collect and parse event logs from Okta API with Elastic Agent. - Okta system logs" + }, + { + "title": "Recorded Future", + "id": "ti_recordedfuture", + "description": "Ingest threat intelligence indicators from Recorded Future risk lists with Elastic Agent.", + "data_streams": [ + { + "dataset": "threat", + "index_pattern": "logs-ti_recordedfuture.threat-*", + "title": "Recorded Future" + } + ], + "elser_embedding": "Recorded Future - Ingest threat intelligence indicators from Recorded Future risk lists with Elastic Agent. - Recorded Future" + }, + { + "title": "IIS", + "id": "iis", + "description": "Collect logs and metrics from Internet Information Services (IIS) servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-iis.access-*", + "title": "IIS access logs" + }, + { + "dataset": "webserver", + "index_pattern": "logs-iis.webserver-*", + "title": "IIS web server metrics" + }, + { + "dataset": "error", + "index_pattern": "logs-iis.error-*", + "title": "IIS error logs" + }, + { + "dataset": "website", + "index_pattern": "logs-iis.website-*", + "title": "IIS website metrics" + }, + { + "dataset": "application_pool", + "index_pattern": "logs-iis.application_pool-*", + "title": "IIS application_pool metrics" + } + ], + "elser_embedding": "IIS - Collect logs and metrics from Internet Information Services (IIS) servers with Elastic Agent. - IIS access logs IIS web server metrics IIS error logs IIS website metrics IIS application_pool metrics" + }, + { + "title": "Golang", + "id": "golang", + "description": "This Elastic integration collects metrics from Golang applications.", + "data_streams": [ + { + "dataset": "heap", + "index_pattern": "logs-golang.heap-*", + "title": "Golang Heap metrics" + }, + { + "dataset": "expvar", + "index_pattern": "logs-golang.expvar-*", + "title": "Golang expvar metrics" + } + ], + "elser_embedding": "Golang - This Elastic integration collects metrics from Golang applications. - Golang Heap metrics Golang expvar metrics" + }, + { + "title": "MongoDB", + "id": "mongodb", + "description": "Collect logs and metrics from MongoDB instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "replstatus", + "index_pattern": "logs-mongodb.replstatus-*", + "title": "MongoDB replstatus metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-mongodb.log-*", + "title": "mongodb log logs" + }, + { + "dataset": "metrics", + "index_pattern": "logs-mongodb.metrics-*", + "title": "MongoDB metrics" + }, + { + "dataset": "status", + "index_pattern": "logs-mongodb.status-*", + "title": "MongoDB status metrics" + }, + { + "dataset": "dbstats", + "index_pattern": "logs-mongodb.dbstats-*", + "title": "MongoDB dbstats metrics" + }, + { + "dataset": "collstats", + "index_pattern": "logs-mongodb.collstats-*", + "title": "MongoDB collstats metrics" + } + ], + "elser_embedding": "MongoDB - Collect logs and metrics from MongoDB instances with Elastic Agent. - MongoDB replstatus metrics mongodb log logs MongoDB metrics MongoDB status metrics MongoDB dbstats metrics MongoDB collstats metrics" + }, + { + "title": "Sublime Security", + "id": "sublime_security", + "description": "Collect logs from Sublime Security with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-sublime_security.audit-*", + "title": "Sublime Security Audit logs" + }, + { + "dataset": "email_message", + "index_pattern": "logs-sublime_security.email_message-*", + "title": "Sublime Security Email Message logs" + }, + { + "dataset": "message_event", + "index_pattern": "logs-sublime_security.message_event-*", + "title": "Sublime Security Message Event logs" + } + ], + "elser_embedding": "Sublime Security - Collect logs from Sublime Security with Elastic Agent. - Sublime Security Audit logs Sublime Security Email Message logs Sublime Security Message Event logs" + }, + { + "title": "Nginx", + "id": "nginx", + "description": "Collect logs and metrics from Nginx HTTP servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-nginx.access-*", + "title": "Nginx access logs" + }, + { + "dataset": "error", + "index_pattern": "logs-nginx.error-*", + "title": "Nginx error logs" + }, + { + "dataset": "stubstatus", + "index_pattern": "logs-nginx.stubstatus-*", + "title": "Nginx stubstatus metrics" + } + ], + "elser_embedding": "Nginx - Collect logs and metrics from Nginx HTTP servers with Elastic Agent. - Nginx access logs Nginx error logs Nginx stubstatus metrics" + }, + { + "title": "Apache Spark", + "id": "apache_spark", + "description": "Collect metrics from Apache Spark with Elastic Agent.", + "data_streams": [ + { + "dataset": "driver", + "index_pattern": "logs-apache_spark.driver-*", + "title": "Apache Spark driver metrics" + }, + { + "dataset": "application", + "index_pattern": "logs-apache_spark.application-*", + "title": "Apache Spark application metrics" + }, + { + "dataset": "node", + "index_pattern": "logs-apache_spark.node-*", + "title": "Apache Spark node metrics" + }, + { + "dataset": "executor", + "index_pattern": "logs-apache_spark.executor-*", + "title": "Apache Spark executor metrics" + } + ], + "elser_embedding": "Apache Spark - Collect metrics from Apache Spark with Elastic Agent. - Apache Spark driver metrics Apache Spark application metrics Apache Spark node metrics Apache Spark executor metrics" + }, + { + "title": "Rapid7 Threat Command", + "id": "ti_rapid7_threat_command", + "description": "Collect threat intelligence from Threat Command API with Elastic Agent.", + "data_streams": [ + { + "dataset": "ioc", + "index_pattern": "logs-ti_rapid7_threat_command.ioc-*", + "title": "Rapid7 Threat Command IOCs" + }, + { + "dataset": "vulnerability", + "index_pattern": "logs-ti_rapid7_threat_command.vulnerability-*", + "title": "Rapid7 Threat Command Vulnerability" + }, + { + "dataset": "alert", + "index_pattern": "logs-ti_rapid7_threat_command.alert-*", + "title": "Rapid7 Threat Command Alerts" + } + ], + "elser_embedding": "Rapid7 Threat Command - Collect threat intelligence from Threat Command API with Elastic Agent. - Rapid7 Threat Command IOCs Rapid7 Threat Command Vulnerability Rapid7 Threat Command Alerts" + }, + { + "title": "Fortinet FortiEDR Logs", + "id": "fortinet_fortiedr", + "description": "Collect logs from Fortinet FortiEDR instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_fortiedr.log-*", + "title": "Fortinet FortEDR Endpoint Detection and Response logs" + } + ], + "elser_embedding": "Fortinet FortiEDR Logs - Collect logs from Fortinet FortiEDR instances with Elastic Agent. - Fortinet FortEDR Endpoint Detection and Response logs" + }, + { + "title": "ThreatQuotient", + "id": "ti_threatq", + "description": "Ingest threat intelligence indicators from ThreatQuotient with Elastic Agent.", + "data_streams": [ + { + "dataset": "threat", + "index_pattern": "logs-ti_threatq.threat-*", + "title": "ThreatQ" + } + ], + "elser_embedding": "ThreatQuotient - Ingest threat intelligence indicators from ThreatQuotient with Elastic Agent. - ThreatQ" + }, + { + "title": "BBOT (Bighuge BLS OSINT Tool)", + "id": "bbot", + "description": "BBOT is a recursive internet scanner inspired by Spiderfoot, but designed to be faster, more reliable, and friendlier to pentesters, bug bounty hunters, and developers. ", + "data_streams": [ + { + "dataset": "asm_intel", + "index_pattern": "logs-bbot.asm_intel-*", + "title": "BBOT-Data-Ingest" + } + ], + "elser_embedding": "BBOT (Bighuge BLS OSINT Tool) - BBOT is a recursive internet scanner inspired by Spiderfoot, but designed to be faster, more reliable, and friendlier to pentesters, bug bounty hunters, and developers. - BBOT-Data-Ingest" + }, + { + "title": "Microsoft SQL Server", + "id": "microsoft_sqlserver", + "description": "Collect events from Microsoft SQL Server with Elastic Agent", + "data_streams": [ + { + "dataset": "performance", + "index_pattern": "logs-microsoft_sqlserver.performance-*", + "title": "Microsoft SQL Server performance metrics" + }, + { + "dataset": "audit", + "index_pattern": "logs-microsoft_sqlserver.audit-*", + "title": "SQL Server audit events" + }, + { + "dataset": "log", + "index_pattern": "logs-microsoft_sqlserver.log-*", + "title": "Microsoft SQL Server error logs" + }, + { + "dataset": "transaction_log", + "index_pattern": "logs-microsoft_sqlserver.transaction_log-*", + "title": "Microsoft SQL Server transaction_log metrics" + } + ], + "elser_embedding": "Microsoft SQL Server - Collect events from Microsoft SQL Server with Elastic Agent - Microsoft SQL Server performance metrics SQL Server audit events Microsoft SQL Server error logs Microsoft SQL Server transaction_log metrics" + }, + { + "title": "Claroty CTD", + "id": "claroty_ctd", + "description": "Collect logs from Claroty CTD using Elastic Agent.", + "data_streams": [ + { + "dataset": "baseline", + "index_pattern": "logs-claroty_ctd.baseline-*", + "title": "Baseline logs" + }, + { + "dataset": "event", + "index_pattern": "logs-claroty_ctd.event-*", + "title": "Event logs" + }, + { + "dataset": "asset", + "index_pattern": "logs-claroty_ctd.asset-*", + "title": "Asset logs" + } + ], + "elser_embedding": "Claroty CTD - Collect logs from Claroty CTD using Elastic Agent. - Baseline logs Event logs Asset logs" + }, + { + "title": "ZeroFox", + "id": "zerofox", + "description": "Collect logs from ZeroFox with Elastic Agent.", + "data_streams": [ + { + "dataset": "alerts", + "index_pattern": "logs-zerofox.alerts-*", + "title": "Alerts" + } + ], + "elser_embedding": "ZeroFox - Collect logs from ZeroFox with Elastic Agent. - Alerts" + }, + { + "title": "Darktrace", + "id": "darktrace", + "description": "Collect logs from Darktrace with Elastic Agent.", + "data_streams": [ + { + "dataset": "system_status_alert", + "index_pattern": "logs-darktrace.system_status_alert-*", + "title": "Collect System Status Alert logs from Darktrace" + }, + { + "dataset": "model_breach_alert", + "index_pattern": "logs-darktrace.model_breach_alert-*", + "title": "Collect Model Breach Alert logs from Darktrace" + }, + { + "dataset": "ai_analyst_alert", + "index_pattern": "logs-darktrace.ai_analyst_alert-*", + "title": "Collect AI Analyst Alert logs from Darktrace" + } + ], + "elser_embedding": "Darktrace - Collect logs from Darktrace with Elastic Agent. - Collect System Status Alert logs from Darktrace Collect Model Breach Alert logs from Darktrace Collect AI Analyst Alert logs from Darktrace" + }, + { + "title": "Cybersixgill", + "id": "ti_cybersixgill", + "description": "Ingest threat intelligence indicators from Cybersixgill with Elastic Agent.", + "data_streams": [ + { + "dataset": "threat", + "index_pattern": "logs-ti_cybersixgill.threat-*", + "title": "Cybersixgill Darkfeed Logs" + } + ], + "elser_embedding": "Cybersixgill - Ingest threat intelligence indicators from Cybersixgill with Elastic Agent. - Cybersixgill Darkfeed Logs" + }, + { + "title": "Trend Micro Vision One", + "id": "trend_micro_vision_one", + "description": "Collect logs from Trend Micro Vision One with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-trend_micro_vision_one.audit-*", + "title": "Collect Audit logs from Trend Micro Vision One." + }, + { + "dataset": "alert", + "index_pattern": "logs-trend_micro_vision_one.alert-*", + "title": "Collect Alert logs from Trend Micro Vision One." + }, + { + "dataset": "detection", + "index_pattern": "logs-trend_micro_vision_one.detection-*", + "title": "Collect Detection logs from Trend Micro Vision One." + } + ], + "elser_embedding": "Trend Micro Vision One - Collect logs from Trend Micro Vision One with Elastic Agent. - Collect Audit logs from Trend Micro Vision One. Collect Alert logs from Trend Micro Vision One. Collect Detection logs from Trend Micro Vision One." + }, + { + "title": "Traefik", + "id": "traefik", + "description": "Collect logs from Traefik servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-traefik.access-*", + "title": "Traefik access logs" + }, + { + "dataset": "health", + "index_pattern": "logs-traefik.health-*", + "title": "Traefik health metrics" + } + ], + "elser_embedding": "Traefik - Collect logs from Traefik servers with Elastic Agent. - Traefik access logs Traefik health metrics" + }, + { + "title": "F5 BIG-IP", + "id": "f5_bigip", + "description": "Collect logs from F5 BIG-IP with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-f5_bigip.log-*", + "title": "Collect logs from F5 BIG-IP" + } + ], + "elser_embedding": "F5 BIG-IP - Collect logs from F5 BIG-IP with Elastic Agent. - Collect logs from F5 BIG-IP" + }, + { + "title": "Custom Kafka Logs", + "id": "kafka_log", + "description": "Collect data from kafka topic with Elastic Agent.", + "data_streams": [ + { + "dataset": "generic", + "index_pattern": "logs-kafka_log.generic-*", + "title": "Custom Kafka Logs" + } + ], + "elser_embedding": "Custom Kafka Logs - Collect data from kafka topic with Elastic Agent. - Custom Kafka Logs" + }, + { + "title": "CyberArk Privileged Access Security", + "id": "cyberarkpas", + "description": "Collect logs from CyberArk Privileged Access Security with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-cyberarkpas.audit-*", + "title": "CyberArk PAS audit logs" + }, + { + "dataset": "monitor", + "index_pattern": "logs-cyberarkpas.monitor-*", + "title": "CyberArk PAS monitor Events" + } + ], + "elser_embedding": "CyberArk Privileged Access Security - Collect logs from CyberArk Privileged Access Security with Elastic Agent. - CyberArk PAS audit logs CyberArk PAS monitor Events" + }, + { + "title": "Palo Alto Prisma Cloud", + "id": "prisma_cloud", + "description": "Collect logs from Prisma Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "host_profile", + "index_pattern": "logs-prisma_cloud.host_profile-*", + "title": "Collect Host Profile logs from Prisma Cloud Workload Protection." + }, + { + "dataset": "host", + "index_pattern": "logs-prisma_cloud.host-*", + "title": "Collect Host logs from Prisma Cloud Workload Protection." + }, + { + "dataset": "audit", + "index_pattern": "logs-prisma_cloud.audit-*", + "title": "Collect Audit logs from Prisma Cloud Security Posture Management." + }, + { + "dataset": "alert", + "index_pattern": "logs-prisma_cloud.alert-*", + "title": "Collect Alert logs from Prisma Cloud Security Posture Management." + }, + { + "dataset": "incident_audit", + "index_pattern": "logs-prisma_cloud.incident_audit-*", + "title": "Collect Incident Audit logs from Prisma Cloud Workload Protection." + } + ], + "elser_embedding": "Palo Alto Prisma Cloud - Collect logs from Prisma Cloud with Elastic Agent. - Collect Host Profile logs from Prisma Cloud Workload Protection. Collect Host logs from Prisma Cloud Workload Protection. Collect Audit logs from Prisma Cloud Security Posture Management. Collect Alert logs from Prisma Cloud Security Posture Management. Collect Incident Audit logs from Prisma Cloud Workload Protection." + }, + { + "title": "Cilium Tetragon", + "id": "cilium_tetragon", + "description": "Collect Cilium Tetragon logs from Kubernetes environments.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cilium_tetragon.log-*", + "title": "log\n" + } + ], + "elser_embedding": "Cilium Tetragon - Collect Cilium Tetragon logs from Kubernetes environments. - log\n" + }, + { + "title": "Qualys VMDR", + "id": "qualys_vmdr", + "description": "Collect data from Qualys VMDR platform with Elastic Agent.", + "data_streams": [ + { + "dataset": "knowledge_base", + "index_pattern": "logs-qualys_vmdr.knowledge_base-*", + "title": "Collect Knowledge Base data from Qualys VMDR platform." + }, + { + "dataset": "user_activity", + "index_pattern": "logs-qualys_vmdr.user_activity-*", + "title": "Collect User Activity Log data from Qualys VMDR platform." + }, + { + "dataset": "asset_host_detection", + "index_pattern": "logs-qualys_vmdr.asset_host_detection-*", + "title": "Collect Asset Host Detection data from Qualys VMDR platform." + } + ], + "elser_embedding": "Qualys VMDR - Collect data from Qualys VMDR platform with Elastic Agent. - Collect Knowledge Base data from Qualys VMDR platform. Collect User Activity Log data from Qualys VMDR platform. Collect Asset Host Detection data from Qualys VMDR platform." + }, + { + "title": "Elastic Agent", + "id": "elastic_agent", + "description": "Collect logs and metrics from Elastic Agents.", + "data_streams": [ + { + "dataset": "fleet_server_logs", + "index_pattern": "logs-elastic_agent.fleet_server_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "endpoint_security_metrics", + "index_pattern": "logs-elastic_agent.endpoint_security_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "apm_server_logs", + "index_pattern": "logs-elastic_agent.apm_server_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "osquerybeat_logs", + "index_pattern": "logs-elastic_agent.osquerybeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "heartbeat_logs", + "index_pattern": "logs-elastic_agent.heartbeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "metricbeat_logs", + "index_pattern": "logs-elastic_agent.metricbeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "elastic_agent_metrics", + "index_pattern": "logs-elastic_agent.elastic_agent_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "auditbeat_metrics", + "index_pattern": "logs-elastic_agent.auditbeat_metrics-*", + "title": "Elastic Agent Auditbeat Metrics" + }, + { + "dataset": "pf_elastic_symbolizer", + "index_pattern": "logs-elastic_agent.pf_elastic_symbolizer-*", + "title": "Elastic Agent" + }, + { + "dataset": "cloud_defend_logs", + "index_pattern": "logs-elastic_agent.cloud_defend_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "endpoint_sercurity_logs", + "index_pattern": "logs-elastic_agent.endpoint_sercurity_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "filebeat_input_metrics", + "index_pattern": "logs-elastic_agent.filebeat_input_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "metricbeat_metrics", + "index_pattern": "logs-elastic_agent.metricbeat_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "packetbeat_metrics", + "index_pattern": "logs-elastic_agent.packetbeat_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "apm_server_metrics", + "index_pattern": "logs-elastic_agent.apm_server_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "filebeat_input_logs", + "index_pattern": "logs-elastic_agent.filebeat_input_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "elastic_agent_logs", + "index_pattern": "logs-elastic_agent.elastic_agent_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "auditbeat_logs", + "index_pattern": "logs-elastic_agent.auditbeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "filebeat_logs", + "index_pattern": "logs-elastic_agent.filebeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "pf_host_agent_logs", + "index_pattern": "logs-elastic_agent.pf_host_agent_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "cloudbeat_logs", + "index_pattern": "logs-elastic_agent.cloudbeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "heartbeat_metrics", + "index_pattern": "logs-elastic_agent.heartbeat_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "cloudbeat_metrics", + "index_pattern": "logs-elastic_agent.cloudbeat_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "fleet_server_metrics", + "index_pattern": "logs-elastic_agent.fleet_server_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "packetbeat_logs", + "index_pattern": "logs-elastic_agent.packetbeat_logs-*", + "title": "Elastic Agent" + }, + { + "dataset": "osquerybeat_metrics", + "index_pattern": "logs-elastic_agent.osquerybeat_metrics-*", + "title": "Elastic Agent" + }, + { + "dataset": "pf_elastic_collector", + "index_pattern": "logs-elastic_agent.pf_elastic_collector-*", + "title": "Elastic Agent" + }, + { + "dataset": "filebeat_metrics", + "index_pattern": "logs-elastic_agent.filebeat_metrics-*", + "title": "Elastic Agent" + } + ], + "elser_embedding": "Elastic Agent - Collect logs and metrics from Elastic Agents. - Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Auditbeat Metrics Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent Elastic Agent" + }, + { + "title": "Custom Filestream Logs", + "id": "filestream", + "description": "Collect log data using filestream with Elastic Agent.", + "data_streams": [ + { + "dataset": "generic", + "index_pattern": "logs-filestream.generic-*", + "title": "Custom Filestream Logs" + } + ], + "elser_embedding": "Custom Filestream Logs - Collect log data using filestream with Elastic Agent. - Custom Filestream Logs" + }, + { + "title": "OpenCanary", + "id": "opencanary", + "description": "This integration collects and parses logs from OpenCanary honeypots.", + "data_streams": [ + { + "dataset": "events", + "index_pattern": "logs-opencanary.events-*", + "title": "OpenCanary HoneyPot Events" + } + ], + "elser_embedding": "OpenCanary - This integration collects and parses logs from OpenCanary honeypots. - OpenCanary HoneyPot Events" + }, + { + "title": "Palo Alto Cortex XDR", + "id": "panw_cortex_xdr", + "description": "Collect logs from Palo Alto Cortex XDR with Elastic Agent.", + "data_streams": [ + { + "dataset": "incidents", + "index_pattern": "logs-panw_cortex_xdr.incidents-*", + "title": "Palo Alto Cortex XDR Incidents API" + }, + { + "dataset": "alerts", + "index_pattern": "logs-panw_cortex_xdr.alerts-*", + "title": "Palo Alto Cortex XDR Alerts API" + } + ], + "elser_embedding": "Palo Alto Cortex XDR - Collect logs from Palo Alto Cortex XDR with Elastic Agent. - Palo Alto Cortex XDR Incidents API Palo Alto Cortex XDR Alerts API" + }, + { + "title": "Cisco Nexus", + "id": "cisco_nexus", + "description": "Collect logs from Cisco Nexus with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_nexus.log-*", + "title": "Collect logs from Cisco Nexus" + } + ], + "elser_embedding": "Cisco Nexus - Collect logs from Cisco Nexus with Elastic Agent. - Collect logs from Cisco Nexus" + }, + { + "title": "JumpCloud", + "id": "jumpcloud", + "description": "Collect logs from JumpCloud Directory as a Service", + "data_streams": [ + { + "dataset": "events", + "index_pattern": "logs-jumpcloud.events-*", + "title": "JumpCloud Directory as a Service Events" + } + ], + "elser_embedding": "JumpCloud - Collect logs from JumpCloud Directory as a Service - JumpCloud Directory as a Service Events" + }, + { + "title": "Microsoft Defender for Endpoint", + "id": "microsoft_defender_endpoint", + "description": "Collect logs from Microsoft Defender for Endpoint with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-microsoft_defender_endpoint.log-*", + "title": "Microsoft Defender for Endpoint logs" + } + ], + "elser_embedding": "Microsoft Defender for Endpoint - Collect logs from Microsoft Defender for Endpoint with Elastic Agent. - Microsoft Defender for Endpoint logs" + }, + { + "title": "ActiveMQ", + "id": "activemq", + "description": "Collect logs and metrics from ActiveMQ instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "broker", + "index_pattern": "logs-activemq.broker-*", + "title": "ActiveMQ broker metrics" + }, + { + "dataset": "queue", + "index_pattern": "logs-activemq.queue-*", + "title": "ActiveMQ queue metrics" + }, + { + "dataset": "audit", + "index_pattern": "logs-activemq.audit-*", + "title": "ActiveMQ audit logs" + }, + { + "dataset": "log", + "index_pattern": "logs-activemq.log-*", + "title": "ActiveMQ log logs" + }, + { + "dataset": "topic", + "index_pattern": "logs-activemq.topic-*", + "title": "ActiveMQ topic metrics" + } + ], + "elser_embedding": "ActiveMQ - Collect logs and metrics from ActiveMQ instances with Elastic Agent. - ActiveMQ broker metrics ActiveMQ queue metrics ActiveMQ audit logs ActiveMQ log logs ActiveMQ topic metrics" + }, + { + "title": "AbuseCH", + "id": "ti_abusech", + "description": "Ingest threat intelligence indicators from URL Haus, Malware Bazaar, and Threat Fox feeds with Elastic Agent.", + "data_streams": [ + { + "dataset": "threatfox", + "index_pattern": "logs-ti_abusech.threatfox-*", + "title": "AbuseCH Threat Fox indicators" + }, + { + "dataset": "url", + "index_pattern": "logs-ti_abusech.url-*", + "title": "AbuseCH URL logs" + }, + { + "dataset": "malware", + "index_pattern": "logs-ti_abusech.malware-*", + "title": "AbuseCH Malware payloads" + }, + { + "dataset": "malwarebazaar", + "index_pattern": "logs-ti_abusech.malwarebazaar-*", + "title": "AbuseCH MalwareBazaar payloads" + } + ], + "elser_embedding": "AbuseCH - Ingest threat intelligence indicators from URL Haus, Malware Bazaar, and Threat Fox feeds with Elastic Agent. - AbuseCH Threat Fox indicators AbuseCH URL logs AbuseCH Malware payloads AbuseCH MalwareBazaar payloads" + }, + { + "title": "Infoblox BloxOne DDI", + "id": "infoblox_bloxone_ddi", + "description": "Collect logs from Infoblox BloxOne DDI with Elastic Agent.", + "data_streams": [ + { + "dataset": "dns_data", + "index_pattern": "logs-infoblox_bloxone_ddi.dns_data-*", + "title": "Collect DNS Data logs from Infoblox BloxOne DDI" + }, + { + "dataset": "dns_config", + "index_pattern": "logs-infoblox_bloxone_ddi.dns_config-*", + "title": "Collect DNS Config logs from Infoblox BloxOne DDI" + }, + { + "dataset": "dhcp_lease", + "index_pattern": "logs-infoblox_bloxone_ddi.dhcp_lease-*", + "title": "Collect DHCP Lease logs from Infoblox BloxOne DDI" + } + ], + "elser_embedding": "Infoblox BloxOne DDI - Collect logs from Infoblox BloxOne DDI with Elastic Agent. - Collect DNS Data logs from Infoblox BloxOne DDI Collect DNS Config logs from Infoblox BloxOne DDI Collect DHCP Lease logs from Infoblox BloxOne DDI" + }, + { + "title": "Google Security Command Center", + "id": "google_scc", + "description": "Collect logs from Google Security Command Center with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-google_scc.audit-*", + "title": "Collect Audit logs from Google Security Command Center." + }, + { + "dataset": "finding", + "index_pattern": "logs-google_scc.finding-*", + "title": "Collect Finding logs from Google Security Command Center." + }, + { + "dataset": "asset", + "index_pattern": "logs-google_scc.asset-*", + "title": "Collect Asset logs from Google Security Command Center." + }, + { + "dataset": "source", + "index_pattern": "logs-google_scc.source-*", + "title": "Collect Source logs from Google Security Command Center." + } + ], + "elser_embedding": "Google Security Command Center - Collect logs from Google Security Command Center with Elastic Agent. - Collect Audit logs from Google Security Command Center. Collect Finding logs from Google Security Command Center. Collect Asset logs from Google Security Command Center. Collect Source logs from Google Security Command Center." + }, + { + "title": "CoreDNS", + "id": "coredns", + "description": "Collect logs from CoreDNS instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-coredns.log-*", + "title": "CoreDNS logs" + } + ], + "elser_embedding": "CoreDNS - Collect logs from CoreDNS instances with Elastic Agent. - CoreDNS logs" + }, + { + "title": "NetFlow Records", + "id": "netflow", + "description": "Collect flow records from NetFlow and IPFIX exporters with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-netflow.log-*", + "title": "NetFlow logs" + } + ], + "elser_embedding": "NetFlow Records - Collect flow records from NetFlow and IPFIX exporters with Elastic Agent. - NetFlow logs" + }, + { + "title": "Forcepoint Web Security", + "id": "forcepoint_web", + "description": "Forcepoint Web Security", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-forcepoint_web.logs-*", + "title": "Forcepoint Web Security Logs" + } + ], + "elser_embedding": "Forcepoint Web Security - Forcepoint Web Security - Forcepoint Web Security Logs" + }, + { + "title": "Trellix EDR Cloud", + "id": "trellix_edr_cloud", + "description": "Collect logs from Trellix EDR Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-trellix_edr_cloud.event-*", + "title": "Collect Event logs from Trellix EDR Cloud." + } + ], + "elser_embedding": "Trellix EDR Cloud - Collect logs from Trellix EDR Cloud with Elastic Agent. - Collect Event logs from Trellix EDR Cloud." + }, + { + "title": "Slack Logs", + "id": "slack", + "description": "Slack Logs Integration", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-slack.audit-*", + "title": "Slack Audit Logs" + } + ], + "elser_embedding": "Slack Logs - Slack Logs Integration - Slack Audit Logs" + }, + { + "title": "Cisco FTD", + "id": "cisco_ftd", + "description": "Collect logs from Cisco FTD with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_ftd.log-*", + "title": "Cisco FTD logs" + } + ], + "elser_embedding": "Cisco FTD - Collect logs from Cisco FTD with Elastic Agent. - Cisco FTD logs" + }, + { + "title": "Microsoft DNS Server", + "id": "microsoft_dnsserver", + "description": "Collect logs from Microsoft DNS Server with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-microsoft_dnsserver.audit-*", + "title": "Collect DNS Server Audit logs" + }, + { + "dataset": "analytical", + "index_pattern": "logs-microsoft_dnsserver.analytical-*", + "title": "Collect DNS Server Analytical logs" + } + ], + "elser_embedding": "Microsoft DNS Server - Collect logs from Microsoft DNS Server with Elastic Agent. - Collect DNS Server Audit logs Collect DNS Server Analytical logs" + }, + { + "title": "Mandiant Advantage", + "id": "ti_mandiant_advantage", + "description": "Collect Threat Intelligence from products within the Mandiant Advantage platform.", + "data_streams": [ + { + "dataset": "threat_intelligence", + "index_pattern": "logs-ti_mandiant_advantage.threat_intelligence-*", + "title": "Mandiant Threat Intelligence" + } + ], + "elser_embedding": "Mandiant Advantage - Collect Threat Intelligence from products within the Mandiant Advantage platform. - Mandiant Threat Intelligence" + }, + { + "title": "Fortinet FortiClient Logs", + "id": "fortinet_forticlient", + "description": "Collect logs from Fortinet FortiClient instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_forticlient.log-*", + "title": "Fortinet FortiClient Endpoint Security logs" + } + ], + "elser_embedding": "Fortinet FortiClient Logs - Collect logs from Fortinet FortiClient instances with Elastic Agent. - Fortinet FortiClient Endpoint Security logs" + }, + { + "title": "AWS Fargate (for ECS clusters)", + "id": "awsfargate", + "description": "Collects metrics from containers and tasks running on Amazon ECS clusters with Elastic Agent.", + "data_streams": [ + { + "dataset": "task_stats", + "index_pattern": "logs-awsfargate.task_stats-*", + "title": "AWS Fargate task_stats metrics" + } + ], + "elser_embedding": "AWS Fargate (for ECS clusters) - Collects metrics from containers and tasks running on Amazon ECS clusters with Elastic Agent. - AWS Fargate task_stats metrics" + }, + { + "title": "Azure Network Watcher VNet", + "id": "azure_network_watcher_vnet", + "description": "Collect logs from Azure Network Watcher VNet with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-azure_network_watcher_vnet.log-*", + "title": "Collect VNet logs from Azure Network Watcher" + } + ], + "elser_embedding": "Azure Network Watcher VNet - Collect logs from Azure Network Watcher VNet with Elastic Agent. - Collect VNet logs from Azure Network Watcher" + }, + { + "title": "Osquery Logs", + "id": "osquery", + "description": "Collect logs from Osquery with Elastic Agent.", + "data_streams": [ + { + "dataset": "result", + "index_pattern": "logs-osquery.result-*", + "title": "Osquery result logs" + } + ], + "elser_embedding": "Osquery Logs - Collect logs from Osquery with Elastic Agent. - Osquery result logs" + }, + { + "title": "Pleasant Password Server", + "id": "pps", + "description": "Integration for Pleasant Password Server Syslog Messages", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-pps.log-*", + "title": "Pleasant Password Server logs" + } + ], + "elser_embedding": "Pleasant Password Server - Integration for Pleasant Password Server Syslog Messages - Pleasant Password Server logs" + }, + { + "title": "Bravura Monitor", + "id": "hid_bravura_monitor", + "description": "Collect logs from Bravura Security Fabric with Elastic Agent.", + "data_streams": [ + { + "dataset": "winlog", + "index_pattern": "logs-hid_bravura_monitor.winlog-*", + "title": "Bravura Security Fabric logs" + }, + { + "dataset": "log", + "index_pattern": "logs-hid_bravura_monitor.log-*", + "title": "Bravura Monitor" + } + ], + "elser_embedding": "Bravura Monitor - Collect logs from Bravura Security Fabric with Elastic Agent. - Bravura Security Fabric logs Bravura Monitor" + }, + { + "title": "MISP", + "id": "ti_misp", + "description": "Ingest threat intelligence indicators from MISP platform with Elastic Agent.", + "data_streams": [ + { + "dataset": "threat", + "index_pattern": "logs-ti_misp.threat-*", + "title": "MISP" + }, + { + "dataset": "threat_attributes", + "index_pattern": "logs-ti_misp.threat_attributes-*", + "title": "MISP" + } + ], + "elser_embedding": "MISP - Ingest threat intelligence indicators from MISP platform with Elastic Agent. - MISP MISP" + }, + { + "title": "Redis Enterprise", + "id": "redisenterprise", + "description": "Collect metrics from Redis Enterprise Cluster", + "data_streams": [ + { + "dataset": "node", + "index_pattern": "logs-redisenterprise.node-*", + "title": "node" + }, + { + "dataset": "proxy", + "index_pattern": "logs-redisenterprise.proxy-*", + "title": "proxy" + } + ], + "elser_embedding": "Redis Enterprise - Collect metrics from Redis Enterprise Cluster - node proxy" + }, + { + "title": "Network Packet Capture", + "id": "network_traffic", + "description": "Capture and analyze network traffic from a host with Elastic Agent.", + "data_streams": [ + { + "dataset": "nfs", + "index_pattern": "logs-network_traffic.nfs-*", + "title": "NFS" + }, + { + "dataset": "tls", + "index_pattern": "logs-network_traffic.tls-*", + "title": "TLS" + }, + { + "dataset": "icmp", + "index_pattern": "logs-network_traffic.icmp-*", + "title": "ICMP" + }, + { + "dataset": "cassandra", + "index_pattern": "logs-network_traffic.cassandra-*", + "title": "Cassandra" + }, + { + "dataset": "mongodb", + "index_pattern": "logs-network_traffic.mongodb-*", + "title": "MongoDB" + }, + { + "dataset": "thrift", + "index_pattern": "logs-network_traffic.thrift-*", + "title": "Thrift" + }, + { + "dataset": "flow", + "index_pattern": "logs-network_traffic.flow-*", + "title": "Flows" + }, + { + "dataset": "dhcpv4", + "index_pattern": "logs-network_traffic.dhcpv4-*", + "title": "DHCP" + }, + { + "dataset": "pgsql", + "index_pattern": "logs-network_traffic.pgsql-*", + "title": "PostgreSQL" + }, + { + "dataset": "redis", + "index_pattern": "logs-network_traffic.redis-*", + "title": "Redis" + }, + { + "dataset": "dns", + "index_pattern": "logs-network_traffic.dns-*", + "title": "DNS" + }, + { + "dataset": "sip", + "index_pattern": "logs-network_traffic.sip-*", + "title": "SIP" + }, + { + "dataset": "mysql", + "index_pattern": "logs-network_traffic.mysql-*", + "title": "MySQL" + }, + { + "dataset": "amqp", + "index_pattern": "logs-network_traffic.amqp-*", + "title": "AMQP" + }, + { + "dataset": "http", + "index_pattern": "logs-network_traffic.http-*", + "title": "HTTP" + }, + { + "dataset": "memcached", + "index_pattern": "logs-network_traffic.memcached-*", + "title": "Memcached" + } + ], + "elser_embedding": "Network Packet Capture - Capture and analyze network traffic from a host with Elastic Agent. - NFS TLS ICMP Cassandra MongoDB Thrift Flows DHCP PostgreSQL Redis DNS SIP MySQL AMQP HTTP Memcached" + }, + { + "title": "MySQL Enterprise", + "id": "mysql_enterprise", + "description": "Collect audit logs from MySQL Enterprise with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-mysql_enterprise.audit-*", + "title": "MySQL Enterprise Audit Log" + } + ], + "elser_embedding": "MySQL Enterprise - Collect audit logs from MySQL Enterprise with Elastic Agent. - MySQL Enterprise Audit Log" + }, + { + "title": "GitHub", + "id": "github", + "description": "Collect logs from GitHub with Elastic Agent.", + "data_streams": [ + { + "dataset": "dependabot", + "index_pattern": "logs-github.dependabot-*", + "title": "GHAS Dependabot" + }, + { + "dataset": "issues", + "index_pattern": "logs-github.issues-*", + "title": "Github Issue" + }, + { + "dataset": "secret_scanning", + "index_pattern": "logs-github.secret_scanning-*", + "title": "GHAS Secret Scanning" + }, + { + "dataset": "audit", + "index_pattern": "logs-github.audit-*", + "title": "GitHub Audit Logs" + }, + { + "dataset": "code_scanning", + "index_pattern": "logs-github.code_scanning-*", + "title": "GHAS Code Scanning" + } + ], + "elser_embedding": "GitHub - Collect logs from GitHub with Elastic Agent. - GHAS Dependabot Github Issue GHAS Secret Scanning GitHub Audit Logs GHAS Code Scanning" + }, + { + "title": "Microsoft Entra ID Entity Analytics", + "id": "entityanalytics_entra_id", + "description": "Collect identities from Microsoft Entra ID (formerly Azure Active Directory) with Elastic Agent.", + "data_streams": [ + { + "dataset": "device", + "index_pattern": "logs-entityanalytics_entra_id.device-*", + "title": "Microsoft Entra ID Entity Analytics Device Events" + }, + { + "dataset": "user", + "index_pattern": "logs-entityanalytics_entra_id.user-*", + "title": "Microsoft Entra ID Entity Analytics User Events" + }, + { + "dataset": "entity", + "index_pattern": "logs-entityanalytics_entra_id.entity-*", + "title": "Identities" + } + ], + "elser_embedding": "Microsoft Entra ID Entity Analytics - Collect identities from Microsoft Entra ID (formerly Azure Active Directory) with Elastic Agent. - Microsoft Entra ID Entity Analytics Device Events Microsoft Entra ID Entity Analytics User Events Identities" + }, + { + "title": "ThreatConnect", + "id": "ti_threatconnect", + "description": "Collects Indicators from ThreatConnect using the Elastic Agent and saves them as logs inside Elastic", + "data_streams": [ + { + "dataset": "indicator", + "index_pattern": "logs-ti_threatconnect.indicator-*", + "title": "Collect Indicators from ThreatConnect." + } + ], + "elser_embedding": "ThreatConnect - Collects Indicators from ThreatConnect using the Elastic Agent and saves them as logs inside Elastic - Collect Indicators from ThreatConnect." + }, + { + "title": "Microsoft Sentinel", + "id": "microsoft_sentinel", + "description": "Collect logs from Microsoft Sentinel with Elastic Agent.", + "data_streams": [ + { + "dataset": "alert", + "index_pattern": "logs-microsoft_sentinel.alert-*", + "title": "Microsoft Sentinel Alert logs" + }, + { + "dataset": "incident", + "index_pattern": "logs-microsoft_sentinel.incident-*", + "title": "Microsoft Sentinel Incident logs" + }, + { + "dataset": "event", + "index_pattern": "logs-microsoft_sentinel.event-*", + "title": "Collect Events from Microsoft Sentinel." + } + ], + "elser_embedding": "Microsoft Sentinel - Collect logs from Microsoft Sentinel with Elastic Agent. - Microsoft Sentinel Alert logs Microsoft Sentinel Incident logs Collect Events from Microsoft Sentinel." + }, + { + "title": "Check Point", + "id": "checkpoint", + "description": "Collect logs from Check Point with Elastic Agent.", + "data_streams": [ + { + "dataset": "firewall", + "index_pattern": "logs-checkpoint.firewall-*", + "title": "Check Point firewall logs" + } + ], + "elser_embedding": "Check Point - Collect logs from Check Point with Elastic Agent. - Check Point firewall logs" + }, + { + "title": "WatchGuard Firebox", + "id": "watchguard_firebox", + "description": "Collect logs from WatchGuard Firebox with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-watchguard_firebox.log-*", + "title": "WatchGuard Firebox logs" + } + ], + "elser_embedding": "WatchGuard Firebox - Collect logs from WatchGuard Firebox with Elastic Agent. - WatchGuard Firebox logs" + }, + { + "title": "Nagios XI", + "id": "nagios_xi", + "description": "Collect Logs and Metrics from Nagios XI with Elastic Agent.", + "data_streams": [ + { + "dataset": "host", + "index_pattern": "logs-nagios_xi.host-*", + "title": "Host" + }, + { + "dataset": "events", + "index_pattern": "logs-nagios_xi.events-*", + "title": "Events" + }, + { + "dataset": "service", + "index_pattern": "logs-nagios_xi.service-*", + "title": "Service" + } + ], + "elser_embedding": "Nagios XI - Collect Logs and Metrics from Nagios XI with Elastic Agent. - Host Events Service" + }, + { + "title": "Atlassian Jira", + "id": "atlassian_jira", + "description": "Collect logs from Atlassian Jira with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-atlassian_jira.audit-*", + "title": "Jira Audit Logs" + } + ], + "elser_embedding": "Atlassian Jira - Collect logs from Atlassian Jira with Elastic Agent. - Jira Audit Logs" + }, + { + "title": "Snyk", + "id": "snyk", + "description": "Collect logs from Snyk with Elastic Agent.", + "data_streams": [ + { + "dataset": "issues", + "index_pattern": "logs-snyk.issues-*", + "title": "Collect Snyk Issues Data" + }, + { + "dataset": "audit", + "index_pattern": "logs-snyk.audit-*", + "title": "Collect Snyk Audit Logs" + }, + { + "dataset": "audit_logs", + "index_pattern": "logs-snyk.audit_logs-*", + "title": "Collect Snyk Audit Logs" + }, + { + "dataset": "vulnerabilities", + "index_pattern": "logs-snyk.vulnerabilities-*", + "title": "Collect Snyk Vulnerability Data" + } + ], + "elser_embedding": "Snyk - Collect logs from Snyk with Elastic Agent. - Collect Snyk Issues Data Collect Snyk Audit Logs Collect Snyk Audit Logs Collect Snyk Vulnerability Data" + }, + { + "title": "Google Cloud Platform", + "id": "gcp", + "description": "Collect logs and metrics from Google Cloud Platform with Elastic Agent.", + "data_streams": [ + { + "dataset": "compute", + "index_pattern": "logs-gcp.compute-*", + "title": "GCP Compute Metrics" + }, + { + "dataset": "pubsub", + "index_pattern": "logs-gcp.pubsub-*", + "title": "GCP PubSub Metrics" + }, + { + "dataset": "cloudsql_postgresql", + "index_pattern": "logs-gcp.cloudsql_postgresql-*", + "title": "GCP CloudSQL PostgreSQL Metrics" + }, + { + "dataset": "billing", + "index_pattern": "logs-gcp.billing-*", + "title": "GCP Billing Metrics" + }, + { + "dataset": "loadbalancing_metrics", + "index_pattern": "logs-gcp.loadbalancing_metrics-*", + "title": "GCP Load Balancing Metrics" + }, + { + "dataset": "cloudrun_metrics", + "index_pattern": "logs-gcp.cloudrun_metrics-*", + "title": "GCP Cloud Run Metrics" + }, + { + "dataset": "audit", + "index_pattern": "logs-gcp.audit-*", + "title": "Google Cloud Platform (GCP) audit logs" + }, + { + "dataset": "dataproc", + "index_pattern": "logs-gcp.dataproc-*", + "title": "GCP Dataproc Metrics" + }, + { + "dataset": "redis", + "index_pattern": "logs-gcp.redis-*", + "title": "GCP Redis Metrics" + }, + { + "dataset": "cloudsql_mysql", + "index_pattern": "logs-gcp.cloudsql_mysql-*", + "title": "GCP CloudSQL MySQL Metrics" + }, + { + "dataset": "dns", + "index_pattern": "logs-gcp.dns-*", + "title": "Google Cloud Platform (GCP) DNS logs" + }, + { + "dataset": "cloudsql_sqlserver", + "index_pattern": "logs-gcp.cloudsql_sqlserver-*", + "title": "GCP CloudSQL SQL Server Metrics" + }, + { + "dataset": "storage", + "index_pattern": "logs-gcp.storage-*", + "title": "GCP Storage Metrics" + }, + { + "dataset": "gke", + "index_pattern": "logs-gcp.gke-*", + "title": "GCP GKE Metrics" + }, + { + "dataset": "vpcflow", + "index_pattern": "logs-gcp.vpcflow-*", + "title": "Google Cloud Platform (GCP) vpcflow logs" + }, + { + "dataset": "loadbalancing_logs", + "index_pattern": "logs-gcp.loadbalancing_logs-*", + "title": "Google Cloud Platform (GCP) Load Balancing logs" + }, + { + "dataset": "firestore", + "index_pattern": "logs-gcp.firestore-*", + "title": "GCP Firestore Metrics" + }, + { + "dataset": "firewall", + "index_pattern": "logs-gcp.firewall-*", + "title": "Google Cloud Platform (GCP) firewall logs" + } + ], + "elser_embedding": "Google Cloud Platform - Collect logs and metrics from Google Cloud Platform with Elastic Agent. - GCP Compute Metrics GCP PubSub Metrics GCP CloudSQL PostgreSQL Metrics GCP Billing Metrics GCP Load Balancing Metrics GCP Cloud Run Metrics Google Cloud Platform (GCP) audit logs GCP Dataproc Metrics GCP Redis Metrics GCP CloudSQL MySQL Metrics Google Cloud Platform (GCP) DNS logs GCP CloudSQL SQL Server Metrics GCP Storage Metrics GCP GKE Metrics Google Cloud Platform (GCP) vpcflow logs Google Cloud Platform (GCP) Load Balancing logs GCP Firestore Metrics Google Cloud Platform (GCP) firewall logs" + }, + { + "title": "Logstash", + "id": "logstash", + "description": "Collect logs and metrics from Logstash with Elastic Agent.", + "data_streams": [ + { + "dataset": "node_cel", + "index_pattern": "logs-logstash.node_cel-*", + "title": "Logstash Node Stats" + }, + { + "dataset": "pipeline", + "index_pattern": "logs-logstash.pipeline-*", + "title": "Logstash pipeline" + }, + { + "dataset": "plugins", + "index_pattern": "logs-logstash.plugins-*", + "title": "Logstash plugins" + }, + { + "dataset": "node_stats", + "index_pattern": "logs-logstash.node_stats-*", + "title": "Logstash node_stats metrics" + }, + { + "dataset": "slowlog", + "index_pattern": "logs-logstash.slowlog-*", + "title": "logstash slowlog logs" + }, + { + "dataset": "log", + "index_pattern": "logs-logstash.log-*", + "title": "Logstash logs" + }, + { + "dataset": "node", + "index_pattern": "logs-logstash.node-*", + "title": "Logstash node metrics" + } + ], + "elser_embedding": "Logstash - Collect logs and metrics from Logstash with Elastic Agent. - Logstash Node Stats Logstash pipeline Logstash plugins Logstash node_stats metrics logstash slowlog logs Logstash logs Logstash node metrics" + }, + { + "title": "Palo Alto Prisma Access", + "id": "prisma_access", + "description": "Collect logs from Palo Alto Prisma Access with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-prisma_access.event-*", + "title": "Collect Events from Palo Alto Prisma Access" + } + ], + "elser_embedding": "Palo Alto Prisma Access - Collect logs from Palo Alto Prisma Access with Elastic Agent. - Collect Events from Palo Alto Prisma Access" + }, + { + "title": "Barracuda CloudGen Firewall Logs", + "id": "barracuda_cloudgen_firewall", + "description": "Collect logs from Barracuda CloudGen Firewall devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-barracuda_cloudgen_firewall.log-*", + "title": "Barracuda CloudGen Firewall Logs" + } + ], + "elser_embedding": "Barracuda CloudGen Firewall Logs - Collect logs from Barracuda CloudGen Firewall devices with Elastic Agent. - Barracuda CloudGen Firewall Logs" + }, + { + "title": "Jamf Pro", + "id": "jamf_pro", + "description": "Collect logs and inventory data from Jamf Pro with Elastic Agent", + "data_streams": [ + { + "dataset": "inventory", + "index_pattern": "logs-jamf_pro.inventory-*", + "title": "Inventory data" + }, + { + "dataset": "events", + "index_pattern": "logs-jamf_pro.events-*", + "title": "Jamf Pro Events" + } + ], + "elser_embedding": "Jamf Pro - Collect logs and inventory data from Jamf Pro with Elastic Agent - Inventory data Jamf Pro Events" + }, + { + "title": "Fortinet FortiManager Logs", + "id": "fortinet_fortimanager", + "description": "Collect logs from Fortinet FortiManager instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_fortimanager.log-*", + "title": "Collect logs from Fortinet FortiManager" + } + ], + "elser_embedding": "Fortinet FortiManager Logs - Collect logs from Fortinet FortiManager instances with Elastic Agent. - Collect logs from Fortinet FortiManager" + }, + { + "title": "Elastic APM", + "id": "apm", + "description": "Monitor, detect, and diagnose complex application performance issues.", + "data_streams": [], + "elser_embedding": "Elastic APM - Monitor, detect, and diagnose complex application performance issues. - " + }, + { + "title": "AlienVault OTX", + "id": "ti_otx", + "description": "Ingest threat intelligence indicators from AlienVault Open Threat Exchange (OTX) with Elastic Agent.", + "data_streams": [ + { + "dataset": "pulses_subscribed", + "index_pattern": "logs-ti_otx.pulses_subscribed-*", + "title": "Alienvault OTX Subcribed Pulses" + }, + { + "dataset": "threat", + "index_pattern": "logs-ti_otx.threat-*", + "title": "Alienvault OTX logs" + } + ], + "elser_embedding": "AlienVault OTX - Ingest threat intelligence indicators from AlienVault Open Threat Exchange (OTX) with Elastic Agent. - Alienvault OTX Subcribed Pulses Alienvault OTX logs" + }, + { + "title": "Check Point", + "id": "checkpoint", + "description": "Collect logs from Check Point with Elastic Agent.", + "data_streams": [ + { + "dataset": "firewall", + "index_pattern": "logs-checkpoint.firewall-*", + "title": "Check Point firewall logs" + } + ], + "elser_embedding": "Check Point - Collect logs from Check Point with Elastic Agent. - Check Point firewall logs" + }, + { + "title": "Kubernetes OpenTelemetry Assets", + "id": "kubernetes_otel", + "description": "Utilise the pre-built dashboard for OTel-native metrics and events collected from a Kubernetes cluster", + "data_streams": [], + "elser_embedding": "Kubernetes OpenTelemetry Assets - Utilise the pre-built dashboard for OTel-native metrics and events collected from a Kubernetes cluster - " + }, + { + "title": "EclecticIQ", + "id": "ti_eclecticiq", + "description": "Ingest threat intelligence from EclecticIQ with Elastic Agent", + "data_streams": [ + { + "dataset": "threat", + "index_pattern": "logs-ti_eclecticiq.threat-*", + "title": "Poll Outgoing feed" + } + ], + "elser_embedding": "EclecticIQ - Ingest threat intelligence from EclecticIQ with Elastic Agent - Poll Outgoing feed" + }, + { + "title": "Lumos", + "id": "lumos", + "description": "An integration with Lumos to ship your Activity logs to your Elastic instance.", + "data_streams": [ + { + "dataset": "activity_logs", + "index_pattern": "logs-lumos.activity_logs-*", + "title": "Lumos Activity Logs" + } + ], + "elser_embedding": "Lumos - An integration with Lumos to ship your Activity logs to your Elastic instance. - Lumos Activity Logs" + }, + { + "title": "Anomali", + "id": "ti_anomali", + "description": "Ingest threat intelligence indicators from Anomali with Elastic Agent.", + "data_streams": [ + { + "dataset": "threatstream", + "index_pattern": "logs-ti_anomali.threatstream-*", + "title": "Anomali ThreatStream" + }, + { + "dataset": "intelligence", + "index_pattern": "logs-ti_anomali.intelligence-*", + "title": "Anomali ThreatStream" + } + ], + "elser_embedding": "Anomali - Ingest threat intelligence indicators from Anomali with Elastic Agent. - Anomali ThreatStream Anomali ThreatStream" + }, + { + "title": "Jolokia Input", + "id": "jolokia", + "description": "Collects Metrics from Jolokia Agents", + "data_streams": [], + "elser_embedding": "Jolokia Input - Collects Metrics from Jolokia Agents - " + }, + { + "title": "Sysdig", + "id": "sysdig", + "description": "Collect alerts from Sysdig using Elastic Agent.", + "data_streams": [ + { + "dataset": "alerts", + "index_pattern": "logs-sysdig.alerts-*", + "title": "Sysdig" + } + ], + "elser_embedding": "Sysdig - Collect alerts from Sysdig using Elastic Agent. - Sysdig" + }, + { + "title": "Pulse Connect Secure", + "id": "pulse_connect_secure", + "description": "Collect logs from Pulse Connect Secure with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-pulse_connect_secure.log-*", + "title": "Pulse Connect Secure" + } + ], + "elser_embedding": "Pulse Connect Secure - Collect logs from Pulse Connect Secure with Elastic Agent. - Pulse Connect Secure" + }, + { + "title": "Zeek", + "id": "zeek", + "description": "Collect logs from Zeek with Elastic Agent.", + "data_streams": [ + { + "dataset": "x509", + "index_pattern": "logs-zeek.x509-*", + "title": "Zeek x509 logs" + }, + { + "dataset": "software", + "index_pattern": "logs-zeek.software-*", + "title": "Zeek software logs" + }, + { + "dataset": "traceroute", + "index_pattern": "logs-zeek.traceroute-*", + "title": "Zeek traceroute logs" + }, + { + "dataset": "capture_loss", + "index_pattern": "logs-zeek.capture_loss-*", + "title": "Zeek capture_loss logs" + }, + { + "dataset": "smb_cmd", + "index_pattern": "logs-zeek.smb_cmd-*", + "title": "Zeek smb_cmd logs" + }, + { + "dataset": "snmp", + "index_pattern": "logs-zeek.snmp-*", + "title": "Zeek snmp logs" + }, + { + "dataset": "irc", + "index_pattern": "logs-zeek.irc-*", + "title": "Zeek irc logs" + }, + { + "dataset": "intel", + "index_pattern": "logs-zeek.intel-*", + "title": "Zeek intel logs" + }, + { + "dataset": "pe", + "index_pattern": "logs-zeek.pe-*", + "title": "Zeek pe logs" + }, + { + "dataset": "known_services", + "index_pattern": "logs-zeek.known_services-*", + "title": "Zeek Known Services logs" + }, + { + "dataset": "radius", + "index_pattern": "logs-zeek.radius-*", + "title": "Zeek radius logs" + }, + { + "dataset": "modbus", + "index_pattern": "logs-zeek.modbus-*", + "title": "Zeek modbus logs" + }, + { + "dataset": "tunnel", + "index_pattern": "logs-zeek.tunnel-*", + "title": "Zeek tunnel logs" + }, + { + "dataset": "stats", + "index_pattern": "logs-zeek.stats-*", + "title": "Zeek stats logs" + }, + { + "dataset": "smb_files", + "index_pattern": "logs-zeek.smb_files-*", + "title": "Zeek smb_files logs" + }, + { + "dataset": "ocsp", + "index_pattern": "logs-zeek.ocsp-*", + "title": "Zeek ocsp logs" + }, + { + "dataset": "connection", + "index_pattern": "logs-zeek.connection-*", + "title": "Zeek connection logs" + }, + { + "dataset": "kerberos", + "index_pattern": "logs-zeek.kerberos-*", + "title": "Zeek kerberos logs" + }, + { + "dataset": "weird", + "index_pattern": "logs-zeek.weird-*", + "title": "Zeek weird logs" + }, + { + "dataset": "smb_mapping", + "index_pattern": "logs-zeek.smb_mapping-*", + "title": "Zeek smb_mapping logs" + }, + { + "dataset": "signature", + "index_pattern": "logs-zeek.signature-*", + "title": "Zeek signature logs" + }, + { + "dataset": "ntp", + "index_pattern": "logs-zeek.ntp-*", + "title": "Zeek ntp logs" + }, + { + "dataset": "dns", + "index_pattern": "logs-zeek.dns-*", + "title": "Zeek dns logs" + }, + { + "dataset": "dpd", + "index_pattern": "logs-zeek.dpd-*", + "title": "Zeek dpd logs" + }, + { + "dataset": "dhcp", + "index_pattern": "logs-zeek.dhcp-*", + "title": "Zeek dhcp logs" + }, + { + "dataset": "notice", + "index_pattern": "logs-zeek.notice-*", + "title": "Zeek notice logs" + }, + { + "dataset": "files", + "index_pattern": "logs-zeek.files-*", + "title": "Zeek files logs" + }, + { + "dataset": "ntlm", + "index_pattern": "logs-zeek.ntlm-*", + "title": "Zeek ntlm logs" + }, + { + "dataset": "known_certs", + "index_pattern": "logs-zeek.known_certs-*", + "title": "Zeek Known Certs logs" + }, + { + "dataset": "sip", + "index_pattern": "logs-zeek.sip-*", + "title": "Zeek sip logs" + }, + { + "dataset": "rdp", + "index_pattern": "logs-zeek.rdp-*", + "title": "Zeek rdp logs" + }, + { + "dataset": "mysql", + "index_pattern": "logs-zeek.mysql-*", + "title": "Zeek mysql logs" + }, + { + "dataset": "rfb", + "index_pattern": "logs-zeek.rfb-*", + "title": "Zeek rfb logs" + }, + { + "dataset": "ssh", + "index_pattern": "logs-zeek.ssh-*", + "title": "Zeek ssh logs" + }, + { + "dataset": "syslog", + "index_pattern": "logs-zeek.syslog-*", + "title": "Zeek syslog logs" + }, + { + "dataset": "http", + "index_pattern": "logs-zeek.http-*", + "title": "Zeek http logs" + }, + { + "dataset": "ssl", + "index_pattern": "logs-zeek.ssl-*", + "title": "Zeek ssl logs" + }, + { + "dataset": "socks", + "index_pattern": "logs-zeek.socks-*", + "title": "Zeek socks logs" + }, + { + "dataset": "smtp", + "index_pattern": "logs-zeek.smtp-*", + "title": "Zeek smtp logs" + }, + { + "dataset": "ftp", + "index_pattern": "logs-zeek.ftp-*", + "title": "Zeek ftp logs" + }, + { + "dataset": "known_hosts", + "index_pattern": "logs-zeek.known_hosts-*", + "title": "Zeek Known Hosts logs" + }, + { + "dataset": "dnp3", + "index_pattern": "logs-zeek.dnp3-*", + "title": "Zeek dnp3 logs" + }, + { + "dataset": "dce_rpc", + "index_pattern": "logs-zeek.dce_rpc-*", + "title": "Zeek dce_rpc logs" + } + ], + "elser_embedding": "Zeek - Collect logs from Zeek with Elastic Agent. - Zeek x509 logs Zeek software logs Zeek traceroute logs Zeek capture_loss logs Zeek smb_cmd logs Zeek snmp logs Zeek irc logs Zeek intel logs Zeek pe logs Zeek Known Services logs Zeek radius logs Zeek modbus logs Zeek tunnel logs Zeek stats logs Zeek smb_files logs Zeek ocsp logs Zeek connection logs Zeek kerberos logs Zeek weird logs Zeek smb_mapping logs Zeek signature logs Zeek ntp logs Zeek dns logs Zeek dpd logs Zeek dhcp logs Zeek notice logs Zeek files logs Zeek ntlm logs Zeek Known Certs logs Zeek sip logs Zeek rdp logs Zeek mysql logs Zeek rfb logs Zeek ssh logs Zeek syslog logs Zeek http logs Zeek ssl logs Zeek socks logs Zeek smtp logs Zeek ftp logs Zeek Known Hosts logs Zeek dnp3 logs Zeek dce_rpc logs" + }, + { + "title": "CrowdStrike", + "id": "crowdstrike", + "description": "Collect logs from Crowdstrike with Elastic Agent.", + "data_streams": [ + { + "dataset": "fdr", + "index_pattern": "logs-crowdstrike.fdr-*", + "title": "Falcon Data Replicator" + }, + { + "dataset": "host", + "index_pattern": "logs-crowdstrike.host-*", + "title": "Collect Host logs from CrowdStrike." + }, + { + "dataset": "alert", + "index_pattern": "logs-crowdstrike.alert-*", + "title": "Collect Alert logs from CrowdStrike." + }, + { + "dataset": "falcon", + "index_pattern": "logs-crowdstrike.falcon-*", + "title": "Crowdstrike falcon logs" + } + ], + "elser_embedding": "CrowdStrike - Collect logs from Crowdstrike with Elastic Agent. - Falcon Data Replicator Collect Host logs from CrowdStrike. Collect Alert logs from CrowdStrike. Crowdstrike falcon logs" + }, + { + "title": "Fortinet FortiGate Firewall Logs", + "id": "fortinet_fortigate", + "description": "Collect logs from Fortinet FortiGate firewalls with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_fortigate.log-*", + "title": "Fortinet FortiGate logs" + } + ], + "elser_embedding": "Fortinet FortiGate Firewall Logs - Collect logs from Fortinet FortiGate firewalls with Elastic Agent. - Fortinet FortiGate logs" + }, + { + "title": "Active Directory Entity Analytics", + "id": "entityanalytics_ad", + "description": "Collect User Identities from Active Directory Entity with Elastic Agent.", + "data_streams": [ + { + "dataset": "user", + "index_pattern": "logs-entityanalytics_ad.user-*", + "title": "Collect User Identities logs from Active Directory" + } + ], + "elser_embedding": "Active Directory Entity Analytics - Collect User Identities from Active Directory Entity with Elastic Agent. - Collect User Identities logs from Active Directory" + }, + { + "title": "Arista NG Firewall", + "id": "arista_ngfw", + "description": "Collect logs and metrics from Arista NG Firewall.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-arista_ngfw.log-*", + "title": "Firewall Event" + } + ], + "elser_embedding": "Arista NG Firewall - Collect logs and metrics from Arista NG Firewall. - Firewall Event" + }, + { + "title": "Proofpoint TAP", + "id": "proofpoint_tap", + "description": "Collect logs from Proofpoint TAP with Elastic Agent.", + "data_streams": [ + { + "dataset": "message_blocked", + "index_pattern": "logs-proofpoint_tap.message_blocked-*", + "title": "Message Blocked" + }, + { + "dataset": "clicks_blocked", + "index_pattern": "logs-proofpoint_tap.clicks_blocked-*", + "title": "Clicks Blocked" + }, + { + "dataset": "clicks_permitted", + "index_pattern": "logs-proofpoint_tap.clicks_permitted-*", + "title": "Clicks Permitted" + }, + { + "dataset": "message_delivered", + "index_pattern": "logs-proofpoint_tap.message_delivered-*", + "title": "Message Delivered" + } + ], + "elser_embedding": "Proofpoint TAP - Collect logs from Proofpoint TAP with Elastic Agent. - Message Blocked Clicks Blocked Clicks Permitted Message Delivered" + }, + { + "title": "BitDefender", + "id": "bitdefender", + "description": "Ingest BitDefender GravityZone logs and data", + "data_streams": [ + { + "dataset": "push_statistics", + "index_pattern": "logs-bitdefender.push_statistics-*", + "title": "BitDefender GravityZone Push Notification Statistics" + }, + { + "dataset": "push_configuration", + "index_pattern": "logs-bitdefender.push_configuration-*", + "title": "BitDefender GravityZone Push Notification Configuration" + }, + { + "dataset": "push_notifications", + "index_pattern": "logs-bitdefender.push_notifications-*", + "title": "BitDefender GravityZone Push Notifications" + } + ], + "elser_embedding": "BitDefender - Ingest BitDefender GravityZone logs and data - BitDefender GravityZone Push Notification Statistics BitDefender GravityZone Push Notification Configuration BitDefender GravityZone Push Notifications" + }, + { + "title": "Redis", + "id": "redis", + "description": "Collect logs and metrics from Redis servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "keyspace", + "index_pattern": "logs-redis.keyspace-*", + "title": "Redis keyspace metrics" + }, + { + "dataset": "key", + "index_pattern": "logs-redis.key-*", + "title": "Redis key metrics" + }, + { + "dataset": "info", + "index_pattern": "logs-redis.info-*", + "title": "Redis info metrics" + }, + { + "dataset": "slowlog", + "index_pattern": "logs-redis.slowlog-*", + "title": "Redis slow logs" + }, + { + "dataset": "log", + "index_pattern": "logs-redis.log-*", + "title": "Redis application logs" + } + ], + "elser_embedding": "Redis - Collect logs and metrics from Redis servers with Elastic Agent. - Redis keyspace metrics Redis key metrics Redis info metrics Redis slow logs Redis application logs" + }, + { + "title": "Cisco Duo", + "id": "cisco_duo", + "description": "Collect logs from Cisco Duo with Elastic Agent.", + "data_streams": [ + { + "dataset": "summary", + "index_pattern": "logs-cisco_duo.summary-*", + "title": "Cisco Duo summary logs" + }, + { + "dataset": "admin", + "index_pattern": "logs-cisco_duo.admin-*", + "title": "Cisco Duo administrator logs" + }, + { + "dataset": "telephony", + "index_pattern": "logs-cisco_duo.telephony-*", + "title": "Cisco Duo telephony logs (legacy)" + }, + { + "dataset": "telephony_v2", + "index_pattern": "logs-cisco_duo.telephony_v2-*", + "title": "Cisco Duo telephony logs" + }, + { + "dataset": "auth", + "index_pattern": "logs-cisco_duo.auth-*", + "title": "Cisco Duo authentication logs" + }, + { + "dataset": "trust_monitor", + "index_pattern": "logs-cisco_duo.trust_monitor-*", + "title": "Cisco Duo trust monitor logs" + }, + { + "dataset": "activity", + "index_pattern": "logs-cisco_duo.activity-*", + "title": "Cisco Duo activity logs" + }, + { + "dataset": "offline_enrollment", + "index_pattern": "logs-cisco_duo.offline_enrollment-*", + "title": "Cisco Duo offline enrollment logs" + } + ], + "elser_embedding": "Cisco Duo - Collect logs from Cisco Duo with Elastic Agent. - Cisco Duo summary logs Cisco Duo administrator logs Cisco Duo telephony logs (legacy) Cisco Duo telephony logs Cisco Duo authentication logs Cisco Duo trust monitor logs Cisco Duo activity logs Cisco Duo offline enrollment logs" + }, + { + "title": "Elasticsearch", + "id": "elasticsearch", + "description": "Elasticsearch Integration", + "data_streams": [ + { + "dataset": "index_recovery", + "index_pattern": "logs-elasticsearch.index_recovery-*", + "title": "Elasticsearch index_recovery metrics" + }, + { + "dataset": "shard", + "index_pattern": "logs-elasticsearch.shard-*", + "title": "Elasticsearch shard metrics" + }, + { + "dataset": "ingest_pipeline", + "index_pattern": "logs-elasticsearch.ingest_pipeline-*", + "title": "Elasticsearch ingest metrics" + }, + { + "dataset": "enrich", + "index_pattern": "logs-elasticsearch.enrich-*", + "title": "Elasticsearch enrich metrics" + }, + { + "dataset": "audit", + "index_pattern": "logs-elasticsearch.audit-*", + "title": "Elasticsearch audit logs" + }, + { + "dataset": "server", + "index_pattern": "logs-elasticsearch.server-*", + "title": "Elasticsearch server logs" + }, + { + "dataset": "node_stats", + "index_pattern": "logs-elasticsearch.node_stats-*", + "title": "Elasticsearch node_stats metrics" + }, + { + "dataset": "index_summary", + "index_pattern": "logs-elasticsearch.index_summary-*", + "title": "Elasticsearch index_summary metrics" + }, + { + "dataset": "deprecation", + "index_pattern": "logs-elasticsearch.deprecation-*", + "title": "Elasticsearch deprecation logs" + }, + { + "dataset": "index", + "index_pattern": "logs-elasticsearch.index-*", + "title": "Elasticsearch index metrics" + }, + { + "dataset": "slowlog", + "index_pattern": "logs-elasticsearch.slowlog-*", + "title": "Elasticsearch slowlog logs" + }, + { + "dataset": "pending_tasks", + "index_pattern": "logs-elasticsearch.pending_tasks-*", + "title": "Elasticsearch pending_tasks metrics" + }, + { + "dataset": "ccr", + "index_pattern": "logs-elasticsearch.ccr-*", + "title": "Elasticsearch ccr metrics" + }, + { + "dataset": "node", + "index_pattern": "logs-elasticsearch.node-*", + "title": "Elasticsearch node metrics" + }, + { + "dataset": "cluster_stats", + "index_pattern": "logs-elasticsearch.cluster_stats-*", + "title": "Elasticsearch cluster_stats metrics" + }, + { + "dataset": "gc", + "index_pattern": "logs-elasticsearch.gc-*", + "title": "Elasticsearch gc logs" + }, + { + "dataset": "ml_job", + "index_pattern": "logs-elasticsearch.ml_job-*", + "title": "Elasticsearch ml_job metrics" + } + ], + "elser_embedding": "Elasticsearch - Elasticsearch Integration - Elasticsearch index_recovery metrics Elasticsearch shard metrics Elasticsearch ingest metrics Elasticsearch enrich metrics Elasticsearch audit logs Elasticsearch server logs Elasticsearch node_stats metrics Elasticsearch index_summary metrics Elasticsearch deprecation logs Elasticsearch index metrics Elasticsearch slowlog logs Elasticsearch pending_tasks metrics Elasticsearch ccr metrics Elasticsearch node metrics Elasticsearch cluster_stats metrics Elasticsearch gc logs Elasticsearch ml_job metrics" + }, + { + "title": "Universal Profiling Agent", + "id": "profiler_agent", + "description": "Fleet-wide, whole-system, continuous profiling with zero instrumentation.", + "data_streams": [], + "elser_embedding": "Universal Profiling Agent - Fleet-wide, whole-system, continuous profiling with zero instrumentation. - " + }, + { + "title": "Check Point Harmony Email & Collaboration", + "id": "checkpoint_email", + "description": "Collect logs from Check Point Harmony Email & Collaboration with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-checkpoint_email.event-*", + "title": "Check Point Harmony Email & Collaboration Event logs" + } + ], + "elser_embedding": "Check Point Harmony Email & Collaboration - Collect logs from Check Point Harmony Email & Collaboration with Elastic Agent. - Check Point Harmony Email & Collaboration Event logs" + }, + { + "title": "Apache HTTP Server", + "id": "apache", + "description": "Collect logs and metrics from Apache servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-apache.access-*", + "title": "Apache access logs" + }, + { + "dataset": "error", + "index_pattern": "logs-apache.error-*", + "title": "Apache error logs" + }, + { + "dataset": "status", + "index_pattern": "logs-apache.status-*", + "title": "Apache status metrics" + } + ], + "elser_embedding": "Apache HTTP Server - Collect logs and metrics from Apache servers with Elastic Agent. - Apache access logs Apache error logs Apache status metrics" + }, + { + "title": "Istio", + "id": "istio", + "description": "Collect logs and metrics from the service mesh Istio with Elastic Agent.", + "data_streams": [ + { + "dataset": "access_logs", + "index_pattern": "logs-istio.access_logs-*", + "title": "Istio access logs" + }, + { + "dataset": "proxy_metrics", + "index_pattern": "logs-istio.proxy_metrics-*", + "title": "Istio Proxy Metrics" + }, + { + "dataset": "istiod_metrics", + "index_pattern": "logs-istio.istiod_metrics-*", + "title": "Istiod Metrics" + } + ], + "elser_embedding": "Istio - Collect logs and metrics from the service mesh Istio with Elastic Agent. - Istio access logs Istio Proxy Metrics Istiod Metrics" + }, + { + "title": "GCP Metrics Input", + "id": "gcp_metrics", + "description": "GCP Metrics Input", + "data_streams": [], + "elser_embedding": "GCP Metrics Input - GCP Metrics Input - " + }, + { + "title": "Fortinet FortiMail", + "id": "fortinet_fortimail", + "description": "Collect logs from Fortinet FortiMail instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_fortimail.log-*", + "title": "Collect logs from Fortinet FortiMail" + } + ], + "elser_embedding": "Fortinet FortiMail - Collect logs from Fortinet FortiMail instances with Elastic Agent. - Collect logs from Fortinet FortiMail" + }, + { + "title": "Spring Boot", + "id": "spring_boot", + "description": "This Elastic integration collects logs and metrics from Spring Boot integration.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-spring_boot.memory-*", + "title": "Memory Metrics" + }, + { + "dataset": "http_trace", + "index_pattern": "logs-spring_boot.http_trace-*", + "title": "HTTP Trace Metrics" + }, + { + "dataset": "gc", + "index_pattern": "logs-spring_boot.gc-*", + "title": "Garbage Collector (GC) Metrics" + }, + { + "dataset": "threading", + "index_pattern": "logs-spring_boot.threading-*", + "title": "Threading Metrics" + }, + { + "dataset": "audit_events", + "index_pattern": "logs-spring_boot.audit_events-*", + "title": "Audit Events" + } + ], + "elser_embedding": "Spring Boot - This Elastic integration collects logs and metrics from Spring Boot integration. - Memory Metrics HTTP Trace Metrics Garbage Collector (GC) Metrics Threading Metrics Audit Events" + }, + { + "title": "Jamf Compliance Reporter", + "id": "jamf_compliance_reporter", + "description": "Collect logs from Jamf Compliance Reporter with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-jamf_compliance_reporter.log-*", + "title": "Jamf Compliance Reporter logs" + } + ], + "elser_embedding": "Jamf Compliance Reporter - Collect logs from Jamf Compliance Reporter with Elastic Agent. - Jamf Compliance Reporter logs" + }, + { + "title": "SentinelOne", + "id": "sentinel_one", + "description": "Collect logs from SentinelOne with Elastic Agent.", + "data_streams": [ + { + "dataset": "group", + "index_pattern": "logs-sentinel_one.group-*", + "title": "Collect Group logs from SentinelOne" + }, + { + "dataset": "threat", + "index_pattern": "logs-sentinel_one.threat-*", + "title": "Collect Threat logs from SentinelOne" + }, + { + "dataset": "alert", + "index_pattern": "logs-sentinel_one.alert-*", + "title": "Collect Alert logs from SentinelOne" + }, + { + "dataset": "agent", + "index_pattern": "logs-sentinel_one.agent-*", + "title": "Collect Agent logs from SentinelOne" + }, + { + "dataset": "activity", + "index_pattern": "logs-sentinel_one.activity-*", + "title": "Collect Activity logs from SentinelOne" + } + ], + "elser_embedding": "SentinelOne - Collect logs from SentinelOne with Elastic Agent. - Collect Group logs from SentinelOne Collect Threat logs from SentinelOne Collect Alert logs from SentinelOne Collect Agent logs from SentinelOne Collect Activity logs from SentinelOne" + }, + { + "title": "Enterprise Search", + "id": "enterprisesearch", + "description": "Enterprise Search Integration", + "data_streams": [ + { + "dataset": "stats", + "index_pattern": "logs-enterprisesearch.stats-*", + "title": "Enterprise Search stats metrics" + }, + { + "dataset": "health", + "index_pattern": "logs-enterprisesearch.health-*", + "title": "Enterprise Search health metrics" + } + ], + "elser_embedding": "Enterprise Search - Enterprise Search Integration - Enterprise Search stats metrics Enterprise Search health metrics" + }, + { + "title": "Microsoft Exchange Online Message Trace", + "id": "microsoft_exchange_online_message_trace", + "description": "Microsoft Exchange Online Message Trace Integration", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-microsoft_exchange_online_message_trace.log-*", + "title": "Microsoft Exchange Online Message Trace logs" + } + ], + "elser_embedding": "Microsoft Exchange Online Message Trace - Microsoft Exchange Online Message Trace Integration - Microsoft Exchange Online Message Trace logs" + }, + { + "title": "CrowdStrike Falcon Intelligence", + "id": "ti_crowdstrike", + "description": "Collect logs from CrowdStrike Falcon Intelligence with Elastic Agent.", + "data_streams": [ + { + "dataset": "intel", + "index_pattern": "logs-ti_crowdstrike.intel-*", + "title": "Collect Intel logs from CrowdStrike Falcon Intelligence." + }, + { + "dataset": "ioc", + "index_pattern": "logs-ti_crowdstrike.ioc-*", + "title": "Collect IOC logs from CrowdStrike Falcon Intelligence." + } + ], + "elser_embedding": "CrowdStrike Falcon Intelligence - Collect logs from CrowdStrike Falcon Intelligence with Elastic Agent. - Collect Intel logs from CrowdStrike Falcon Intelligence. Collect IOC logs from CrowdStrike Falcon Intelligence." + }, + { + "title": "Auditd Manager", + "id": "auditd_manager", + "description": "The Auditd Manager Integration receives audit events from the Linux Audit Framework that is a part of the Linux kernel.", + "data_streams": [ + { + "dataset": "auditd", + "index_pattern": "logs-auditd_manager.auditd-*", + "title": "Auditd Manager" + } + ], + "elser_embedding": "Auditd Manager - The Auditd Manager Integration receives audit events from the Linux Audit Framework that is a part of the Linux kernel. - Auditd Manager" + }, + { + "title": "Oracle", + "id": "oracle", + "description": "Collect Oracle Audit Log, Performance metrics, Tablespace metrics, Sysmetrics metrics, System statistics metrics, memory metrics from Oracle database.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-oracle.memory-*", + "title": "Memory metrics" + }, + { + "dataset": "performance", + "index_pattern": "logs-oracle.performance-*", + "title": "Oracle performance metrics" + }, + { + "dataset": "database_audit", + "index_pattern": "logs-oracle.database_audit-*", + "title": "Oracle Audit Log" + }, + { + "dataset": "sysmetric", + "index_pattern": "logs-oracle.sysmetric-*", + "title": "Sysmetric related metrics." + }, + { + "dataset": "system_statistics", + "index_pattern": "logs-oracle.system_statistics-*", + "title": "System Statistics" + }, + { + "dataset": "tablespace", + "index_pattern": "logs-oracle.tablespace-*", + "title": "Oracle tablespace metrics" + } + ], + "elser_embedding": "Oracle - Collect Oracle Audit Log, Performance metrics, Tablespace metrics, Sysmetrics metrics, System statistics metrics, memory metrics from Oracle database. - Memory metrics Oracle performance metrics Oracle Audit Log Sysmetric related metrics. System Statistics Oracle tablespace metrics" + }, + { + "title": "Akamai", + "id": "akamai", + "description": "Collect logs from Akamai with Elastic Agent.", + "data_streams": [ + { + "dataset": "siem", + "index_pattern": "logs-akamai.siem-*", + "title": "Akamai SIEM Logs" + } + ], + "elser_embedding": "Akamai - Collect logs from Akamai with Elastic Agent. - Akamai SIEM Logs" + }, + { + "title": "Custom Journald logs", + "id": "journald", + "description": "Collect logs from journald with Elastic Agent.", + "data_streams": [], + "elser_embedding": "Custom Journald logs - Collect logs from journald with Elastic Agent. - " + }, + { + "title": "Universal Profiling Collector", + "id": "profiler_collector", + "description": "Fleet-wide, whole-system, continuous profiling with zero instrumentation.", + "data_streams": [], + "elser_embedding": "Universal Profiling Collector - Fleet-wide, whole-system, continuous profiling with zero instrumentation. - " + }, + { + "title": "Custom API using Common Expression Language", + "id": "cel", + "description": "Collect custom events from an API with Elastic agent", + "data_streams": [], + "elser_embedding": "Custom API using Common Expression Language - Collect custom events from an API with Elastic agent - " + }, + { + "title": "etcd", + "id": "etcd", + "description": "Collect metrics from etcd instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "self", + "index_pattern": "logs-etcd.self-*", + "title": "etcd self metrics" + }, + { + "dataset": "leader", + "index_pattern": "logs-etcd.leader-*", + "title": "etcd leader metrics" + }, + { + "dataset": "store", + "index_pattern": "logs-etcd.store-*", + "title": "etcd store metrics" + }, + { + "dataset": "metrics", + "index_pattern": "logs-etcd.metrics-*", + "title": "etcd v3 metrics" + } + ], + "elser_embedding": "etcd - Collect metrics from etcd instances with Elastic Agent. - etcd self metrics etcd leader metrics etcd store metrics etcd v3 metrics" + }, + { + "title": "Citrix Web App Firewall", + "id": "citrix_waf", + "description": "Ingest events from Citrix Systems Web App Firewall.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-citrix_waf.log-*", + "title": "Cisco ASA logs" + } + ], + "elser_embedding": "Citrix Web App Firewall - Ingest events from Citrix Systems Web App Firewall. - Cisco ASA logs" + }, + { + "title": "Azure OpenAI", + "id": "azure_openai", + "description": "Collects Azure OpenAI Logs and Metrics", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-azure_openai.logs-*", + "title": "Collect Azure OpenAI logs" + }, + { + "dataset": "metrics", + "index_pattern": "logs-azure_openai.metrics-*", + "title": "Collect OpenAI metrics" + } + ], + "elser_embedding": "Azure OpenAI - Collects Azure OpenAI Logs and Metrics - Collect Azure OpenAI logs Collect OpenAI metrics" + }, + { + "title": "Cisco ISE", + "id": "cisco_ise", + "description": "Collect logs from Cisco ISE with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_ise.log-*", + "title": "Cisco ISE logs" + } + ], + "elser_embedding": "Cisco ISE - Collect logs from Cisco ISE with Elastic Agent. - Cisco ISE logs" + }, + { + "title": "Citrix ADC", + "id": "citrix_adc", + "description": "This Elastic integration collects logs and metrics from Citrix ADC product.", + "data_streams": [ + { + "dataset": "vpn", + "index_pattern": "logs-citrix_adc.vpn-*", + "title": "VPN metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-citrix_adc.log-*", + "title": "Citrix ADC logs" + }, + { + "dataset": "service", + "index_pattern": "logs-citrix_adc.service-*", + "title": "Citrix ADC Service metrics" + }, + { + "dataset": "system", + "index_pattern": "logs-citrix_adc.system-*", + "title": "System metrics" + }, + { + "dataset": "interface", + "index_pattern": "logs-citrix_adc.interface-*", + "title": "Interface metrics" + }, + { + "dataset": "lbvserver", + "index_pattern": "logs-citrix_adc.lbvserver-*", + "title": "Load Balancing Virtual Server metrics" + } + ], + "elser_embedding": "Citrix ADC - This Elastic integration collects logs and metrics from Citrix ADC product. - VPN metrics Citrix ADC logs Citrix ADC Service metrics System metrics Interface metrics Load Balancing Virtual Server metrics" + }, + { + "title": "Box Events", + "id": "box_events", + "description": "Collect logs from Box with Elastic Agent", + "data_streams": [ + { + "dataset": "events", + "index_pattern": "logs-box_events.events-*", + "title": "List user and enterprise events" + } + ], + "elser_embedding": "Box Events - Collect logs from Box with Elastic Agent - List user and enterprise events" + }, + { + "title": "Prometheus", + "id": "prometheus", + "description": "Collect metrics from Prometheus servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "query", + "index_pattern": "logs-prometheus.query-*", + "title": "Prometheus query metrics" + }, + { + "dataset": "remote_write", + "index_pattern": "logs-prometheus.remote_write-*", + "title": "Prometheus remote_write metrics" + }, + { + "dataset": "collector", + "index_pattern": "logs-prometheus.collector-*", + "title": "Prometheus collector metrics" + } + ], + "elser_embedding": "Prometheus - Collect metrics from Prometheus servers with Elastic Agent. - Prometheus query metrics Prometheus remote_write metrics Prometheus collector metrics" + }, + { + "title": "Kubernetes", + "id": "kubernetes", + "description": "Collect logs and metrics from Kubernetes clusters with Elastic Agent.", + "data_streams": [ + { + "dataset": "state_resourcequota", + "index_pattern": "logs-kubernetes.state_resourcequota-*", + "title": "Kubernetes ResourceQuota metrics" + }, + { + "dataset": "state_storageclass", + "index_pattern": "logs-kubernetes.state_storageclass-*", + "title": "Kubernetes StorageClass metrics" + }, + { + "dataset": "state_persistentvolume", + "index_pattern": "logs-kubernetes.state_persistentvolume-*", + "title": "Kubernetes PersistentVolume metrics" + }, + { + "dataset": "pod", + "index_pattern": "logs-kubernetes.pod-*", + "title": "Kubernetes Pod metrics" + }, + { + "dataset": "state_container", + "index_pattern": "logs-kubernetes.state_container-*", + "title": "Kubernetes Container metrics" + }, + { + "dataset": "state_service", + "index_pattern": "logs-kubernetes.state_service-*", + "title": "Kubernetes Service metrics" + }, + { + "dataset": "state_replicaset", + "index_pattern": "logs-kubernetes.state_replicaset-*", + "title": "Kubernetes state_replicaset metrics" + }, + { + "dataset": "state_deployment", + "index_pattern": "logs-kubernetes.state_deployment-*", + "title": "Kubernetes Deployment metrics" + }, + { + "dataset": "container", + "index_pattern": "logs-kubernetes.container-*", + "title": "Kubernetes Container metrics" + }, + { + "dataset": "state_cronjob", + "index_pattern": "logs-kubernetes.state_cronjob-*", + "title": "Kubernetes Cronjob metrics" + }, + { + "dataset": "state_persistentvolumeclaim", + "index_pattern": "logs-kubernetes.state_persistentvolumeclaim-*", + "title": "Kubernetes PersistentVolumeClaim metrics" + }, + { + "dataset": "apiserver", + "index_pattern": "logs-kubernetes.apiserver-*", + "title": "Kubernetes API Server metrics" + }, + { + "dataset": "audit_logs", + "index_pattern": "logs-kubernetes.audit_logs-*", + "title": "Kubernetes audit logs" + }, + { + "dataset": "container_logs", + "index_pattern": "logs-kubernetes.container_logs-*", + "title": "Kubernetes container logs" + }, + { + "dataset": "state_namespace", + "index_pattern": "logs-kubernetes.state_namespace-*", + "title": "Kubernetes Namespace metrics" + }, + { + "dataset": "controllermanager", + "index_pattern": "logs-kubernetes.controllermanager-*", + "title": "Kubernetes Controller Manager metrics" + }, + { + "dataset": "state_statefulset", + "index_pattern": "logs-kubernetes.state_statefulset-*", + "title": "Kubernetes StatefulSet metrics" + }, + { + "dataset": "state_pod", + "index_pattern": "logs-kubernetes.state_pod-*", + "title": "Kubernetes Pod metrics" + }, + { + "dataset": "event", + "index_pattern": "logs-kubernetes.event-*", + "title": "Kubernetes Event metrics" + }, + { + "dataset": "node", + "index_pattern": "logs-kubernetes.node-*", + "title": "Kubernetes Node metrics" + }, + { + "dataset": "scheduler", + "index_pattern": "logs-kubernetes.scheduler-*", + "title": "Kubernetes Scheduler metrics" + }, + { + "dataset": "system", + "index_pattern": "logs-kubernetes.system-*", + "title": "Kubernetes System metrics" + }, + { + "dataset": "proxy", + "index_pattern": "logs-kubernetes.proxy-*", + "title": "Kubernetes Proxy metrics" + }, + { + "dataset": "state_node", + "index_pattern": "logs-kubernetes.state_node-*", + "title": "Kubernetes Node metrics" + }, + { + "dataset": "volume", + "index_pattern": "logs-kubernetes.volume-*", + "title": "Kubernetes Volume metrics" + }, + { + "dataset": "state_job", + "index_pattern": "logs-kubernetes.state_job-*", + "title": "Kubernetes Job metrics" + }, + { + "dataset": "state_daemonset", + "index_pattern": "logs-kubernetes.state_daemonset-*", + "title": "Kubernetes Deamonset metrics" + } + ], + "elser_embedding": "Kubernetes - Collect logs and metrics from Kubernetes clusters with Elastic Agent. - Kubernetes ResourceQuota metrics Kubernetes StorageClass metrics Kubernetes PersistentVolume metrics Kubernetes Pod metrics Kubernetes Container metrics Kubernetes Service metrics Kubernetes state_replicaset metrics Kubernetes Deployment metrics Kubernetes Container metrics Kubernetes Cronjob metrics Kubernetes PersistentVolumeClaim metrics Kubernetes API Server metrics Kubernetes audit logs Kubernetes container logs Kubernetes Namespace metrics Kubernetes Controller Manager metrics Kubernetes StatefulSet metrics Kubernetes Pod metrics Kubernetes Event metrics Kubernetes Node metrics Kubernetes Scheduler metrics Kubernetes System metrics Kubernetes Proxy metrics Kubernetes Node metrics Kubernetes Volume metrics Kubernetes Job metrics Kubernetes Deamonset metrics" + }, + { + "title": "Okta Entity Analytics", + "id": "entityanalytics_okta", + "description": "Collect User Identities from Okta with Elastic Agent.", + "data_streams": [ + { + "dataset": "user", + "index_pattern": "logs-entityanalytics_okta.user-*", + "title": "Collect User Identities logs from Okta" + } + ], + "elser_embedding": "Okta Entity Analytics - Collect User Identities from Okta with Elastic Agent. - Collect User Identities logs from Okta" + }, + { + "title": "GCP Vertex AI", + "id": "gcp_vertexai", + "description": "Collect GCP Vertex AI metrics with Elastic Agent", + "data_streams": [ + { + "dataset": "metrics", + "index_pattern": "logs-gcp_vertexai.metrics-*", + "title": "GCP Vertex AI Metrics" + } + ], + "elser_embedding": "GCP Vertex AI - Collect GCP Vertex AI metrics with Elastic Agent - GCP Vertex AI Metrics" + }, + { + "title": "First EPSS", + "id": "first_epss", + "description": "Collect exploit prediction score data from the First EPSS API with Elastic Agent.", + "data_streams": [ + { + "dataset": "vulnerability", + "index_pattern": "logs-first_epss.vulnerability-*", + "title": "Collect EPSS data from First API." + } + ], + "elser_embedding": "First EPSS - Collect exploit prediction score data from the First EPSS API with Elastic Agent. - Collect EPSS data from First API." + }, + { + "title": "Snort", + "id": "snort", + "description": "Collect logs from Snort with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-snort.log-*", + "title": "Snort" + } + ], + "elser_embedding": "Snort - Collect logs from Snort with Elastic Agent. - Snort" + }, + { + "title": "Azure Functions", + "id": "azure_functions", + "description": "Get metrics and logs from Azure Functions", + "data_streams": [ + { + "dataset": "functionapplogs", + "index_pattern": "logs-azure_functions.functionapplogs-*", + "title": "Collect Azure Functions logs" + }, + { + "dataset": "metrics", + "index_pattern": "logs-azure_functions.metrics-*", + "title": "Azure Functions App Metrics" + } + ], + "elser_embedding": "Azure Functions - Get metrics and logs from Azure Functions - Collect Azure Functions logs Azure Functions App Metrics" + }, + { + "title": "SentinelOne Cloud Funnel", + "id": "sentinel_one_cloud_funnel", + "description": "Collect logs from SentinelOne Cloud Funnel with Elastic Agent.", + "data_streams": [ + { + "dataset": "threat_intelligence_indicators", + "index_pattern": "logs-sentinel_one_cloud_funnel.threat_intelligence_indicators-*", + "title": "SentinelOne Cloud Funnel Threat Intelligence Indicator Events" + }, + { + "dataset": "scheduled_task", + "index_pattern": "logs-sentinel_one_cloud_funnel.scheduled_task-*", + "title": "SentinelOne Cloud Funnel Scheduled Task Events" + }, + { + "dataset": "cross_process", + "index_pattern": "logs-sentinel_one_cloud_funnel.cross_process-*", + "title": "SentinelOne Cloud Funnel cross_process Events" + }, + { + "dataset": "url", + "index_pattern": "logs-sentinel_one_cloud_funnel.url-*", + "title": "SentinelOne Cloud Funnel URL Events" + }, + { + "dataset": "file", + "index_pattern": "logs-sentinel_one_cloud_funnel.file-*", + "title": "SentinelOne Cloud Funnel File Events" + }, + { + "dataset": "module", + "index_pattern": "logs-sentinel_one_cloud_funnel.module-*", + "title": "SentinelOne Cloud Funnel Module Events" + }, + { + "dataset": "process", + "index_pattern": "logs-sentinel_one_cloud_funnel.process-*", + "title": "SentinelOne Cloud Funnel Process Events" + }, + { + "dataset": "dns", + "index_pattern": "logs-sentinel_one_cloud_funnel.dns-*", + "title": "SentinelOne Cloud Funnel dns Events" + }, + { + "dataset": "logins", + "index_pattern": "logs-sentinel_one_cloud_funnel.logins-*", + "title": "SentinelOne Cloud Funnel Logins Events" + }, + { + "dataset": "command_script", + "index_pattern": "logs-sentinel_one_cloud_funnel.command_script-*", + "title": "SentinelOne Cloud Funnel command_script Events" + }, + { + "dataset": "indicators", + "index_pattern": "logs-sentinel_one_cloud_funnel.indicators-*", + "title": "SentinelOne Cloud Funnel Indicator Events" + }, + { + "dataset": "event", + "index_pattern": "logs-sentinel_one_cloud_funnel.event-*", + "title": "Collect Event logs from SentinelOne Cloud Funnel." + }, + { + "dataset": "ip", + "index_pattern": "logs-sentinel_one_cloud_funnel.ip-*", + "title": "SentinelOne Cloud Funnel IP Events" + }, + { + "dataset": "registry", + "index_pattern": "logs-sentinel_one_cloud_funnel.registry-*", + "title": "SentinelOne Cloud Funnel Registry Events" + } + ], + "elser_embedding": "SentinelOne Cloud Funnel - Collect logs from SentinelOne Cloud Funnel with Elastic Agent. - SentinelOne Cloud Funnel Threat Intelligence Indicator Events SentinelOne Cloud Funnel Scheduled Task Events SentinelOne Cloud Funnel cross_process Events SentinelOne Cloud Funnel URL Events SentinelOne Cloud Funnel File Events SentinelOne Cloud Funnel Module Events SentinelOne Cloud Funnel Process Events SentinelOne Cloud Funnel dns Events SentinelOne Cloud Funnel Logins Events SentinelOne Cloud Funnel command_script Events SentinelOne Cloud Funnel Indicator Events Collect Event logs from SentinelOne Cloud Funnel. SentinelOne Cloud Funnel IP Events SentinelOne Cloud Funnel Registry Events" + }, + { + "title": "Cisco Meraki", + "id": "cisco_meraki", + "description": "Collect logs from Cisco Meraki with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_meraki.log-*", + "title": "Cisco Meraki logs (via Syslog)" + }, + { + "dataset": "events", + "index_pattern": "logs-cisco_meraki.events-*", + "title": "Cisco Meraki webhook events" + } + ], + "elser_embedding": "Cisco Meraki - Collect logs from Cisco Meraki with Elastic Agent. - Cisco Meraki logs (via Syslog) Cisco Meraki webhook events" + }, + { + "title": "Osquery Manager", + "id": "osquery_manager", + "description": "Deploy Osquery with Elastic Agent, then run and schedule queries in Kibana", + "data_streams": [ + { + "dataset": "result", + "index_pattern": "logs-osquery_manager.result-*", + "title": "Osquery Manager queries" + }, + { + "dataset": "action_responses", + "index_pattern": "logs-osquery_manager.action_responses-*", + "title": "Osquery Manager queries" + } + ], + "elser_embedding": "Osquery Manager - Deploy Osquery with Elastic Agent, then run and schedule queries in Kibana - Osquery Manager queries Osquery Manager queries" + }, + { + "title": "ModSecurity Audit", + "id": "modsecurity", + "description": "Collect logs from ModSecurity with Elastic Agent", + "data_streams": [ + { + "dataset": "auditlog", + "index_pattern": "logs-modsecurity.auditlog-*", + "title": "Modsecurity Audit Log" + } + ], + "elser_embedding": "ModSecurity Audit - Collect logs from ModSecurity with Elastic Agent - Modsecurity Audit Log" + }, + { + "title": "pfSense", + "id": "pfsense", + "description": "Collect logs from pfSense and OPNsense with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-pfsense.log-*", + "title": "pfSense log logs" + } + ], + "elser_embedding": "pfSense - Collect logs from pfSense and OPNsense with Elastic Agent. - pfSense log logs" + }, + { + "title": "Ceph", + "id": "ceph", + "description": "This Elastic integration collects metrics from Ceph instance.", + "data_streams": [ + { + "dataset": "cluster_disk", + "index_pattern": "logs-ceph.cluster_disk-*", + "title": "Cluster Disk metrics" + }, + { + "dataset": "osd_pool_stats", + "index_pattern": "logs-ceph.osd_pool_stats-*", + "title": "OSD Pool Stats" + }, + { + "dataset": "cluster_status", + "index_pattern": "logs-ceph.cluster_status-*", + "title": "Cluster Status metrics" + }, + { + "dataset": "pool_disk", + "index_pattern": "logs-ceph.pool_disk-*", + "title": "Pool Disk metrics" + }, + { + "dataset": "osd_tree", + "index_pattern": "logs-ceph.osd_tree-*", + "title": "OSD Tree metrics" + }, + { + "dataset": "osd_performance", + "index_pattern": "logs-ceph.osd_performance-*", + "title": "OSD Performance metrics" + }, + { + "dataset": "cluster_health", + "index_pattern": "logs-ceph.cluster_health-*", + "title": "Cluster Health metrics" + } + ], + "elser_embedding": "Ceph - This Elastic integration collects metrics from Ceph instance. - Cluster Disk metrics OSD Pool Stats Cluster Status metrics Pool Disk metrics OSD Tree metrics OSD Performance metrics Cluster Health metrics" + }, + { + "title": "Maltiverse", + "id": "ti_maltiverse", + "description": "Ingest threat intelligence indicators from Maltiverse feeds with Elastic Agent", + "data_streams": [ + { + "dataset": "indicator", + "index_pattern": "logs-ti_maltiverse.indicator-*", + "title": "Maltiverse indicator" + } + ], + "elser_embedding": "Maltiverse - Ingest threat intelligence indicators from Maltiverse feeds with Elastic Agent - Maltiverse indicator" + }, + { + "title": "Imperva", + "id": "imperva", + "description": "Collect logs from Imperva devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "securesphere", + "index_pattern": "logs-imperva.securesphere-*", + "title": "Collect logs from Imperva SecureSphere" + } + ], + "elser_embedding": "Imperva - Collect logs from Imperva devices with Elastic Agent. - Collect logs from Imperva SecureSphere" + }, + { + "title": "Linux Metrics", + "id": "linux", + "description": "Collect metrics from Linux servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-linux.memory-*", + "title": "Linux-only memory metrics" + }, + { + "dataset": "socket", + "index_pattern": "logs-linux.socket-*", + "title": "System socket metrics" + }, + { + "dataset": "ksm", + "index_pattern": "logs-linux.ksm-*", + "title": "Kernel Samepage merging metrics" + }, + { + "dataset": "raid", + "index_pattern": "logs-linux.raid-*", + "title": "System raid metrics" + }, + { + "dataset": "conntrack", + "index_pattern": "logs-linux.conntrack-*", + "title": "System conntrack metrics" + }, + { + "dataset": "network_summary", + "index_pattern": "logs-linux.network_summary-*", + "title": "System network_summary metrics" + }, + { + "dataset": "users", + "index_pattern": "logs-linux.users-*", + "title": "System users metrics" + }, + { + "dataset": "service", + "index_pattern": "logs-linux.service-*", + "title": "System service metrics" + }, + { + "dataset": "pageinfo", + "index_pattern": "logs-linux.pageinfo-*", + "title": "System page info metrics" + }, + { + "dataset": "iostat", + "index_pattern": "logs-linux.iostat-*", + "title": "Linux disk iostat metrics" + }, + { + "dataset": "entropy", + "index_pattern": "logs-linux.entropy-*", + "title": "System entropy metrics" + } + ], + "elser_embedding": "Linux Metrics - Collect metrics from Linux servers with Elastic Agent. - Linux-only memory metrics System socket metrics Kernel Samepage merging metrics System raid metrics System conntrack metrics System network_summary metrics System users metrics System service metrics System page info metrics Linux disk iostat metrics System entropy metrics" + }, + { + "title": "Cybereason", + "id": "cybereason", + "description": "Collect logs from Cybereason with Elastic Agent.", + "data_streams": [ + { + "dataset": "logon_session", + "index_pattern": "logs-cybereason.logon_session-*", + "title": "Collect Logon Session logs from Cybereason." + }, + { + "dataset": "poll_malop", + "index_pattern": "logs-cybereason.poll_malop-*", + "title": "Collect Poll Malop logs from Cybereason." + }, + { + "dataset": "suspicions_process", + "index_pattern": "logs-cybereason.suspicions_process-*", + "title": "Collect Suspicions Process logs from Cybereason." + }, + { + "dataset": "malop_process", + "index_pattern": "logs-cybereason.malop_process-*", + "title": "Collect Malop Process logs from Cybereason." + }, + { + "dataset": "malop_connection", + "index_pattern": "logs-cybereason.malop_connection-*", + "title": "Collect Malop Connection logs from Cybereason." + }, + { + "dataset": "malware", + "index_pattern": "logs-cybereason.malware-*", + "title": "Collect Malware logs from Cybereason." + } + ], + "elser_embedding": "Cybereason - Collect logs from Cybereason with Elastic Agent. - Collect Logon Session logs from Cybereason. Collect Poll Malop logs from Cybereason. Collect Suspicions Process logs from Cybereason. Collect Malop Process logs from Cybereason. Collect Malop Connection logs from Cybereason. Collect Malware logs from Cybereason." + }, + { + "title": "Kafka", + "id": "kafka", + "description": "Collect logs and metrics from Kafka servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "broker", + "index_pattern": "logs-kafka.broker-*", + "title": "Kafka broker metrics" + }, + { + "dataset": "consumergroup", + "index_pattern": "logs-kafka.consumergroup-*", + "title": "Kafka consumergroup metrics" + }, + { + "dataset": "partition", + "index_pattern": "logs-kafka.partition-*", + "title": "Kafka partition metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-kafka.log-*", + "title": "Kafka log logs" + } + ], + "elser_embedding": "Kafka - Collect logs and metrics from Kafka servers with Elastic Agent. - Kafka broker metrics Kafka consumergroup metrics Kafka partition metrics Kafka log logs" + }, + { + "title": "Sophos Central", + "id": "sophos_central", + "description": "This Elastic integration collects logs from Sophos Central with Elastic Agent.", + "data_streams": [ + { + "dataset": "alert", + "index_pattern": "logs-sophos_central.alert-*", + "title": "Collect Sophos Central SIEM Alert logs" + }, + { + "dataset": "event", + "index_pattern": "logs-sophos_central.event-*", + "title": "Collect Sophos Central SIEM Events logs" + } + ], + "elser_embedding": "Sophos Central - This Elastic integration collects logs from Sophos Central with Elastic Agent. - Collect Sophos Central SIEM Alert logs Collect Sophos Central SIEM Events logs" + }, + { + "title": "PostgreSQL", + "id": "postgresql", + "description": "Collect logs and metrics from PostgreSQL servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "bgwriter", + "index_pattern": "logs-postgresql.bgwriter-*", + "title": "PostgreSQL bgwriter metrics" + }, + { + "dataset": "database", + "index_pattern": "logs-postgresql.database-*", + "title": "PostgreSQL database metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-postgresql.log-*", + "title": "PostgreSQL logs" + }, + { + "dataset": "statement", + "index_pattern": "logs-postgresql.statement-*", + "title": "PostgreSQL statement metrics" + }, + { + "dataset": "activity", + "index_pattern": "logs-postgresql.activity-*", + "title": "PostgreSQL activity metrics" + } + ], + "elser_embedding": "PostgreSQL - Collect logs and metrics from PostgreSQL servers with Elastic Agent. - PostgreSQL bgwriter metrics PostgreSQL database metrics PostgreSQL logs PostgreSQL statement metrics PostgreSQL activity metrics" + }, + { + "title": "Corelight", + "id": "corelight", + "description": "Collect logs from Corelight with Elastic Agent.", + "data_streams": [], + "elser_embedding": "Corelight - Collect logs from Corelight with Elastic Agent. - " + }, + { + "title": "Threat Intelligence Utilities", + "id": "ti_util", + "description": "Prebuilt Threat Intelligence dashboard for Elastic Security", + "data_streams": [], + "elser_embedding": "Threat Intelligence Utilities - Prebuilt Threat Intelligence dashboard for Elastic Security - " + }, + { + "title": "Imperva Cloud WAF", + "id": "imperva_cloud_waf", + "description": "Collect logs from Imperva Cloud WAF with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-imperva_cloud_waf.event-*", + "title": "Collect Imperva Cloud WAF Events" + } + ], + "elser_embedding": "Imperva Cloud WAF - Collect logs from Imperva Cloud WAF with Elastic Agent. - Collect Imperva Cloud WAF Events" + }, + { + "title": "File Integrity Monitoring", + "id": "fim", + "description": "The File Integrity Monitoring integration reports filesystem changes in real time.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-fim.event-*", + "title": "Filesystem events" + } + ], + "elser_embedding": "File Integrity Monitoring - The File Integrity Monitoring integration reports filesystem changes in real time. - Filesystem events" + }, + { + "title": "Custom Websocket logs", + "id": "websocket", + "description": "Collect custom events from a socket server with Elastic agent.", + "data_streams": [], + "elser_embedding": "Custom Websocket logs - Collect custom events from a socket server with Elastic agent. - " + }, + { + "title": "SpyCloud Enterprise Protection", + "id": "spycloud", + "description": "Collect data from SpyCloud Enterprise Protection with Elastic Agent.", + "data_streams": [ + { + "dataset": "compass", + "index_pattern": "logs-spycloud.compass-*", + "title": "Collect Compass logs from SpyCloud Enterprise Protection." + }, + { + "dataset": "breach_record", + "index_pattern": "logs-spycloud.breach_record-*", + "title": "Collect Breach Record logs from SpyCloud Enterprise Protection." + }, + { + "dataset": "breach_catalog", + "index_pattern": "logs-spycloud.breach_catalog-*", + "title": "Collect Breach Catalog logs from SpyCloud Enterprise Protection." + } + ], + "elser_embedding": "SpyCloud Enterprise Protection - Collect data from SpyCloud Enterprise Protection with Elastic Agent. - Collect Compass logs from SpyCloud Enterprise Protection. Collect Breach Record logs from SpyCloud Enterprise Protection. Collect Breach Catalog logs from SpyCloud Enterprise Protection." + }, + { + "title": "Canva", + "id": "canva", + "description": "Collect logs from Canva with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-canva.audit-*", + "title": "Collect Audit Logs from Canva" + } + ], + "elser_embedding": "Canva - Collect logs from Canva with Elastic Agent. - Collect Audit Logs from Canva" + }, + { + "title": "Microsoft Office 365", + "id": "o365", + "description": "Collect logs from Microsoft Office 365 with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-o365.audit-*", + "title": "Microsoft Office 365 audit logs" + } + ], + "elser_embedding": "Microsoft Office 365 - Collect logs from Microsoft Office 365 with Elastic Agent. - Microsoft Office 365 audit logs" + }, + { + "title": "AWS", + "id": "aws", + "description": "Collect logs and metrics from Amazon Web Services (AWS) with Elastic Agent.", + "data_streams": [ + { + "dataset": "ec2_metrics", + "index_pattern": "logs-aws.ec2_metrics-*", + "title": "AWS EC2 metrics" + }, + { + "dataset": "apigateway_metrics", + "index_pattern": "logs-aws.apigateway_metrics-*", + "title": "AWS API Gateway metrics" + }, + { + "dataset": "ec2_logs", + "index_pattern": "logs-aws.ec2_logs-*", + "title": "AWS EC2 logs" + }, + { + "dataset": "cloudwatch_logs", + "index_pattern": "logs-aws.cloudwatch_logs-*", + "title": "AWS CloudWatch logs" + }, + { + "dataset": "billing", + "index_pattern": "logs-aws.billing-*", + "title": "AWS Billing Metrics" + }, + { + "dataset": "ebs", + "index_pattern": "logs-aws.ebs-*", + "title": "AWS EBS metrics" + }, + { + "dataset": "awshealth", + "index_pattern": "logs-aws.awshealth-*", + "title": "AWS Health" + }, + { + "dataset": "transitgateway", + "index_pattern": "logs-aws.transitgateway-*", + "title": "AWS Transit Gateway metrics" + }, + { + "dataset": "cloudtrail", + "index_pattern": "logs-aws.cloudtrail-*", + "title": "AWS CloudTrail Logs" + }, + { + "dataset": "vpn", + "index_pattern": "logs-aws.vpn-*", + "title": "AWS VPN metrics" + }, + { + "dataset": "sns", + "index_pattern": "logs-aws.sns-*", + "title": "AWS SNS metrics" + }, + { + "dataset": "firewall_metrics", + "index_pattern": "logs-aws.firewall_metrics-*", + "title": "AWS Network Firewall metrics" + }, + { + "dataset": "waf", + "index_pattern": "logs-aws.waf-*", + "title": "AWS WAF logs" + }, + { + "dataset": "emr_metrics", + "index_pattern": "logs-aws.emr_metrics-*", + "title": "AWS EMR metrics" + }, + { + "dataset": "firewall_logs", + "index_pattern": "logs-aws.firewall_logs-*", + "title": "AWS Network Firewall logs" + }, + { + "dataset": "lambda", + "index_pattern": "logs-aws.lambda-*", + "title": "AWS Lambda metrics" + }, + { + "dataset": "securityhub_insights", + "index_pattern": "logs-aws.securityhub_insights-*", + "title": "Collect AWS Security Hub Insights logs from AWS" + }, + { + "dataset": "redshift", + "index_pattern": "logs-aws.redshift-*", + "title": "Amazon Redshift metrics" + }, + { + "dataset": "inspector", + "index_pattern": "logs-aws.inspector-*", + "title": "Collect AWS Inspector logs from AWS" + }, + { + "dataset": "route53_resolver_logs", + "index_pattern": "logs-aws.route53_resolver_logs-*", + "title": "AWS Route 53 Resolver Query Logs" + }, + { + "dataset": "emr_logs", + "index_pattern": "logs-aws.emr_logs-*", + "title": "AWS EMR logs" + }, + { + "dataset": "elb_metrics", + "index_pattern": "logs-aws.elb_metrics-*", + "title": "AWS ELB metrics" + }, + { + "dataset": "s3access", + "index_pattern": "logs-aws.s3access-*", + "title": "AWS s3access logs" + }, + { + "dataset": "securityhub_findings", + "index_pattern": "logs-aws.securityhub_findings-*", + "title": "Collect AWS Security Hub Findings logs from AWS" + }, + { + "dataset": "vpcflow", + "index_pattern": "logs-aws.vpcflow-*", + "title": "AWS vpcflow logs" + }, + { + "dataset": "elb_logs", + "index_pattern": "logs-aws.elb_logs-*", + "title": "AWS ELB logs" + }, + { + "dataset": "kafka_metrics", + "index_pattern": "logs-aws.kafka_metrics-*", + "title": "AWS Kafka metrics" + }, + { + "dataset": "kinesis", + "index_pattern": "logs-aws.kinesis-*", + "title": "AWS Kinesis Data Stream metrics" + }, + { + "dataset": "cloudwatch_metrics", + "index_pattern": "logs-aws.cloudwatch_metrics-*", + "title": "AWS CloudWatch metrics" + }, + { + "dataset": "s3_daily_storage", + "index_pattern": "logs-aws.s3_daily_storage-*", + "title": "AWS S3 daily storage metrics" + }, + { + "dataset": "guardduty", + "index_pattern": "logs-aws.guardduty-*", + "title": "Collect Amazon GuardDuty Findings logs from AWS" + }, + { + "dataset": "rds", + "index_pattern": "logs-aws.rds-*", + "title": "AWS RDS metrics" + }, + { + "dataset": "ecs_metrics", + "index_pattern": "logs-aws.ecs_metrics-*", + "title": "AWS ECS metrics" + }, + { + "dataset": "s3_storage_lens", + "index_pattern": "logs-aws.s3_storage_lens-*", + "title": "AWS S3 Storage Lens metrics" + }, + { + "dataset": "route53_public_logs", + "index_pattern": "logs-aws.route53_public_logs-*", + "title": "AWS Route 53 Public Zone Logs" + }, + { + "dataset": "cloudfront_logs", + "index_pattern": "logs-aws.cloudfront_logs-*", + "title": "AWS CloudFront logs" + }, + { + "dataset": "usage", + "index_pattern": "logs-aws.usage-*", + "title": "AWS usage metrics" + }, + { + "dataset": "dynamodb", + "index_pattern": "logs-aws.dynamodb-*", + "title": "AWS DynamoDB metrics" + }, + { + "dataset": "apigateway_logs", + "index_pattern": "logs-aws.apigateway_logs-*", + "title": "AWS API Gateway logs" + }, + { + "dataset": "s3_request", + "index_pattern": "logs-aws.s3_request-*", + "title": "AWS S3 request metrics" + }, + { + "dataset": "sqs", + "index_pattern": "logs-aws.sqs-*", + "title": "AWS SQS metrics" + }, + { + "dataset": "natgateway", + "index_pattern": "logs-aws.natgateway-*", + "title": "AWS NAT gateway metrics" + } + ], + "elser_embedding": "AWS - Collect logs and metrics from Amazon Web Services (AWS) with Elastic Agent. - AWS EC2 metrics AWS API Gateway metrics AWS EC2 logs AWS CloudWatch logs AWS Billing Metrics AWS EBS metrics AWS Health AWS Transit Gateway metrics AWS CloudTrail Logs AWS VPN metrics AWS SNS metrics AWS Network Firewall metrics AWS WAF logs AWS EMR metrics AWS Network Firewall logs AWS Lambda metrics Collect AWS Security Hub Insights logs from AWS Amazon Redshift metrics Collect AWS Inspector logs from AWS AWS Route 53 Resolver Query Logs AWS EMR logs AWS ELB metrics AWS s3access logs Collect AWS Security Hub Findings logs from AWS AWS vpcflow logs AWS ELB logs AWS Kafka metrics AWS Kinesis Data Stream metrics AWS CloudWatch metrics AWS S3 daily storage metrics Collect Amazon GuardDuty Findings logs from AWS AWS RDS metrics AWS ECS metrics AWS S3 Storage Lens metrics AWS Route 53 Public Zone Logs AWS CloudFront logs AWS usage metrics AWS DynamoDB metrics AWS API Gateway logs AWS S3 request metrics AWS SQS metrics AWS NAT gateway metrics" + }, + { + "title": "Nginx Ingress Controller Logs", + "id": "nginx_ingress_controller", + "description": "Collect Nginx Ingress Controller logs.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-nginx_ingress_controller.access-*", + "title": "Nginx Ingress Controller access logs" + }, + { + "dataset": "error", + "index_pattern": "logs-nginx_ingress_controller.error-*", + "title": "Nginx Ingress Controller error logs" + } + ], + "elser_embedding": "Nginx Ingress Controller Logs - Collect Nginx Ingress Controller logs. - Nginx Ingress Controller access logs Nginx Ingress Controller error logs" + }, + { + "title": "Cisco Umbrella", + "id": "cisco_umbrella", + "description": "Collect logs from Cisco Umbrella with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_umbrella.log-*", + "title": "Cisco Umbrella logs" + } + ], + "elser_embedding": "Cisco Umbrella - Collect logs from Cisco Umbrella with Elastic Agent. - Cisco Umbrella logs" + }, + { + "title": "Cloudflare Logpush", + "id": "cloudflare_logpush", + "description": "Collect and parse logs from Cloudflare API with Elastic Agent.", + "data_streams": [ + { + "dataset": "http_request", + "index_pattern": "logs-cloudflare_logpush.http_request-*", + "title": "Collect HTTP Request logs from Cloudflare" + }, + { + "dataset": "access_request", + "index_pattern": "logs-cloudflare_logpush.access_request-*", + "title": "Collect Access Request logs from Cloudflare" + }, + { + "dataset": "network_session", + "index_pattern": "logs-cloudflare_logpush.network_session-*", + "title": "Collect Zero Trust Network Session logs from Cloudflare" + }, + { + "dataset": "spectrum_event", + "index_pattern": "logs-cloudflare_logpush.spectrum_event-*", + "title": "Collect Spectrum Event logs from Cloudflare" + }, + { + "dataset": "gateway_http", + "index_pattern": "logs-cloudflare_logpush.gateway_http-*", + "title": "Collect Gateway HTTP logs from Cloudflare" + }, + { + "dataset": "casb", + "index_pattern": "logs-cloudflare_logpush.casb-*", + "title": "Collect CASB Findings logs from Cloudflare" + }, + { + "dataset": "magic_ids", + "index_pattern": "logs-cloudflare_logpush.magic_ids-*", + "title": "Collect Magic IDS logs from Cloudflare" + }, + { + "dataset": "workers_trace", + "index_pattern": "logs-cloudflare_logpush.workers_trace-*", + "title": "Collect Workers Trace Event logs from Cloudflare" + }, + { + "dataset": "audit", + "index_pattern": "logs-cloudflare_logpush.audit-*", + "title": "Collect Audit logs from Cloudflare" + }, + { + "dataset": "nel_report", + "index_pattern": "logs-cloudflare_logpush.nel_report-*", + "title": "Collect NEL Report logs from Cloudflare" + }, + { + "dataset": "network_analytics", + "index_pattern": "logs-cloudflare_logpush.network_analytics-*", + "title": "Collect Network Analytics logs from Cloudflare" + }, + { + "dataset": "dns", + "index_pattern": "logs-cloudflare_logpush.dns-*", + "title": "Collect DNS logs from Cloudflare" + }, + { + "dataset": "device_posture", + "index_pattern": "logs-cloudflare_logpush.device_posture-*", + "title": "Collect Device Posture Results logs from Cloudflare" + }, + { + "dataset": "gateway_dns", + "index_pattern": "logs-cloudflare_logpush.gateway_dns-*", + "title": "Collect Gateway DNS logs from Cloudflare" + }, + { + "dataset": "dns_firewall", + "index_pattern": "logs-cloudflare_logpush.dns_firewall-*", + "title": "Collect DNS Firewall logs from Cloudflare" + }, + { + "dataset": "sinkhole_http", + "index_pattern": "logs-cloudflare_logpush.sinkhole_http-*", + "title": "Collect Sinkhole HTTP logs from Cloudflare" + }, + { + "dataset": "firewall_event", + "index_pattern": "logs-cloudflare_logpush.firewall_event-*", + "title": "Collect Firewall Event logs from Cloudflare" + }, + { + "dataset": "gateway_network", + "index_pattern": "logs-cloudflare_logpush.gateway_network-*", + "title": "Collect Gateway Network logs from Cloudflare" + } + ], + "elser_embedding": "Cloudflare Logpush - Collect and parse logs from Cloudflare API with Elastic Agent. - Collect HTTP Request logs from Cloudflare Collect Access Request logs from Cloudflare Collect Zero Trust Network Session logs from Cloudflare Collect Spectrum Event logs from Cloudflare Collect Gateway HTTP logs from Cloudflare Collect CASB Findings logs from Cloudflare Collect Magic IDS logs from Cloudflare Collect Workers Trace Event logs from Cloudflare Collect Audit logs from Cloudflare Collect NEL Report logs from Cloudflare Collect Network Analytics logs from Cloudflare Collect DNS logs from Cloudflare Collect Device Posture Results logs from Cloudflare Collect Gateway DNS logs from Cloudflare Collect DNS Firewall logs from Cloudflare Collect Sinkhole HTTP logs from Cloudflare Collect Firewall Event logs from Cloudflare Collect Gateway Network logs from Cloudflare" + }, + { + "title": "Microsoft DHCP", + "id": "microsoft_dhcp", + "description": "Collect logs from Microsoft DHCP with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-microsoft_dhcp.log-*", + "title": "Microsoft DHCP Logs" + } + ], + "elser_embedding": "Microsoft DHCP - Collect logs from Microsoft DHCP with Elastic Agent. - Microsoft DHCP Logs" + }, + { + "title": "Netskope", + "id": "netskope", + "description": "Collect logs from Netskope with Elastic Agent.", + "data_streams": [ + { + "dataset": "alerts", + "index_pattern": "logs-netskope.alerts-*", + "title": "Alerts" + }, + { + "dataset": "events", + "index_pattern": "logs-netskope.events-*", + "title": "Events" + } + ], + "elser_embedding": "Netskope - Collect logs from Netskope with Elastic Agent. - Alerts Events" + }, + { + "title": "Suricata", + "id": "suricata", + "description": "Collect logs from Suricata with Elastic Agent.", + "data_streams": [ + { + "dataset": "eve", + "index_pattern": "logs-suricata.eve-*", + "title": "Suricata eve logs" + } + ], + "elser_embedding": "Suricata - Collect logs from Suricata with Elastic Agent. - Suricata eve logs" + }, + { + "title": "Custom Azure Logs", + "id": "azure_logs", + "description": "Collect log events from Azure Event Hubs with Elastic Agent", + "data_streams": [], + "elser_embedding": "Custom Azure Logs - Collect log events from Azure Event Hubs with Elastic Agent - " + }, + { + "title": "Zscaler Private Access", + "id": "zscaler_zpa", + "description": "Collect logs from Zscaler Private Access (ZPA) with Elastic Agent.", + "data_streams": [ + { + "dataset": "browser_access", + "index_pattern": "logs-zscaler_zpa.browser_access-*", + "title": "Browser Access Logs" + }, + { + "dataset": "app_connector_status", + "index_pattern": "logs-zscaler_zpa.app_connector_status-*", + "title": "App Connector Status Logs" + }, + { + "dataset": "user_status", + "index_pattern": "logs-zscaler_zpa.user_status-*", + "title": "User Status Logs" + }, + { + "dataset": "audit", + "index_pattern": "logs-zscaler_zpa.audit-*", + "title": "Audit Logs" + }, + { + "dataset": "user_activity", + "index_pattern": "logs-zscaler_zpa.user_activity-*", + "title": "User Activity Logs" + } + ], + "elser_embedding": "Zscaler Private Access - Collect logs from Zscaler Private Access (ZPA) with Elastic Agent. - Browser Access Logs App Connector Status Logs User Status Logs Audit Logs User Activity Logs" + }, + { + "title": "Cisco Aironet", + "id": "cisco_aironet", + "description": "Integration for Cisco Aironet WLC Logs", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_aironet.log-*", + "title": "Cisco Aironet logs" + } + ], + "elser_embedding": "Cisco Aironet - Integration for Cisco Aironet WLC Logs - Cisco Aironet logs" + }, + { + "title": "Collective Intelligence Framework v3", + "id": "ti_cif3", + "description": "Ingest threat indicators from a Collective Intelligence Framework v3 instance with Elastic Agent.", + "data_streams": [ + { + "dataset": "feed", + "index_pattern": "logs-ti_cif3.feed-*", + "title": "CIFv3 Feed" + } + ], + "elser_embedding": "Collective Intelligence Framework v3 - Ingest threat indicators from a Collective Intelligence Framework v3 instance with Elastic Agent. - CIFv3 Feed" + }, + { + "title": "Bitwarden", + "id": "bitwarden", + "description": "Collect logs from Bitwarden with Elastic Agent.", + "data_streams": [ + { + "dataset": "group", + "index_pattern": "logs-bitwarden.group-*", + "title": "Collect Group logs from Bitwarden" + }, + { + "dataset": "policy", + "index_pattern": "logs-bitwarden.policy-*", + "title": "Collect Policy logs from Bitwarden" + }, + { + "dataset": "member", + "index_pattern": "logs-bitwarden.member-*", + "title": "Collect Member logs from Bitwarden" + }, + { + "dataset": "event", + "index_pattern": "logs-bitwarden.event-*", + "title": "Collect Event logs from Bitwarden" + }, + { + "dataset": "collection", + "index_pattern": "logs-bitwarden.collection-*", + "title": "Collect Collection logs from Bitwarden" + } + ], + "elser_embedding": "Bitwarden - Collect logs from Bitwarden with Elastic Agent. - Collect Group logs from Bitwarden Collect Policy logs from Bitwarden Collect Member logs from Bitwarden Collect Event logs from Bitwarden Collect Collection logs from Bitwarden" + }, + { + "title": "Kibana", + "id": "kibana", + "description": "Collect logs and metrics from Kibana with Elastic Agent.", + "data_streams": [ + { + "dataset": "node_actions", + "index_pattern": "logs-kibana.node_actions-*", + "title": "Kibana node_actions metrics" + }, + { + "dataset": "stats", + "index_pattern": "logs-kibana.stats-*", + "title": "Kibana stats metrics" + }, + { + "dataset": "audit", + "index_pattern": "logs-kibana.audit-*", + "title": "kibana audit logs" + }, + { + "dataset": "task_manager_metrics", + "index_pattern": "logs-kibana.task_manager_metrics-*", + "title": "Kibana task manager metrics" + }, + { + "dataset": "cluster_rules", + "index_pattern": "logs-kibana.cluster_rules-*", + "title": "Kibana cluster_rules metrics" + }, + { + "dataset": "background_task_utilization", + "index_pattern": "logs-kibana.background_task_utilization-*", + "title": "Kibana background task utilization metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-kibana.log-*", + "title": "Kibana logs" + }, + { + "dataset": "node_rules", + "index_pattern": "logs-kibana.node_rules-*", + "title": "Kibana node_rules metrics" + }, + { + "dataset": "status", + "index_pattern": "logs-kibana.status-*", + "title": "Kibana status metrics" + }, + { + "dataset": "cluster_actions", + "index_pattern": "logs-kibana.cluster_actions-*", + "title": "Kibana cluster_actions metrics" + } + ], + "elser_embedding": "Kibana - Collect logs and metrics from Kibana with Elastic Agent. - Kibana node_actions metrics Kibana stats metrics kibana audit logs Kibana task manager metrics Kibana cluster_rules metrics Kibana background task utilization metrics Kibana logs Kibana node_rules metrics Kibana status metrics Kibana cluster_actions metrics" + }, + { + "title": "Digital Guardian", + "id": "digital_guardian", + "description": "Collect logs from Digital Guardian with Elastic Agent.", + "data_streams": [ + { + "dataset": "arc", + "index_pattern": "logs-digital_guardian.arc-*", + "title": "Digital Guardian ARC Logs" + } + ], + "elser_embedding": "Digital Guardian - Collect logs from Digital Guardian with Elastic Agent. - Digital Guardian ARC Logs" + }, + { + "title": "MySQL", + "id": "mysql", + "description": "Collect logs and metrics from MySQL servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "performance", + "index_pattern": "logs-mysql.performance-*", + "title": "MySQL performance metrics" + }, + { + "dataset": "error", + "index_pattern": "logs-mysql.error-*", + "title": "MySQL error logs" + }, + { + "dataset": "slowlog", + "index_pattern": "logs-mysql.slowlog-*", + "title": "MySQL slowlog logs" + }, + { + "dataset": "galera_status", + "index_pattern": "logs-mysql.galera_status-*", + "title": "MySQL galera_status metrics" + }, + { + "dataset": "replica_status", + "index_pattern": "logs-mysql.replica_status-*", + "title": "Collect replica status metrics from mysql" + }, + { + "dataset": "status", + "index_pattern": "logs-mysql.status-*", + "title": "MySQL status metrics" + } + ], + "elser_embedding": "MySQL - Collect logs and metrics from MySQL servers with Elastic Agent. - MySQL performance metrics MySQL error logs MySQL slowlog logs MySQL galera_status metrics Collect replica status metrics from mysql MySQL status metrics" + }, + { + "title": "CISA Known Exploited Vulnerabilities", + "id": "cisa_kevs", + "description": "This package allows the ingest of known exploited vulnerabilities according to the Cybersecurity and Infrastructure Security Agency of the United States of America. This information could be used to enrich or track exisiting vulnerabilities that are known to be exploited in the wild.", + "data_streams": [ + { + "dataset": "vulnerability", + "index_pattern": "logs-cisa_kevs.vulnerability-*", + "title": "CISA Known Exploited Vulnerabilities List" + } + ], + "elser_embedding": "CISA Known Exploited Vulnerabilities - This package allows the ingest of known exploited vulnerabilities according to the Cybersecurity and Infrastructure Security Agency of the United States of America. This information could be used to enrich or track exisiting vulnerabilities that are known to be exploited in the wild. - CISA Known Exploited Vulnerabilities List" + }, + { + "title": "StormShield SNS", + "id": "stormshield", + "description": "Stormshield SNS integration.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-stormshield.log-*", + "title": "StormShield SNS logs" + } + ], + "elser_embedding": "StormShield SNS - Stormshield SNS integration. - StormShield SNS logs" + }, + { + "title": "1Password", + "id": "1password", + "description": "Collect logs from 1Password with Elastic Agent.", + "data_streams": [ + { + "dataset": "item_usages", + "index_pattern": "logs-1password.item_usages-*", + "title": "Collect 1Password item usages events" + }, + { + "dataset": "signin_attempts", + "index_pattern": "logs-1password.signin_attempts-*", + "title": "1Password sign-in attempt events" + }, + { + "dataset": "audit_events", + "index_pattern": "logs-1password.audit_events-*", + "title": "Collect 1Password audit events" + } + ], + "elser_embedding": "1Password - Collect logs from 1Password with Elastic Agent. - Collect 1Password item usages events 1Password sign-in attempt events Collect 1Password audit events" + }, + { + "title": "Azure Network Watcher NSG", + "id": "azure_network_watcher_nsg", + "description": "Collect logs from Azure Network Watcher NSG with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-azure_network_watcher_nsg.log-*", + "title": "Collect NSG logs from Azure Network Watcher" + } + ], + "elser_embedding": "Azure Network Watcher NSG - Collect logs from Azure Network Watcher NSG with Elastic Agent. - Collect NSG logs from Azure Network Watcher" + }, + { + "title": "WebSphere Application Server", + "id": "websphere_application_server", + "description": "Collects metrics from IBM WebSphere Application Server with Elastic Agent.", + "data_streams": [ + { + "dataset": "threadpool", + "index_pattern": "logs-websphere_application_server.threadpool-*", + "title": "ThreadPool metrics" + }, + { + "dataset": "servlet", + "index_pattern": "logs-websphere_application_server.servlet-*", + "title": "Servlet metrics" + }, + { + "dataset": "session_manager", + "index_pattern": "logs-websphere_application_server.session_manager-*", + "title": "Session Manager metrics" + }, + { + "dataset": "jdbc", + "index_pattern": "logs-websphere_application_server.jdbc-*", + "title": "JDBC metrics" + } + ], + "elser_embedding": "WebSphere Application Server - Collects metrics from IBM WebSphere Application Server with Elastic Agent. - ThreadPool metrics Servlet metrics Session Manager metrics JDBC metrics" + }, + { + "title": "GitLab", + "id": "gitlab", + "description": "Collect logs from GitLab with Elastic Agent.", + "data_streams": [ + { + "dataset": "sidekiq", + "index_pattern": "logs-gitlab.sidekiq-*", + "title": "GitLab Sidekiq logs" + }, + { + "dataset": "audit", + "index_pattern": "logs-gitlab.audit-*", + "title": "Audit" + }, + { + "dataset": "auth", + "index_pattern": "logs-gitlab.auth-*", + "title": "Auth" + }, + { + "dataset": "application", + "index_pattern": "logs-gitlab.application-*", + "title": "Application" + }, + { + "dataset": "pages", + "index_pattern": "logs-gitlab.pages-*", + "title": "GitLab Pages logs" + }, + { + "dataset": "production", + "index_pattern": "logs-gitlab.production-*", + "title": "GitLab Production logs" + }, + { + "dataset": "api", + "index_pattern": "logs-gitlab.api-*", + "title": "GitLab API logs" + } + ], + "elser_embedding": "GitLab - Collect logs from GitLab with Elastic Agent. - GitLab Sidekiq logs Audit Auth Application GitLab Pages logs GitLab Production logs GitLab API logs" + }, + { + "title": "Custom Logs", + "id": "log", + "description": "Collect custom logs with Elastic Agent.", + "data_streams": [], + "elser_embedding": "Custom Logs - Collect custom logs with Elastic Agent. - " + }, + { + "title": "Tenable Vulnerability Management", + "id": "tenable_io", + "description": "Collect logs from Tenable Vulnerability Management with Elastic Agent.", + "data_streams": [ + { + "dataset": "plugin", + "index_pattern": "logs-tenable_io.plugin-*", + "title": "Collect Plugin logs from Tenable Vulnerability Management" + }, + { + "dataset": "vulnerability", + "index_pattern": "logs-tenable_io.vulnerability-*", + "title": "Collect Vulnerability logs from Tenable Vulnerability Management" + }, + { + "dataset": "scan", + "index_pattern": "logs-tenable_io.scan-*", + "title": "Collect Scan logs from Tenable Vulnerability Management" + }, + { + "dataset": "asset", + "index_pattern": "logs-tenable_io.asset-*", + "title": "Collect Asset data from Tenable Vulnerability Management" + } + ], + "elser_embedding": "Tenable Vulnerability Management - Collect logs from Tenable Vulnerability Management with Elastic Agent. - Collect Plugin logs from Tenable Vulnerability Management Collect Vulnerability logs from Tenable Vulnerability Management Collect Scan logs from Tenable Vulnerability Management Collect Asset data from Tenable Vulnerability Management" + }, + { + "title": "Falco", + "id": "falco", + "description": "Collect events and alerts from Falco using Elastic Agent", + "data_streams": [ + { + "dataset": "alerts", + "index_pattern": "logs-falco.alerts-*", + "title": "Falco Alerts" + } + ], + "elser_embedding": "Falco - Collect events and alerts from Falco using Elastic Agent - Falco Alerts" + }, + { + "title": "Docker", + "id": "docker", + "description": "Collect metrics and logs from Docker instances with Elastic Agent.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-docker.memory-*", + "title": "Docker memory metrics" + }, + { + "dataset": "network", + "index_pattern": "logs-docker.network-*", + "title": "Docker network metrics" + }, + { + "dataset": "image", + "index_pattern": "logs-docker.image-*", + "title": "Docker image metrics" + }, + { + "dataset": "container", + "index_pattern": "logs-docker.container-*", + "title": "Docker container metrics" + }, + { + "dataset": "info", + "index_pattern": "logs-docker.info-*", + "title": "Docker info metrics" + }, + { + "dataset": "container_logs", + "index_pattern": "logs-docker.container_logs-*", + "title": "Docker container logs" + }, + { + "dataset": "diskio", + "index_pattern": "logs-docker.diskio-*", + "title": "Docker diskio metrics" + }, + { + "dataset": "event", + "index_pattern": "logs-docker.event-*", + "title": "Docker event metrics" + }, + { + "dataset": "healthcheck", + "index_pattern": "logs-docker.healthcheck-*", + "title": "Docker healthcheck metrics" + }, + { + "dataset": "cpu", + "index_pattern": "logs-docker.cpu-*", + "title": "Docker cpu metrics" + } + ], + "elser_embedding": "Docker - Collect metrics and logs from Docker instances with Elastic Agent. - Docker memory metrics Docker network metrics Docker image metrics Docker container metrics Docker info metrics Docker container logs Docker diskio metrics Docker event metrics Docker healthcheck metrics Docker cpu metrics" + }, + { + "title": "Elastic Synthetics Dashboards", + "id": "synthetics_dashboards", + "description": "Explore Elastic Synthetics metrics with these dashboards.", + "data_streams": [], + "elser_embedding": "Elastic Synthetics Dashboards - Explore Elastic Synthetics metrics with these dashboards. - " + }, + { + "title": "Azure Billing Metrics", + "id": "azure_billing", + "description": "Collect billing metrics with Elastic Agent.", + "data_streams": [ + { + "dataset": "billing", + "index_pattern": "logs-azure_billing.billing-*", + "title": "Azure Billing Metrics" + } + ], + "elser_embedding": "Azure Billing Metrics - Collect billing metrics with Elastic Agent. - Azure Billing Metrics" + }, + { + "title": "Couchbase", + "id": "couchbase", + "description": "Collect metrics from Couchbase databases with Elastic Agent.", + "data_streams": [ + { + "dataset": "cache", + "index_pattern": "logs-couchbase.cache-*", + "title": "Couchbase Sync Gateway Cache metrics." + }, + { + "dataset": "cbl_replication", + "index_pattern": "logs-couchbase.cbl_replication-*", + "title": "Couchbase Sync Gateway CBL Replications metrics" + }, + { + "dataset": "query_index", + "index_pattern": "logs-couchbase.query_index-*", + "title": "Query Index metrics" + }, + { + "dataset": "xdcr", + "index_pattern": "logs-couchbase.xdcr-*", + "title": "Couchbase XDCR Metrics" + }, + { + "dataset": "miscellaneous", + "index_pattern": "logs-couchbase.miscellaneous-*", + "title": "Couchbase Sync Gateway Delta Sync, Import, Security and GSI views metrics." + }, + { + "dataset": "node", + "index_pattern": "logs-couchbase.node-*", + "title": "Node metrics" + }, + { + "dataset": "resource", + "index_pattern": "logs-couchbase.resource-*", + "title": "Couchbase Sync Gateway Resource Utilization metrics." + }, + { + "dataset": "bucket", + "index_pattern": "logs-couchbase.bucket-*", + "title": "Couchbase bucket metrics" + }, + { + "dataset": "cluster", + "index_pattern": "logs-couchbase.cluster-*", + "title": "Couchbase cluster metrics" + }, + { + "dataset": "database_stats", + "index_pattern": "logs-couchbase.database_stats-*", + "title": "Couchbase Sync Gateway Database Stats metrics." + } + ], + "elser_embedding": "Couchbase - Collect metrics from Couchbase databases with Elastic Agent. - Couchbase Sync Gateway Cache metrics. Couchbase Sync Gateway CBL Replications metrics Query Index metrics Couchbase XDCR Metrics Couchbase Sync Gateway Delta Sync, Import, Security and GSI views metrics. Node metrics Couchbase Sync Gateway Resource Utilization metrics. Couchbase bucket metrics Couchbase cluster metrics Couchbase Sync Gateway Database Stats metrics." + }, + { + "title": "VMware Carbon Black Cloud", + "id": "carbon_black_cloud", + "description": "Collect logs from VMWare Carbon Black Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "watchlist_hit", + "index_pattern": "logs-carbon_black_cloud.watchlist_hit-*", + "title": "Watchlist Hit" + }, + { + "dataset": "asset_vulnerability_summary", + "index_pattern": "logs-carbon_black_cloud.asset_vulnerability_summary-*", + "title": "Asset Vulnerability Summary" + }, + { + "dataset": "endpoint_event", + "index_pattern": "logs-carbon_black_cloud.endpoint_event-*", + "title": "Endpoint Event" + }, + { + "dataset": "audit", + "index_pattern": "logs-carbon_black_cloud.audit-*", + "title": "Audit" + }, + { + "dataset": "alert", + "index_pattern": "logs-carbon_black_cloud.alert-*", + "title": "Alert" + }, + { + "dataset": "alert_v7", + "index_pattern": "logs-carbon_black_cloud.alert_v7-*", + "title": "Alert V7" + } + ], + "elser_embedding": "VMware Carbon Black Cloud - Collect logs from VMWare Carbon Black Cloud with Elastic Agent. - Watchlist Hit Asset Vulnerability Summary Endpoint Event Audit Alert Alert V7" + }, + { + "title": "Universal Profiling Symbolizer", + "id": "profiler_symbolizer", + "description": "Fleet-wide, whole-system, continuous profiling with zero instrumentation.", + "data_streams": [], + "elser_embedding": "Universal Profiling Symbolizer - Fleet-wide, whole-system, continuous profiling with zero instrumentation. - " + }, + { + "title": "Fortinet FortiProxy", + "id": "fortinet_fortiproxy", + "description": "Collect logs from Fortinet FortiProxy with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-fortinet_fortiproxy.log-*", + "title": "Collect logs from Fortinet FortiProxy" + } + ], + "elser_embedding": "Fortinet FortiProxy - Collect logs from Fortinet FortiProxy with Elastic Agent. - Collect logs from Fortinet FortiProxy" + }, + { + "title": "MongoDB Atlas", + "id": "mongodb_atlas", + "description": "This Elastic integration collects logs and metrics from MongoDB Atlas instance.", + "data_streams": [ + { + "dataset": "mongod_database", + "index_pattern": "logs-mongodb_atlas.mongod_database-*", + "title": "Collect Mongod Database logs from MongoDB Atlas" + }, + { + "dataset": "disk", + "index_pattern": "logs-mongodb_atlas.disk-*", + "title": "Collect Disk metrics from MongoDB Atlas" + }, + { + "dataset": "project", + "index_pattern": "logs-mongodb_atlas.project-*", + "title": "Collect Project logs from MongoDB Atlas" + }, + { + "dataset": "process", + "index_pattern": "logs-mongodb_atlas.process-*", + "title": "Collect Process metrics from MongoDB Atlas" + }, + { + "dataset": "alert", + "index_pattern": "logs-mongodb_atlas.alert-*", + "title": "Collect Alert logs from MongoDB Atlas" + }, + { + "dataset": "mongod_audit", + "index_pattern": "logs-mongodb_atlas.mongod_audit-*", + "title": "Collect Mongod Audit logs from MongoDB Atlas" + }, + { + "dataset": "organization", + "index_pattern": "logs-mongodb_atlas.organization-*", + "title": "Collect Organization logs from MongoDB Atlas" + }, + { + "dataset": "hardware", + "index_pattern": "logs-mongodb_atlas.hardware-*", + "title": "Collect Hardware metrics from MongoDB Atlas" + } + ], + "elser_embedding": "MongoDB Atlas - This Elastic integration collects logs and metrics from MongoDB Atlas instance. - Collect Mongod Database logs from MongoDB Atlas Collect Disk metrics from MongoDB Atlas Collect Project logs from MongoDB Atlas Collect Process metrics from MongoDB Atlas Collect Alert logs from MongoDB Atlas Collect Mongod Audit logs from MongoDB Atlas Collect Organization logs from MongoDB Atlas Collect Hardware metrics from MongoDB Atlas" + }, + { + "title": "Zero Networks", + "id": "zeronetworks", + "description": "Zero Networks Logs integration", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-zeronetworks.audit-*", + "title": "Zero Networks Audit Logs" + } + ], + "elser_embedding": "Zero Networks - Zero Networks Logs integration - Zero Networks Audit Logs" + }, + { + "title": "CockroachDB Metrics", + "id": "cockroachdb", + "description": "Collect metrics from CockroachDB servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "status", + "index_pattern": "logs-cockroachdb.status-*", + "title": "Status" + } + ], + "elser_embedding": "CockroachDB Metrics - Collect metrics from CockroachDB servers with Elastic Agent. - Status" + }, + { + "title": "Microsoft Exchange Server", + "id": "microsoft_exchange_server", + "description": "Collect logs from Microsoft Exchange Server with Elastic Agent.", + "data_streams": [ + { + "dataset": "imap4_pop3", + "index_pattern": "logs-microsoft_exchange_server.imap4_pop3-*", + "title": "Exchange Server IMAP4 POP3" + }, + { + "dataset": "httpproxy", + "index_pattern": "logs-microsoft_exchange_server.httpproxy-*", + "title": "Exchange HTTPProxy" + }, + { + "dataset": "smtp", + "index_pattern": "logs-microsoft_exchange_server.smtp-*", + "title": "Exchange SMTP" + }, + { + "dataset": "messagetracking", + "index_pattern": "logs-microsoft_exchange_server.messagetracking-*", + "title": "Exchange Messagetracking" + } + ], + "elser_embedding": "Microsoft Exchange Server - Collect logs from Microsoft Exchange Server with Elastic Agent. - Exchange Server IMAP4 POP3 Exchange HTTPProxy Exchange SMTP Exchange Messagetracking" + }, + { + "title": "Cisco Secure Email Gateway", + "id": "cisco_secure_email_gateway", + "description": "Collect logs from Cisco Secure Email Gateway with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_secure_email_gateway.log-*", + "title": "Cisco Secure Email Gateway logs" + } + ], + "elser_embedding": "Cisco Secure Email Gateway - Collect logs from Cisco Secure Email Gateway with Elastic Agent. - Cisco Secure Email Gateway logs" + }, + { + "title": "Prometheus Input", + "id": "prometheus_input", + "description": "Collects metrics from Prometheus exporter.", + "data_streams": [], + "elser_embedding": "Prometheus Input - Collects metrics from Prometheus exporter. - " + }, + { + "title": "PingOne", + "id": "ping_one", + "description": "Collect logs from PingOne with Elastic-Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-ping_one.audit-*", + "title": "Collect Audit logs from PingOne" + } + ], + "elser_embedding": "PingOne - Collect logs from PingOne with Elastic-Agent. - Collect Audit logs from PingOne" + }, + { + "title": "Squid Proxy", + "id": "squid", + "description": "Collect and parse logs from Squid devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-squid.log-*", + "title": "Squid logs" + } + ], + "elser_embedding": "Squid Proxy - Collect and parse logs from Squid devices with Elastic Agent. - Squid logs" + }, + { + "title": "Zoom", + "id": "zoom", + "description": "Collect logs from Zoom with Elastic Agent.", + "data_streams": [ + { + "dataset": "webhook", + "index_pattern": "logs-zoom.webhook-*", + "title": "Zoom webhook logs" + } + ], + "elser_embedding": "Zoom - Collect logs from Zoom with Elastic Agent. - Zoom webhook logs" + }, + { + "title": "Auth0", + "id": "auth0", + "description": "Collect logs from Auth0 with Elastic Agent.", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-auth0.logs-*", + "title": "Auth0 logs" + } + ], + "elser_embedding": "Auth0 - Collect logs from Auth0 with Elastic Agent. - Auth0 logs" + }, + { + "title": "Tomcat NetWitness Logs", + "id": "tomcat", + "description": "Collect and parse logs from Apache Tomcat servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-tomcat.log-*", + "title": "Apache Tomcat logs" + } + ], + "elser_embedding": "Tomcat NetWitness Logs - Collect and parse logs from Apache Tomcat servers with Elastic Agent. - Apache Tomcat logs" + }, + { + "title": "Auditd Logs", + "id": "auditd", + "description": "Collect logs from Linux audit daemon with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-auditd.log-*", + "title": "Auditd logs" + } + ], + "elser_embedding": "Auditd Logs - Collect logs from Linux audit daemon with Elastic Agent. - Auditd logs" + }, + { + "title": "SQL Input", + "id": "sql", + "description": "Collects Metrics by Quering on SQL Databases", + "data_streams": [], + "elser_embedding": "SQL Input - Collects Metrics by Quering on SQL Databases - " + }, + { + "title": "Azure Frontdoor", + "id": "azure_frontdoor", + "description": "This Elastic integration collects logs from Azure Frontdoor.", + "data_streams": [ + { + "dataset": "access", + "index_pattern": "logs-azure_frontdoor.access-*", + "title": "FrontDoor Access" + }, + { + "dataset": "waf", + "index_pattern": "logs-azure_frontdoor.waf-*", + "title": "FrontDoor WAF" + } + ], + "elser_embedding": "Azure Frontdoor - This Elastic integration collects logs from Azure Frontdoor. - FrontDoor Access FrontDoor WAF" + }, + { + "title": "Amazon Data Firehose", + "id": "awsfirehose", + "description": "Stream logs and metrics from Amazon Data Firehose into Elastic Cloud.", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-awsfirehose.logs-*", + "title": "Logs from Amazon Data Firehose" + }, + { + "dataset": "metrics", + "index_pattern": "logs-awsfirehose.metrics-*", + "title": "Metrics ingested from Amazon Data Firehose" + } + ], + "elser_embedding": "Amazon Data Firehose - Stream logs and metrics from Amazon Data Firehose into Elastic Cloud. - Logs from Amazon Data Firehose Metrics ingested from Amazon Data Firehose" + }, + { + "title": "Zscaler Internet Access", + "id": "zscaler_zia", + "description": "Collect logs from Zscaler Internet Access (ZIA) with Elastic Agent.", + "data_streams": [ + { + "dataset": "sandbox_report", + "index_pattern": "logs-zscaler_zia.sandbox_report-*", + "title": "Sandbox Report Logs" + }, + { + "dataset": "tunnel", + "index_pattern": "logs-zscaler_zia.tunnel-*", + "title": "Tunnel Logs" + }, + { + "dataset": "audit", + "index_pattern": "logs-zscaler_zia.audit-*", + "title": "Audit Logs" + }, + { + "dataset": "dns", + "index_pattern": "logs-zscaler_zia.dns-*", + "title": "DNS logs" + }, + { + "dataset": "web", + "index_pattern": "logs-zscaler_zia.web-*", + "title": "Web Logs" + }, + { + "dataset": "endpoint_dlp", + "index_pattern": "logs-zscaler_zia.endpoint_dlp-*", + "title": "Endpoint DLP Logs" + }, + { + "dataset": "alerts", + "index_pattern": "logs-zscaler_zia.alerts-*", + "title": "Alerts" + }, + { + "dataset": "firewall", + "index_pattern": "logs-zscaler_zia.firewall-*", + "title": "Firewall Logs" + } + ], + "elser_embedding": "Zscaler Internet Access - Collect logs from Zscaler Internet Access (ZIA) with Elastic Agent. - Sandbox Report Logs Tunnel Logs Audit Logs DNS logs Web Logs Endpoint DLP Logs Alerts Firewall Logs" + }, + { + "title": "Broadcom ProxySG", + "id": "proxysg", + "description": "Collect access logs from Broadcom ProxySG with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-proxysg.log-*", + "title": "ProxySG Access Logs" + } + ], + "elser_embedding": "Broadcom ProxySG - Collect access logs from Broadcom ProxySG with Elastic Agent. - ProxySG Access Logs" + }, + { + "title": "Juniper SRX", + "id": "juniper_srx", + "description": "Collect logs from Juniper SRX devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-juniper_srx.log-*", + "title": "Juniper SRX logs" + } + ], + "elser_embedding": "Juniper SRX - Collect logs from Juniper SRX devices with Elastic Agent. - Juniper SRX logs" + }, + { + "title": "ServiceNow", + "id": "servicenow", + "description": "Collect logs from ServiceNow with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-servicenow.event-*", + "title": "Event" + } + ], + "elser_embedding": "ServiceNow - Collect logs from ServiceNow with Elastic Agent. - Event" + }, + { + "title": "Defend for Containers", + "id": "cloud_defend", + "description": "Elastic Defend for Containers (BETA) provides cloud-native runtime protections for containerized environments.", + "data_streams": [ + { + "dataset": "heartbeat", + "index_pattern": "logs-cloud_defend.heartbeat-*", + "title": "Cloud Defend Liveness Heartbeat" + }, + { + "dataset": "file", + "index_pattern": "logs-cloud_defend.file-*", + "title": "File telemetry" + }, + { + "dataset": "process", + "index_pattern": "logs-cloud_defend.process-*", + "title": "Process telemetry" + }, + { + "dataset": "metrics", + "index_pattern": "logs-cloud_defend.metrics-*", + "title": "Cloud defend metrics" + }, + { + "dataset": "alerts", + "index_pattern": "logs-cloud_defend.alerts-*", + "title": "alerts" + } + ], + "elser_embedding": "Defend for Containers - Elastic Defend for Containers (BETA) provides cloud-native runtime protections for containerized environments. - Cloud Defend Liveness Heartbeat File telemetry Process telemetry Cloud defend metrics alerts" + }, + { + "title": "authentik", + "id": "authentik", + "description": "Collect logs from authentik with Elastic Agent.", + "data_streams": [ + { + "dataset": "group", + "index_pattern": "logs-authentik.group-*", + "title": "authentik group logs" + }, + { + "dataset": "event", + "index_pattern": "logs-authentik.event-*", + "title": "authentik event logs" + }, + { + "dataset": "user", + "index_pattern": "logs-authentik.user-*", + "title": "authentik user logs" + } + ], + "elser_embedding": "authentik - Collect logs from authentik with Elastic Agent. - authentik group logs authentik event logs authentik user logs" + }, + { + "title": "Wiz", + "id": "wiz", + "description": "Collect logs from Wiz with Elastic Agent.", + "data_streams": [ + { + "dataset": "issue", + "index_pattern": "logs-wiz.issue-*", + "title": "Collect Issue logs from Wiz." + }, + { + "dataset": "vulnerability", + "index_pattern": "logs-wiz.vulnerability-*", + "title": "Collect Vulnerability logs from Wiz." + }, + { + "dataset": "audit", + "index_pattern": "logs-wiz.audit-*", + "title": "Collect Audit logs from Wiz." + }, + { + "dataset": "cloud_configuration_finding", + "index_pattern": "logs-wiz.cloud_configuration_finding-*", + "title": "Collet Cloud Configuration Finding logs from Wiz." + } + ], + "elser_embedding": "Wiz - Collect logs from Wiz with Elastic Agent. - Collect Issue logs from Wiz. Collect Vulnerability logs from Wiz. Collect Audit logs from Wiz. Collet Cloud Configuration Finding logs from Wiz." + }, + { + "title": "Mattermost", + "id": "mattermost", + "description": "Collect logs from Mattermost with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-mattermost.audit-*", + "title": "Audit Logs" + } + ], + "elser_embedding": "Mattermost - Collect logs from Mattermost with Elastic Agent. - Audit Logs" + }, + { + "title": "Teleport", + "id": "teleport", + "description": "Collect logs from Teleport with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-teleport.audit-*", + "title": "Teleport audit logs" + } + ], + "elser_embedding": "Teleport - Collect logs from Teleport with Elastic Agent. - Teleport audit logs" + }, + { + "title": "Fleet Server", + "id": "fleet_server", + "description": "Centrally manage Elastic Agents with the Fleet Server integration.", + "data_streams": [ + { + "dataset": "agent_versions_metrics", + "index_pattern": "logs-fleet_server.agent_versions_metrics-*", + "title": "Fleet Agent Versions" + }, + { + "dataset": "agent_status_metrics", + "index_pattern": "logs-fleet_server.agent_status_metrics-*", + "title": "Fleet Agent Status" + }, + { + "dataset": "output_health_logs", + "index_pattern": "logs-fleet_server.output_health_logs-*", + "title": "Output Health" + } + ], + "elser_embedding": "Fleet Server - Centrally manage Elastic Agents with the Fleet Server integration. - Fleet Agent Versions Fleet Agent Status Output Health" + }, + { + "title": "Cisco Secure Endpoint", + "id": "cisco_secure_endpoint", + "description": "Collect logs from Cisco Secure Endpoint (AMP) with Elastic Agent.", + "data_streams": [ + { + "dataset": "event", + "index_pattern": "logs-cisco_secure_endpoint.event-*", + "title": "Cisco Secure Endpoint logs" + } + ], + "elser_embedding": "Cisco Secure Endpoint - Collect logs from Cisco Secure Endpoint (AMP) with Elastic Agent. - Cisco Secure Endpoint logs" + }, + { + "title": "Iptables", + "id": "iptables", + "description": "Collect logs from Iptables with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-iptables.log-*", + "title": "Iptables log logs" + } + ], + "elser_embedding": "Iptables - Collect logs from Iptables with Elastic Agent. - Iptables log logs" + }, + { + "title": "Google Workspace", + "id": "google_workspace", + "description": "Collect logs from Google Workspace with Elastic Agent.", + "data_streams": [ + { + "dataset": "user_accounts", + "index_pattern": "logs-google_workspace.user_accounts-*", + "title": "User accounts logs" + }, + { + "dataset": "device", + "index_pattern": "logs-google_workspace.device-*", + "title": "Device logs" + }, + { + "dataset": "admin", + "index_pattern": "logs-google_workspace.admin-*", + "title": "Admin logs" + }, + { + "dataset": "gcp", + "index_pattern": "logs-google_workspace.gcp-*", + "title": "GCP logs" + }, + { + "dataset": "group_enterprise", + "index_pattern": "logs-google_workspace.group_enterprise-*", + "title": "Group Enterprise logs" + }, + { + "dataset": "login", + "index_pattern": "logs-google_workspace.login-*", + "title": "Login logs" + }, + { + "dataset": "access_transparency", + "index_pattern": "logs-google_workspace.access_transparency-*", + "title": "Access Transparency logs" + }, + { + "dataset": "alert", + "index_pattern": "logs-google_workspace.alert-*", + "title": "Collect Alert logs from Google Workspace" + }, + { + "dataset": "context_aware_access", + "index_pattern": "logs-google_workspace.context_aware_access-*", + "title": "Context Aware Access logs" + }, + { + "dataset": "token", + "index_pattern": "logs-google_workspace.token-*", + "title": "Token logs" + }, + { + "dataset": "drive", + "index_pattern": "logs-google_workspace.drive-*", + "title": "Drive logs" + }, + { + "dataset": "groups", + "index_pattern": "logs-google_workspace.groups-*", + "title": "Groups logs" + }, + { + "dataset": "saml", + "index_pattern": "logs-google_workspace.saml-*", + "title": "SAML logs" + }, + { + "dataset": "rules", + "index_pattern": "logs-google_workspace.rules-*", + "title": "Rules logs" + } + ], + "elser_embedding": "Google Workspace - Collect logs from Google Workspace with Elastic Agent. - User accounts logs Device logs Admin logs GCP logs Group Enterprise logs Login logs Access Transparency logs Collect Alert logs from Google Workspace Context Aware Access logs Token logs Drive logs Groups logs SAML logs Rules logs" + }, + { + "title": "VMware Carbon Black EDR", + "id": "carbonblack_edr", + "description": "Collect logs from VMware Carbon Black EDR with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-carbonblack_edr.log-*", + "title": "Carbon Black EDR logs" + } + ], + "elser_embedding": "VMware Carbon Black EDR - Collect logs from VMware Carbon Black EDR with Elastic Agent. - Carbon Black EDR logs" + }, + { + "title": "Mimecast", + "id": "mimecast", + "description": "Collect logs from Mimecast with Elastic Agent.", + "data_streams": [ + { + "dataset": "dlp_logs", + "index_pattern": "logs-mimecast.dlp_logs-*", + "title": "DLP Mimecast Logs" + }, + { + "dataset": "ttp_url_logs", + "index_pattern": "logs-mimecast.ttp_url_logs-*", + "title": "TTP URL Logs" + }, + { + "dataset": "siem_logs", + "index_pattern": "logs-mimecast.siem_logs-*", + "title": "SIEM Mimecast Logs" + }, + { + "dataset": "message_release_logs", + "index_pattern": "logs-mimecast.message_release_logs-*", + "title": "Mimecast Message Release" + }, + { + "dataset": "ttp_ip_logs", + "index_pattern": "logs-mimecast.ttp_ip_logs-*", + "title": "TTP Impersonation Mimecast Logs" + }, + { + "dataset": "audit_events", + "index_pattern": "logs-mimecast.audit_events-*", + "title": "Audit Events Mimecast Logs" + }, + { + "dataset": "ttp_ap_logs", + "index_pattern": "logs-mimecast.ttp_ap_logs-*", + "title": "TTP Attachment Logs" + }, + { + "dataset": "archive_search_logs", + "index_pattern": "logs-mimecast.archive_search_logs-*", + "title": "Archive Search Mimecast Logs" + }, + { + "dataset": "threat_intel_malware_grid", + "index_pattern": "logs-mimecast.threat_intel_malware_grid-*", + "title": "Threat Intel Feed - Malware Grid" + }, + { + "dataset": "threat_intel_malware_customer", + "index_pattern": "logs-mimecast.threat_intel_malware_customer-*", + "title": "Threat Intel Feed - Malware Customer" + } + ], + "elser_embedding": "Mimecast - Collect logs from Mimecast with Elastic Agent. - DLP Mimecast Logs TTP URL Logs SIEM Mimecast Logs Mimecast Message Release TTP Impersonation Mimecast Logs Audit Events Mimecast Logs TTP Attachment Logs Archive Search Mimecast Logs Threat Intel Feed - Malware Grid Threat Intel Feed - Malware Customer" + }, + { + "title": "Oracle WebLogic", + "id": "oracle_weblogic", + "description": "Collect logs and metrics from Oracle WebLogic with Elastic Agent.", + "data_streams": [ + { + "dataset": "managed_server", + "index_pattern": "logs-oracle_weblogic.managed_server-*", + "title": "Managed Server logs" + }, + { + "dataset": "access", + "index_pattern": "logs-oracle_weblogic.access-*", + "title": "Access logs" + }, + { + "dataset": "threadpool", + "index_pattern": "logs-oracle_weblogic.threadpool-*", + "title": "Collect Oracle WebLogic ThreadPool metrics" + }, + { + "dataset": "deployed_application", + "index_pattern": "logs-oracle_weblogic.deployed_application-*", + "title": "Collect Oracle WebLogic Deployed Application metrics" + }, + { + "dataset": "admin_server", + "index_pattern": "logs-oracle_weblogic.admin_server-*", + "title": "Admin Server logs" + }, + { + "dataset": "domain", + "index_pattern": "logs-oracle_weblogic.domain-*", + "title": "Domain logs" + } + ], + "elser_embedding": "Oracle WebLogic - Collect logs and metrics from Oracle WebLogic with Elastic Agent. - Managed Server logs Access logs Collect Oracle WebLogic ThreadPool metrics Collect Oracle WebLogic Deployed Application metrics Admin Server logs Domain logs" + }, + { + "title": "System Audit", + "id": "system_audit", + "description": "Collect various logs & metrics from System Audit modules with Elastic Agent.", + "data_streams": [ + { + "dataset": "package", + "index_pattern": "logs-system_audit.package-*", + "title": "System Audit - [Package]" + } + ], + "elser_embedding": "System Audit - Collect various logs & metrics from System Audit modules with Elastic Agent. - System Audit - [Package]" + }, + { + "title": "Salesforce", + "id": "salesforce", + "description": "Collect logs from Salesforce instances using the Elastic Agent. This integration enables monitoring and analysis of various Salesforce logs, including Login, Logout, Setup Audit Trail, and Apex execution logs. Gain insights into user activity, security events, and application performance.\n", + "data_streams": [ + { + "dataset": "setupaudittrail", + "index_pattern": "logs-salesforce.setupaudittrail-*", + "title": "Salesforce setupaudittrail logs" + }, + { + "dataset": "login", + "index_pattern": "logs-salesforce.login-*", + "title": "Salesforce login logs" + }, + { + "dataset": "logout", + "index_pattern": "logs-salesforce.logout-*", + "title": "Salesforce logout logs" + }, + { + "dataset": "apex", + "index_pattern": "logs-salesforce.apex-*", + "title": "Salesforce Apex logs" + } + ], + "elser_embedding": "Salesforce - Collect logs from Salesforce instances using the Elastic Agent. This integration enables monitoring and analysis of various Salesforce logs, including Login, Logout, Setup Audit Trail, and Apex execution logs. Gain insights into user activity, security events, and application performance.\n - Salesforce setupaudittrail logs Salesforce login logs Salesforce logout logs Salesforce Apex logs" + }, + { + "title": "Azure Application Insights Metrics Overview", + "id": "azure_application_insights", + "description": "Collect application insights metrics from Azure Monitor with Elastic Agent.", + "data_streams": [ + { + "dataset": "app_insights", + "index_pattern": "logs-azure_application_insights.app_insights-*", + "title": "Azure Application Insights" + }, + { + "dataset": "app_state", + "index_pattern": "logs-azure_application_insights.app_state-*", + "title": "Azure Application State" + } + ], + "elser_embedding": "Azure Application Insights Metrics Overview - Collect application insights metrics from Azure Monitor with Elastic Agent. - Azure Application Insights Azure Application State" + }, + { + "title": "ForgeRock", + "id": "forgerock", + "description": "Collect audit logs from ForgeRock with Elastic Agent.", + "data_streams": [ + { + "dataset": "idm_sync", + "index_pattern": "logs-forgerock.idm_sync-*", + "title": "IDM-Sync audit logs" + }, + { + "dataset": "idm_core", + "index_pattern": "logs-forgerock.idm_core-*", + "title": "IDM-Core debug logs" + }, + { + "dataset": "am_access", + "index_pattern": "logs-forgerock.am_access-*", + "title": "AM-Access audit logs" + }, + { + "dataset": "idm_activity", + "index_pattern": "logs-forgerock.idm_activity-*", + "title": "IDM-Activity audit logs" + }, + { + "dataset": "idm_config", + "index_pattern": "logs-forgerock.idm_config-*", + "title": "IDM-Config audit logs" + }, + { + "dataset": "am_config", + "index_pattern": "logs-forgerock.am_config-*", + "title": "AM-Config audit logs" + }, + { + "dataset": "am_activity", + "index_pattern": "logs-forgerock.am_activity-*", + "title": "AM-Activity audit logs" + }, + { + "dataset": "am_authentication", + "index_pattern": "logs-forgerock.am_authentication-*", + "title": "AM-Authentication audit logs" + }, + { + "dataset": "idm_authentication", + "index_pattern": "logs-forgerock.idm_authentication-*", + "title": "IDM-Authentication audit logs" + }, + { + "dataset": "idm_access", + "index_pattern": "logs-forgerock.idm_access-*", + "title": "IDM-Access audit logs" + }, + { + "dataset": "am_core", + "index_pattern": "logs-forgerock.am_core-*", + "title": "AM-Core debug logs" + } + ], + "elser_embedding": "ForgeRock - Collect audit logs from ForgeRock with Elastic Agent. - IDM-Sync audit logs IDM-Core debug logs AM-Access audit logs IDM-Activity audit logs IDM-Config audit logs AM-Config audit logs AM-Activity audit logs AM-Authentication audit logs IDM-Authentication audit logs IDM-Access audit logs AM-Core debug logs" + }, + { + "title": "Tenable.sc", + "id": "tenable_sc", + "description": "Collect logs from Tenable.sc with Elastic Agent.\n", + "data_streams": [ + { + "dataset": "plugin", + "index_pattern": "logs-tenable_sc.plugin-*", + "title": "Tenable.sc plugin logs" + }, + { + "dataset": "vulnerability", + "index_pattern": "logs-tenable_sc.vulnerability-*", + "title": "Tenable.sc vulnerability logs" + }, + { + "dataset": "asset", + "index_pattern": "logs-tenable_sc.asset-*", + "title": "Tenable.sc asset logs" + } + ], + "elser_embedding": "Tenable.sc - Collect logs from Tenable.sc with Elastic Agent.\n - Tenable.sc plugin logs Tenable.sc vulnerability logs Tenable.sc asset logs" + }, + { + "title": "Cisco IOS", + "id": "cisco_ios", + "description": "Collect logs from Cisco IOS with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_ios.log-*", + "title": "Cisco IOS logs" + } + ], + "elser_embedding": "Cisco IOS - Collect logs from Cisco IOS with Elastic Agent. - Cisco IOS logs" + }, + { + "title": "ZooKeeper Metrics", + "id": "zookeeper", + "description": "Collect metrics from ZooKeeper service with Elastic Agent.", + "data_streams": [ + { + "dataset": "connection", + "index_pattern": "logs-zookeeper.connection-*", + "title": "ZooKeeper connection metrics" + }, + { + "dataset": "mntr", + "index_pattern": "logs-zookeeper.mntr-*", + "title": "ZooKeeper mntr metrics" + }, + { + "dataset": "server", + "index_pattern": "logs-zookeeper.server-*", + "title": "ZooKeeper server metrics" + } + ], + "elser_embedding": "ZooKeeper Metrics - Collect metrics from ZooKeeper service with Elastic Agent. - ZooKeeper connection metrics ZooKeeper mntr metrics ZooKeeper server metrics" + }, + { + "title": "Palo Alto Next-Gen Firewall", + "id": "panw", + "description": "Collect logs from Palo Alto next-gen firewalls with Elastic Agent.", + "data_streams": [ + { + "dataset": "panos", + "index_pattern": "logs-panw.panos-*", + "title": "Palo Alto Networks PAN-OS firewall logs" + } + ], + "elser_embedding": "Palo Alto Next-Gen Firewall - Collect logs from Palo Alto next-gen firewalls with Elastic Agent. - Palo Alto Networks PAN-OS firewall logs" + }, + { + "title": "Hadoop", + "id": "hadoop", + "description": "Collect metrics from Apache Hadoop with Elastic Agent.", + "data_streams": [ + { + "dataset": "namenode", + "index_pattern": "logs-hadoop.namenode-*", + "title": "NameNode Metrics" + }, + { + "dataset": "datanode", + "index_pattern": "logs-hadoop.datanode-*", + "title": "DataNode metrics" + }, + { + "dataset": "node_manager", + "index_pattern": "logs-hadoop.node_manager-*", + "title": "Node Manager metrics" + }, + { + "dataset": "application", + "index_pattern": "logs-hadoop.application-*", + "title": "Application metrics" + }, + { + "dataset": "cluster", + "index_pattern": "logs-hadoop.cluster-*", + "title": "Cluster metrics" + } + ], + "elser_embedding": "Hadoop - Collect metrics from Apache Hadoop with Elastic Agent. - NameNode Metrics DataNode metrics Node Manager metrics Application metrics Cluster metrics" + }, + { + "title": "InfluxDb", + "id": "influxdb", + "description": "Collect metrics from Influxdb database", + "data_streams": [ + { + "dataset": "advstatus", + "index_pattern": "logs-influxdb.advstatus-*", + "title": "InfluxDB database advanced status metrics" + }, + { + "dataset": "status", + "index_pattern": "logs-influxdb.status-*", + "title": "InfluxDB database status metrics" + } + ], + "elser_embedding": "InfluxDb - Collect metrics from Influxdb database - InfluxDB database advanced status metrics InfluxDB database status metrics" + }, + { + "title": "Sophos", + "id": "sophos", + "description": "Collect logs from Sophos with Elastic Agent.", + "data_streams": [ + { + "dataset": "xg", + "index_pattern": "logs-sophos.xg-*", + "title": "Sophos XG logs" + }, + { + "dataset": "utm", + "index_pattern": "logs-sophos.utm-*", + "title": "Sophos UTM logs" + } + ], + "elser_embedding": "Sophos - Collect logs from Sophos with Elastic Agent. - Sophos XG logs Sophos UTM logs" + }, + { + "title": "Menlo Security", + "id": "menlo", + "description": "Collect logs from Menlo Security products with Elastic Agent", + "data_streams": [ + { + "dataset": "dlp", + "index_pattern": "logs-menlo.dlp-*", + "title": "Collect Menlo DLP from Menlo Security API" + }, + { + "dataset": "web", + "index_pattern": "logs-menlo.web-*", + "title": "Collect Menlo Web from Menlo Security API" + } + ], + "elser_embedding": "Menlo Security - Collect logs from Menlo Security products with Elastic Agent - Collect Menlo DLP from Menlo Security API Collect Menlo Web from Menlo Security API" + }, + { + "title": "Barracuda Web Application Firewall", + "id": "barracuda", + "description": "Collect logs from Barracuda Web Application Firewall with Elastic Agent.", + "data_streams": [ + { + "dataset": "waf", + "index_pattern": "logs-barracuda.waf-*", + "title": "Barracuda WAF Logs" + } + ], + "elser_embedding": "Barracuda Web Application Firewall - Collect logs from Barracuda Web Application Firewall with Elastic Agent. - Barracuda WAF Logs" + }, + { + "title": "FireEye Network Security", + "id": "fireeye", + "description": "Collect logs from FireEye NX with Elastic Agent.", + "data_streams": [ + { + "dataset": "nx", + "index_pattern": "logs-fireeye.nx-*", + "title": "Fireeye NX" + } + ], + "elser_embedding": "FireEye Network Security - Collect logs from FireEye NX with Elastic Agent. - Fireeye NX" + }, + { + "title": "Tines", + "id": "tines", + "description": "Tines Logs & Time Saved Reports", + "data_streams": [ + { + "dataset": "time_saved", + "index_pattern": "logs-tines.time_saved-*", + "title": "Tines Time Saved Reports" + }, + { + "dataset": "audit_logs", + "index_pattern": "logs-tines.audit_logs-*", + "title": "Tines Audit Logs" + } + ], + "elser_embedding": "Tines - Tines Logs & Time Saved Reports - Tines Time Saved Reports Tines Audit Logs" + }, + { + "title": "Cisco Meraki Metrics", + "id": "cisco_meraki_metrics", + "description": "Collect metrics from Cisco Meraki with Elastic Agent.", + "data_streams": [ + { + "dataset": "device_health", + "index_pattern": "logs-cisco_meraki_metrics.device_health-*", + "title": "Cisco Meraki Device Health Metrics" + } + ], + "elser_embedding": "Cisco Meraki Metrics - Collect metrics from Cisco Meraki with Elastic Agent. - Cisco Meraki Device Health Metrics" + }, + { + "title": "VMware vSphere", + "id": "vsphere", + "description": "This Elastic integration collects metrics and logs from vSphere/vCenter servers", + "data_streams": [ + { + "dataset": "network", + "index_pattern": "logs-vsphere.network-*", + "title": "vSphere network metrics" + }, + { + "dataset": "resourcepool", + "index_pattern": "logs-vsphere.resourcepool-*", + "title": "vSphere resourcepool metrics" + }, + { + "dataset": "datastore", + "index_pattern": "logs-vsphere.datastore-*", + "title": "vSphere datastore metrics" + }, + { + "dataset": "virtualmachine", + "index_pattern": "logs-vsphere.virtualmachine-*", + "title": "vSphere virtual machine metrics" + }, + { + "dataset": "host", + "index_pattern": "logs-vsphere.host-*", + "title": "vSphere host metrics" + }, + { + "dataset": "datastorecluster", + "index_pattern": "logs-vsphere.datastorecluster-*", + "title": "vSphere DatastoreCluster metrics" + }, + { + "dataset": "log", + "index_pattern": "logs-vsphere.log-*", + "title": "vSphere Logs" + }, + { + "dataset": "cluster", + "index_pattern": "logs-vsphere.cluster-*", + "title": "vSphere cluster metrics" + } + ], + "elser_embedding": "VMware vSphere - This Elastic integration collects metrics and logs from vSphere/vCenter servers - vSphere network metrics vSphere resourcepool metrics vSphere datastore metrics vSphere virtual machine metrics vSphere host metrics vSphere DatastoreCluster metrics vSphere Logs vSphere cluster metrics" + }, + { + "title": "Platform Observability", + "id": "platform_observability", + "description": "Collect stack component logs with Elastic Agent", + "data_streams": [ + { + "dataset": "kibana_audit", + "index_pattern": "logs-platform_observability.kibana_audit-*", + "title": "Platform Observability Kibana audit logs" + }, + { + "dataset": "kibana_log", + "index_pattern": "logs-platform_observability.kibana_log-*", + "title": "Platform Observability Kibana logs" + } + ], + "elser_embedding": "Platform Observability - Collect stack component logs with Elastic Agent - Platform Observability Kibana audit logs Platform Observability Kibana logs" + }, + { + "title": "System", + "id": "system", + "description": "Collect system logs and metrics from your servers with Elastic Agent.", + "data_streams": [ + { + "dataset": "memory", + "index_pattern": "logs-system.memory-*", + "title": "System memory metrics" + }, + { + "dataset": "network", + "index_pattern": "logs-system.network-*", + "title": "System network metrics" + }, + { + "dataset": "uptime", + "index_pattern": "logs-system.uptime-*", + "title": "System uptime metrics" + }, + { + "dataset": "socket_summary", + "index_pattern": "logs-system.socket_summary-*", + "title": "System socket_summary metrics" + }, + { + "dataset": "auth", + "index_pattern": "logs-system.auth-*", + "title": "System auth logs" + }, + { + "dataset": "process", + "index_pattern": "logs-system.process-*", + "title": "System process metrics" + }, + { + "dataset": "load", + "index_pattern": "logs-system.load-*", + "title": "System load metrics" + }, + { + "dataset": "application", + "index_pattern": "logs-system.application-*", + "title": "Windows Application Events" + }, + { + "dataset": "diskio", + "index_pattern": "logs-system.diskio-*", + "title": "System diskio metrics" + }, + { + "dataset": "syslog", + "index_pattern": "logs-system.syslog-*", + "title": "System syslog logs" + }, + { + "dataset": "filesystem", + "index_pattern": "logs-system.filesystem-*", + "title": "System filesystem metrics" + }, + { + "dataset": "fsstat", + "index_pattern": "logs-system.fsstat-*", + "title": "System fsstat metrics" + }, + { + "dataset": "core", + "index_pattern": "logs-system.core-*", + "title": "System core metrics" + }, + { + "dataset": "cpu", + "index_pattern": "logs-system.cpu-*", + "title": "System cpu metrics" + }, + { + "dataset": "process_summary", + "index_pattern": "logs-system.process_summary-*", + "title": "System process_summary metrics" + }, + { + "dataset": "system", + "index_pattern": "logs-system.system-*", + "title": "Windows System Events" + }, + { + "dataset": "security", + "index_pattern": "logs-system.security-*", + "title": "Security logs" + } + ], + "elser_embedding": "System - Collect system logs and metrics from your servers with Elastic Agent. - System memory metrics System network metrics System uptime metrics System socket_summary metrics System auth logs System process metrics System load metrics Windows Application Events System diskio metrics System syslog logs System filesystem metrics System fsstat metrics System core metrics System cpu metrics System process_summary metrics Windows System Events Security logs" + }, + { + "title": "Airflow", + "id": "airflow", + "description": "Airflow Integration.", + "data_streams": [ + { + "dataset": "statsd", + "index_pattern": "logs-airflow.statsd-*", + "title": "Airflow metrics" + } + ], + "elser_embedding": "Airflow - Airflow Integration. - Airflow metrics" + }, + { + "title": "Custom Google Pub/Sub Logs", + "id": "gcp_pubsub", + "description": "Collect Logs from Google Pub/Sub topics", + "data_streams": [], + "elser_embedding": "Custom Google Pub/Sub Logs - Collect Logs from Google Pub/Sub topics - " + }, + { + "title": "Beat", + "id": "beat", + "description": "Beat Integration", + "data_streams": [], + "elser_embedding": "Beat - Beat Integration - " + }, + { + "title": "Cyberark Privileged Threat Analytics", + "id": "cyberark_pta", + "description": "Collect security logs from Cyberark PTA integration.", + "data_streams": [ + { + "dataset": "events", + "index_pattern": "logs-cyberark_pta.events-*", + "title": "CyberArk PTA logs" + } + ], + "elser_embedding": "Cyberark Privileged Threat Analytics - Collect security logs from Cyberark PTA integration. - CyberArk PTA logs" + }, + { + "title": "Trellix ePO Cloud", + "id": "trellix_epo_cloud", + "description": "Collect logs from Trellix ePO Cloud with Elastic Agent.", + "data_streams": [ + { + "dataset": "device", + "index_pattern": "logs-trellix_epo_cloud.device-*", + "title": "Collect Device logs from Trellix ePO Cloud." + }, + { + "dataset": "group", + "index_pattern": "logs-trellix_epo_cloud.group-*", + "title": "Collect Group logs from Trellix ePO Cloud." + }, + { + "dataset": "event", + "index_pattern": "logs-trellix_epo_cloud.event-*", + "title": "Collect Event logs from Trellix ePO Cloud." + } + ], + "elser_embedding": "Trellix ePO Cloud - Collect logs from Trellix ePO Cloud with Elastic Agent. - Collect Device logs from Trellix ePO Cloud. Collect Group logs from Trellix ePO Cloud. Collect Event logs from Trellix ePO Cloud." + }, + { + "title": "Vectra Detect", + "id": "vectra_detect", + "description": "Collect logs from Vectra Detect with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-vectra_detect.log-*", + "title": "Collect logs from Vectra Detect" + } + ], + "elser_embedding": "Vectra Detect - Collect logs from Vectra Detect with Elastic Agent. - Collect logs from Vectra Detect" + }, + { + "title": "Atlassian Confluence", + "id": "atlassian_confluence", + "description": "Collect logs from Atlassian Confluence with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-atlassian_confluence.audit-*", + "title": "Confluence Audit Logs" + } + ], + "elser_embedding": "Atlassian Confluence - Collect logs from Atlassian Confluence with Elastic Agent. - Confluence Audit Logs" + }, + { + "title": "QNAP NAS", + "id": "qnap_nas", + "description": "Collect logs from QNAP NAS devices with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-qnap_nas.log-*", + "title": "QNAP NAS logs" + } + ], + "elser_embedding": "QNAP NAS - Collect logs from QNAP NAS devices with Elastic Agent. - QNAP NAS logs" + }, + { + "title": "Memcached", + "id": "memcached", + "description": "Memcached Integration", + "data_streams": [ + { + "dataset": "stats", + "index_pattern": "logs-memcached.stats-*", + "title": "Memcached stats metrics" + } + ], + "elser_embedding": "Memcached - Memcached Integration - Memcached stats metrics" + }, + { + "title": "Azure Resource Metrics", + "id": "azure_metrics", + "description": "Collect metrics from Azure resources with Elastic Agent.", + "data_streams": [ + { + "dataset": "container_service", + "index_pattern": "logs-azure_metrics.container_service-*", + "title": "Container Service" + }, + { + "dataset": "container_instance", + "index_pattern": "logs-azure_metrics.container_instance-*", + "title": "Container Instance" + }, + { + "dataset": "compute_vm", + "index_pattern": "logs-azure_metrics.compute_vm-*", + "title": "Compute VM" + }, + { + "dataset": "monitor", + "index_pattern": "logs-azure_metrics.monitor-*", + "title": "Monitor" + }, + { + "dataset": "storage_account", + "index_pattern": "logs-azure_metrics.storage_account-*", + "title": "Storage Account" + }, + { + "dataset": "compute_vm_scaleset", + "index_pattern": "logs-azure_metrics.compute_vm_scaleset-*", + "title": "Compute VM Scaleset" + }, + { + "dataset": "database_account", + "index_pattern": "logs-azure_metrics.database_account-*", + "title": "Database Account" + }, + { + "dataset": "container_registry", + "index_pattern": "logs-azure_metrics.container_registry-*", + "title": "Container Registry" + } + ], + "elser_embedding": "Azure Resource Metrics - Collect metrics from Azure resources with Elastic Agent. - Container Service Container Instance Compute VM Monitor Storage Account Compute VM Scaleset Database Account Container Registry" + }, + { + "title": "Elastic Connectors", + "id": "elastic_connectors", + "description": "Sync data from source to the Elasticsearch index.", + "data_streams": [], + "elser_embedding": "Elastic Connectors - Sync data from source to the Elasticsearch index. - " + }, + { + "title": "StatsD Input", + "id": "statsd_input", + "description": "StatsD Input Package", + "data_streams": [], + "elser_embedding": "StatsD Input - StatsD Input Package - " + }, + { + "title": "Cloudflare", + "id": "cloudflare", + "description": "Collect logs from Cloudflare with Elastic Agent.", + "data_streams": [ + { + "dataset": "logpull", + "index_pattern": "logs-cloudflare.logpull-*", + "title": "Cloudflare Logpull" + }, + { + "dataset": "audit", + "index_pattern": "logs-cloudflare.audit-*", + "title": "Cloudflare Audit Logs" + } + ], + "elser_embedding": "Cloudflare - Collect logs from Cloudflare with Elastic Agent. - Cloudflare Logpull Cloudflare Audit Logs" + }, + { + "title": "Cribl", + "id": "cribl", + "description": "Stream logs from Cribl into Elastic.", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-cribl.logs-*", + "title": "Logs" + } + ], + "elser_embedding": "Cribl - Stream logs from Cribl into Elastic. - Logs" + }, + { + "title": "PHP-FPM", + "id": "php_fpm", + "description": "This Elastic integration collects metrics from PHP-FPM.", + "data_streams": [ + { + "dataset": "process", + "index_pattern": "logs-php_fpm.process-*", + "title": "Process metrics" + }, + { + "dataset": "pool", + "index_pattern": "logs-php_fpm.pool-*", + "title": "Pool metrics" + } + ], + "elser_embedding": "PHP-FPM - This Elastic integration collects metrics from PHP-FPM. - Process metrics Pool metrics" + }, + { + "title": "Azure Logs", + "id": "azure", + "description": "This Elastic integration collects logs from Azure", + "data_streams": [ + { + "dataset": "platformlogs", + "index_pattern": "logs-azure.platformlogs-*", + "title": "Azure Platform Logs" + }, + { + "dataset": "auditlogs", + "index_pattern": "logs-azure.auditlogs-*", + "title": "Azure Audit Logs" + }, + { + "dataset": "springcloudlogs", + "index_pattern": "logs-azure.springcloudlogs-*", + "title": "Azure Spring Apps Logs" + }, + { + "dataset": "signinlogs", + "index_pattern": "logs-azure.signinlogs-*", + "title": "Azure Signin Logs" + }, + { + "dataset": "firewall_logs", + "index_pattern": "logs-azure.firewall_logs-*", + "title": "Collect Network rule logs from Azure Firewall" + }, + { + "dataset": "graphactivitylogs", + "index_pattern": "logs-azure.graphactivitylogs-*", + "title": "Microsoft Graph Activity Logs" + }, + { + "dataset": "application_gateway", + "index_pattern": "logs-azure.application_gateway-*", + "title": "Azure Application Gateway logs" + }, + { + "dataset": "eventhub", + "index_pattern": "logs-azure.eventhub-*", + "title": "Azure Event Hub Input" + }, + { + "dataset": "provisioning", + "index_pattern": "logs-azure.provisioning-*", + "title": "Microsoft Entra ID Provisioning Logs" + }, + { + "dataset": "activitylogs", + "index_pattern": "logs-azure.activitylogs-*", + "title": "Azure Activity Logs" + }, + { + "dataset": "identity_protection", + "index_pattern": "logs-azure.identity_protection-*", + "title": "Microsoft Entra ID Identity Protection Logs" + } + ], + "elser_embedding": "Azure Logs - This Elastic integration collects logs from Azure - Azure Platform Logs Azure Audit Logs Azure Spring Apps Logs Azure Signin Logs Collect Network rule logs from Azure Firewall Microsoft Graph Activity Logs Azure Application Gateway logs Azure Event Hub Input Microsoft Entra ID Provisioning Logs Azure Activity Logs Microsoft Entra ID Identity Protection Logs" + }, + { + "title": "Palo Alto Networks Metrics", + "id": "panw_metrics", + "description": "Collect metrics from Palo Alto Networks with Elastic Agent.", + "data_streams": [ + { + "dataset": "vpn", + "index_pattern": "logs-panw_metrics.vpn-*", + "title": "Palo Alto Networks VPN metrics" + }, + { + "dataset": "interfaces", + "index_pattern": "logs-panw_metrics.interfaces-*", + "title": "Palo Alto Networks Interfaces metrics" + }, + { + "dataset": "system", + "index_pattern": "logs-panw_metrics.system-*", + "title": "Palo Alto Networks System metrics" + }, + { + "dataset": "routing", + "index_pattern": "logs-panw_metrics.routing-*", + "title": "Palo Alto Networks Routing metrics" + } + ], + "elser_embedding": "Palo Alto Networks Metrics - Collect metrics from Palo Alto Networks with Elastic Agent. - Palo Alto Networks VPN metrics Palo Alto Networks Interfaces metrics Palo Alto Networks System metrics Palo Alto Networks Routing metrics" + }, + { + "title": "Custom Threat Intelligence", + "id": "ti_custom", + "description": "Ingest threat intelligence data in STIX 2.1 format with Elastic Agent", + "data_streams": [ + { + "dataset": "indicator", + "index_pattern": "logs-ti_custom.indicator-*", + "title": "STIX 2.1 indicators" + } + ], + "elser_embedding": "Custom Threat Intelligence - Ingest threat intelligence data in STIX 2.1 format with Elastic Agent - STIX 2.1 indicators" + }, + { + "title": "Check Point Harmony Endpoint", + "id": "checkpoint_harmony_endpoint", + "description": "Collect logs from Check Point Harmony Endpoint", + "data_streams": [ + { + "dataset": "urlfiltering", + "index_pattern": "logs-checkpoint_harmony_endpoint.urlfiltering-*", + "title": "URL Filtering" + }, + { + "dataset": "forensics", + "index_pattern": "logs-checkpoint_harmony_endpoint.forensics-*", + "title": "Forensics" + }, + { + "dataset": "antibot", + "index_pattern": "logs-checkpoint_harmony_endpoint.antibot-*", + "title": "Anti-Bot" + }, + { + "dataset": "threatemulation", + "index_pattern": "logs-checkpoint_harmony_endpoint.threatemulation-*", + "title": "Threat Emulation" + }, + { + "dataset": "threatextraction", + "index_pattern": "logs-checkpoint_harmony_endpoint.threatextraction-*", + "title": "Threat Extraction" + }, + { + "dataset": "zerophishing", + "index_pattern": "logs-checkpoint_harmony_endpoint.zerophishing-*", + "title": "Zero Phishing" + }, + { + "dataset": "antimalware", + "index_pattern": "logs-checkpoint_harmony_endpoint.antimalware-*", + "title": "Anti-Malware" + } + ], + "elser_embedding": "Check Point Harmony Endpoint - Collect logs from Check Point Harmony Endpoint - URL Filtering Forensics Anti-Bot Threat Emulation Threat Extraction Zero Phishing Anti-Malware" + }, + { + "title": "Thycotic Secret Server", + "id": "thycotic_ss", + "description": "Thycotic Secret Server logs", + "data_streams": [ + { + "dataset": "logs", + "index_pattern": "logs-thycotic_ss.logs-*", + "title": "Thycotic Secret Server Logs" + } + ], + "elser_embedding": "Thycotic Secret Server - Thycotic Secret Server logs - Thycotic Secret Server Logs" + }, + { + "title": "Custom HTTP Endpoint Logs", + "id": "http_endpoint", + "description": "Collect JSON data from listening HTTP port with Elastic Agent.", + "data_streams": [], + "elser_embedding": "Custom HTTP Endpoint Logs - Collect JSON data from listening HTTP port with Elastic Agent. - " + }, + { + "title": "Atlassian Bitbucket", + "id": "atlassian_bitbucket", + "description": "Collect logs from Atlassian Bitbucket with Elastic Agent.", + "data_streams": [ + { + "dataset": "audit", + "index_pattern": "logs-atlassian_bitbucket.audit-*", + "title": "Bitbucket Audit Logs" + } + ], + "elser_embedding": "Atlassian Bitbucket - Collect logs from Atlassian Bitbucket with Elastic Agent. - Bitbucket Audit Logs" + }, + { + "title": "TYCHON Agentless", + "id": "tychon", + "description": "Collect complete master endpoint datasets including vulnerability and STIG to comply with DISA endpoint requirements and C2C without adding services to your endpoints.", + "data_streams": [ + { + "dataset": "systemcerts", + "index_pattern": "logs-tychon.systemcerts-*", + "title": "System Certificates" + }, + { + "dataset": "stig", + "index_pattern": "logs-tychon.stig-*", + "title": "Endpoint STIG Results" + }, + { + "dataset": "softwareinventory", + "index_pattern": "logs-tychon.softwareinventory-*", + "title": "Endpoint Software Inventory Info" + }, + { + "dataset": "coams", + "index_pattern": "logs-tychon.coams-*", + "title": "Endpoint Operational Attributes (Requires DATT)" + }, + { + "dataset": "harddrive", + "index_pattern": "logs-tychon.harddrive-*", + "title": "Endpoint Harddrive Info" + }, + { + "dataset": "host", + "index_pattern": "logs-tychon.host-*", + "title": "Host Operating System Info" + }, + { + "dataset": "cve", + "index_pattern": "logs-tychon.cve-*", + "title": "Vulnerabilites" + }, + { + "dataset": "externaldevicecontrol", + "index_pattern": "logs-tychon.externaldevicecontrol-*", + "title": "Endpoint External Device Control" + }, + { + "dataset": "cmrs", + "index_pattern": "logs-tychon.cmrs-*", + "title": "DISA Continuous Monitoring and Risk Scoring Data" + }, + { + "dataset": "arp", + "index_pattern": "logs-tychon.arp-*", + "title": "Endpoint Arp Table Information" + }, + { + "dataset": "ciphers", + "index_pattern": "logs-tychon.ciphers-*", + "title": "Certificate Ciphers" + }, + { + "dataset": "features", + "index_pattern": "logs-tychon.features-*", + "title": "Features Info" + }, + { + "dataset": "epp", + "index_pattern": "logs-tychon.epp-*", + "title": "Endpoint Protection Platform Info" + }, + { + "dataset": "cpu", + "index_pattern": "logs-tychon.cpu-*", + "title": "Endpoint CPU Info" + }, + { + "dataset": "browser", + "index_pattern": "logs-tychon.browser-*", + "title": "Endpoint Browser Configurations" + }, + { + "dataset": "exposedservice", + "index_pattern": "logs-tychon.exposedservice-*", + "title": "Endpoint Exposed Services" + }, + { + "dataset": "volume", + "index_pattern": "logs-tychon.volume-*", + "title": "Endpoint Volumes Info" + }, + { + "dataset": "hardware", + "index_pattern": "logs-tychon.hardware-*", + "title": "Hardware Info" + }, + { + "dataset": "networkadapter", + "index_pattern": "logs-tychon.networkadapter-*", + "title": "Network Adapters" + } + ], + "elser_embedding": "TYCHON Agentless - Collect complete master endpoint datasets including vulnerability and STIG to comply with DISA endpoint requirements and C2C without adding services to your endpoints. - System Certificates Endpoint STIG Results Endpoint Software Inventory Info Endpoint Operational Attributes (Requires DATT) Endpoint Harddrive Info Host Operating System Info Vulnerabilites Endpoint External Device Control DISA Continuous Monitoring and Risk Scoring Data Endpoint Arp Table Information Certificate Ciphers Features Info Endpoint Protection Platform Info Endpoint CPU Info Endpoint Browser Configurations Endpoint Exposed Services Endpoint Volumes Info Hardware Info Network Adapters" + }, + { + "title": "Proofpoint On Demand", + "id": "proofpoint_on_demand", + "description": "Collect logs from Proofpoint On Demand with Elastic Agent.", + "data_streams": [ + { + "dataset": "message", + "index_pattern": "logs-proofpoint_on_demand.message-*", + "title": "Proofpoint On Demand Message logs" + }, + { + "dataset": "audit", + "index_pattern": "logs-proofpoint_on_demand.audit-*", + "title": "Proofpoint On Demand Audit logs" + }, + { + "dataset": "mail", + "index_pattern": "logs-proofpoint_on_demand.mail-*", + "title": "Proofpoint On Demand Mail logs" + } + ], + "elser_embedding": "Proofpoint On Demand - Collect logs from Proofpoint On Demand with Elastic Agent. - Proofpoint On Demand Message logs Proofpoint On Demand Audit logs Proofpoint On Demand Mail logs" + }, + { + "title": "Cisco ASA", + "id": "cisco_asa", + "description": "Collect logs from Cisco ASA with Elastic Agent.", + "data_streams": [ + { + "dataset": "log", + "index_pattern": "logs-cisco_asa.log-*", + "title": "Cisco ASA logs" + } + ], + "elser_embedding": "Cisco ASA - Collect logs from Cisco ASA with Elastic Agent. - Cisco ASA logs" + }, + { + "title": "Amazon Security Lake", + "id": "amazon_security_lake", + "description": "Collect logs from Amazon Security Lake with Elastic Agent.", + "data_streams": [ + { + "dataset": "network_activity", + "index_pattern": "logs-amazon_security_lake.network_activity-*", + "title": "Amazon Security Lake Network Activity Events" + }, + { + "dataset": "application_activity", + "index_pattern": "logs-amazon_security_lake.application_activity-*", + "title": "Amazon Security Lake Application Activity Events" + }, + { + "dataset": "discovery", + "index_pattern": "logs-amazon_security_lake.discovery-*", + "title": "Amazon Security Lake Discovery Events" + }, + { + "dataset": "findings", + "index_pattern": "logs-amazon_security_lake.findings-*", + "title": "Amazon Security Lake Findings Events" + }, + { + "dataset": "system_activity", + "index_pattern": "logs-amazon_security_lake.system_activity-*", + "title": "Amazon Security Lake System Activity Events" + }, + { + "dataset": "event", + "index_pattern": "logs-amazon_security_lake.event-*", + "title": "Collect Amazon Security Lake Events" + }, + { + "dataset": "iam", + "index_pattern": "logs-amazon_security_lake.iam-*", + "title": "Amazon Security Lake Identity and Access Management Events" + } + ], + "elser_embedding": "Amazon Security Lake - Collect logs from Amazon Security Lake with Elastic Agent. - Amazon Security Lake Network Activity Events Amazon Security Lake Application Activity Events Amazon Security Lake Discovery Events Amazon Security Lake Findings Events Amazon Security Lake System Activity Events Collect Amazon Security Lake Events Amazon Security Lake Identity and Access Management Events" + }, + { + "title": "Azure App Service", + "id": "azure_app_service", + "description": "Collect logs from Azure App Service with Elastic Agent.", + "data_streams": [ + { + "dataset": "app_service_logs", + "index_pattern": "logs-azure_app_service.app_service_logs-*", + "title": "Collect App Service logs from Azure" + } + ], + "elser_embedding": "Azure App Service - Collect logs from Azure App Service with Elastic Agent. - Collect App Service logs from Azure" + }, + { + "title": "ESET PROTECT", + "id": "eset_protect", + "description": "Collect logs from ESET PROTECT with Elastic Agent.", + "data_streams": [ + { + "dataset": "device_task", + "index_pattern": "logs-eset_protect.device_task-*", + "title": "Collect Device Task logs from ESET PROTECT" + }, + { + "dataset": "detection", + "index_pattern": "logs-eset_protect.detection-*", + "title": "Collect Detection logs from ESET PROTECT" + }, + { + "dataset": "event", + "index_pattern": "logs-eset_protect.event-*", + "title": "Collect Event logs from ESET PROTECT" + } + ], + "elser_embedding": "ESET PROTECT - Collect logs from ESET PROTECT with Elastic Agent. - Collect Device Task logs from ESET PROTECT Collect Detection logs from ESET PROTECT Collect Event logs from ESET PROTECT" + }, + { + "id": "endpoint", + "title": "Elastic Defend", + "description": "windows linux osx dns network process suspicious user registry host host-based endpoint analysis commandline cli command exfiltration ransomware detection system os operating traffic prevention file user modification integrity obfuscation powershell anomaly edr xdr", + "data_streams": [ + { + "dataset": "endpoint.events.api", + "title": "Endpoint API Events", + "index_pattern": "logs-endpoint.events.api-*" + }, + { + "dataset": "endpoint.events.file", + "title": "Endpoint File Events", + "index_pattern": "logs-endpoint.events.file-*" + }, + { + "dataset": "endpoint.events.library", + "title": "Endpoint Library and Driver Events", + "index_pattern": "logs-endpoint.events.library-*" + }, + { + "dataset": "endpoint.events.network", + "title": "Endpoint Network Events", + "index_pattern": "logs-endpoint.events.network-*" + }, + { + "dataset": "endpoint.events.process", + "title": "Endpoint Process Events", + "index_pattern": "logs-endpoint.events.process-*" + }, + { + "dataset": "endpoint.events.registry", + "title": "Endpoint Registry Events", + "index_pattern": "logs-endpoint.events.registry-*" + }, + { + "dataset": "endpoint.events.security", + "title": "Endpoint Security Events", + "index_pattern": "logs-endpoint.events.security-*" + } + ], + "elser_embedding": "Elastic Defend - windows linux osx dns network process suspicious user registry host host-based endpoint analysis commandline cli command exfiltration ransomware detection system os operating traffic prevention file user modification integrity obfuscation powershell anomaly edr xdr - Endpoint API Events Endpoint File Events Endpoint Library and Driver Events Endpoint Network Events Endpoint Process Events Endpoint Registry Events Endpoint Security Events" + } +] \ No newline at end of file diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts index 4f0b65e063b77..14825326eee0e 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_base_client.ts @@ -5,9 +5,9 @@ * 2.0. */ +import type { SearchHit, SearchResponse } from '@elastic/elasticsearch/lib/api/types'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import assert from 'assert'; -import type { SearchHit, SearchResponse } from '@elastic/elasticsearch/lib/api/types'; import type { Stored } from '../types'; import type { IndexNameProvider } from './rule_migrations_data_client'; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts index 40f4aa6bf786e..8960edd0cce21 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_client.ts @@ -6,8 +6,9 @@ */ import type { ElasticsearchClient, Logger } from '@kbn/core/server'; -import { RuleMigrationsDataRulesClient } from './rule_migrations_data_rules_client'; +import { RuleMigrationsDataIntegrationsClient } from './rule_migrations_data_integrations_client'; import { RuleMigrationsDataResourcesClient } from './rule_migrations_data_resources_client'; +import { RuleMigrationsDataRulesClient } from './rule_migrations_data_rules_client'; import type { AdapterId } from './rule_migrations_data_service'; export type IndexNameProvider = () => Promise; @@ -16,6 +17,7 @@ export type IndexNameProviders = Record; export class RuleMigrationsDataClient { public readonly rules: RuleMigrationsDataRulesClient; public readonly resources: RuleMigrationsDataResourcesClient; + public readonly integrations: RuleMigrationsDataIntegrationsClient; constructor( indexNameProviders: IndexNameProviders, @@ -35,5 +37,11 @@ export class RuleMigrationsDataClient { esClient, logger ); + this.integrations = new RuleMigrationsDataIntegrationsClient( + indexNameProviders.integrations, + username, + esClient, + logger + ); } } diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_integrations_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_integrations_client.ts new file mode 100644 index 0000000000000..3fdf1d11de36c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_integrations_client.ts @@ -0,0 +1,89 @@ +/* + * 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 { Integration } from '../types'; +import { RuleMigrationsDataBaseClient } from './rule_migrations_data_base_client'; + +/* This will be removed once the package registry changes is performed */ +import integrationsFile from './integrations_temp.json'; + +/* The minimum score required for a integration to be considered correct, might need to change this later */ +const MIN_SCORE = 40 as const; +/* The number of integrations the RAG will return, sorted by score */ +const RETURNED_INTEGRATIONS = 5 as const; + +/* This is a temp implementation to allow further development until https://github.com/elastic/package-registry/issues/1252 */ +const INTEGRATIONS = integrationsFile as Integration[]; +/* BULK_MAX_SIZE defines the number to break down the bulk operations by. + * The 500 number was chosen as a reasonable number to avoid large payloads. It can be adjusted if needed. + */ +export class RuleMigrationsDataIntegrationsClient extends RuleMigrationsDataBaseClient { + /** Indexes an array of integrations to be used with ELSER semantic search queries */ + async create(): Promise { + const index = await this.getIndexName(); + await this.esClient + .bulk({ + refresh: 'wait_for', + operations: INTEGRATIONS.flatMap((integration) => [ + { update: { _index: index, _id: integration.id } }, + { + doc: { + title: integration.title, + description: integration.description, + data_streams: integration.data_streams, + elser_embedding: integration.elser_embedding, + '@timestamp': new Date().toISOString(), + }, + doc_as_upsert: true, + }, + ]), + }) + .catch((error) => { + this.logger.error(`Error indexing integration details for ELSER: ${error.message}`); + throw error; + }); + } + + /** Based on a LLM generated semantic string, returns the 5 best results with a score above 40 */ + async retrieveIntegrations(semanticString: string): Promise { + const index = await this.getIndexName(); + const query = { + bool: { + should: [ + { + semantic: { + query: semanticString, + field: 'elser_embedding', + boost: 1.5, + }, + }, + { + multi_match: { + query: semanticString, + fields: ['title^2', 'description'], + boost: 3, + }, + }, + ], + }, + }; + const results = await this.esClient + .search({ + index, + query, + size: RETURNED_INTEGRATIONS, + min_score: MIN_SCORE, + }) + .then(this.processResponseHits.bind(this)) + .catch((error) => { + this.logger.error(`Error querying integration details for ELSER: ${error.message}`); + throw error; + }); + + return results; + } +} diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.test.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.test.ts index e738bd85e2f1a..f8cc0c3f1c076 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.test.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.test.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { INDEX_PATTERN, RuleMigrationsDataService } from './rule_migrations_data_service'; -import { Subject } from 'rxjs'; -import type { InstallParams } from '@kbn/index-adapter'; -import { IndexPatternAdapter } from '@kbn/index-adapter'; import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; -import { loggerMock } from '@kbn/logging-mocks'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { securityServiceMock } from '@kbn/core-security-server-mocks'; +import type { InstallParams } from '@kbn/index-adapter'; +import { IndexPatternAdapter } from '@kbn/index-adapter'; +import { loggerMock } from '@kbn/logging-mocks'; +import { Subject } from 'rxjs'; import type { IndexNameProviders } from './rule_migrations_data_client'; +import { INDEX_PATTERN, RuleMigrationsDataService } from './rule_migrations_data_service'; jest.mock('@kbn/index-adapter'); @@ -42,7 +42,7 @@ describe('SiemRuleMigrationsDataService', () => { describe('constructor', () => { it('should create IndexPatternAdapters', () => { new RuleMigrationsDataService(logger, kibanaVersion); - expect(MockedIndexPatternAdapter).toHaveBeenCalledTimes(2); + expect(MockedIndexPatternAdapter).toHaveBeenCalledTimes(3); }); it('should create component templates', () => { @@ -54,6 +54,9 @@ describe('SiemRuleMigrationsDataService', () => { expect(indexPatternAdapter.setComponentTemplate).toHaveBeenCalledWith( expect.objectContaining({ name: `${INDEX_PATTERN}-resources` }) ); + expect(indexPatternAdapter.setComponentTemplate).toHaveBeenCalledWith( + expect.objectContaining({ name: `${INDEX_PATTERN}-integrations` }) + ); }); it('should create index templates', () => { @@ -65,6 +68,9 @@ describe('SiemRuleMigrationsDataService', () => { expect(indexPatternAdapter.setIndexTemplate).toHaveBeenCalledWith( expect.objectContaining({ name: `${INDEX_PATTERN}-resources` }) ); + expect(indexPatternAdapter.setIndexTemplate).toHaveBeenCalledWith( + expect.objectContaining({ name: `${INDEX_PATTERN}-integrations` }) + ); }); }); @@ -92,8 +98,11 @@ describe('SiemRuleMigrationsDataService', () => { logger: loggerMock.create(), pluginStop$: new Subject(), }; - const [rulesIndexPatternAdapter, resourcesIndexPatternAdapter] = - MockedIndexPatternAdapter.mock.instances; + const [ + rulesIndexPatternAdapter, + resourcesIndexPatternAdapter, + integrationsIndexPatternAdapter, + ] = MockedIndexPatternAdapter.mock.instances; (rulesIndexPatternAdapter.install as jest.Mock).mockResolvedValueOnce(undefined); await index.install(params); @@ -101,12 +110,16 @@ describe('SiemRuleMigrationsDataService', () => { await mockIndexNameProviders.rules(); await mockIndexNameProviders.resources(); + await mockIndexNameProviders.integrations(); expect(rulesIndexPatternAdapter.createIndex).toHaveBeenCalledWith('space1'); expect(rulesIndexPatternAdapter.getIndexName).toHaveBeenCalledWith('space1'); expect(resourcesIndexPatternAdapter.createIndex).toHaveBeenCalledWith('space1'); expect(resourcesIndexPatternAdapter.getIndexName).toHaveBeenCalledWith('space1'); + + expect(integrationsIndexPatternAdapter.createIndex).toHaveBeenCalledWith('space1'); + expect(integrationsIndexPatternAdapter.getIndexName).toHaveBeenCalledWith('space1'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.ts index c19a89cefd81a..ceff8e05f9f2f 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_data_service.ts @@ -6,17 +6,18 @@ */ import type { AuthenticatedUser, ElasticsearchClient, Logger } from '@kbn/core/server'; import { IndexPatternAdapter, type FieldMap, type InstallParams } from '@kbn/index-adapter'; +import type { IndexNameProvider, IndexNameProviders } from './rule_migrations_data_client'; +import { RuleMigrationsDataClient } from './rule_migrations_data_client'; import { - ruleMigrationsFieldMap, + integrationsFieldMap, ruleMigrationResourcesFieldMap, + ruleMigrationsFieldMap, } from './rule_migrations_field_maps'; -import type { IndexNameProvider, IndexNameProviders } from './rule_migrations_data_client'; -import { RuleMigrationsDataClient } from './rule_migrations_data_client'; const TOTAL_FIELDS_LIMIT = 2500; export const INDEX_PATTERN = '.kibana-siem-rule-migrations'; -export type AdapterId = 'rules' | 'resources'; +export type AdapterId = 'rules' | 'resources' | 'integrations'; interface CreateClientParams { spaceId: string; @@ -31,6 +32,7 @@ export class RuleMigrationsDataService { this.adapters = { rules: this.createAdapter({ id: 'rules', fieldMap: ruleMigrationsFieldMap }), resources: this.createAdapter({ id: 'resources', fieldMap: ruleMigrationResourcesFieldMap }), + integrations: this.createAdapter({ id: 'integrations', fieldMap: integrationsFieldMap }), }; } @@ -49,6 +51,7 @@ export class RuleMigrationsDataService { await Promise.all([ this.adapters.rules.install({ ...params, logger: this.logger }), this.adapters.resources.install({ ...params, logger: this.logger }), + this.adapters.integrations.install({ ...params, logger: this.logger }), ]); } @@ -56,6 +59,7 @@ export class RuleMigrationsDataService { const indexNameProviders: IndexNameProviders = { rules: this.createIndexNameProvider('rules', spaceId), resources: this.createIndexNameProvider('resources', spaceId), + integrations: this.createIndexNameProvider('integrations', spaceId), }; return new RuleMigrationsDataClient( diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts index 3811ff74b5ca1..8e8a3c5ee0f27 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/data/rule_migrations_field_maps.ts @@ -26,6 +26,7 @@ export const ruleMigrationsFieldMap: FieldMap { - const resourcesContext = []; - if (resources.macro?.length) { - const macrosSummary = resources.macro - .map((macro) => `\`${macro.name}\`: ${macro.content}`) - .join('\n'); - resourcesContext.push('<>', macrosSummary, '<>'); - } - if (resources.list?.length) { - const lookupsSummary = resources.list - .map((list) => `lookup ${list.name}: ${list.content}`) - .join('\n'); - resourcesContext.push('<>', lookupsSummary, '<>'); - } - return resourcesContext.join('\n'); -}; - -export const getReplaceQueryResourcesPrompt = ( - state: MigrateRuleState, - resources: RuleMigrationResources -): string => { - const resourcesContext = getResourcesContext(resources); - return `You are an agent expert in Splunk SPL (Search Processing Language). -Your task is to inline a set of macros and lookup table values in a SPL query. - -## Guidelines: - -- You will be provided with a SPL query and also the resources reference with the values of macros and lookup tables. -- You have to replace the macros and lookup tables in the SPL query with their actual values. -- The original and modified queries must be equivalent. -- Macros names have the number of arguments in parentheses, e.g., \`macroName(2)\`. You must replace the correct macro accounting for the number of arguments. - -## Process: - -- Go through the SPL query and identify all the macros and lookup tables that are used. Two scenarios may arise: - - The macro or lookup table is provided in the resources: Replace the call by their actual value in the query. - - The macro or lookup table is not provided in the resources: Keep the call in the query as it is. - -## Example: - Having the following macros: - \`someSource\`: sourcetype="somesource" - \`searchTitle(1)\`: search title="$value$" - \`searchTitle\`: search title=* - \`searchType\`: search type=* - And the following SPL query: - \`\`\`spl - \`someSource\` \`someFilter\` - | \`searchTitle("sometitle")\` - | \`searchType("sometype")\` - | table * - \`\`\` - The correct replacement would be: - \`\`\`spl - sourcetype="somesource" \`someFilter\` - | search title="sometitle" - | \`searchType("sometype")\` - | table * - \`\`\` - -## Important: You must respond only with the modified query inside a \`\`\`spl code block, nothing else. - -# Find the macros and lookup tables below: - -${resourcesContext} - -# Find the SPL query below: - -\`\`\`spl -${state.original_rule.query} -\`\`\` - -`; -}; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/graph.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/graph.ts new file mode 100644 index 0000000000000..f986098e9deb0 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/graph.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { END, START, StateGraph } from '@langchain/langgraph'; +import { getProcessQueryNode } from './nodes/process_query'; +import { getRetrieveIntegrationsNode } from './nodes/retrieve_integrations'; +import { getTranslateRuleNode } from './nodes/translate_rule'; +import { translateRuleState } from './state'; +import type { TranslateRuleGraphParams } from './types'; + +export function getTranslateRuleGraph({ + model, + inferenceClient, + resourceRetriever, + integrationRetriever, + connectorId, + logger, +}: TranslateRuleGraphParams) { + const translateRuleNode = getTranslateRuleNode({ + model, + inferenceClient, + resourceRetriever, + connectorId, + logger, + }); + const processQueryNode = getProcessQueryNode({ + model, + resourceRetriever, + }); + const retrieveIntegrationsNode = getRetrieveIntegrationsNode({ + model, + integrationRetriever, + }); + + const translateRuleGraph = new StateGraph(translateRuleState) + // Nodes + .addNode('processQuery', processQueryNode) + .addNode('retrieveIntegrations', retrieveIntegrationsNode) + .addNode('translateRule', translateRuleNode) + // Edges + .addEdge(START, 'processQuery') + .addEdge('processQuery', 'retrieveIntegrations') + .addEdge('retrieveIntegrations', 'translateRule') + .addEdge('translateRule', END); + + const graph = translateRuleGraph.compile(); + graph.name = 'Translate Rule Graph'; + return graph; +} diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/index.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/index.ts new file mode 100644 index 0000000000000..6a2b7e9cebd7e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/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 { getTranslateRuleGraph } from './graph'; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/index.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/index.ts new file mode 100644 index 0000000000000..6feb852eba474 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/index.ts @@ -0,0 +1,7 @@ +/* + * 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 { getProcessQueryNode } from './process_query'; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/process_query.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/process_query.ts new file mode 100644 index 0000000000000..0f90d74dafba3 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/process_query.ts @@ -0,0 +1,34 @@ +/* + * 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 { StringOutputParser } from '@langchain/core/output_parsers'; +import { isEmpty } from 'lodash/fp'; +import type { ChatModel } from '../../../../../util/actions_client_chat'; +import type { RuleResourceRetriever } from '../../../../../util/rule_resource_retriever'; +import type { GraphNode } from '../../types'; +import { getReplaceQueryResourcesPrompt } from './prompts'; + +interface GetProcessQueryNodeParams { + model: ChatModel; + resourceRetriever: RuleResourceRetriever; +} + +export const getProcessQueryNode = ({ + model, + resourceRetriever, +}: GetProcessQueryNodeParams): GraphNode => { + return async (state) => { + let query = state.original_rule.query; + const resources = await resourceRetriever.getResources(state.original_rule); + if (!isEmpty(resources)) { + const replaceQueryResourcesPrompt = getReplaceQueryResourcesPrompt(state, resources); + const stringParser = new StringOutputParser(); + query = await model.pipe(stringParser).invoke(replaceQueryResourcesPrompt); + } + return { inline_query: query }; + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/prompts.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/prompts.ts new file mode 100644 index 0000000000000..5d2e6648c1d85 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/process_query/prompts.ts @@ -0,0 +1,123 @@ +/* + * 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 { RuleMigrationResources } from '../../../../../util/rule_resource_retriever'; +import type { TranslateRuleState } from '../../types'; + +const getResourcesContext = (resources: RuleMigrationResources): string => { + const resourcesContext = []; + if (resources.macro?.length) { + const macrosSummary = resources.macro + .map((macro) => `\`${macro.name}\`: ${macro.content}`) + .join('\n'); + resourcesContext.push('<>', macrosSummary, '<>'); + } + if (resources.list?.length) { + const lookupsSummary = resources.list + .map((list) => `lookup ${list.name}: ${list.content}`) + .join('\n'); + resourcesContext.push('<>', lookupsSummary, '<>'); + } + return resourcesContext.join('\n'); +}; + +export const getReplaceQueryResourcesPrompt = ( + state: TranslateRuleState, + resources: RuleMigrationResources +): string => { + const resourcesContext = getResourcesContext(resources); + return `You are an agent expert in Splunk SPL (Search Processing Language). +Your task is to inline a set of macros and lookup tables syntax using their values in a SPL query. + +# Guidelines +- You will be provided with a SPL query and also the resources reference with the values of macros and lookup tables. +- You have to replace the macros and lookup tables syntax in the SPL query and use their values inline, if provided. +- The original and modified queries must be equivalent. + +# Process +- Go through the SPL query and identify all the macros and lookup tables that are used. Two scenarios may arise: + - The macro or lookup table is provided in the resources: Replace it using its actual content. + - The macro or lookup table is not provided in the resources: Do not replace it, keep it in the query as it is. + +## Macros replacements + +### Notes: +- Macros names have the number of arguments in parentheses, e.g., \`macroName(2)\`. You must replace the correct macro accounting for the number of arguments. + +### Example: + Having the following macros: + \`someSource\`: sourcetype="somesource" + \`searchTitle(1)\`: search title="$value$" + \`searchTitle\`: search title=* + \`searchType\`: search type=* + And the following SPL query: + \`\`\`spl + \`someSource\` \`someFilter\` + | \`searchTitle("sometitle")\` + | \`searchType("sometype")\` + | table * + \`\`\` + The correct replacement would be: + \`\`\`spl + sourcetype="somesource" \`someFilter\` + | search title="sometitle" + | \`searchType("sometype")\` + | table * + \`\`\` + +## Lookups replacements + +### Notes: +- OUTPUTNEW and OUTPUT fields should be replaced with the values from the lookup table. +- Use the \`case\` function to evaluate conditions in the same order provided by the lookup table. +- Ensure all lookup matching fields are correctly matched to their respective case conditions. +- If there are more than one field to match, use the \`AND\` operator to combine them inside the \`case\` function. +- The transformed SPL query should function equivalently to the original query with the \`lookup\` command. + +### Example: + Having the following lookup table: + uid,username,department + 1066,Claudia Garcia,Engineering + 1690,Rutherford Sullivan,Engineering + 1815,Vanya Patel,IT + 1862,Wei Zhang,Engineering + 1916,Alex Martin,Personnel + And the following SPL query: + \`\`\`spl + ... | lookup users uid OUTPUTNEW username, department + \`\`\` + The correct replacement would be: + \`\`\`spl + ... | eval username=case(uid=1066, "Claudia Garcia", + uid=1690, "Rutherford Sullivan", + uid=1815, "Vanya Patel", + uid=1862, "Wei Zhang", + uid=1916, "Alex Martin", + true, null), + department=case(uid=1066, "Engineering", + uid=1690, "Engineering", + uid=1815, "IT", + uid=1862, "Engineering", + uid=1916, "Personnel", + true, null) + \`\`\` + + +## Important: You must respond only with the modified query inside a \`\`\`spl code block, nothing else. + +# Find the macros and lookup tables below: + +${resourcesContext} + +# Find the SPL query below: + +\`\`\`spl +${state.original_rule.query} +\`\`\` + +`; +}; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/index.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/index.ts new file mode 100644 index 0000000000000..7db89035c6ad7 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/index.ts @@ -0,0 +1,7 @@ +/* + * 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 { getRetrieveIntegrationsNode } from './retrieve_integrations'; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/prompts.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/prompts.ts new file mode 100644 index 0000000000000..4d15ad71d6794 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/prompts.ts @@ -0,0 +1,48 @@ +/* + * 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 { ChatPromptTemplate } from '@langchain/core/prompts'; + +export const CREATE_SEMANTIC_QUERY_PROMPT = ChatPromptTemplate.fromMessages([ + [ + 'system', + `You are a helpful assistant that helps in translating provided titles, descriptions and data sources into a single summary of keywords specifically crafted to be used as a semantic search query, which are usually short and includes keywords that are valid for the usecase. + The data provided are collected from SIEM detection rules, and it is trying to match the description of a list of data sources, so provide good keywords that match this usecase. + Try to also detect what sort of vendor, solution or technology is required and add these as keywords as well. + Some examples would be to identify if its cloud, which vendor, network, host, endpoint, etc.`, + ], + [ + 'human', + ` +Title: {title} +Description: {description} +Query: {query} + + +Go through the relevant title, description and data sources from the above query and create a collection of keywords specifically crafted to be used as a semantic search query. + + +- The query should be short and concise. +- Include keywords that are relevant to the use case. +- Add related keywords you detected from the above query, like one or more vendor, product, cloud provider, OS platform etc. +- Always reply with a JSON object with the key "query" and the value as the semantic search query inside three backticks as shown in the below example. + + + +U: +Title: Processes created by netsh +Description: This search looks for processes launching netsh.exe to execute various commands via the netsh command-line utility. Netsh.exe is a command-line scripting utility that allows you to, either locally or remotely, display or modify the network configuration of a computer that is currently running. Netsh can be used as a persistence proxy technique to execute a helper .dll when netsh.exe is executed. In this search, we are looking for processes spawned by netsh.exe that are executing commands via the command line. Deprecated because we have another detection of the same type. +Data Sources: + +A: Please find the query keywords JSON object below: +\`\`\`json +{{"query": "windows host endpoint netsh.exe process creation command-line utility network configuration persistence proxy dll execution sysmon event id 1"}} +\`\`\` +`, + ], + ['ai', 'Please find the query keywords JSON object below:'], +]); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/retrieve_integrations.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/retrieve_integrations.ts new file mode 100644 index 0000000000000..18577532fdf66 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/retrieve_integrations/retrieve_integrations.ts @@ -0,0 +1,44 @@ +/* + * 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 { JsonOutputParser } from '@langchain/core/output_parsers'; +import type { ChatModel } from '../../../../../util/actions_client_chat'; +import type { IntegrationRetriever } from '../../../../../util/integration_retriever'; +import type { GraphNode } from '../../types'; +import { CREATE_SEMANTIC_QUERY_PROMPT } from './prompts'; + +interface GetRetrieveIntegrationsNodeParams { + model: ChatModel; + integrationRetriever: IntegrationRetriever; +} + +interface GetSemanticQueryResponse { + query: string; +} + +export const getRetrieveIntegrationsNode = ({ + model, + integrationRetriever, +}: GetRetrieveIntegrationsNodeParams): GraphNode => { + const jsonParser = new JsonOutputParser(); + const semanticQueryChain = CREATE_SEMANTIC_QUERY_PROMPT.pipe(model).pipe(jsonParser); + + return async (state) => { + const query = state.inline_query; + + const integrationQuery = (await semanticQueryChain.invoke({ + title: state.original_rule.title, + description: state.original_rule.description, + query, + })) as GetSemanticQueryResponse; + + const integrations = await integrationRetriever.getIntegrations(integrationQuery.query); + return { + integrations, + }; + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/esql_knowledge_base_caller.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/esql_knowledge_base_caller.ts similarity index 100% rename from x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/esql_knowledge_base_caller.ts rename to x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/esql_knowledge_base_caller.ts diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/index.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/index.ts new file mode 100644 index 0000000000000..c8c5678b7f2f5 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/index.ts @@ -0,0 +1,7 @@ +/* + * 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 { getTranslateRuleNode } from './translate_rule'; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/prompts/esql_translation_prompt.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/prompts.ts similarity index 85% rename from x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/prompts/esql_translation_prompt.ts rename to x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/prompts.ts index 05e3c5c63bbe3..3e77353bba8b1 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/prompts/esql_translation_prompt.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/prompts.ts @@ -5,9 +5,12 @@ * 2.0. */ -import type { MigrateRuleState } from '../../../types'; +import type { TranslateRuleState } from '../../types'; -export const getEsqlTranslationPrompt = (state: MigrateRuleState, query: string): string => { +export const getEsqlTranslationPrompt = ( + state: TranslateRuleState, + indexPatterns: string +): string => { return `You are a helpful cybersecurity (SIEM) expert agent. Your task is to migrate "detection rules" from Splunk to Elastic Security. Your goal is to translate the SPL query into an equivalent Elastic Security Query Language (ES|QL) query. @@ -19,7 +22,7 @@ Your goal is to translate the SPL query into an equivalent Elastic Security Quer ## Guidelines: - Analyze the SPL query and identify the key components. - Translate the SPL query into an equivalent ES|QL query using ECS (Elastic Common Schema) field names. -- Always use logs* index pattern for the ES|QL translated query. +- Always start the generated ES|QL query by filtering FROM using these index patterns in the translated query: ${indexPatterns}. - If, in the SPL query, you find a lookup list or macro call, mention it in the summary and add a placeholder in the query with the format [macro:(argumentCount)] or [lookup:] including the [] keys, - Examples: - \`get_duration(firstDate,secondDate)\` -> [macro:get_duration(2)] @@ -40,7 +43,7 @@ ${state.original_rule.description} <> <> -${query} +${state.inline_query} <> `; }; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/translate_query.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/translate_rule.ts similarity index 61% rename from x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/translate_query.ts rename to x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/translate_rule.ts index e12d3b96ceb3f..3fcd968b55650 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/nodes/translate_query/translate_query.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/nodes/translate_rule/translate_rule.ts @@ -7,17 +7,14 @@ import type { Logger } from '@kbn/core/server'; import type { InferenceClient } from '@kbn/inference-plugin/server'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { isEmpty } from 'lodash/fp'; +import { SiemMigrationRuleTranslationResult } from '../../../../../../../../../../common/siem_migrations/constants'; +import type { ChatModel } from '../../../../../util/actions_client_chat'; +import type { RuleResourceRetriever } from '../../../../../util/rule_resource_retriever'; import type { GraphNode } from '../../types'; import { getEsqlKnowledgeBase } from './esql_knowledge_base_caller'; -import { getReplaceQueryResourcesPrompt } from './prompts/replace_resources_prompt'; -import { getEsqlTranslationPrompt } from './prompts/esql_translation_prompt'; -import { SiemMigrationRuleTranslationResult } from '../../../../../../../../common/siem_migrations/constants'; -import type { RuleResourceRetriever } from '../../../util/rule_resource_retriever'; -import type { ChatModel } from '../../../util/actions_client_chat'; +import { getEsqlTranslationPrompt } from './prompts'; -interface GetTranslateQueryNodeParams { +interface GetTranslateRuleNodeParams { model: ChatModel; inferenceClient: InferenceClient; resourceRetriever: RuleResourceRetriever; @@ -25,25 +22,19 @@ interface GetTranslateQueryNodeParams { logger: Logger; } -export const getTranslateQueryNode = ({ - model, +export const getTranslateRuleNode = ({ inferenceClient, - resourceRetriever, connectorId, logger, -}: GetTranslateQueryNodeParams): GraphNode => { +}: GetTranslateRuleNodeParams): GraphNode => { const esqlKnowledgeBaseCaller = getEsqlKnowledgeBase({ inferenceClient, connectorId, logger }); return async (state) => { - let query = state.original_rule.query; + const indexPatterns = state.integrations.flatMap((integration) => + integration.data_streams.map((dataStream) => dataStream.index_pattern) + ); + const integrationIds = state.integrations.map((integration) => integration.id); - const resources = await resourceRetriever.getResources(state.original_rule); - if (!isEmpty(resources)) { - const replaceQueryResourcesPrompt = getReplaceQueryResourcesPrompt(state, resources); - const stringParser = new StringOutputParser(); - query = await model.pipe(stringParser).invoke(replaceQueryResourcesPrompt); - } - - const prompt = getEsqlTranslationPrompt(state, query); + const prompt = getEsqlTranslationPrompt(state, indexPatterns.join(' ')); const response = await esqlKnowledgeBaseCaller(prompt); const esqlQuery = response.match(/```esql\n([\s\S]*?)\n```/)?.[1] ?? ''; @@ -57,6 +48,7 @@ export const getTranslateQueryNode = ({ translation_result: translationResult, elastic_rule: { title: state.original_rule.title, + integration_ids: integrationIds, description: state.original_rule.description, severity: 'low', query: esqlQuery, diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/state.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/state.ts new file mode 100644 index 0000000000000..8c8e9780aedf8 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/state.ts @@ -0,0 +1,48 @@ +/* + * 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 { BaseMessage } from '@langchain/core/messages'; +import { Annotation, messagesStateReducer } from '@langchain/langgraph'; +import { SiemMigrationRuleTranslationResult } from '../../../../../../../../common/siem_migrations/constants'; +import type { + ElasticRule, + OriginalRule, + RuleMigration, +} from '../../../../../../../../common/siem_migrations/model/rule_migration.gen'; +import type { Integration } from '../../../../types'; + +export const translateRuleState = Annotation.Root({ + messages: Annotation({ + reducer: messagesStateReducer, + default: () => [], + }), + original_rule: Annotation(), + integrations: Annotation({ + reducer: (current, value) => value ?? current, + default: () => [], + }), + inline_query: Annotation({ + reducer: (current, value) => value ?? current, + default: () => '', + }), + elastic_rule: Annotation({ + reducer: (state, action) => ({ ...state, ...action }), + default: () => ({} as ElasticRule), + }), + translation_result: Annotation({ + reducer: (current, value) => value ?? current, + default: () => SiemMigrationRuleTranslationResult.UNTRANSLATABLE, + }), + comments: Annotation({ + reducer: (current, value) => (value ? (current ?? []).concat(value) : current), + default: () => [], + }), + response: Annotation({ + reducer: (current, value) => value ?? current, + default: () => '', + }), +}); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/types.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/types.ts new file mode 100644 index 0000000000000..42bf8e14c5924 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/sub_graphs/translate_rule/types.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 type { Logger } from '@kbn/core/server'; +import type { InferenceClient } from '@kbn/inference-plugin/server'; +import type { ChatModel } from '../../../util/actions_client_chat'; +import type { IntegrationRetriever } from '../../../util/integration_retriever'; +import type { RuleResourceRetriever } from '../../../util/rule_resource_retriever'; +import type { translateRuleState } from './state'; + +export type TranslateRuleState = typeof translateRuleState.State; +export type GraphNode = (state: TranslateRuleState) => Promise>; + +export interface TranslateRuleGraphParams { + inferenceClient: InferenceClient; + model: ChatModel; + connectorId: string; + resourceRetriever: RuleResourceRetriever; + integrationRetriever: IntegrationRetriever; + logger: Logger; +} diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/types.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/types.ts index 975c03439842e..046083140e5e5 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/types.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/agent/types.ts @@ -7,10 +7,11 @@ import type { Logger } from '@kbn/core/server'; import type { InferenceClient } from '@kbn/inference-plugin/server'; -import type { migrateRuleState } from './state'; import type { ChatModel } from '../util/actions_client_chat'; +import type { IntegrationRetriever } from '../util/integration_retriever'; import type { PrebuiltRulesMapByName } from '../util/prebuilt_rules'; import type { RuleResourceRetriever } from '../util/rule_resource_retriever'; +import type { migrateRuleState } from './state'; export type MigrateRuleState = typeof migrateRuleState.State; export type GraphNode = (state: MigrateRuleState) => Promise>; @@ -21,5 +22,6 @@ export interface MigrateRuleGraphParams { connectorId: string; prebuiltRulesMap: PrebuiltRulesMapByName; resourceRetriever: RuleResourceRetriever; + integrationRetriever: IntegrationRetriever; logger: Logger; } diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts index 989c33a44cb36..b7cc545001f91 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/rule_migrations_task_client.ts @@ -15,18 +15,19 @@ import type { } from '../../../../../common/siem_migrations/model/rule_migration.gen'; import type { RuleMigrationsDataClient } from '../data/rule_migrations_data_client'; import type { RuleMigrationDataStats } from '../data/rule_migrations_data_rules_client'; +import { getRuleMigrationAgent } from './agent'; +import type { MigrateRuleState } from './agent/types'; import type { + MigrationAgent, + RuleMigrationTaskPrepareParams, + RuleMigrationTaskRunParams, RuleMigrationTaskStartParams, RuleMigrationTaskStartResult, RuleMigrationTaskStopResult, - RuleMigrationTaskPrepareParams, - RuleMigrationTaskRunParams, - MigrationAgent, } from './types'; -import { getRuleMigrationAgent } from './agent'; -import type { MigrateRuleState } from './agent/types'; -import { retrievePrebuiltRulesMap } from './util/prebuilt_rules'; import { ActionsClientChat } from './util/actions_client_chat'; +import { IntegrationRetriever } from './util/integration_retriever'; +import { retrievePrebuiltRulesMap } from './util/prebuilt_rules'; import { RuleResourceRetriever } from './util/rule_resource_retriever'; const ITERATION_BATCH_SIZE = 50 as const; @@ -89,6 +90,7 @@ export class RuleMigrationsTaskClient { }: RuleMigrationTaskPrepareParams): Promise { const prebuiltRulesMap = await retrievePrebuiltRulesMap({ soClient, rulesClient }); const resourceRetriever = new RuleResourceRetriever(migrationId, this.data); + const integrationRetriever = new IntegrationRetriever(this.data); const actionsClientChat = new ActionsClientChat(connectorId, actionsClient, this.logger); const model = await actionsClientChat.createModel({ @@ -102,6 +104,7 @@ export class RuleMigrationsTaskClient { inferenceClient, prebuiltRulesMap, resourceRetriever, + integrationRetriever, logger: this.logger, }); return agent; diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.test.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.test.ts new file mode 100644 index 0000000000000..2aa01a9c9c41d --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.test.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 { MockRuleMigrationsDataClient } from '../../data/__mocks__/mocks'; +import { IntegrationRetriever } from './integration_retriever'; + +describe('IntegrationRetriever', () => { + let integrationRetriever: IntegrationRetriever; + const mockRuleMigrationsDataClient = new MockRuleMigrationsDataClient(); + const mockIntegrationItem = { + id: '1', + title: 'Integration 1', + description: 'Integration 1 description', + data_streams: [{ dataset: 'test', title: 'dstitle', index_pattern: 'logs-*' }], + elser_embedding: 'elser_embedding', + }; + beforeEach(() => { + integrationRetriever = new IntegrationRetriever(mockRuleMigrationsDataClient); + mockRuleMigrationsDataClient.integrations.retrieveIntegrations.mockImplementation( + async (_: string) => { + return mockIntegrationItem; + } + ); + }); + + it('should retrieve integrations', async () => { + const result = await integrationRetriever.getIntegrations('test'); + + expect(mockRuleMigrationsDataClient.integrations.retrieveIntegrations).toHaveBeenCalledWith( + 'test' + ); + expect(result).toEqual(mockIntegrationItem); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.ts new file mode 100644 index 0000000000000..7913e2c438081 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/task/util/integration_retriever.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 { RuleMigrationsDataClient } from '../../data/rule_migrations_data_client'; +import type { Integration } from '../../types'; + +export class IntegrationRetriever { + constructor(private readonly dataClient: RuleMigrationsDataClient) {} + + public async getIntegrations(semanticString: string): Promise { + return this.integrationRetriever(semanticString); + } + + private integrationRetriever = async (semanticString: string): Promise => { + const integrations = await this.dataClient.integrations.retrieveIntegrations(semanticString); + + return integrations; + }; +} diff --git a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts index e506b43cc323b..f8a0f0b3b25a7 100644 --- a/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/siem_migrations/rules/types.ts @@ -14,3 +14,11 @@ export type Stored = T & { id: string }; export type StoredRuleMigration = Stored; export type StoredRuleMigrationResource = Stored; + +export interface Integration { + title: string; + id: string; + description: string; + data_streams: Array<{ dataset: string; title: string; index_pattern: string }>; + elser_embedding: string; +} diff --git a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/create_timelines.ts b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/create_timelines.ts index aee26dc06bc77..fcccd38191a7d 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/create_timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/create_timelines.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { TimelineStatusEnum, TimelineTypeEnum } from '../../../../common/api/timeline'; + export const mockTemplate = { columns: [ { @@ -172,13 +174,13 @@ export const mockTemplate = { kqlQuery: { filterQuery: { kuery: { kind: 'kuery', expression: '' }, serializedQuery: '' } }, indexNames: [], title: 'Generic Process Timeline - Duplicate - Duplicate', - timelineType: 'template', + timelineType: TimelineTypeEnum.template, templateTimelineVersion: null, templateTimelineId: null, dateRange: { start: '2020-10-01T11:37:31.655Z', end: '2020-10-02T11:37:31.655Z' }, savedQueryId: null, sort: { columnId: '@timestamp', sortDirection: 'desc' }, - status: 'active', + status: TimelineStatusEnum.active, }; export const mockTimeline = { @@ -210,11 +212,11 @@ export const mockTimeline = { '.siem-signals-angelachuang-default', ], title: 'my timeline', - timelineType: 'default', + timelineType: TimelineTypeEnum.default, templateTimelineVersion: null, templateTimelineId: null, dateRange: { start: '2020-11-03T13:34:40.339Z', end: '2020-11-04T13:34:40.339Z' }, savedQueryId: null, sort: { columnId: '@timestamp', columnType: 'number', sortDirection: 'desc' }, - status: 'draft', + status: TimelineStatusEnum.draft, }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md b/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md deleted file mode 100644 index 6878e21e14452..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md +++ /dev/null @@ -1,1439 +0,0 @@ -**Timeline apis** - - 1. Create timeline api - 2. Update timeline api - 3. Create template timeline api - 4. Update template timeline api - - -## Create timeline api -#### POST /api/timeline -##### Authorization -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` -##### Request body -```json -{ - "timeline": { - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [], - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": null - }, - "title": "abd", - "dateRange": { - "start": 1587370079200, - "end": 1587456479201 - }, - "savedQueryId": null, - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - } - }, - "timelineId":null, // Leave this as null - "version":null // Leave this as null -} -``` - - -## Update timeline api -#### PATCH /api/timeline -##### Authorization -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` -##### Request body -```json -{ - "timeline": { - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [], - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": null - }, - "title": "abd", - "dateRange": { - "start": 1587370079200, - "end": 1587456479201 - }, - "savedQueryId": null, - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - }, - "created": 1587468588922, - "createdBy": "casetester", - "updated": 1587468588922, - "updatedBy": "casetester", - "timelineType": "default" - }, - "timelineId":"68ea5330-83c3-11ea-bff9-ab01dd7cb6cc", // Have to match the existing timeline savedObject id - "version":"WzYwLDFd" // Have to match the existing timeline version -} -``` - -## Create template timeline api -#### POST /api/timeline -##### Authorization -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` -##### Request body -```json -{ - "timeline": { - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [ - - ], - "description": "", - "eventType": "all", - "filters": [ - - ], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": null - }, - "title": "abd", - "dateRange": { - "start": 1587370079200, - "end": 1587456479201 - }, - "savedQueryId": null, - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - }, - "timelineType": "template" // This is the difference between create timeline - }, - "timelineId":null, // Leave this as null - "version":null // Leave this as null -} -``` - - -## Update template timeline api -#### PATCH /api/timeline -##### Authorization -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` -##### Request body -```json -{ - "timeline": { - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [], - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": null - }, - "title": "abd", - "dateRange": { - "start": 1587370079200, - "end": 1587456479201 - }, - "savedQueryId": null, - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - }, - "timelineType": "template", - "created": 1587473119992, - "createdBy": "casetester", - "updated": 1587473119992, - "updatedBy": "casetester", - "templateTimelineId": "745d0316-6af7-43bf-afd6-9747119754fb", // Please provide the existing template timeline version - "templateTimelineVersion": 2 // Please provide a template timeline version grater than existing one - }, - "timelineId":"f5a4bd10-83cd-11ea-bf78-0547a65f1281", // This is a must as well - "version":"Wzg2LDFd" // Please provide the existing timeline version -} -``` - -## Export timeline api - -#### POST /api/timeline/_export - -##### Authorization - -Type: Basic Auth - -username: Your Kibana username - -password: Your Kibana password - - - - -##### Request header - -``` - -Content-Type: application/json - -kbn-version: 8.0.0 - -``` - -##### Request param - -``` -file_name: ${filename}.ndjson -``` - -##### Request body -```json -{ - ids: [ - ${timelineId} - ] -} -``` - -## Import timeline api - -#### POST /api/timeline/_import - -##### Authorization - -Type: Basic Auth - -username: Your Kibana username - -password: Your Kibana password - - - - -##### Request header - -``` - -Content-Type: application/json - -kbn-version: 8.0.0 - -``` - -##### Request body - -``` -{ - file: sample.ndjson -} -``` - - -(each json in the file should match this format) -example: -``` -{"savedObjectId":"a3002fd0-781b-11ea-85e4-df9002f1452c","version":"WzIzLDFd","columns":[{"columnHeaderType":"not-filtered","id":"@timestamp"},{"columnHeaderType":"not-filtered","id":"message"},{"columnHeaderType":"not-filtered","id":"event.category"},{"columnHeaderType":"not-filtered","id":"event.action"},{"columnHeaderType":"not-filtered","id":"host.name"},{"columnHeaderType":"not-filtered","id":"source.ip"},{"columnHeaderType":"not-filtered","id":"destination.ip"},{"columnHeaderType":"not-filtered","id":"user.name"}],"dataProviders":[],"description":"tes description","eventType":"all","filters":[{"meta":{"field":null,"negate":false,"alias":null,"disabled":false,"params":"{\"query\":\"MacBook-Pro-de-Gloria.local\"}","type":"phrase","key":"host.name"},"query":"{\"match_phrase\":{\"host.name\":\"MacBook-Pro-de-Gloria.local\"}}","missing":null,"exists":null,"match_all":null,"range":null,"script":null}],"kqlMode":"filter","kqlQuery":{"filterQuery":{"serializedQuery":"{\"bool\":{\"should\":[{\"exists\":{\"field\":\"host.name\"}}],\"minimum_should_match\":1}}","kuery":{"expression":"host.name: *","kind":"kuery"}}},"title":"Test","dateRange":{"start":1585227005527,"end":1585313405527},"savedQueryId":null,"sort":{"columnId":"@timestamp","sortDirection":"desc"},"created":1586187068132,"createdBy":"angela","updated":1586187068132,"updatedBy":"angela","eventNotes":[],"globalNotes":[{"noteId":"a3b4d9d0-781b-11ea-85e4-df9002f1452c","version":"WzI1LDFd","note":"this is a note","timelineId":"a3002fd0-781b-11ea-85e4-df9002f1452c","created":1586187069313,"createdBy":"angela","updated":1586187069313,"updatedBy":"angela"}],"pinnedEventIds":[]} -``` - -##### Response -``` -{"success":true,"success_count":1,"errors":[]} -``` - -## Get draft timeline api - -#### GET /api/timeline/_draft - -##### Authorization - -Type: Basic Auth - -username: Your Kibana username - -password: Your Kibana password - - -##### Request header - -``` - -Content-Type: application/json - -kbn-version: 8.0.0 - -``` - -##### Request param -``` -timelineType: `default` or `template` -``` - -##### Response -```json -{ - "data": { - "persistTimeline": { - "timeline": { - "savedObjectId": "ababbd90-99de-11ea-8446-1d7fd9f03ebf", - "version": "WzM2MiwzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [], - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "timelineType": "default", - "kqlQuery": { - "filterQuery": null - }, - "title": "", - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - }, - "status": "draft", - "created": 1589899222908, - "createdBy": "casetester", - "updated": 1589899222908, - "updatedBy": "casetester", - "templateTimelineId": null, - "templateTimelineVersion": null, - "favorite": [], - "eventIdToNoteIds": [], - "noteIds": [], - "notes": [], - "pinnedEventIds": [], - "pinnedEventsSaveObject": [] - } - } - } -} -``` - -## Create draft timeline api - -#### POST /api/timeline/_draft - -##### Authorization - -Type: Basic Auth - -username: Your Kibana username - -password: Your Kibana password - - -##### Request header - -``` - -Content-Type: application/json - -kbn-version: 8.0.0 - -``` - -##### Request body - -```json -{ - "timelineType": "default" or "template" -} -``` - -##### Response -```json -{ - "data": { - "persistTimeline": { - "timeline": { - "savedObjectId": "ababbd90-99de-11ea-8446-1d7fd9f03ebf", - "version": "WzQyMywzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [], - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "timelineType": "default", - "kqlQuery": { - "filterQuery": null - }, - "title": "", - "sort": { - "columnId": "@timestamp", - "sortDirection": "desc" - }, - "status": "draft", - "created": 1589903306582, - "createdBy": "casetester", - "updated": 1589903306582, - "updatedBy": "casetester", - "templateTimelineId": null, - "templateTimelineVersion": null, - "favorite": [], - "eventIdToNoteIds": [], - "noteIds": [], - "notes": [], - "pinnedEventIds": [], - "pinnedEventsSaveObject": [] - } - } - } -} -``` - -## Get timelines / timeline templates api - -#### GET /api/timelines - - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` - -##### Query params - -optional: -only_user_favorite={boolean} -page_index={number} -page_size={number} -search={string} -sort_field={title|description|updated|created} -sort_order={asc|desc} -status={active|draft|immutable} -timeline_type={default|template} - -##### example -api/timelines?page_size=10&page_index=1&sort_field=updated&sort_order=desc&timeline_type=default - -##### Response - -```json -{ - "totalCount": 2, - "timeline": [ - { - "savedObjectId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4NywzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp", - "type": "number" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [ - { - "excluded": false, - "and": [], - "kqlQuery": "", - "name": "", - "queryMatch": { - "field": "host.name", - "value": "", - "operator": ":*" - }, - "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", - "type": "default", - "enabled": true - } - ], - "dataViewId": "security-solution", - "description": "", - "eqlOptions": { - "tiebreakerField": "", - "size": 100, - "query": "", - "eventCategoryField": "event.category", - "timestampField": "@timestamp" - }, - "eventType": "all", - "excludedRowRendererIds": [], - "filters": [], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": null - }, - "indexNames": [ - ".siem-signals-angelachuang-default", - "auditbeat-*", - "endgame-*", - "filebeat-*", - "logs-*", - "packetbeat-*", - "winlogbeat-*" - ], - "title": "timeline - Duplicate", - "timelineType": "default", - "templateTimelineVersion": null, - "templateTimelineId": null, - "dateRange": { - "start": "2021-03-25T05:38:55.593Z", - "end": "2021-03-26T15:59:59.999Z" - }, - "savedQueryId": null, - "sort": [ - { - "columnType": "number", - "sortDirection": "desc", - "columnId": "@timestamp" - } - ], - "status": "active", - "created": 1616757027458, - "createdBy": "angela", - "updated": 1616758738320, - "updatedBy": "angela", - "favorite": [], - "eventIdToNoteIds": [ - { - "noteId": "e6f3a9a0-8e23-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4MywzXQ==", - "eventId": "QN84bngBYJMSg9tnAi1V", - "note": "note!", - "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "created": 1616757041466, - "createdBy": "angela", - "updated": 1616757041466, - "updatedBy": "angela" - } - ], - "noteIds": [ - "221524f0-8e24-11eb-ad8a-a192243e45e8" - ], - "notes": [ - { - "noteId": "e6f3a9a0-8e23-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4MywzXQ==", - "eventId": "QN84bngBYJMSg9tnAi1V", - "note": "note!", - "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "created": 1616757041466, - "createdBy": "angela", - "updated": 1616757041466, - "updatedBy": "angela" - }, - { - "noteId": "221524f0-8e24-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4NiwzXQ==", - "note": "global note!", - "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "created": 1616757140671, - "createdBy": "angela", - "updated": 1616757140671, - "updatedBy": "angela" - } - ], - "pinnedEventIds": [ - "QN84bngBYJMSg9tnAi1V", - "P984bngBYJMSg9tnAi1V" - ], - "pinnedEventsSaveObject": [ - { - "pinnedEventId": "e85339a0-8e23-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4NCwzXQ==", - "eventId": "QN84bngBYJMSg9tnAi1V", - "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "created": 1616757043770, - "createdBy": "angela", - "updated": 1616757043770, - "updatedBy": "angela" - }, - { - "pinnedEventId": "2945cfe0-8e24-11eb-ad8a-a192243e45e8", - "version": "WzM1NzQ4NSwzXQ==", - "eventId": "P984bngBYJMSg9tnAi1V", - "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", - "created": 1616757152734, - "createdBy": "angela", - "updated": 1616757152734, - "updatedBy": "angela" - } - ] - }, - { - "savedObjectId": "48870270-8e1f-11eb-9cbd-7f6324a02fb7", - "version": "WzM1NzQ4MiwzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp", - "type": "number" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [ - { - "excluded": false, - "and": [], - "kqlQuery": "", - "name": "", - "queryMatch": { - "field": "host.name", - "value": "", - "operator": ":*" - }, - "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", - "type": "default", - "enabled": true - } - ], - "dataViewId": "security-solution", - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "timelineType": "default", - "kqlQuery": { - "filterQuery": null - }, - "title": "timeline", - "sort": [ - { - "columnType": "number", - "sortDirection": "desc", - "columnId": "@timestamp" - } - ], - "status": "active", - "created": 1616755057686, - "createdBy": "angela", - "updated": 1616756755376, - "updatedBy": "angela", - "templateTimelineId": null, - "templateTimelineVersion": null, - "excludedRowRendererIds": [], - "dateRange": { - "start": "2021-03-25T16:00:00.000Z", - "end": "2021-03-26T15:59:59.999Z" - }, - "indexNames": [ - "auditbeat-*", - "endgame-*", - "filebeat-*", - "logs-*", - "packetbeat-*", - "winlogbeat-*", - ".siem-signals-angelachuang-default" - ], - "eqlOptions": { - "tiebreakerField": "", - "size": 100, - "query": "", - "eventCategoryField": "event.category", - "timestampField": "@timestamp" - }, - "savedQueryId": null, - "favorite": [ - { - "favoriteDate": 1616756755376, - "keySearch": "YW5nZWxh", - "fullName": "Angela", - "userName": "angela" - } - ], - "eventIdToNoteIds": [], - "noteIds": [], - "notes": [], - "pinnedEventIds": [], - "pinnedEventsSaveObject": [] - } - ], - "defaultTimelineCount": 2, - "templateTimelineCount": 4, - "elasticTemplateTimelineCount": 3, - "customTemplateTimelineCount": 1, - "favoriteCount": 1 -} -``` - -## Get timeline api - -#### GET /api/id?id={savedObjectId} - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` - -##### Response -```json -{ - "data": { - "getOneTimeline": { - "savedObjectId": "48870270-8e1f-11eb-9cbd-7f6324a02fb7", - "version": "WzM1NzQ4MiwzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp", - "type": "number" - }, - { - "columnHeaderType": "not-filtered", - "id": "message" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.category" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "host.name" - }, - { - "columnHeaderType": "not-filtered", - "id": "source.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "destination.ip" - }, - { - "columnHeaderType": "not-filtered", - "id": "user.name" - } - ], - "dataProviders": [ - { - "excluded": false, - "and": [], - "kqlQuery": "", - "name": "", - "queryMatch": { - "field": "host.name", - "value": "", - "operator": ":*" - }, - "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", - "type": "default", - "enabled": true - } - ], - "dataViewId": "security-solution", - "description": "", - "eventType": "all", - "filters": [], - "kqlMode": "filter", - "timelineType": "default", - "kqlQuery": { - "filterQuery": null - }, - "title": "timeline", - "sort": [ - { - "columnType": "number", - "sortDirection": "desc", - "columnId": "@timestamp" - } - ], - "status": "active", - "created": 1616755057686, - "createdBy": "angela", - "updated": 1616756755376, - "updatedBy": "angela", - "templateTimelineId": null, - "templateTimelineVersion": null, - "excludedRowRendererIds": [], - "dateRange": { - "start": "2021-03-25T16:00:00.000Z", - "end": "2021-03-26T15:59:59.999Z" - }, - "indexNames": [ - "auditbeat-*", - "endgame-*", - "filebeat-*", - "logs-*", - "packetbeat-*", - "winlogbeat-*", - ".siem-signals-angelachuang-default" - ], - "eqlOptions": { - "tiebreakerField": "", - "size": 100, - "query": "", - "eventCategoryField": "event.category", - "timestampField": "@timestamp" - }, - "savedQueryId": null, - "favorite": [ - { - "favoriteDate": 1616756755376, - "keySearch": "YW5nZWxh", - "fullName": "Angela", - "userName": "angela" - } - ], - "eventIdToNoteIds": [], - "noteIds": [], - "notes": [], - "pinnedEventIds": [], - "pinnedEventsSaveObject": [] - } - } -} -``` - - -## Get timeline template api - -#### GET /api/timeline?template_timeline_id={templateTimelineId} - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` - -##### Response -```json -{ - "data": { - "getOneTimeline": { - "savedObjectId": "bf662160-9788-11eb-8277-3516cc4109c3", - "version": "WzM1NzU2MCwzXQ==", - "columns": [ - { - "columnHeaderType": "not-filtered", - "id": "@timestamp" - }, - { - "columnHeaderType": "not-filtered", - "id": "signal.rule.description" - }, - { - "columnHeaderType": "not-filtered", - "id": "event.action" - }, - { - "columnHeaderType": "not-filtered", - "id": "process.name" - }, - { - "aggregatable": true, - "description": "The working directory of the process.", - "columnHeaderType": "not-filtered", - "id": "process.working_directory", - "category": "process", - "type": "string", - "example": "/home/alice" - }, - { - "aggregatable": true, - "description": "Array of process arguments, starting with the absolute path to\nthe executable.\n\nMay be filtered to protect sensitive information.", - "columnHeaderType": "not-filtered", - "id": "process.args", - "category": "process", - "type": "string", - "example": "[\"/usr/bin/ssh\",\"-l\",\"user\",\"10.0.0.16\"]" - }, - { - "columnHeaderType": "not-filtered", - "id": "process.pid" - }, - { - "aggregatable": true, - "description": "Absolute path to the process executable.", - "columnHeaderType": "not-filtered", - "id": "process.parent.executable", - "category": "process", - "type": "string", - "example": "/usr/bin/ssh" - }, - { - "aggregatable": true, - "description": "Array of process arguments.\n\nMay be filtered to protect sensitive information.", - "columnHeaderType": "not-filtered", - "id": "process.parent.args", - "category": "process", - "type": "string", - "example": "[\"ssh\",\"-l\",\"user\",\"10.0.0.16\"]" - }, - { - "aggregatable": true, - "description": "Process id.", - "columnHeaderType": "not-filtered", - "id": "process.parent.pid", - "category": "process", - "type": "number", - "example": "4242" - }, - { - "aggregatable": true, - "description": "Short name or login of the user.", - "columnHeaderType": "not-filtered", - "id": "user.name", - "category": "user", - "type": "string", - "example": "albert" - }, - { - "aggregatable": true, - "description": "Name of the host.\n\nIt can contain what `hostname` returns on Unix systems, the fully qualified\ndomain name, or a name specified by the user. The sender decides which value\nto use.", - "columnHeaderType": "not-filtered", - "id": "host.name", - "category": "host", - "type": "string" - } - ], - "dataProviders": [ - { - "excluded": false, - "and": [], - "kqlQuery": "", - "name": "{process.name}", - "queryMatch": { - "displayValue": null, - "field": "process.name", - "displayField": null, - "value": "{process.name}", - "operator": ":" - }, - "id": "timeline-1-8622010a-61fb-490d-b162-beac9c36a853", - "type": "template", - "enabled": true - } - ], - "dataViewId": "security-solution", - "description": "", - "eqlOptions": { - "eventCategoryField": "event.category", - "tiebreakerField": "", - "timestampField": "@timestamp", - "query": "", - "size": 100 - }, - "eventType": "all", - "excludedRowRendererIds": [], - "filters": [], - "kqlMode": "filter", - "kqlQuery": { - "filterQuery": { - "kuery": { - "kind": "kuery", - "expression": "" - }, - "serializedQuery": "" - } - }, - "indexNames": [], - "title": "Generic Process Timeline - Duplicate", - "timelineType": "template", - "templateTimelineVersion": 1, - "templateTimelineId": "94dd7443-97ea-4461-864d-fa96803ec111", - "dateRange": { - "start": "2021-04-06T07:57:57.922Z", - "end": "2021-04-07T07:57:57.922Z" - }, - "savedQueryId": null, - "sort": [ - { - "sortDirection": "desc", - "columnId": "@timestamp" - } - ], - "status": "active", - "created": 1617789914742, - "createdBy": "angela", - "updated": 1617790158569, - "updatedBy": "angela", - "favorite": [ - { - "favoriteDate": 1617790158569, - "keySearch": "YW5nZWxh", - "fullName": "Angela", - "userName": "angela" - } - ], - "eventIdToNoteIds": [], - "noteIds": [], - "notes": [], - "pinnedEventIds": [], - "pinnedEventsSaveObject": [] - } - } -} -``` - -## Delete timeline api - -#### DELETE /api/timeline - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` - -Content-Type: application/json - -kbn-version: 8.0.0 - -``` - -##### Request body - -```json -{ - "savedObjectIds": [savedObjectId1, savedObjectId2] -} -``` - -##### Response -```json -{"data":{"deleteTimeline":true}} -``` - -## Persist note api - -#### POST /api/note - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` - -##### Request body - -```json -{ - "note": { - "timelineId": {timeline id that the note is linked to}, - "eventId" (optional): {event id the note is linked to. Not available is it is a global note}, - "note"(optional): {note content}, - }, - "noteId"(optional): note savedObjectId, - "version" (optional): note savedObjectVersion -} -``` -##### Example -```json -{ - "noteId": null, - "version": null, - "note": { - "eventId": "Q9tqqXgBc4D54_cxJnHV", - "note": "note", - "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213" - } -} -``` - -##### Response -``` -{ - "data": { - "persistNote": { - "code": 200, - "message": "success", - "note": { - "noteId": "fe8f6980-97ad-11eb-862e-850f4426d3d0", - "version": "WzM1MDAyNSwzXQ==", - "eventId": "UNtqqXgBc4D54_cxIGi-", - "note": "event note", - "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213", - "created": 1617805912088, - "createdBy": "angela", - "updated": 1617805912088, - "updatedBy": "angela" - } - } - } -} -``` - -## Persist pinned event api - -#### POST /api/pinned_event - -##### Authorization - -Type: Basic Auth -username: Your Kibana username -password: Your Kibana password - - -##### Request header - -``` -Content-Type: application/json -kbn-version: 8.0.0 -``` - -##### Request body - -```json -{ - "eventId": {event which is pinned} - "pinnedEventId" (optional): {pinned event savedObjectId} - "timelineId": {timeline which this pinned event is linked to} -} -``` - -##### example - -``` -{ - "eventId":"UdtqqXgBc4D54_cxIGi", - "pinnedEventId":null, - "timelineId":"1ec3b430-908e-11eb-94fa-c9122cbc0213" -} -``` - -##### Response -```json -{ - "data": { - "persistPinnedEventOnTimeline": { - "pinnedEventId": "5b8f1720-97ae-11eb-862e-850f4426d3d0", - "version": "WzM1MDA1OSwzXQ==", - "eventId": "UdtqqXgBc4D54_cxIGi-", - "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213", - "created": 1617806068114, - "createdBy": "angela", - "updated": 1617806068114, - "updatedBy": "angela" - } - } -} -``` - - - diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.test.ts index ba727f6c0d707..72976ab3bf9f0 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.test.ts @@ -92,13 +92,7 @@ describe('clean draft timelines', () => { timelineType: req.body.timelineType, }); expect(response.status).toEqual(200); - expect(response.body).toEqual({ - data: { - persistTimeline: { - timeline: createTimelineWithTimelineId, - }, - }, - }); + expect(response.body).toEqual(createTimelineWithTimelineId); }); test('should return clean existing draft if draft available ', async () => { @@ -121,12 +115,6 @@ describe('clean draft timelines', () => { expect(mockGetTimeline).toHaveBeenCalled(); expect(response.status).toEqual(200); - expect(response.body).toEqual({ - data: { - persistTimeline: { - timeline: mockGetDraftTimelineValue, - }, - }, - }); + expect(response.body).toEqual(mockGetDraftTimelineValue); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts index fb6ffba7995b8..639a5a2ae0e8c 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts @@ -66,13 +66,7 @@ export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) = ); return response.ok({ - body: { - data: { - persistTimeline: { - timeline: cleanedDraftTimeline, - }, - }, - }, + body: cleanedDraftTimeline, }); } const templateTimelineData = @@ -91,17 +85,14 @@ export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) = if (newTimelineResponse.code === 200) { return response.ok({ - body: { - data: { - persistTimeline: { - timeline: newTimelineResponse.timeline, - }, - }, - }, + body: newTimelineResponse.timeline, + }); + } else { + return siemResponse.error({ + body: newTimelineResponse.message, + statusCode: newTimelineResponse.code, }); } - - return response.ok({}); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.test.ts index 75c9b361bc78f..49e276f8a4c50 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.test.ts @@ -90,13 +90,7 @@ describe('get draft timelines', () => { }); expect(response.status).toEqual(200); - expect(response.body).toEqual({ - data: { - persistTimeline: { - timeline: createTimelineWithTimelineId, - }, - }, - }); + expect(response.body).toEqual(createTimelineWithTimelineId); }); test('should return an existing draft if available', async () => { @@ -110,13 +104,7 @@ describe('get draft timelines', () => { ); expect(mockPersistTimeline).not.toHaveBeenCalled(); expect(response.status).toEqual(200); - expect(response.body).toEqual({ - data: { - persistTimeline: { - timeline: mockGetDraftTimelineValue, - }, - }, - }); + expect(response.body).toEqual(mockGetDraftTimelineValue); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts index e83d2cc839db0..37db10f5393bc 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/get_draft_timelines/index.ts @@ -49,13 +49,7 @@ export const getDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) => if (draftTimeline?.savedObjectId) { return response.ok({ - body: { - data: { - persistTimeline: { - timeline: draftTimeline, - }, - }, - }, + body: draftTimeline, }); } @@ -65,18 +59,13 @@ export const getDraftTimelinesRoute = (router: SecuritySolutionPluginRouter) => }); if (newTimelineResponse.code === 200) { - return response.ok({ - body: { - data: { - persistTimeline: { - timeline: newTimelineResponse.timeline, - }, - }, - }, + return response.ok({ body: newTimelineResponse.timeline }); + } else { + return siemResponse.error({ + body: newTimelineResponse.message, + statusCode: newTimelineResponse.code, }); } - - return response.ok({}); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts index 7308801030f4a..c2bc36e18c357 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts @@ -15,7 +15,7 @@ import { NOTE_URL } from '../../../../../common/constants'; import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; -import { DeleteNoteRequestBody, type DeleteNoteResponse } from '../../../../../common/api/timeline'; +import { DeleteNoteRequestBody } from '../../../../../common/api/timeline'; import { deleteNote } from '../../saved_object/notes'; export const deleteNoteRoute = (router: SecuritySolutionPluginRouter) => { @@ -36,7 +36,7 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter) => { }, version: '2023-10-31', }, - async (context, request, response): Promise> => { + async (context, request, response): Promise => { const siemResponse = buildSiemResponse(response); try { @@ -56,9 +56,7 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter) => { noteIds, }); - return response.ok({ - body: { data: {} }, - }); + return response.ok(); } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts index 3a1ae1ba27e2f..dc8fffbc0a86d 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts @@ -76,8 +76,7 @@ export const getNotesRoute = ( perPage: maxUnassociatedNotes, }; const res = await getAllSavedNote(frameworkRequest, options); - const body: GetNotesResponse = res ?? {}; - return response.ok({ body }); + return response.ok({ body: res }); } // searching for all the notes associated with a specific document id @@ -88,7 +87,7 @@ export const getNotesRoute = ( perPage: maxUnassociatedNotes, }; const res = await getAllSavedNote(frameworkRequest, options); - return response.ok({ body: res ?? {} }); + return response.ok({ body: res }); } // if savedObjectIds is provided, we will search for all the notes associated with the savedObjectIds @@ -106,8 +105,7 @@ export const getNotesRoute = ( perPage: maxUnassociatedNotes, }; const res = await getAllSavedNote(frameworkRequest, options); - const body: GetNotesResponse = res ?? {}; - return response.ok({ body }); + return response.ok({ body: res }); } // searching for all the notes associated with a specific saved object id @@ -120,8 +118,7 @@ export const getNotesRoute = ( perPage: maxUnassociatedNotes, }; const res = await getAllSavedNote(frameworkRequest, options); - const body: GetNotesResponse = res ?? {}; - return response.ok({ body }); + return response.ok({ body: res }); } // retrieving all the notes following the query parameters @@ -236,8 +233,7 @@ export const getNotesRoute = ( options.filter = nodeBuilder.and(filterKueryNodeArray); const res = await getAllSavedNote(frameworkRequest, options); - const body: GetNotesResponse = res ?? {}; - return response.ok({ body }); + return response.ok({ body: res }); } catch (err) { const error = transformError(err); const siemResponse = buildSiemResponse(response); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts index f9759444b26d8..12fed18a5c396 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts @@ -53,10 +53,9 @@ export const persistNoteRoute = (router: SecuritySolutionPluginRouter) => { note, overrideOwner: true, }); - const body: PersistNoteRouteResponse = { data: { persistNote: res } }; return response.ok({ - body, + body: res, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts index 51b001c9ea29e..7dd66f86245ab 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts @@ -61,9 +61,7 @@ export const persistPinnedEventRoute = (router: SecuritySolutionPluginRouter) => ); return response.ok({ - body: { - data: { persistPinnedEventOnTimeline: res }, - }, + body: res, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts index 502b43d4e347f..2241de72b3307 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/copy_timeline/index.ts @@ -44,9 +44,17 @@ export const copyTimelineRoute = (router: SecuritySolutionPluginRouter) => { const frameworkRequest = await buildFrameworkRequest(context, request); const { timeline, timelineIdToCopy } = request.body; const copiedTimeline = await copyTimeline(frameworkRequest, timeline, timelineIdToCopy); - return response.ok({ - body: { data: { persistTimeline: copiedTimeline } }, - }); + + if (copiedTimeline.code === 200) { + return response.ok({ + body: copiedTimeline.timeline, + }); + } else { + return siemResponse.error({ + body: copiedTimeline.message, + statusCode: copiedTimeline.code, + }); + } } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.test.ts index a510f24a35637..67e7547b4b5a2 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.test.ts @@ -69,8 +69,8 @@ describe('create timelines', () => { beforeEach(async () => { jest.doMock('../../../saved_object/timelines', () => { return { - getTimeline: mockGetTimeline.mockReturnValue(null), persistTimeline: mockPersistTimeline.mockReturnValue({ + code: 200, timeline: createTimelineWithTimelineId, }), }; @@ -173,6 +173,7 @@ describe('create timelines', () => { return { getTimelineTemplateOrNull: mockGetTimeline.mockReturnValue(null), persistTimeline: mockPersistTimeline.mockReturnValue({ + code: 200, timeline: createTemplateTimelineWithTimelineId, }), }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts index a91fefc20f934..e6af5abd78425 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts @@ -81,13 +81,16 @@ export const createTimelinesRoute = (router: SecuritySolutionPluginRouter) => { timelineVersion: version, }); - return response.ok({ - body: { - data: { - persistTimeline: newTimeline, - }, - }, - }); + if (newTimeline.code === 200) { + return response.ok({ + body: newTimeline.timeline, + }); + } else { + return siemResponse.error({ + statusCode: newTimeline.code, + body: newTimeline.message, + }); + } } else { return siemResponse.error( compareTimelinesStatus.checkIsFailureCases(TimelineStatusActions.create) || { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts index 07cffb3e13bf5..4d64ab88c88fb 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts @@ -8,10 +8,7 @@ import type { IKibanaResponse } from '@kbn/core-http-server'; import { transformError } from '@kbn/securitysolution-es-utils'; import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; -import { - DeleteTimelinesRequestBody, - type DeleteTimelinesResponse, -} from '../../../../../../common/api/timeline'; +import { DeleteTimelinesRequestBody } from '../../../../../../common/api/timeline'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_URL } from '../../../../../../common/constants'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; @@ -37,7 +34,7 @@ export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter) => { request: { body: buildRouteValidationWithZod(DeleteTimelinesRequestBody) }, }, }, - async (context, request, response): Promise> => { + async (context, request, response): Promise => { const siemResponse = buildSiemResponse(response); try { @@ -45,8 +42,7 @@ export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter) => { const { savedObjectIds, searchIds } = request.body; await deleteTimeline(frameworkRequest, savedObjectIds, searchIds); - const body: DeleteTimelinesResponse = { data: { deleteTimeline: true } }; - return response.ok({ body }); + return response.ok(); } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts index a1ae2178fb6fd..75d61987e775b 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts @@ -20,7 +20,6 @@ import { type GetTimelineResponse, } from '../../../../../../common/api/timeline'; import { getTimelineTemplateOrNull, getTimelineOrNull } from '../../../saved_object/timelines'; -import type { ResolvedTimeline, TimelineResponse } from '../../../../../../common/api/timeline'; export const getTimelineRoute = (router: SecuritySolutionPluginRouter) => { router.versioned @@ -41,26 +40,33 @@ export const getTimelineRoute = (router: SecuritySolutionPluginRouter) => { }, }, async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); + try { const frameworkRequest = await buildFrameworkRequest(context, request); const query = request.query ?? {}; const { template_timeline_id: templateTimelineId, id } = query; - let res: TimelineResponse | ResolvedTimeline | null = null; - if (templateTimelineId != null && id == null) { - res = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); + const timeline = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); + if (timeline) { + return response.ok({ body: timeline }); + } } else if (templateTimelineId == null && id != null) { - res = await getTimelineOrNull(frameworkRequest, id); + const timelineOrNull = await getTimelineOrNull(frameworkRequest, id); + if (timelineOrNull) { + return response.ok({ body: timelineOrNull }); + } } else { throw new Error('please provide id or template_timeline_id'); } - return response.ok({ body: res ? { data: { getOneTimeline: res } } : {} }); + return siemResponse.error({ + statusCode: 404, + body: 'Could not find timeline', + }); } catch (err) { const error = transformError(err); - const siemResponse = buildSiemResponse(response); - return siemResponse.error({ body: error.message, statusCode: error.statusCode, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts index 01a3801ad8672..2ebcb4c38c37e 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts @@ -59,7 +59,6 @@ export const getTimelinesRoute = (router: SecuritySolutionPluginRouter) => { sortOrder, } : null; - let res = null; let totalCount = null; if (pageSize == null && pageIndex == null) { @@ -75,7 +74,7 @@ export const getTimelinesRoute = (router: SecuritySolutionPluginRouter) => { totalCount = allActiveTimelines.totalCount; } - res = await getAllTimeline( + const res = await getAllTimeline( frameworkRequest, onlyUserFavorite, { @@ -88,7 +87,7 @@ export const getTimelinesRoute = (router: SecuritySolutionPluginRouter) => { timelineType ); - return response.ok({ body: res ?? {} }); + return response.ok({ body: res }); } catch (err) { const error = transformError(err); const siemResponse = buildSiemResponse(response); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts index f66c5456c0396..3e40a7a7ebcb0 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts @@ -83,7 +83,7 @@ export const importTimelinesRoute = (router: SecuritySolutionPluginRouter, confi if (res instanceof Error || typeof res === 'string') { throw res; } else { - return response.ok({ body: res ?? {} }); + return response.ok({ body: res }); } } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts index bb2ba80526d00..0c74d259bd228 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts @@ -69,6 +69,7 @@ describe('update timelines', () => { getTimelineOrNull: mockGetTimeline.mockReturnValue(mockGetTimelineValue), persistTimeline: mockPersistTimeline.mockReturnValue({ timeline: updateTimelineWithTimelineId.timeline, + code: 200, }), }; }); @@ -177,6 +178,7 @@ describe('update timelines', () => { }), persistTimeline: mockPersistTimeline.mockReturnValue({ timeline: updateTemplateTimelineWithTimelineId.timeline, + code: 200, }), }; }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts index 7ddea9bd5ffe7..340b8611901e5 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts @@ -73,13 +73,16 @@ export const patchTimelinesRoute = (router: SecuritySolutionPluginRouter) => { timelineVersion: version, }); - return response.ok({ - body: { - data: { - persistTimeline: updatedTimeline, - }, - }, - }); + if (updatedTimeline.code === 200) { + return response.ok({ + body: updatedTimeline.timeline, + }); + } else { + return siemResponse.error({ + statusCode: updatedTimeline.code, + body: updatedTimeline.message, + }); + } } else { const error = compareTimelinesStatus.checkIsFailureCases(TimelineStatusActions.update); return siemResponse.error( diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts index 22d579229a73b..ed3531d8bd744 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts @@ -52,7 +52,7 @@ export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter) => { const { timelineId, templateTimelineId, templateTimelineVersion, timelineType } = request.body; - const timeline = await persistFavorite( + const persistFavoriteResponse = await persistFavorite( frameworkRequest, timelineId || null, templateTimelineId || null, @@ -60,15 +60,16 @@ export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter) => { timelineType || TimelineTypeEnum.default ); - const body: PersistFavoriteRouteResponse = { - data: { - persistFavorite: timeline, - }, - }; - - return response.ok({ - body, - }); + if (persistFavoriteResponse.code !== 200) { + return siemResponse.error({ + body: persistFavoriteResponse.message, + statusCode: persistFavoriteResponse.code, + }); + } else { + return response.ok({ + body: persistFavoriteResponse.favoriteTimeline, + }); + } } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts index 773e74faaaf46..8e6ff9e8adca7 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/resolve_timeline/index.ts @@ -21,7 +21,6 @@ import { type ResolveTimelineResponse, } from '../../../../../../common/api/timeline'; import { getTimelineTemplateOrNull, resolveTimelineOrNull } from '../../../saved_object/timelines'; -import type { SavedTimeline, ResolvedTimeline } from '../../../../../../common/api/timeline'; export const resolveTimelineRoute = (router: SecuritySolutionPluginRouter) => { router.versioned @@ -42,28 +41,39 @@ export const resolveTimelineRoute = (router: SecuritySolutionPluginRouter) => { }, }, async (context, request, response): Promise> => { + const siemResponse = buildSiemResponse(response); + try { const frameworkRequest = await buildFrameworkRequest(context, request); const query = request.query ?? {}; const { template_timeline_id: templateTimelineId, id } = query; - let res: SavedTimeline | ResolvedTimeline | null = null; - if (templateTimelineId != null && id == null) { // Template timelineId is not a SO id, so it does not need to be updated to use resolve - res = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); + const timeline = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); + if (timeline) { + return response.ok({ + body: { timeline, outcome: 'exactMatch' }, + }); + } } else if (templateTimelineId == null && id != null) { // In the event the objectId is defined, run the resolve call - res = await resolveTimelineOrNull(frameworkRequest, id); + const timelineOrNull = await resolveTimelineOrNull(frameworkRequest, id); + if (timelineOrNull) { + return response.ok({ + body: timelineOrNull, + }); + } } else { throw new Error('please provide id or template_timeline_id'); } - return response.ok({ body: res ? { data: res } : {} }); + return siemResponse.error({ + statusCode: 404, + body: 'Could not resolve timeline', + }); } catch (err) { const error = transformError(err); - const siemResponse = buildSiemResponse(response); - return siemResponse.error({ body: error.message, statusCode: error.statusCode, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts index 571e0f4da8616..3a211efc9565d 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts @@ -6,7 +6,7 @@ */ import type { FrameworkRequest } from '../../../framework'; -import { persistNote } from './saved_object'; +import { persistNote, type InternalNoteResponse } from './saved_object'; import { getOverridableNote } from './get_overridable_note'; import type { Note } from '../../../../../common/api/timeline'; @@ -16,7 +16,7 @@ export const persistNotes = async ( existingNoteIds?: string[] | null, newNotes?: Note[], overrideOwner: boolean = true -) => { +): Promise => { return Promise.all( newNotes?.map(async (note) => { const newNote = await getOverridableNote( @@ -31,6 +31,6 @@ export const persistNotes = async ( note: newNote, overrideOwner, }); - }) ?? [] + }) ?? ([] as InternalNoteResponse[]) ); }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts index ff353efe0fb53..7614ff1c1d1dc 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts @@ -6,7 +6,6 @@ */ import { failure } from 'io-ts/lib/PathReporter'; -import { getOr } from 'lodash/fp'; import { v1 as uuidv1 } from 'uuid'; import { pipe } from 'fp-ts/lib/pipeable'; @@ -81,6 +80,11 @@ export const getNotesByTimelineId = async ( return notesByTimelineId.notes; }; +export interface InternalNoteResponse extends ResponseNote { + message: string; + code: number; +} + export const persistNote = async ({ request, noteId, @@ -91,35 +95,18 @@ export const persistNote = async ({ noteId: string | null; note: BareNote | BareNoteWithoutExternalRefs; overrideOwner?: boolean; -}): Promise => { - try { - if (noteId == null) { - return await createNote({ - request, - noteId, - note, - overrideOwner, - }); - } - - // Update existing note - return await updateNote({ request, noteId, note, overrideOwner }); - } catch (err) { - if (getOr(null, 'output.statusCode', err) === 403) { - const noteToReturn: Note = { - ...note, - noteId: uuidv1(), - version: '', - timelineId: '', - }; - return { - code: 403, - message: err.message, - note: noteToReturn, - }; - } - throw err; +}): Promise => { + if (noteId == null) { + return createNote({ + request, + noteId, + note, + overrideOwner, + }); } + + // Update existing note + return updateNote({ request, noteId, note, overrideOwner }); }; export const createNote = async ({ @@ -132,7 +119,7 @@ export const createNote = async ({ noteId: string | null; note: BareNote | BareNoteWithoutExternalRefs; overrideOwner?: boolean; -}): Promise => { +}): Promise => { const { savedObjects: { client: savedObjectsClient }, uiSettings: { client: uiSettingsClient }, @@ -203,7 +190,7 @@ export const updateNote = async ({ noteId: string; note: BareNote | BareNoteWithoutExternalRefs; overrideOwner?: boolean; -}): Promise => { +}): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const userInfo = request.user; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts index 5181a099ae7fb..e7537b94a5d62 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts @@ -6,7 +6,6 @@ */ import { failure } from 'io-ts/lib/PathReporter'; -import { getOr } from 'lodash/fp'; import { pipe } from 'fp-ts/lib/pipeable'; import { map, fold } from 'fp-ts/lib/Either'; import { identity } from 'fp-ts/lib/function'; @@ -77,44 +76,24 @@ export const persistPinnedEventOnTimeline = async ( eventId: string, timelineId: string ): Promise => { - try { - if (pinnedEventId != null) { - // Delete Pinned Event on Timeline - await deletePinnedEventOnTimeline(request, [pinnedEventId]); - return null; - } - - const pinnedEvents = await getPinnedEventsInTimelineWithEventId(request, timelineId, eventId); - - // we already had this event pinned so let's just return the one we already had - if (pinnedEvents.length > 0) { - return { ...pinnedEvents[0], code: 200 }; - } - - return await createPinnedEvent({ - request, - eventId, - timelineId, - }); - } catch (err) { - if (getOr(null, 'output.statusCode', err) === 404) { - /* - * Why we are doing that, because if it is not found for sure that it will be unpinned - * There is no need to bring back this error since we can assume that it is unpinned - */ - return null; - } - if (getOr(null, 'output.statusCode', err) === 403) { - return pinnedEventId != null - ? { - code: 403, - message: err.message, - pinnedEventId: eventId, - } - : null; - } - throw err; + if (pinnedEventId != null) { + // Delete Pinned Event on Timeline + await deletePinnedEventOnTimeline(request, [pinnedEventId]); + return { unpinned: true }; + } + + const pinnedEvents = await getPinnedEventsInTimelineWithEventId(request, timelineId, eventId); + + // we already had this event pinned so let's just return the one we already had + if (pinnedEvents.length > 0) { + return { ...pinnedEvents[0] }; } + + return createPinnedEvent({ + request, + eventId, + timelineId, + }); }; const getPinnedEventsInTimelineWithEventId = async ( @@ -172,7 +151,6 @@ const createPinnedEvent = async ({ // create Pinned Event on Timeline return { ...convertSavedObjectToSavedPinnedEvent(repopulatedSavedObject), - code: 200, }; }; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts index c3016164d4e7e..f8e99f2831ae3 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts @@ -298,61 +298,67 @@ export const getDraftTimeline = async ( return getAllSavedTimeline(request, options); }; +interface InternalPersistFavoriteResponse { + code: number; + message: string; + favoriteTimeline: FavoriteTimelineResponse; +} + export const persistFavorite = async ( request: FrameworkRequest, timelineId: string | null, templateTimelineId: string | null, templateTimelineVersion: number | null, timelineType: TimelineType -): Promise => { +): Promise => { const userName = request.user?.username ?? UNAUTHENTICATED_USER; const fullName = request.user?.full_name ?? ''; - try { - let timeline: SavedTimeline = {}; - if (timelineId != null) { - const { - eventIdToNoteIds, - notes, - noteIds, - pinnedEventIds, - pinnedEventsSaveObject, - savedObjectId, - version, - ...savedTimeline - } = await getBasicSavedTimeline(request, timelineId); - timelineId = savedObjectId; // eslint-disable-line no-param-reassign - timeline = savedTimeline; - } + let timeline: SavedTimeline = {}; + if (timelineId != null) { + const { + eventIdToNoteIds, + notes, + noteIds, + pinnedEventIds, + pinnedEventsSaveObject, + savedObjectId, + version, + ...savedTimeline + } = await getBasicSavedTimeline(request, timelineId); + timelineId = savedObjectId; // eslint-disable-line no-param-reassign + timeline = savedTimeline; + } - const userFavoriteTimeline = { - keySearch: userName != null ? convertStringToBase64(userName) : null, - favoriteDate: new Date().valueOf(), - fullName, - userName, - }; - if (timeline.favorite != null) { - const alreadyExistsTimelineFavoriteByUser = timeline.favorite.findIndex( - (user) => user.userName === userName - ); - - timeline.favorite = - alreadyExistsTimelineFavoriteByUser > -1 - ? [ - ...timeline.favorite.slice(0, alreadyExistsTimelineFavoriteByUser), - ...timeline.favorite.slice(alreadyExistsTimelineFavoriteByUser + 1), - ] - : [...timeline.favorite, userFavoriteTimeline]; - } else if (timeline.favorite == null) { - timeline.favorite = [userFavoriteTimeline]; - } + const userFavoriteTimeline = { + keySearch: userName != null ? convertStringToBase64(userName) : null, + favoriteDate: new Date().valueOf(), + fullName, + userName, + }; + if (timeline.favorite != null) { + const alreadyExistsTimelineFavoriteByUser = timeline.favorite.findIndex( + (user) => user.userName === userName + ); - const persistResponse = await persistTimeline(request, timelineId, null, { - ...timeline, - templateTimelineId, - templateTimelineVersion, - timelineType, - }); - return { + timeline.favorite = + alreadyExistsTimelineFavoriteByUser > -1 + ? [ + ...timeline.favorite.slice(0, alreadyExistsTimelineFavoriteByUser), + ...timeline.favorite.slice(alreadyExistsTimelineFavoriteByUser + 1), + ] + : [...timeline.favorite, userFavoriteTimeline]; + } else if (timeline.favorite == null) { + timeline.favorite = [userFavoriteTimeline]; + } + + const persistResponse = await persistTimeline(request, timelineId, null, { + ...timeline, + templateTimelineId, + templateTimelineVersion, + timelineType, + }); + return { + favoriteTimeline: { savedObjectId: persistResponse.timeline.savedObjectId, version: persistResponse.timeline.version, favorite: @@ -362,19 +368,10 @@ export const persistFavorite = async ( templateTimelineId, templateTimelineVersion, timelineType, - }; - } catch (err) { - if (getOr(null, 'output.statusCode', err) === 403) { - return { - savedObjectId: '', - version: '', - favorite: [], - code: 403, - message: err.message, - }; - } - throw err; - } + }, + code: persistResponse.code, + message: persistResponse.message, + }; }; export interface InternalTimelineResponse { diff --git a/x-pack/plugins/security_solution/server/routes/limited_concurrency.ts b/x-pack/plugins/security_solution/server/routes/limited_concurrency.ts index bce6c835a7ed7..396bad7d2ce24 100644 --- a/x-pack/plugins/security_solution/server/routes/limited_concurrency.ts +++ b/x-pack/plugins/security_solution/server/routes/limited_concurrency.ts @@ -6,11 +6,11 @@ */ import type { - CoreSetup, KibanaRequest, LifecycleResponseFactory, OnPreAuthToolkit, -} from '@kbn/core/server'; +} from '@kbn/core-http-server'; +import type { CoreSetup } from '@kbn/core-lifecycle-server'; import { LIMITED_CONCURRENCY_ROUTE_TAG_PREFIX } from '../../common/constants'; class MaxCounter { diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 43b4665b8d9d8..4a00ef93abe63 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -221,7 +221,6 @@ "@kbn/entities-schema", "@kbn/inference-plugin", "@kbn/core-saved-objects-server-mocks", - "@kbn/core-http-router-server-internal", "@kbn/core-security-server-mocks", "@kbn/serverless", "@kbn/core-user-profile-browser", @@ -230,6 +229,7 @@ "@kbn/core-user-profile-common", "@kbn/langchain", "@kbn/react-hooks", - "@kbn/index-adapter" + "@kbn/index-adapter", + "@kbn/core-http-server-utils" ] } diff --git a/x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx b/x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx index e631fac8d6d24..5531210e10a3c 100644 --- a/x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx +++ b/x-pack/plugins/session_view/public/components/tty_player/hooks.test.tsx @@ -4,7 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { renderHook, act } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { sessionViewIOEventsMock } from '../../../common/mocks/responses/session_view_io_events.mock'; import { useIOLines, useXtermPlayer, XtermPlayerDeps } from './hooks'; import type { ProcessEventsPage } from '../../../common'; @@ -31,7 +32,7 @@ describe('TTYPlayer/hooks', () => { // test memoization let last = result.current.lines; - rerender(); + rerender({ pages: initial }); expect(result.current.lines === last).toBeTruthy(); last = result.current.lines; rerender({ pages: [...initial] }); diff --git a/x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx b/x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx index 7918a6fdda693..cf79e32dfce83 100644 --- a/x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx +++ b/x-pack/plugins/session_view/public/components/tty_search_bar/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { AppContextTestRender, createAppRootMockRenderer } from '../../test'; import { sessionViewIOEventsMock } from '../../../common/mocks/responses/session_view_io_events.mock'; diff --git a/x-pack/plugins/spaces/server/lib/request_interceptors/on_request_interceptor.ts b/x-pack/plugins/spaces/server/lib/request_interceptors/on_request_interceptor.ts index 61d7ac23818ad..812d7177a4163 100644 --- a/x-pack/plugins/spaces/server/lib/request_interceptors/on_request_interceptor.ts +++ b/x-pack/plugins/spaces/server/lib/request_interceptors/on_request_interceptor.ts @@ -6,11 +6,11 @@ */ import type { - CoreSetup, KibanaRequest, LifecycleResponseFactory, OnPreRoutingToolkit, -} from '@kbn/core/server'; +} from '@kbn/core-http-server'; +import type { CoreSetup } from '@kbn/core-lifecycle-server'; import { getSpaceIdFromPath } from '../../../common'; diff --git a/x-pack/plugins/spaces/tsconfig.json b/x-pack/plugins/spaces/tsconfig.json index 1099a054bd708..771f1b2e6139b 100644 --- a/x-pack/plugins/spaces/tsconfig.json +++ b/x-pack/plugins/spaces/tsconfig.json @@ -53,7 +53,8 @@ "@kbn/core-http-router-server-mocks", "@kbn/core-application-browser-mocks", "@kbn/ui-theme", - "@kbn/core-chrome-browser" + "@kbn/core-chrome-browser", + "@kbn/core-lifecycle-server" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts index d2ffa0b116bda..de6c10246298a 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/constants.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/constants.ts @@ -21,8 +21,7 @@ export enum SUB_ACTION { INVOKE_STREAM = 'invokeStream', DASHBOARD = 'getDashboard', TEST = 'test', - CONVERSE = 'converse', - CONVERSE_STREAM = 'converseStream', + BEDROCK_CLIENT_SEND = 'bedrockClientSend', } export const DEFAULT_TIMEOUT_MS = 120000; diff --git a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts index c444159c010b2..e9194a752300c 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/schema.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/schema.ts @@ -26,11 +26,6 @@ export const RunActionParamsSchema = schema.object({ signal: schema.maybe(schema.any()), timeout: schema.maybe(schema.number()), raw: schema.maybe(schema.boolean()), - apiType: schema.maybe( - schema.oneOf([schema.literal('converse'), schema.literal('invoke')], { - defaultValue: 'invoke', - }) - ), }); export const BedrockMessageSchema = schema.object( @@ -154,53 +149,11 @@ export const DashboardActionResponseSchema = schema.object({ available: schema.boolean(), }); -export const ConverseActionParamsSchema = schema.object({ - // Bedrock API Properties - modelId: schema.maybe(schema.string()), - messages: schema.arrayOf( - schema.object({ - role: schema.string(), - content: schema.any(), - }) - ), - system: schema.arrayOf( - schema.object({ - text: schema.string(), - }) - ), - inferenceConfig: schema.object({ - temperature: schema.maybe(schema.number()), - maxTokens: schema.maybe(schema.number()), - stopSequences: schema.maybe(schema.arrayOf(schema.string())), - topP: schema.maybe(schema.number()), - }), - toolConfig: schema.maybe( - schema.object({ - tools: schema.arrayOf( - schema.object({ - toolSpec: schema.object({ - name: schema.string(), - description: schema.string(), - inputSchema: schema.object({ - json: schema.object({ - type: schema.string(), - properties: schema.object({}, { unknowns: 'allow' }), - required: schema.maybe(schema.arrayOf(schema.string())), - additionalProperties: schema.boolean(), - $schema: schema.maybe(schema.string()), - }), - }), - }), - }) - ), - toolChoice: schema.maybe(schema.object({}, { unknowns: 'allow' })), - }) - ), - additionalModelRequestFields: schema.maybe(schema.any()), - additionalModelResponseFieldPaths: schema.maybe(schema.any()), - guardrailConfig: schema.maybe(schema.any()), +export const BedrockClientSendParamsSchema = schema.object({ + // ConverseCommand | ConverseStreamCommand from @aws-sdk/client-bedrock-runtime + command: schema.any(), // Kibana related properties signal: schema.maybe(schema.any()), }); -export const ConverseActionResponseSchema = schema.object({}, { unknowns: 'allow' }); +export const BedrockClientSendResponseSchema = schema.object({}, { unknowns: 'allow' }); diff --git a/x-pack/plugins/stack_connectors/common/bedrock/types.ts b/x-pack/plugins/stack_connectors/common/bedrock/types.ts index e3dd49538176f..2e716a52547cd 100644 --- a/x-pack/plugins/stack_connectors/common/bedrock/types.ts +++ b/x-pack/plugins/stack_connectors/common/bedrock/types.ts @@ -21,8 +21,8 @@ import { RunApiLatestResponseSchema, BedrockMessageSchema, BedrockToolChoiceSchema, - ConverseActionParamsSchema, - ConverseActionResponseSchema, + BedrockClientSendParamsSchema, + BedrockClientSendResponseSchema, } from './schema'; export type Config = TypeOf; @@ -39,5 +39,5 @@ export type DashboardActionParams = TypeOf; export type DashboardActionResponse = TypeOf; export type BedrockMessage = TypeOf; export type BedrockToolChoice = TypeOf; -export type ConverseActionParams = TypeOf; -export type ConverseActionResponse = TypeOf; +export type ConverseActionParams = TypeOf; +export type ConverseActionResponse = TypeOf; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts index 2a4d91a07f1d3..ce3dd90942cf5 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts @@ -30,6 +30,7 @@ jest.mock('../lib/gen_ai/create_gen_ai_dashboard'); // @ts-ignore const mockSigner = jest.spyOn(aws, 'sign').mockReturnValue({ signed: true }); +const mockSend = jest.fn(); describe('BedrockConnector', () => { let mockRequest: jest.Mock; let mockError: jest.Mock; @@ -89,6 +90,8 @@ describe('BedrockConnector', () => { beforeEach(() => { // @ts-ignore connector.request = mockRequest; + // @ts-ignore + connector.bedrockClient.send = mockSend; }); describe('runApi', () => { @@ -630,6 +633,57 @@ describe('BedrockConnector', () => { ); }); }); + + describe('bedrockClientSend', () => { + it('should send the command and return the response', async () => { + const command = { input: 'test' }; + const response = { result: 'success' }; + mockSend.mockResolvedValue(response); + + const result = await connector.bedrockClientSend( + { signal: undefined, command }, + connectorUsageCollector + ); + + expect(mockSend).toHaveBeenCalledWith(command, { abortSignal: undefined }); + expect(result).toEqual(response); + }); + + it('should handle and split streaming response', async () => { + const command = { input: 'test' }; + const stream = new PassThrough(); + const response = { stream }; + mockSend.mockResolvedValue(response); + + const result = (await connector.bedrockClientSend( + { signal: undefined, command }, + connectorUsageCollector + )) as unknown as { + stream?: unknown; + tokenStream?: unknown; + }; + + expect(mockSend).toHaveBeenCalledWith(command, { abortSignal: undefined }); + expect(result.stream).toBeDefined(); + expect(result.tokenStream).toBeDefined(); + }); + + it('should handle non-streaming response', async () => { + const command = { input: 'test' }; + const usage = { stats: 0 }; + const response = { usage }; + mockSend.mockResolvedValue(response); + + const result = (await connector.bedrockClientSend( + { signal: undefined, command }, + connectorUsageCollector + )) as unknown as { + usage?: unknown; + }; + expect(result.usage).toBeDefined(); + }); + }); + describe('getResponseErrorMessage', () => { it('returns an unknown error message', () => { // @ts-expect-error expects an axios error as the parameter diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts index 55b631ba9441c..339efa49f69bf 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts @@ -7,6 +7,8 @@ import { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; import aws from 'aws4'; +import { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime'; +import { SmithyMessageDecoderStream } from '@smithy/eventstream-codec'; import { AxiosError, Method } from 'axios'; import { IncomingMessage } from 'http'; import { PassThrough } from 'stream'; @@ -21,7 +23,7 @@ import { StreamingResponseSchema, RunActionResponseSchema, RunApiLatestResponseSchema, - ConverseActionParamsSchema, + BedrockClientSendParamsSchema, } from '../../../common/bedrock/schema'; import { Config, @@ -60,13 +62,20 @@ interface SignedRequest { export class BedrockConnector extends SubActionConnector { private url; private model; + private bedrockClient; constructor(params: ServiceParams) { super(params); this.url = this.config.apiUrl; this.model = this.config.defaultModel; - + this.bedrockClient = new BedrockRuntimeClient({ + region: extractRegionId(this.config.apiUrl), + credentials: { + accessKeyId: this.secrets.accessKey, + secretAccessKey: this.secrets.secret, + }, + }); this.registerSubActions(); } @@ -108,15 +117,9 @@ export class BedrockConnector extends SubActionConnector { }); this.registerSubAction({ - name: SUB_ACTION.CONVERSE, - method: 'converse', - schema: ConverseActionParamsSchema, - }); - - this.registerSubAction({ - name: SUB_ACTION.CONVERSE_STREAM, - method: 'converseStream', - schema: ConverseActionParamsSchema, + name: SUB_ACTION.BEDROCK_CLIENT_SEND, + method: 'bedrockClientSend', + schema: BedrockClientSendParamsSchema, }); } @@ -240,15 +243,14 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B * @param signal Optional signal to cancel the request. * @param timeout Optional timeout for the request. * @param raw Optional flag to indicate if the response should be returned as raw data. - * @param apiType Optional type of API to be called. Defaults to 'invoke', . */ public async runApi( - { body, model: reqModel, signal, timeout, raw, apiType = 'invoke' }: RunActionParams, + { body, model: reqModel, signal, timeout, raw }: RunActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { // set model on per request basis const currentModel = reqModel ?? this.model; - const path = `/model/${currentModel}/${apiType}`; + const path = `/model/${currentModel}/invoke`; const signed = this.signRequest(body, path, false); const requestArgs = { ...signed, @@ -281,22 +283,18 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B /** * NOT INTENDED TO BE CALLED DIRECTLY - * call invokeStream or converseStream instead + * call invokeStream instead * responsible for making a POST request to a specified URL with a given request body. * The response is then processed based on whether it is a streaming response or a regular response. * @param body The stringified request body to be sent in the POST request. * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. */ private async streamApi( - { body, model: reqModel, signal, timeout, apiType = 'invoke' }: RunActionParams, + { body, model: reqModel, signal, timeout }: RunActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { - const streamingApiRoute = { - invoke: 'invoke-with-response-stream', - converse: 'converse-stream', - }; // set model on per request basis - const path = `/model/${reqModel ?? this.model}/${streamingApiRoute[apiType]}`; + const path = `/model/${reqModel ?? this.model}/invoke-with-response-stream`; const signed = this.signRequest(body, path, true); const response = await this.request( @@ -436,45 +434,28 @@ The Kibana Connector in use may need to be reconfigured with an updated Amazon B } /** - * Sends a request to the Bedrock API to perform a conversation action. - * @param input - The parameters for the conversation action. + * Sends a request via the BedrockRuntimeClient to perform a conversation action. + * @param params - The parameters for the conversation action. + * @param params.signal - The signal to cancel the request. + * @param params.command - The command class to be sent to the API. (ConverseCommand | ConverseStreamCommand) * @param connectorUsageCollector - The usage collector for the connector. * @returns A promise that resolves to the response of the conversation action. */ - public async converse( - { signal, ...converseApiInput }: ConverseActionParams, + public async bedrockClientSend( + { signal, command }: ConverseActionParams, connectorUsageCollector: ConnectorUsageCollector ): Promise { - const res = await this.runApi( - { - body: JSON.stringify(converseApiInput), - raw: true, - apiType: 'converse', - signal, - }, - connectorUsageCollector - ); - return res; - } + connectorUsageCollector.addRequestBodyBytes(undefined, command); + const res = await this.bedrockClient.send(command, { + abortSignal: signal, + }); - /** - * Sends a request to the Bedrock API to perform a streaming conversation action. - * @param input - The parameters for the streaming conversation action. - * @param connectorUsageCollector - The usage collector for the connector. - * @returns A promise that resolves to the streaming response of the conversation action. - */ - public async converseStream( - { signal, ...converseApiInput }: ConverseActionParams, - connectorUsageCollector: ConnectorUsageCollector - ): Promise { - const res = await this.streamApi( - { - body: JSON.stringify(converseApiInput), - apiType: 'converse', - signal, - }, - connectorUsageCollector - ); + if ('stream' in res) { + const resultStream = res.stream as SmithyMessageDecoderStream; + // splits the stream in two, [stream = consumer, tokenStream = token tracking] + const [stream, tokenStream] = tee(resultStream); + return { ...res, stream, tokenStream }; + } return res; } @@ -571,3 +552,91 @@ function parseContent(content: Array<{ text?: string; type: string }>): string { } const usesDeprecatedArguments = (body: string): boolean => JSON.parse(body)?.prompt != null; + +function extractRegionId(url: string) { + const match = (url ?? '').match(/bedrock\.(.*?)\.amazonaws\./); + if (match) { + return match[1]; + } else { + // fallback to us-east-1 + return 'us-east-1'; + } +} + +/** + * Splits an async iterator into two independent async iterators which can be independently read from at different speeds. + * @param asyncIterator The async iterator returned from Bedrock to split + */ +function tee( + asyncIterator: SmithyMessageDecoderStream +): [SmithyMessageDecoderStream, SmithyMessageDecoderStream] { + // @ts-ignore options is private, but we need it to create the new streams + const streamOptions = asyncIterator.options; + + const streamLeft = new SmithyMessageDecoderStream(streamOptions); + const streamRight = new SmithyMessageDecoderStream(streamOptions); + + // Queues to store chunks for each stream + const leftQueue: T[] = []; + const rightQueue: T[] = []; + + // Promises for managing when a chunk is available + let leftPending: ((chunk: T | null) => void) | null = null; + let rightPending: ((chunk: T | null) => void) | null = null; + + const distribute = async () => { + for await (const chunk of asyncIterator) { + // Push the chunk into both queues + if (leftPending) { + leftPending(chunk); + leftPending = null; + } else { + leftQueue.push(chunk); + } + + if (rightPending) { + rightPending(chunk); + rightPending = null; + } else { + rightQueue.push(chunk); + } + } + + // Signal the end of the iterator + if (leftPending) { + leftPending(null); + } + if (rightPending) { + rightPending(null); + } + }; + + // Start distributing chunks from the iterator + distribute().catch(() => { + // swallow errors + }); + + // Helper to create an async iterator for each stream + const createIterator = ( + queue: T[], + setPending: (fn: ((chunk: T | null) => void) | null) => void + ) => { + return async function* () { + while (true) { + if (queue.length > 0) { + yield queue.shift()!; + } else { + const chunk = await new Promise((resolve) => setPending(resolve)); + if (chunk === null) break; // End of the stream + yield chunk; + } + } + }; + }; + + // Assign independent async iterators to each stream + streamLeft[Symbol.asyncIterator] = createIterator(leftQueue, (fn) => (leftPending = fn)); + streamRight[Symbol.asyncIterator] = createIterator(rightQueue, (fn) => (rightPending = fn)); + + return [streamLeft, streamRight]; +} diff --git a/x-pack/plugins/threat_intelligence/public/hooks/use_integrations.test.tsx b/x-pack/plugins/threat_intelligence/public/hooks/use_integrations.test.tsx index 2df9bea337ba5..e13fb396808d2 100644 --- a/x-pack/plugins/threat_intelligence/public/hooks/use_integrations.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/hooks/use_integrations.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query'; import { INSTALLATION_STATUS, THREAT_INTELLIGENCE_CATEGORY } from '../utils/filter_integrations'; @@ -25,9 +25,7 @@ const renderUseQuery = (result: { items: any[] }) => describe('useIntegrations', () => { it('should have undefined data during loading state', async () => { const mockIntegrations = { items: [] }; - const { result, waitFor } = renderUseQuery(mockIntegrations); - - await waitFor(() => result.current.isLoading); + const { result } = renderUseQuery(mockIntegrations); expect(result.current.isLoading).toBeTruthy(); expect(result.current.data).toBeUndefined(); @@ -43,9 +41,9 @@ describe('useIntegrations', () => { }, ], }; - const { result, waitFor } = renderUseQuery(mockIntegrations); + const { result } = renderUseQuery(mockIntegrations); - await waitFor(() => result.current.isSuccess); + await waitFor(() => expect(result.current.isSuccess).toBe(true)); expect(result.current.isLoading).toBeFalsy(); expect(result.current.data).toEqual(mockIntegrations); diff --git a/x-pack/plugins/threat_intelligence/public/modules/block_list/hooks/use_policies.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/block_list/hooks/use_policies.test.tsx index a01b7da64b684..4a1af74a100a3 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/block_list/hooks/use_policies.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/block_list/hooks/use_policies.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query'; const createWrapper = () => { @@ -24,9 +24,7 @@ const renderUseQuery = (result: { items: any[] }) => describe('usePolicies', () => { it('should have undefined data during loading state', async () => { const mockPolicies = { items: [] }; - const { result, waitFor } = renderUseQuery(mockPolicies); - - await waitFor(() => result.current.isLoading); + const { result } = renderUseQuery(mockPolicies); expect(result.current.isLoading).toBeTruthy(); expect(result.current.data).toBeUndefined(); @@ -41,9 +39,9 @@ describe('usePolicies', () => { }, ], }; - const { result, waitFor } = renderUseQuery(mockPolicies); + const { result } = renderUseQuery(mockPolicies); - await waitFor(() => result.current.isSuccess); + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); expect(result.current.isLoading).toBeFalsy(); expect(result.current.data).toEqual(mockPolicies); diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx index 8e2f5d3d96a25..a38b25fce0f61 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_case_permission.test.tsx @@ -6,7 +6,7 @@ */ import React, { FC, ReactNode } from 'react'; -import { Renderer, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook, RenderHookResult } from '@testing-library/react'; import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; import { KibanaContext } from '../../../hooks/use_kibana'; import { useCaseDisabled } from './use_case_permission'; @@ -27,7 +27,7 @@ const getProviderComponent = ); describe('useCasePermission', () => { - let hookResult: RenderHookResult<{}, boolean, Renderer>; + let hookResult: RenderHookResult; it('should return false if user has correct permissions and indicator has a name', () => { const mockedServices = { diff --git a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_indicator_by_id.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_indicator_by_id.test.tsx index 0c23962ccaa46..e9f43c316190a 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_indicator_by_id.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/cases/hooks/use_indicator_by_id.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { renderHook } from '@testing-library/react-hooks'; -import { useIndicatorById, UseIndicatorByIdValue } from './use_indicator_by_id'; +import { waitFor, renderHook } from '@testing-library/react'; +import { useIndicatorById } from './use_indicator_by_id'; import { TestProvidersComponent } from '../../../mocks/test_providers'; import { createFetchIndicatorById } from '../services/fetch_indicator_by_id'; import { Indicator } from '../../../../common/types/indicator'; @@ -16,13 +16,10 @@ jest.mock('../services/fetch_indicator_by_id'); const indicatorByIdQueryResult = { _id: 'testId' } as unknown as Indicator; const renderUseIndicatorById = (initialProps = { indicatorId: 'testId' }) => - renderHook<{ indicatorId: string }, UseIndicatorByIdValue>( - (props) => useIndicatorById(props.indicatorId), - { - initialProps, - wrapper: TestProvidersComponent, - } - ); + renderHook((props) => useIndicatorById(props.indicatorId), { + initialProps, + wrapper: TestProvidersComponent, + }); describe('useIndicatorById()', () => { type MockedCreateFetchIndicators = jest.MockedFunction; @@ -49,8 +46,7 @@ describe('useIndicatorById()', () => { expect(indicatorsQuery).toHaveBeenCalledTimes(1); // isLoading should turn to false eventually - await hookResult.waitFor(() => !hookResult.result.current.isLoading); - expect(hookResult.result.current.isLoading).toEqual(false); + await waitFor(() => expect(hookResult.result.current.isLoading).toBe(false)); }); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx index 11e1d03a32b51..72935990ef71f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, waitFor, renderHook } from '@testing-library/react'; import { useAggregatedIndicators, UseAggregatedIndicatorsParam } from './use_aggregated_indicators'; import { mockedTimefilterService, TestProvidersComponent } from '../../../mocks/test_providers'; import { createFetchAggregatedIndicators } from '../services/fetch_aggregated_indicators'; @@ -47,7 +47,7 @@ describe('useAggregatedIndicators()', () => { it('should create and call the aggregatedIndicatorsQuery correctly', async () => { aggregatedIndicatorsQuery.mockResolvedValue([]); - const { result, rerender, waitFor } = renderUseAggregatedIndicators(); + const { result, rerender } = renderUseAggregatedIndicators(); // indicators service and the query should be called just once expect( @@ -81,7 +81,7 @@ describe('useAggregatedIndicators()', () => { expect.any(AbortSignal) ); - await waitFor(() => !result.current.isLoading); + await waitFor(() => expect(result.current.isLoading).toBe(false)); expect(result.current).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_column_settings.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_column_settings.test.ts index 74b76030bca37..cbba1c3043f3e 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_column_settings.test.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_column_settings.test.ts @@ -6,7 +6,7 @@ */ import { mockedServices, TestProvidersComponent } from '../../../mocks/test_providers'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { useColumnSettings } from './use_column_settings'; const renderUseColumnSettings = () => diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx index be710e771b040..2276d1cfcf635 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators.test.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { act, renderHook } from '@testing-library/react-hooks'; -import { useIndicators, UseIndicatorsParams, UseIndicatorsValue } from './use_indicators'; +import { act, waitFor, renderHook } from '@testing-library/react'; +import { useIndicators, UseIndicatorsParams } from './use_indicators'; import { TestProvidersComponent } from '../../../mocks/test_providers'; import { createFetchIndicators } from '../services/fetch_indicators'; import { mockTimeRange } from '../../../mocks/mock_indicators_filters_context'; @@ -23,7 +23,7 @@ const useIndicatorsParams: UseIndicatorsParams = { const indicatorsQueryResult = { indicators: [], total: 0 }; const renderUseIndicators = (initialProps = useIndicatorsParams) => - renderHook((props) => useIndicators(props), { + renderHook(useIndicators, { initialProps, wrapper: TestProvidersComponent, }); @@ -53,7 +53,7 @@ describe('useIndicators()', () => { expect(indicatorsQuery).toHaveBeenCalledTimes(1); // isLoading should turn to false eventually - await hookResult.waitFor(() => !hookResult.result.current.isLoading); + await waitFor(() => expect(hookResult.result.current.isLoading).toBe(false)); expect(hookResult.result.current.isLoading).toEqual(false); }); }); @@ -77,7 +77,7 @@ describe('useIndicators()', () => { // Change page size await act(async () => hookResult.result.current.onChangeItemsPerPage(50)); - expect(indicatorsQuery).toHaveBeenCalledTimes(3); + await waitFor(() => expect(indicatorsQuery).toHaveBeenCalledTimes(3)); expect(indicatorsQuery).toHaveBeenLastCalledWith( expect.objectContaining({ pagination: expect.objectContaining({ pageIndex: 0, pageSize: 50 }), @@ -101,7 +101,7 @@ describe('useIndicators()', () => { expect.any(AbortSignal) ); - await hookResult.waitFor(() => !hookResult.result.current.isLoading); + await waitFor(() => expect(hookResult.result.current.isLoading).toBe(false)); expect(hookResult.result.current).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_toolbar_options.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_toolbar_options.test.tsx index 7af7320af0988..9a69b71fd3f75 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_toolbar_options.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_toolbar_options.test.tsx @@ -6,7 +6,7 @@ */ import { TestProvidersComponent } from '../../../mocks/test_providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useToolbarOptions } from './use_toolbar_options'; describe('useToolbarOptions()', () => { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.test.tsx index 893367b42dbd3..8735817747f12 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_total_count.test.tsx @@ -6,7 +6,7 @@ */ import { mockedSearchService, TestProvidersComponent } from '../../../mocks/test_providers'; -import { act, renderHook } from '@testing-library/react-hooks'; +import { renderHook, act } from '@testing-library/react'; import { BehaviorSubject } from 'rxjs'; import { useIndicatorsTotalCount } from './use_total_count'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts index 7e435d944145b..18c8fccd573f1 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Renderer, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook, RenderHookResult } from '@testing-library/react'; import { generateMockIndicator, generateMockUrlIndicator, @@ -19,7 +19,7 @@ import { updateFiltersArray } from '../utils/filter'; jest.mock('../utils/filter', () => ({ updateFiltersArray: jest.fn() })); describe('useFilterInOut()', () => { - let hookResult: RenderHookResult<{}, UseFilterInValue, Renderer>; + let hookResult: RenderHookResult; it('should return empty object if Indicator is incorrect', () => { const indicator: Indicator = generateMockIndicator(); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx index 18d96282d98b6..0b5cc302ef0ea 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx @@ -6,7 +6,7 @@ */ import { EMPTY_VALUE } from '../../../constants/common'; -import { Renderer, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook, RenderHookResult } from '@testing-library/react'; import { generateMockIndicator, generateMockUrlIndicator, @@ -16,7 +16,7 @@ import { TestProvidersComponent } from '../../../mocks/test_providers'; import { useAddToTimeline, UseAddToTimelineValue } from './use_add_to_timeline'; describe('useInvestigateInTimeline()', () => { - let hookResult: RenderHookResult<{}, UseAddToTimelineValue, Renderer>; + let hookResult: RenderHookResult; xit('should return empty object if Indicator is incorrect', () => { const indicator: Indicator = generateMockIndicator(); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx index 5d416c5ff56c7..dc9b3a4a00296 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { Renderer, renderHook, RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook, RenderHookResult } from '@testing-library/react'; import { useInvestigateInTimeline, UseInvestigateInTimelineValue, @@ -18,7 +18,7 @@ import { import { TestProvidersComponent } from '../../../mocks/test_providers'; describe('useInvestigateInTimeline()', () => { - let hookResult: RenderHookResult<{}, UseInvestigateInTimelineValue, Renderer>; + let hookResult: RenderHookResult; it('should return empty object if Indicator is incorrect', () => { const indicator: Indicator = generateMockIndicator(); diff --git a/x-pack/plugins/timelines/common/index.ts b/x-pack/plugins/timelines/common/index.ts index 9b289f481a2d5..0a96a22fb2679 100644 --- a/x-pack/plugins/timelines/common/index.ts +++ b/x-pack/plugins/timelines/common/index.ts @@ -42,8 +42,8 @@ export type { BeatFields, BrowserFields, CursorType, - EqlOptionsData, - EqlOptionsSelected, + EqlFieldsComboBoxOptions, + EqlOptions, FieldsEqlOptions, FieldInfo, IndexField, diff --git a/x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts b/x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts index 66758bbcb94d7..8636a55941042 100644 --- a/x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts +++ b/x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts @@ -22,13 +22,13 @@ export interface TimelineEqlResponse extends EqlSearchStrategyResponse; } -export interface EqlOptionsData { +export interface EqlFieldsComboBoxOptions { keywordFields: EuiComboBoxOptionOption[]; dateFields: EuiComboBoxOptionOption[]; nonDateFields: EuiComboBoxOptionOption[]; } -export interface EqlOptionsSelected { +export interface EqlOptions { eventCategoryField?: string; tiebreakerField?: string; timestampField?: string; @@ -36,4 +36,4 @@ export interface EqlOptionsSelected { size?: number; } -export type FieldsEqlOptions = keyof EqlOptionsSelected; +export type FieldsEqlOptions = keyof EqlOptions; diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts index 61945773faece..5f0bb251a6cb8 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.test.ts @@ -100,7 +100,7 @@ describe('getAggConfigFromEsAgg', () => { field: 'products.base_price', parentAgg: result, aggConfig: { - percents: '1,5,25,50,75,95,99', + percents: [1, 5, 25, 50, 75, 95, 99], }, }); diff --git a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts index 19a4326644736..eedaa75cb3c9e 100644 --- a/x-pack/plugins/transform/public/app/common/pivot_aggs.ts +++ b/x-pack/plugins/transform/public/app/common/pivot_aggs.ts @@ -225,6 +225,7 @@ export interface PivotAggsConfigWithExtra) => void; selectedField: string; isValid?: boolean; + errorMessages?: string[]; }>; /** Aggregation specific configuration */ aggConfig: Partial; @@ -238,6 +239,8 @@ export interface PivotAggsConfigWithExtra string | undefined; /** Helper text for the aggregation reflecting some configuration info */ helperText?: () => string | undefined; + /** Returns validation error messages */ + getErrorMessages?: () => string[] | undefined; } interface PivotAggsConfigPercentiles extends PivotAggsConfigWithUiBase { diff --git a/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx b/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx index 37e8096f355ed..7e9c1b312b996 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx +++ b/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx @@ -7,8 +7,7 @@ import React, { type FC, type PropsWithChildren } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { render, screen, waitFor } from '@testing-library/react'; -import { renderHook } from '@testing-library/react-hooks'; +import { render, screen, waitFor, renderHook } from '@testing-library/react'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import type { CoreSetup } from '@kbn/core/public'; @@ -47,7 +46,7 @@ describe('Transform: useIndexData()', () => { ); - const { result, waitForNextUpdate } = renderHook( + const { result } = renderHook( () => useIndexData({ dataView: { @@ -62,13 +61,13 @@ describe('Transform: useIndexData()', () => { { wrapper } ); - const IndexObj: UseIndexDataReturnType = result.current; - - await waitForNextUpdate(); + await waitFor(() => { + const IndexObj: UseIndexDataReturnType = result.current; - expect(IndexObj.errorMessage).toBe(''); - expect(IndexObj.status).toBe(INDEX_STATUS.UNUSED); - expect(IndexObj.tableItems).toEqual([]); + expect(IndexObj.errorMessage).toBe(''); + expect(IndexObj.status).toBe(INDEX_STATUS.UNUSED); + expect(IndexObj.tableItems).toEqual([]); + }); }); test('dataView set triggers loading', async () => { @@ -78,7 +77,7 @@ describe('Transform: useIndexData()', () => { ); - const { result, waitForNextUpdate } = renderHook( + const { result } = renderHook( () => useIndexData({ dataView: { @@ -108,11 +107,11 @@ describe('Transform: useIndexData()', () => { const IndexObj: UseIndexDataReturnType = result.current; - await waitForNextUpdate(); - - expect(IndexObj.errorMessage).toBe(''); - expect(IndexObj.status).toBe(INDEX_STATUS.LOADING); - expect(IndexObj.tableItems).toEqual([]); + await waitFor(() => { + expect(IndexObj.errorMessage).toBe(''); + expect(IndexObj.status).toBe(INDEX_STATUS.LOADING); + expect(IndexObj.tableItems).toEqual([]); + }); }); }); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx index b24adddf8f159..f08746893a2b1 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx @@ -242,6 +242,7 @@ export const PopoverForm: React.FC = ({ defaultData, otherAggNames, onCha }); }} isValid={aggConfigDef.isValid()} + errorMessages={aggConfigDef.getErrorMessages?.()} /> ) : null} {isUnsupportedAgg && ( diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts index 783d5d68a7438..46c71c5e149d9 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts @@ -82,7 +82,7 @@ describe('Transform: Define Pivot Common', () => { aggName: 'the-field.percentiles', dropDownName: 'percentiles( the-f[i]e>ld )', AggFormComponent: PercentilesAggForm, - aggConfig: { percents: '1,5,25,50,75,95,99' }, + aggConfig: { percents: [1, 5, 25, 50, 75, 95, 99] }, }, 'filter( the-f[i]e>ld )': { agg: 'filter', @@ -222,7 +222,7 @@ describe('Transform: Define Pivot Common', () => { dropDownName: 'percentiles( the-f[i]e>ld )', field: ' the-f[i]e>ld ', AggFormComponent: PercentilesAggForm, - aggConfig: { percents: '1,5,25,50,75,95,99' }, + aggConfig: { percents: [1, 5, 25, 50, 75, 95, 99] }, }, 'sum( the-f[i]e>ld )': { agg: 'sum', @@ -292,7 +292,7 @@ describe('Transform: Define Pivot Common', () => { dropDownName: 'percentiles(rt_bytes_bigger)', field: 'rt_bytes_bigger', AggFormComponent: PercentilesAggForm, - aggConfig: { percents: '1,5,25,50,75,95,99' }, + aggConfig: { percents: [1, 5, 25, 50, 75, 95, 99] }, }, 'sum(rt_bytes_bigger)': { agg: 'sum', diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.test.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.test.ts new file mode 100644 index 0000000000000..4b97357b5e032 --- /dev/null +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.test.ts @@ -0,0 +1,146 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getPercentilesAggConfig } from './config'; +import type { IPivotAggsConfigPercentiles } from './types'; +import { PERCENTILES_AGG_DEFAULT_PERCENTS } from '../../../../../../common'; + +describe('percentiles agg config', () => { + let config: IPivotAggsConfigPercentiles; + + beforeEach(() => { + config = getPercentilesAggConfig({ + agg: 'percentiles', + aggName: 'test-agg', + field: ['test-field'], + dropDownName: 'test-agg', + }); + }); + + describe('#setUiConfigFromEs', () => { + test('sets field and percents from ES config', () => { + // act + config.setUiConfigFromEs({ + field: 'test-field', + percents: [10, 20, 30], + }); + + // assert + expect(config.field).toEqual('test-field'); + expect(config.aggConfig).toEqual({ percents: [10, 20, 30] }); + }); + }); + + describe('#getEsAggConfig', () => { + test('returns null for invalid config', () => { + // arrange + config.aggConfig.percents = [150]; // invalid percentile value + + // act and assert + expect(config.getEsAggConfig()).toBeNull(); + }); + + test('returns valid config', () => { + // arrange + config.field = 'test-field'; + config.aggConfig.percents = [10, 20, 30]; + + // act and assert + expect(config.getEsAggConfig()).toEqual({ + field: 'test-field', + percents: [10, 20, 30], + }); + }); + + test('returns default percents if none specified', () => { + // arrange + config.field = 'test-field'; + + // act and assert + expect(config.getEsAggConfig()).toEqual({ + field: 'test-field', + percents: PERCENTILES_AGG_DEFAULT_PERCENTS, + }); + }); + }); + + describe('#isValid', () => { + test('returns false for percentiles out of range', () => { + // arrange + config.aggConfig.percents = [150]; + + // act and assert + expect(config.isValid()).toBeFalsy(); + expect(config.aggConfig.errors).toContain('PERCENTILE_OUT_OF_RANGE'); + }); + + test('returns false for invalid number format', () => { + // arrrange + config.aggConfig.pendingPercentileInput = 'invalid'; + + // act and assert + expect(config.isValid()).toBeFalsy(); + expect(config.aggConfig.errors).toContain('INVALID_FORMAT'); + }); + + test('returns true for valid percents', () => { + // arrange + config.aggConfig.percents = [10, 20, 30]; + + // act and assert + expect(config.isValid()).toBeTruthy(); + expect(config.aggConfig.errors).toBeUndefined(); + }); + + test('validates pending input along with existing percents', () => { + // arrange + config.aggConfig.percents = [10, 20, 30]; + config.aggConfig.pendingPercentileInput = '50'; + + // act and assert + expect(config.isValid()).toBeTruthy(); + expect(config.aggConfig.errors).toBeUndefined(); + }); + }); + + describe('#getErrorMessages', () => { + test('returns undefined when there are no errors', () => { + // arrange + config.aggConfig.errors = undefined; + + // act and assert + expect(config.getErrorMessages?.()).toBeUndefined(); + }); + + test('returns undefined when errors array is empty', () => { + // arrange + config.aggConfig.errors = []; + + // act and assert + expect(config.getErrorMessages?.()).toBeUndefined(); + }); + + test('returns translated messages for single error', () => { + // arrange + config.aggConfig.errors = ['PERCENTILE_OUT_OF_RANGE']; + + // act and assert + expect(config.getErrorMessages?.()).toEqual(['Percentiles must be between 0 and 100']); + }); + + test('returns translated messages for multiple errors', () => { + // arrange + config.aggConfig.errors = ['PERCENTILE_OUT_OF_RANGE', 'INVALID_FORMAT']; + + // act and assert + expect(config.getErrorMessages?.()).toEqual([ + 'Percentiles must be between 0 and 100', + 'Percentile must be a valid number', + ]); + }); + }); +}); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.ts index 34a1602259515..85260e18463ec 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/config.ts @@ -5,43 +5,60 @@ * 2.0. */ +import { i18n } from '@kbn/i18n'; import { PercentilesAggForm } from './percentiles_form_component'; -import type { IPivotAggsConfigPercentiles } from './types'; +import type { + IPivotAggsConfigPercentiles, + PercentilesAggConfig, + ValidationResult, + ValidationResultErrorType, +} from './types'; import type { PivotAggsConfigBase } from '../../../../../../common'; import { isPivotAggsConfigWithUiBase, PERCENTILES_AGG_DEFAULT_PERCENTS, } from '../../../../../../common'; import type { PivotAggsConfigWithUiBase } from '../../../../../../common/pivot_aggs'; +import { MAX_PERCENTILE_PRECISION, MAX_PERCENTILE_VALUE, MIN_PERCENTILE_VALUE } from './constants'; -/** - * TODO this callback has been moved. - * The logic of parsing the string should be improved. - */ -function parsePercentsInput(inputValue: string | undefined) { - if (inputValue !== undefined) { - const strVals: string[] = inputValue.split(','); - const percents: number[] = []; - for (const str of strVals) { - if (str.trim().length > 0 && isNaN(str as any) === false) { - const val = Number(str); - if (val >= 0 && val <= 100) { - percents.push(val); - } else { - return []; - } - } +function validatePercentsInput(config: Partial): ValidationResult { + const allValues = [...(config.percents ?? [])]; + const errors: ValidationResultErrorType[] = []; + // Combine existing percents with pending input for validation + if (config.pendingPercentileInput) { + // Replace comma with dot before converting to number + const normalizedInput = config.pendingPercentileInput.replace(',', '.'); + const pendingValue = Number(normalizedInput); + + if (allValues.includes(pendingValue)) { + errors.push('DUPLICATE_VALUE'); + } + + if (normalizedInput.replace('.', '').length > MAX_PERCENTILE_PRECISION) { + errors.push('NUMBER_TOO_PRECISE'); } - return percents; + allValues.push(pendingValue); } - return []; -} + if (allValues.length === 0) { + return { + isValid: false, + errors: [], + }; + } + + if (allValues.some((value) => isNaN(value))) { + errors.push('INVALID_FORMAT'); + } + if (allValues.some((value) => value < MIN_PERCENTILE_VALUE || value > MAX_PERCENTILE_VALUE)) { + errors.push('PERCENTILE_OUT_OF_RANGE'); + } -// Input string should only include comma separated numbers -function isValidPercentsInput(inputValue: string) { - return /^[0-9]+(,[0-9]+)*$/.test(inputValue); + return { + isValid: errors.length === 0, + errors: errors.length > 0 ? errors : undefined, + }; } export function getPercentilesAggConfig( @@ -56,13 +73,13 @@ export function getPercentilesAggConfig( AggFormComponent: PercentilesAggForm, field, aggConfig: { - percents: PERCENTILES_AGG_DEFAULT_PERCENTS.toString(), + percents: PERCENTILES_AGG_DEFAULT_PERCENTS, }, setUiConfigFromEs(esAggDefinition) { const { field: esField, percents } = esAggDefinition; this.field = esField; - this.aggConfig.percents = percents.join(','); + this.aggConfig.percents = percents; }, getEsAggConfig() { if (!this.isValid()) { @@ -71,13 +88,36 @@ export function getPercentilesAggConfig( return { field: this.field as string, - percents: parsePercentsInput(this.aggConfig.percents), + percents: this.aggConfig.percents ?? [], }; }, isValid() { - return ( - typeof this.aggConfig.percents === 'string' && isValidPercentsInput(this.aggConfig.percents) - ); + const validationResult = validatePercentsInput(this.aggConfig); + this.aggConfig.errors = validationResult.errors; + return validationResult.isValid; + }, + getErrorMessages() { + if (!this.aggConfig.errors?.length) return; + + return this.aggConfig.errors.map((error) => ERROR_MESSAGES[error]); }, }; } + +const ERROR_MESSAGES: Record = { + INVALID_FORMAT: i18n.translate('xpack.transform.agg.popoverForm.invalidFormatError', { + defaultMessage: 'Percentile must be a valid number', + }), + PERCENTILE_OUT_OF_RANGE: i18n.translate( + 'xpack.transform.agg.popoverForm.percentileOutOfRangeError', + { + defaultMessage: 'Percentiles must be between 0 and 100', + } + ), + NUMBER_TOO_PRECISE: i18n.translate('xpack.transform.agg.popoverForm.numberTooPreciseError', { + defaultMessage: 'Value is too precise. Use fewer decimal places.', + }), + DUPLICATE_VALUE: i18n.translate('xpack.transform.agg.popoverForm.duplicateValueError', { + defaultMessage: 'Value already exists', + }), +}; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/constants.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/constants.ts new file mode 100644 index 0000000000000..4942d3b2f2d1e --- /dev/null +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const MAX_PERCENTILE_PRECISION = 17; +export const MAX_PERCENTILE_VALUE = 100; +export const MIN_PERCENTILE_VALUE = 0; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/percentiles_form_component.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/percentiles_form_component.tsx index 18f619351c46f..d8b32cd8311f1 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/percentiles_form_component.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/percentiles_form_component.tsx @@ -5,38 +5,84 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiFieldText, EuiFormRow } from '@elastic/eui'; +import type { EuiComboBoxOptionOption } from '@elastic/eui'; +import { EuiComboBox, EuiFormRow } from '@elastic/eui'; import type { IPivotAggsConfigPercentiles } from './types'; export const PercentilesAggForm: IPivotAggsConfigPercentiles['AggFormComponent'] = ({ aggConfig, onChange, isValid, + errorMessages, }) => { + const selectedOptions = useMemo( + () => aggConfig.percents?.map((p) => ({ label: p.toString() })) ?? [], + [aggConfig.percents] + ); + + const handleCreateOption = useCallback( + (inputValue: string) => { + if (!isValid) return false; + + const newValue = Number(inputValue.replace(',', '.')); + + const newOption = { + label: newValue.toString(), + }; + const updatedOptions = [...selectedOptions, newOption]; + + onChange({ + percents: updatedOptions.map((option) => Number(option.label)), + }); + }, + [isValid, onChange, selectedOptions] + ); + + const handleOptionsChange = useCallback( + (newOptions: Array>) => { + onChange({ percents: newOptions.map((option) => Number(option.label)) }); + }, + [onChange] + ); + + const handleSearchChange = useCallback( + (searchValue: string) => { + // If we're clearing the input after a valid creation, + // this is the post-creation cleanup + if (searchValue === '' && aggConfig.pendingPercentileInput && isValid) return; + + onChange({ + ...aggConfig, + pendingPercentileInput: searchValue, + }); + }, + [aggConfig, onChange, isValid] + ); + + // Get the last error message if there are any + const lastErrorMessage = errorMessages?.length + ? errorMessages[errorMessages.length - 1] + : undefined; + return ( <> - { - onChange({ - percents: e.target.value, - }); - }} + diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/types.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/types.ts index fc16ba89a88ca..d4dbe83425cd5 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/types.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/percentiles_agg/types.ts @@ -8,10 +8,23 @@ import type { PivotAggsConfigWithExtra } from '../../../../../../common/pivot_aggs'; export interface PercentilesAggConfig { - /** Comma separated list */ - percents: string; + percents: number[]; + pendingPercentileInput?: string; + errors?: ValidationResultErrorType[]; } + +export type ValidationResultErrorType = + | 'INVALID_FORMAT' + | 'PERCENTILE_OUT_OF_RANGE' + | 'NUMBER_TOO_PRECISE' + | 'DUPLICATE_VALUE'; + export type IPivotAggsConfigPercentiles = PivotAggsConfigWithExtra< PercentilesAggConfig, { field: string; percents: number[] } >; + +export interface ValidationResult { + isValid: boolean; + errors?: ValidationResultErrorType[]; +} diff --git a/x-pack/plugins/transform/public/app/sections/edit_transform/state_management/edit_transform_flyout_state.test.tsx b/x-pack/plugins/transform/public/app/sections/edit_transform/state_management/edit_transform_flyout_state.test.tsx index 7e5b38294b664..c70610017b7d7 100644 --- a/x-pack/plugins/transform/public/app/sections/edit_transform/state_management/edit_transform_flyout_state.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/edit_transform/state_management/edit_transform_flyout_state.test.tsx @@ -6,7 +6,8 @@ */ import React, { type FC, type PropsWithChildren } from 'react'; -import { act, renderHook } from '@testing-library/react-hooks'; + +import { renderHook, act } from '@testing-library/react'; import { getTransformConfigMock } from './__mocks__/transform_config'; diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_actions.test.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_actions.test.tsx index 5007065113782..2805d2d0b3c6e 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_actions.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_actions.test.tsx @@ -7,7 +7,7 @@ import React, { type FC, type PropsWithChildren } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; jest.mock('../../../../app_dependencies'); @@ -19,12 +19,11 @@ describe('Transform: Transform List Actions', () => { const wrapper: FC> = ({ children }) => ( {children} ); - const { result, waitForNextUpdate } = renderHook( - () => useActions({ forceDisable: false, transformNodes: 1 }), - { wrapper } - ); + const { result } = renderHook(() => useActions({ forceDisable: false, transformNodes: 1 }), { + wrapper, + }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const actions = result.current.actions; diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.test.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.test.tsx index dcab70822ecd9..04673a386d067 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/use_columns.test.tsx @@ -7,7 +7,7 @@ import React, { type FC, type PropsWithChildren } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { renderHook } from '@testing-library/react-hooks'; +import { waitFor, renderHook } from '@testing-library/react'; import { useColumns } from './use_columns'; @@ -19,11 +19,11 @@ describe('Transform: Job List Columns', () => { const wrapper: FC> = ({ children }) => ( {children} ); - const { result, waitForNextUpdate } = renderHook(() => useColumns([], () => {}, 1, [], false), { + const { result } = renderHook(() => useColumns([], () => {}, 1, [], false), { wrapper, }); - await waitForNextUpdate(); + await waitFor(() => new Promise((resolve) => resolve(null))); const columns: ReturnType['columns'] = result.current.columns; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 018646b09b6b6..8bc9f6357c62b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -406,9 +406,6 @@ "cellActions.extraActionsAriaLabel": "Actions supplémentaires", "cellActions.showMoreActionsLabel": "Plus d'actions", "cellActions.youAreInADialogContainingOptionsScreenReaderOnly": "Vous êtes dans une boîte de dialogue contenant des options pour le champ {fieldName}. Appuyez sur Tab pour naviguer entre les options. Appuyez sur Échap pour quitter.", - "charts.advancedSettings.visualization.colorMappingText": "Mappe des valeurs à des couleurs spécifiques dans les graphiques avec la palette Compatibilité.", - "charts.advancedSettings.visualization.colorMappingTextDeprecation": "Ce paramètre est déclassé et ne sera plus compatible avec les futures versions.", - "charts.advancedSettings.visualization.colorMappingTitle": "Mapping des couleurs", "charts.advancedSettings.visualization.useLegacyTimeAxis.deprecation": "Ce paramètre est déclassé et ne sera plus compatible avec les futures versions.", "charts.advancedSettings.visualization.useLegacyTimeAxis.description": "Active l'axe de temps hérité pour les graphiques dans Lens, Discover, Visualize et TSVB", "charts.advancedSettings.visualization.useLegacyTimeAxis.name": "Axe de temps hérité pour les graphiques", @@ -18591,7 +18588,6 @@ "xpack.enterpriseSearch.overview.gettingStarted.testConnection.description": "Envoyez une requête de test pour confirmer que votre client de langage et votre instance Elasticsearch sont opérationnels.", "xpack.enterpriseSearch.overview.gettingStarted.testConnection.title": "Tester votre connexion", "xpack.enterpriseSearch.overview.navTitle": "Aperçu", - "xpack.enterpriseSearch.overview.setupCta.description": "Ajoutez des fonctions de recherche à votre application ou à votre organisation interne avec Elastic App Search et Workplace Search. Regardez la vidéo pour savoir ce qu'il est possible de faire lorsque la recherche est facilitée.", "xpack.enterpriseSearch.pageTemplate.endpointsButtonLabel": "Points de terminaison et clés d'API", "xpack.enterpriseSearch.passwordLabel": "Mot de passe", "xpack.enterpriseSearch.pipeline.title": "Transformer et enrichir vos données", @@ -26180,8 +26176,8 @@ "xpack.inventory.entitiesGrid.euiDataGrid.alertsTooltip": "Le nombre d'alertes actives", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameLabel": "Nom de l'entité", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameTooltip": "Nom de l'entité (entity.displayName)", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "Affichage de {currentItems} sur {total} {boldEntites}", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entites": "Entités", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "Affichage de {currentItems} sur {total} {boldEntities}", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entities": "Entités", "xpack.inventory.entitiesGrid.euiDataGrid.inventoryEntitiesGridLabel": "Grille des entités d'inventaire", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeen": "{date} à {time}", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeenLabel": "Vu en dernier", @@ -38077,7 +38073,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoAriaLabel": "Ouvrir une fenêtre contextuelle d'aide", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipContent": "Consultez {createEsqlRuleTypeLink} pour commencer à utiliser les règles ES|QL.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipLink": "documentation", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryFieldRequiredError": "Une requête ES|QL est requise.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryLabel": "Requête ES|QL", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldAnomalyThresholdLabel": "Seuil de score d'anomalie", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldMachineLearningJobIdLabel": "Tâche de Machine Learning", @@ -47488,7 +47483,6 @@ "xpack.transform.groupBy.popoverForm.fieldLabel": "Champ", "xpack.transform.groupBy.popoverForm.intervalError": "Intervalle non valide.", "xpack.transform.groupBy.popoverForm.intervalLabel": "Intervalle", - "xpack.transform.groupBy.popoverForm.intervalPercents": "Entrer une liste de centiles séparés par des virgules", "xpack.transform.groupBy.popoverForm.invalidSizeErrorMessage": "Entrer un nombre positif valide", "xpack.transform.groupBy.popoverForm.missingBucketCheckboxHelpText": "Cochez cette case pour inclure les documents sans valeur.", "xpack.transform.groupby.popoverForm.missingBucketCheckboxLabel": "Inclure les compartiments manquants", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 2f76f1a88b515..b218ae98f07bb 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -406,9 +406,6 @@ "cellActions.extraActionsAriaLabel": "追加のアクション", "cellActions.showMoreActionsLabel": "さらにアクションを表示", "cellActions.youAreInADialogContainingOptionsScreenReaderOnly": "フィールド {fieldName} のオプションを含む、ダイアログを表示しています。Tab を押すと、オプションを操作します。Escapeを押すと、終了します。", - "charts.advancedSettings.visualization.colorMappingText": "互換性パレットを使用して、グラフで値を特定の色にマッピングします。", - "charts.advancedSettings.visualization.colorMappingTextDeprecation": "この設定はサポートが終了し、将来のバージョンではサポートされません。", - "charts.advancedSettings.visualization.colorMappingTitle": "カラーマッピング", "charts.advancedSettings.visualization.useLegacyTimeAxis.deprecation": "この設定はサポートが終了し、将来のバージョンではサポートされません。", "charts.advancedSettings.visualization.useLegacyTimeAxis.description": "Lens、Discover、Visualize、およびTSVBでグラフのレガシー時間軸を有効にします", "charts.advancedSettings.visualization.useLegacyTimeAxis.name": "レガシーグラフ時間軸", @@ -18563,7 +18560,6 @@ "xpack.enterpriseSearch.overview.gettingStarted.testConnection.description": "テストリクエストを送信して、言語クライアントとElasticsearchインスタンスが起動し、実行中であることを確認してください。", "xpack.enterpriseSearch.overview.gettingStarted.testConnection.title": "接続をテスト", "xpack.enterpriseSearch.overview.navTitle": "概要", - "xpack.enterpriseSearch.overview.setupCta.description": "Elastic App Search および Workplace Search を使用して、アプリまたは社内組織に検索を追加できます。検索が簡単になるとどのような利点があるのかについては、動画をご覧ください。", "xpack.enterpriseSearch.pageTemplate.endpointsButtonLabel": "エンドポイントとAPIキー", "xpack.enterpriseSearch.passwordLabel": "パスワード", "xpack.enterpriseSearch.pipeline.title": "データの変換とエンリッチ", @@ -26152,8 +26148,8 @@ "xpack.inventory.entitiesGrid.euiDataGrid.alertsTooltip": "アクティブなアラートの件数", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameLabel": "エンティティ名", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameTooltip": "エンティティの名前(entity.displayName)", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "{currentItems}/{total}個の{boldEntites}を表示中", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entites": "エンティティ", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "{currentItems}/{total}個の{boldEntities}を表示中", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entities": "エンティティ", "xpack.inventory.entitiesGrid.euiDataGrid.inventoryEntitiesGridLabel": "インベントリエンティティグリッド", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeen": "{date} @ {time}", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeenLabel": "前回の認識", @@ -38044,7 +38040,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoAriaLabel": "ヘルプポップオーバーを開く", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipContent": "ES|QL ルールの使用を開始するには、{createEsqlRuleTypeLink}を確認してください。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipLink": "ドキュメンテーション", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryFieldRequiredError": "ES|QLクエリは必須です。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryLabel": "ES|QLクエリ", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldAnomalyThresholdLabel": "異常スコアしきい値", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldMachineLearningJobIdLabel": "機械学習ジョブ", @@ -47448,7 +47443,6 @@ "xpack.transform.groupBy.popoverForm.fieldLabel": "フィールド", "xpack.transform.groupBy.popoverForm.intervalError": "無効な間隔。", "xpack.transform.groupBy.popoverForm.intervalLabel": "間隔", - "xpack.transform.groupBy.popoverForm.intervalPercents": "パーセンタイルをコンマで区切って列記します。", "xpack.transform.groupBy.popoverForm.invalidSizeErrorMessage": "有効な正の数値を入力してください", "xpack.transform.groupBy.popoverForm.missingBucketCheckboxHelpText": "選択すると、値がないドキュメントを含めます。", "xpack.transform.groupby.popoverForm.missingBucketCheckboxLabel": "不足しているバケットを含める", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9dcbf8eacac51..a1c92993682d4 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -402,9 +402,6 @@ "cellActions.extraActionsAriaLabel": "附加操作", "cellActions.showMoreActionsLabel": "更多操作", "cellActions.youAreInADialogContainingOptionsScreenReaderOnly": "您在对话框中,其中包含 {fieldName} 字段的选项。按 tab 键导航选项。按 escape 退出。", - "charts.advancedSettings.visualization.colorMappingText": "使用兼容性调色板将值映射到图表中的特定颜色。", - "charts.advancedSettings.visualization.colorMappingTextDeprecation": "此设置已过时,在未来版本中将不受支持。", - "charts.advancedSettings.visualization.colorMappingTitle": "颜色映射", "charts.advancedSettings.visualization.useLegacyTimeAxis.deprecation": "此设置已过时,在未来版本中将不受支持。", "charts.advancedSettings.visualization.useLegacyTimeAxis.description": "在 Lens、Discover、Visualize 和 TSVB 中为图表启用旧版时间轴", "charts.advancedSettings.visualization.useLegacyTimeAxis.name": "旧版图表时间轴", @@ -18227,7 +18224,6 @@ "xpack.enterpriseSearch.overview.gettingStarted.testConnection.description": "发送测试请求,以确认您的语言客户端和 Elasticsearch 实例已启动并正在运行。", "xpack.enterpriseSearch.overview.gettingStarted.testConnection.title": "测试您的连接", "xpack.enterpriseSearch.overview.navTitle": "概览", - "xpack.enterpriseSearch.overview.setupCta.description": "通过 Elastic App Search 和 Workplace Search,将搜索添加到您的应用或内部组织中。观看视频,了解方便易用的搜索功能可以帮您做些什么。", "xpack.enterpriseSearch.pageTemplate.endpointsButtonLabel": "终端和 API 密钥", "xpack.enterpriseSearch.passwordLabel": "密码", "xpack.enterpriseSearch.pipeline.title": "转换和扩充数据", @@ -25682,8 +25678,8 @@ "xpack.inventory.entitiesGrid.euiDataGrid.alertsTooltip": "活动告警计数", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameLabel": "实体名称", "xpack.inventory.entitiesGrid.euiDataGrid.entityNameTooltip": "实体的名称 (entity.displayName)", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "正在显示 {currentItems} 个(共 {total} 个){boldEntites}", - "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entites": "实体", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft": "正在显示 {currentItems} 个(共 {total} 个){boldEntities}", + "xpack.inventory.entitiesGrid.euiDataGrid.headerLeft.entities": "实体", "xpack.inventory.entitiesGrid.euiDataGrid.inventoryEntitiesGridLabel": "库存实体网格", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeen": "{date} @ {time}", "xpack.inventory.entitiesGrid.euiDataGrid.lastSeenLabel": "最后看到时间", @@ -37439,7 +37435,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoAriaLabel": "打开帮助弹出框", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipContent": "请访问我们的{createEsqlRuleTypeLink}以开始使用 ES|QL 规则。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlInfoTooltipLink": "文档", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryFieldRequiredError": "ES|QL 查询必填。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.esqlQueryLabel": "ES|QL 查询", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldAnomalyThresholdLabel": "异常分数阈值", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.fieldMachineLearningJobIdLabel": "Machine Learning 作业", @@ -46722,7 +46717,6 @@ "xpack.transform.groupBy.popoverForm.fieldLabel": "字段", "xpack.transform.groupBy.popoverForm.intervalError": "时间间隔无效。", "xpack.transform.groupBy.popoverForm.intervalLabel": "时间间隔", - "xpack.transform.groupBy.popoverForm.intervalPercents": "输入百分位数的逗号分隔列表", "xpack.transform.groupBy.popoverForm.invalidSizeErrorMessage": "输入有效的正数", "xpack.transform.groupBy.popoverForm.missingBucketCheckboxHelpText": "选择包括没有值的文档。", "xpack.transform.groupby.popoverForm.missingBucketCheckboxLabel": "包括缺失的存储桶", diff --git a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts index be838e00f251b..5be26c69922aa 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts @@ -5,16 +5,17 @@ * 2.0. */ -import { CoreKibanaRequest } from '@kbn/core/server'; -import { loggingSystemMock, httpServerMock } from '@kbn/core/server/mocks'; +import { kibanaRequestFactory } from '@kbn/core-http-server-utils'; import { securityMock } from '@kbn/security-plugin/server/mocks'; -import { ReindexStep, ReindexStatus, ReindexSavedObject } from '../../../common/types'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { httpServerMock } from '@kbn/core-http-server-mocks'; import { credentialStoreFactory } from './credential_store'; +import { ReindexStep, ReindexStatus, type ReindexSavedObject } from '../../../common/types'; const basicAuthHeader = 'Basic abc'; const logMock = loggingSystemMock.create().get(); -const requestMock = CoreKibanaRequest.from( +const requestMock = kibanaRequestFactory( httpServerMock.createRawRequest({ headers: { authorization: basicAuthHeader, diff --git a/x-pack/plugins/upgrade_assistant/tsconfig.json b/x-pack/plugins/upgrade_assistant/tsconfig.json index 34e02a4041310..85fb886ca2af3 100644 --- a/x-pack/plugins/upgrade_assistant/tsconfig.json +++ b/x-pack/plugins/upgrade_assistant/tsconfig.json @@ -39,7 +39,10 @@ "@kbn/shared-ux-link-redirect-app", "@kbn/react-kibana-context-render", "@kbn/data-views-plugin", - "@kbn/deeplinks-observability" + "@kbn/deeplinks-observability", + "@kbn/core-logging-server-mocks", + "@kbn/core-http-server-mocks", + "@kbn/core-http-server-utils" ], "exclude": [ "target/**/*", diff --git a/x-pack/test/accessibility/apps/group3/enterprise_search.ts b/x-pack/test/accessibility/apps/group3/enterprise_search.ts index 3ef1c02c7b8a8..976f16a6c7151 100644 --- a/x-pack/test/accessibility/apps/group3/enterprise_search.ts +++ b/x-pack/test/accessibility/apps/group3/enterprise_search.ts @@ -46,15 +46,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); await a11y.testAppSnapshot(); }); - - it('loads a setup guide', async function () { - await testSubjects.click('setupGuideLink'); - await retry.waitFor( - 'setup guide visible', - async () => await testSubjects.exists('setupGuide') - ); - await a11y.testAppSnapshot(); - }); }); describe('Content', () => { diff --git a/x-pack/test/alerting_api_integration/packages/helpers/kibana.jsonc b/x-pack/test/alerting_api_integration/packages/helpers/kibana.jsonc index 0995f28c9c5d6..2a95a25e41dd1 100644 --- a/x-pack/test/alerting_api_integration/packages/helpers/kibana.jsonc +++ b/x-pack/test/alerting_api_integration/packages/helpers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "test-helper", "id": "@kbn/alerting-api-integration-helpers", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor.ts index aee2e1e2c7212..6be47ba8d9619 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor.ts @@ -304,7 +304,9 @@ export default function ({ getService }: FtrProviderContext) { .send(httpMonitorJson); expect(apiResponse.status).eql(403); - expect(apiResponse.body.message).eql('Forbidden'); + expect(apiResponse.body.message).eql( + 'API [POST /api/synthetics/monitors] is unauthorized for user, this action is granted by the Kibana privileges [uptime-write]' + ); }); }); diff --git a/x-pack/test/api_integration/apis/synthetics/index.ts b/x-pack/test/api_integration/apis/synthetics/index.ts index 15e76126e9555..27c0febf5939d 100644 --- a/x-pack/test/api_integration/apis/synthetics/index.ts +++ b/x-pack/test/api_integration/apis/synthetics/index.ts @@ -16,6 +16,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esDeleteAllIndices('synthetics*'); }); + loadTestFile(require.resolve('./synthetics_api_security')); loadTestFile(require.resolve('./edit_monitor_public_api')); loadTestFile(require.resolve('./add_monitor_public_api')); loadTestFile(require.resolve('./synthetics_enablement')); diff --git a/x-pack/test/api_integration/apis/synthetics/services/synthetics_monitor_test_service.ts b/x-pack/test/api_integration/apis/synthetics/services/synthetics_monitor_test_service.ts index 498da8c6b1800..d1dda60c8d7c8 100644 --- a/x-pack/test/api_integration/apis/synthetics/services/synthetics_monitor_test_service.ts +++ b/x-pack/test/api_integration/apis/synthetics/services/synthetics_monitor_test_service.ts @@ -175,7 +175,7 @@ export class SyntheticsMonitorTestService { } } - async addsNewSpace() { + async addsNewSpace(uptimePermissions: string[] = ['all']) { const username = 'admin'; const password = `${username}-password`; const roleName = 'uptime-role'; @@ -190,7 +190,8 @@ export class SyntheticsMonitorTestService { kibana: [ { feature: { - uptime: ['all'], + uptime: uptimePermissions, + slo: ['all'], }, spaces: ['*'], }, diff --git a/x-pack/test/api_integration/apis/synthetics/synthetics_api_security.ts b/x-pack/test/api_integration/apis/synthetics/synthetics_api_security.ts new file mode 100644 index 0000000000000..ddd0d4b209940 --- /dev/null +++ b/x-pack/test/api_integration/apis/synthetics/synthetics_api_security.ts @@ -0,0 +1,161 @@ +/* + * 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 { + syntheticsAppPublicRestApiRoutes, + syntheticsAppRestApiRoutes, +} from '@kbn/synthetics-plugin/server/routes'; +import expect from '@kbn/expect'; +import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { SyntheticsMonitorTestService } from './services/synthetics_monitor_test_service'; + +export default function ({ getService }: FtrProviderContext) { + describe('SyntheticsAPISecurity', function () { + this.tags('skipCloud'); + + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + const monitorTestService = new SyntheticsMonitorTestService(getService); + const kibanaServer = getService('kibanaServer'); + + const assertPermissions = async ( + method: 'GET' | 'POST' | 'PUT' | 'DELETE', + path: string, + options: { + statusCodes: number[]; + SPACE_ID: string; + username: string; + password: string; + writeAccess?: boolean; + tags?: string; + } + ) => { + let resp; + const { statusCodes, SPACE_ID, username, password, writeAccess } = options; + const tags = !writeAccess ? '[uptime-read]' : options.tags ?? '[uptime-read,uptime-write]'; + const getStatusMessage = (respStatus: string) => + `Expected ${statusCodes?.join( + ',' + )}, got ${respStatus} status code doesn't match, for path: ${path} and method ${method}`; + + const getBodyMessage = (tg?: string) => + `API [${method} ${path}] is unauthorized for user, this action is granted by the Kibana privileges ${ + tg ?? tags + }`; + + const verifyPermissionsBody = (res: any, msg: string) => { + if (res.status === 403 && !res.body.message.includes('MissingIndicesPrivileges:')) { + expect(decodeURIComponent(res.body.message)).to.eql(msg); + } + }; + + switch (method) { + case 'GET': + resp = await supertestWithoutAuth + .get(`/s/${SPACE_ID}${path}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send({}); + expect(statusCodes.includes(resp.status)).to.eql(true, getStatusMessage(resp.status)); + verifyPermissionsBody(resp, getBodyMessage('[uptime-read]')); + break; + case 'PUT': + resp = await supertestWithoutAuth + .put(`/s/${SPACE_ID}${path}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send({}); + expect(statusCodes.includes(resp.status)).to.eql(true, getStatusMessage(resp.status)); + verifyPermissionsBody(resp, getBodyMessage()); + break; + case 'POST': + resp = await supertestWithoutAuth + .post(`/s/${SPACE_ID}${path}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send({}); + expect(statusCodes.includes(resp.status)).to.eql(true, getStatusMessage(resp.status)); + verifyPermissionsBody(resp, getBodyMessage()); + break; + case 'DELETE': + resp = await supertestWithoutAuth + .delete(`/s/${SPACE_ID}${path}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send({}); + expect(statusCodes.includes(resp.status)).to.eql(true, getStatusMessage(resp.status)); + verifyPermissionsBody(resp, getBodyMessage()); + break; + } + + return resp; + }; + + before(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + }); + + const allRoutes = syntheticsAppRestApiRoutes.concat(syntheticsAppPublicRestApiRoutes); + + it('throws permissions errors for un-auth user', async () => { + const { SPACE_ID, username, password } = await monitorTestService.addsNewSpace([]); + + for (const routeFn of allRoutes) { + const route = routeFn(); + await assertPermissions(route.method, route.path, { + statusCodes: [403], + SPACE_ID, + username, + password, + writeAccess: route.writeAccess ?? true, + }); + } + }); + + it('throws permissions errors for read user', async () => { + const { SPACE_ID, username, password } = await monitorTestService.addsNewSpace(['read']); + + for (const routeFn of allRoutes) { + const route = routeFn(); + if (route.writeAccess === false) { + continue; + } + await assertPermissions(route.method, route.path, { + statusCodes: [200, 403, 500, 400, 404], + SPACE_ID, + username, + password, + writeAccess: route.writeAccess ?? true, + tags: '[uptime-write]', + }); + } + }); + + it('no permissions errors for all user', async () => { + const { SPACE_ID, username, password } = await monitorTestService.addsNewSpace(['all']); + + for (const routeFn of allRoutes) { + const route = routeFn(); + if ( + (route.method === 'DELETE' && route.path === SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT) || + SYNTHETICS_API_URLS.SYNTHETICS_PROJECT_APIKEY + ) { + continue; + } + await assertPermissions(route.method, route.path, { + statusCodes: [400, 200, 404], + SPACE_ID, + username, + password, + writeAccess: route.writeAccess ?? true, + tags: '[uptime-write]', + }); + } + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/diagnostics/indices.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/diagnostics/indices.spec.ts index 92976e6bce883..af0249d2a3359 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/diagnostics/indices.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/diagnostics/indices.spec.ts @@ -21,9 +21,10 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon let apmSynthtraceEsClient: ApmSynthtraceEsClient; - describe('Diagnostics: Indices', () => { - describe.skip('When there is no data', () => { - it('returns empty response`', async () => { + // Failing tests were skipped because the current solution for verifying ingest pipelines needs improvement + describe.skip('Diagnostics: Indices', () => { + describe('When there is no data', () => { + it('returns empty response', async () => { const { status, body } = await apmApiClient.adminUser({ endpoint: 'GET /internal/apm/diagnostics', }); @@ -34,7 +35,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - describe.skip('When data is ingested', () => { + describe('When data is ingested', () => { before(async () => { const instance = apm .service({ name: 'synth-go', environment: 'production', agentName: 'go' }) @@ -68,7 +69,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - describe.skip('When data is ingested without the necessary index templates', () => { + describe('When data is ingested without the necessary index templates', () => { before(async () => { await es.indices.deleteDataStream({ name: 'traces-apm-*' }); await es.indices.deleteIndexTemplate({ name: ['traces-apm'] }); @@ -114,7 +115,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - describe.skip('ingest pipelines', () => { + describe('ingest pipelines', () => { before(async () => { const instance = apm .service({ name: 'synth-go', environment: 'production', agentName: 'go' }) @@ -138,7 +139,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon await apmSynthtraceEsClient.clean(); }); - describe.skip('an ingest pipeline is removed', () => { + describe('an ingest pipeline is removed', () => { before(async () => { const datastreamToUpdate = await es.indices.getDataStream({ name: 'metrics-apm.internal-default', @@ -168,7 +169,7 @@ export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderCon }); }); - describe.skip('an ingest pipeline is changed', () => { + describe('an ingest pipeline is changed', () => { before(async () => { const datastreamToUpdate = await es.indices.getDataStream({ name: 'metrics-apm.internal-default', diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts index a8e360ad5a06f..74013fcc56e87 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/index.ts @@ -12,33 +12,35 @@ export default function apmApiIntegrationTests({ }: DeploymentAgnosticFtrProviderContext) { describe('APM', function () { loadTestFile(require.resolve('./agent_explorer')); - loadTestFile(require.resolve('./errors')); loadTestFile(require.resolve('./alerts')); - loadTestFile(require.resolve('./mobile')); + loadTestFile(require.resolve('./cold_start')); + loadTestFile(require.resolve('./correlations')); loadTestFile(require.resolve('./custom_dashboards')); + loadTestFile(require.resolve('./data_view')); loadTestFile(require.resolve('./dependencies')); + loadTestFile(require.resolve('./diagnostics')); + loadTestFile(require.resolve('./entities')); loadTestFile(require.resolve('./environment')); loadTestFile(require.resolve('./error_rate')); - loadTestFile(require.resolve('./data_view')); - loadTestFile(require.resolve('./correlations')); - loadTestFile(require.resolve('./entities')); - loadTestFile(require.resolve('./cold_start')); - loadTestFile(require.resolve('./metrics')); - loadTestFile(require.resolve('./services')); + loadTestFile(require.resolve('./errors')); loadTestFile(require.resolve('./historical_data')); - loadTestFile(require.resolve('./observability_overview')); - loadTestFile(require.resolve('./latency')); loadTestFile(require.resolve('./infrastructure')); - loadTestFile(require.resolve('./service_maps')); loadTestFile(require.resolve('./inspect')); + loadTestFile(require.resolve('./latency')); + loadTestFile(require.resolve('./metrics')); + loadTestFile(require.resolve('./mobile')); + loadTestFile(require.resolve('./observability_overview')); loadTestFile(require.resolve('./service_groups')); - loadTestFile(require.resolve('./time_range_metadata')); - loadTestFile(require.resolve('./diagnostics')); + loadTestFile(require.resolve('./service_maps')); loadTestFile(require.resolve('./service_nodes')); + loadTestFile(require.resolve('./service_overview')); + loadTestFile(require.resolve('./services')); + loadTestFile(require.resolve('./settings')); loadTestFile(require.resolve('./span_links')); loadTestFile(require.resolve('./suggestions')); loadTestFile(require.resolve('./throughput')); + loadTestFile(require.resolve('./time_range_metadata')); + loadTestFile(require.resolve('./traces')); loadTestFile(require.resolve('./transactions')); - loadTestFile(require.resolve('./service_overview')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/services/derived_annotations.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/services/derived_annotations.spec.ts index 3af97dea84c72..272ddb876573f 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/services/derived_annotations.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/services/derived_annotations.spec.ts @@ -118,7 +118,7 @@ export default function annotationApiTests({ getService }: DeploymentAgnosticFtr }); response = ( - await apmApiClient.readUser({ + await apmApiClient.publicApi({ endpoint: 'GET /api/apm/services/{serviceName}/annotation/search 2023-10-31', params: { path: { diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/agent_keys/agent_keys.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/agent_keys/agent_keys.spec.ts new file mode 100644 index 0000000000000..925820c0e7c13 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/agent_keys/agent_keys.spec.ts @@ -0,0 +1,84 @@ +/* + * 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 { PrivilegeType, ClusterPrivilegeType } from '@kbn/apm-plugin/common/privilege_type'; +import type { RoleCredentials } from '../../../../../services'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; +import { expectToReject } from '../../../../../../../apm_api_integration/common/utils/expect_to_reject'; +import type { ApmApiError } from '../../../../../services/apm_api'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const samlAuth = getService('samlAuth'); + + const agentKeyName = 'test'; + const allApplicationPrivileges = [PrivilegeType.AGENT_CONFIG, PrivilegeType.EVENT]; + const clusterPrivileges = [ClusterPrivilegeType.MANAGE_OWN_API_KEY]; + + async function createAgentKey(roleAuthc: RoleCredentials) { + return await apmApiClient.publicApi({ + endpoint: 'POST /api/apm/agent_keys 2023-10-31', + params: { + body: { + name: agentKeyName, + privileges: allApplicationPrivileges, + }, + }, + roleAuthc, + }); + } + + async function invalidateAgentKey(id: string) { + return await apmApiClient.writeUser({ + endpoint: 'POST /internal/apm/api_key/invalidate', + params: { + body: { id }, + }, + }); + } + + async function getAgentKeys() { + return await apmApiClient.writeUser({ endpoint: 'GET /internal/apm/agent_keys' }); + } + + describe('When the user does not have the required privileges', () => { + let roleAuthc: RoleCredentials; + + before(async () => { + roleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('editor'); + }); + + after(async () => { + await samlAuth.invalidateM2mApiKeyWithRoleScope(roleAuthc); + }); + + describe('When the user does not have the required cluster privileges', () => { + it('should return an error when creating an agent key', async () => { + const error = await expectToReject(() => createAgentKey(roleAuthc)); + expect(error.res.status).to.be(403); + expect(error.res.body.message).contain('is missing the following requested privilege'); + expect(error.res.body.attributes).to.eql({ + _inspect: [], + data: { + missingPrivileges: allApplicationPrivileges, + missingClusterPrivileges: clusterPrivileges, + }, + }); + }); + + it('should return an error when invalidating an agent key', async () => { + const error = await expectToReject(() => invalidateAgentKey(agentKeyName)); + expect(error.res.status).to.be(500); + }); + + it('should return an error when getting a list of agent keys', async () => { + const error = await expectToReject(() => getAgentKeys()); + expect(error.res.status).to.be(500); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/basic.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/basic.spec.ts similarity index 63% rename from x-pack/test/apm_api_integration/tests/settings/anomaly_detection/basic.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/basic.spec.ts index 86290fc35f124..195e4ff5e7bd2 100644 --- a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/basic.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/basic.spec.ts @@ -6,17 +6,13 @@ */ import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; -import { ApmApiError } from '../../../common/apm_api_supertest'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; +import type { ApmApiError } from '../../../../../services/apm_api'; -export default function apiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); +export default function apiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); - type SupertestAsUser = - | typeof apmApiClient.readUser - | typeof apmApiClient.writeUser - | typeof apmApiClient.noAccessUser; + type SupertestAsUser = typeof apmApiClient.readUser | typeof apmApiClient.writeUser; function getJobs(user: SupertestAsUser) { return user({ endpoint: `GET /internal/apm/settings/anomaly-detection/jobs` }); @@ -34,7 +30,6 @@ export default function apiTest({ getService }: FtrProviderContext) { async function expectForbidden(user: SupertestAsUser) { try { await getJobs(user); - expect(true).to.be(false); } catch (e) { const err = e as ApmApiError; expect(err.res.status).to.be(403); @@ -42,20 +37,14 @@ export default function apiTest({ getService }: FtrProviderContext) { try { await createJobs(user, ['production', 'staging']); - expect(true).to.be(false); } catch (e) { const err = e as ApmApiError; expect(err.res.status).to.be(403); } } - registry.when('ML jobs return a 403 for', { config: 'basic', archives: [] }, () => { + describe('ML jobs return a 403 for', () => { describe('basic', function () { - this.tags('skipFIPS'); - it('user without access', async () => { - await expectForbidden(apmApiClient.noAccessUser); - }); - it('read user', async () => { await expectForbidden(apmApiClient.readUser); }); diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/read_user.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/read_user.spec.ts new file mode 100644 index 0000000000000..0de23a4c27f2f --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/anomaly_detection/read_user.spec.ts @@ -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 expect from '@kbn/expect'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; +import type { ApmApiError } from '../../../../../services/apm_api'; + +export default function apiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + + function getJobs() { + return apmApiClient.readUser({ endpoint: `GET /internal/apm/settings/anomaly-detection/jobs` }); + } + + function createJobs(environments: string[]) { + return apmApiClient.readUser({ + endpoint: `POST /internal/apm/settings/anomaly-detection/jobs`, + params: { + body: { environments }, + }, + }); + } + + describe('ML jobs', () => { + describe(`when readUser has read access to ML`, () => { + describe('when calling the endpoint for listing jobs', () => { + it('returns a list of jobs', async () => { + const { body } = await getJobs(); + + expect(body.jobs).not.to.be(undefined); + expect(body.hasLegacyJobs).to.be(false); + }); + }); + + describe('when calling create endpoint', () => { + it('returns an error because the user does not have access', async () => { + try { + await createJobs(['production', 'staging']); + expect(true).to.be(false); + } catch (e) { + const err = e as ApmApiError; + expect(err.res.status).to.be(403); + } + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/apm_indices/apm_indices.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/apm_indices/apm_indices.spec.ts new file mode 100644 index 0000000000000..1fe51b69fccb4 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/apm_indices/apm_indices.spec.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 { + APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, +} from '@kbn/apm-data-access-plugin/server/saved_objects/apm_indices'; +import expect from '@kbn/expect'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function apmIndicesTests({ getService }: DeploymentAgnosticFtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const apmApiClient = getService('apmApi'); + + async function deleteSavedObject() { + try { + return await kibanaServer.savedObjects.delete({ + type: APM_INDEX_SETTINGS_SAVED_OBJECT_TYPE, + id: APM_INDEX_SETTINGS_SAVED_OBJECT_ID, + }); + } catch (e) { + if (e.response.status !== 404) { + throw e; + } + } + } + + describe('APM Indices', () => { + beforeEach(async () => { + await deleteSavedObject(); + }); + + afterEach(async () => { + await deleteSavedObject(); + }); + + it('returns APM Indices', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/settings/apm-indices', + }); + expect(response.status).to.be(200); + expect(response.body).to.eql({ + transaction: 'traces-apm*,apm-*,traces-*.otel-*', + span: 'traces-apm*,apm-*,traces-*.otel-*', + error: 'logs-apm*,apm-*,logs-*.otel-*', + metric: 'metrics-apm*,apm-*,metrics-*.otel-*', + onboarding: 'apm-*', + sourcemap: 'apm-*', + }); + }); + + it('updates apm indices', async () => { + const INDEX_VALUE = 'foo-*'; + + const writeResponse = await apmApiClient.writeUser({ + endpoint: 'POST /internal/apm/settings/apm-indices/save', + params: { + body: { transaction: INDEX_VALUE }, + }, + }); + expect(writeResponse.status).to.be(200); + + const readResponse = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/settings/apm-indices', + }); + + expect(readResponse.status).to.be(200); + expect(readResponse.body.transaction).to.eql(INDEX_VALUE); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/custom_link/custom_link.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/custom_link/custom_link.spec.ts new file mode 100644 index 0000000000000..9924814591110 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/custom_link/custom_link.spec.ts @@ -0,0 +1,200 @@ +/* + * 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 type { CustomLink } from '@kbn/apm-plugin/common/custom_link/custom_link_types'; +import type { ApmApiError } from '../../../../../services/apm_api'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; +import { ARCHIVER_ROUTES } from '../../constants/archiver'; + +export default function customLinksTests({ getService }: DeploymentAgnosticFtrProviderContext) { + const esArchiver = getService('esArchiver'); + const apmApiClient = getService('apmApi'); + const log = getService('log'); + + const archiveName = '8.0.0'; + + describe('Custom links with data', () => { + before(async () => { + await esArchiver.load(ARCHIVER_ROUTES[archiveName]); + + const customLink = { + url: 'https://elastic.co', + label: 'with filters', + filters: [ + { key: 'service.name', value: 'baz' }, + { key: 'transaction.type', value: 'qux' }, + ], + } as CustomLink; + + await createCustomLink(customLink); + }); + + after(async () => { + await esArchiver.unload(ARCHIVER_ROUTES[archiveName]); + }); + + it('should fail if the user does not have write access', async () => { + const customLink = { + url: 'https://elastic.co', + label: 'with filters', + filters: [ + { key: 'service.name', value: 'baz' }, + { key: 'transaction.type', value: 'qux' }, + ], + } as CustomLink; + + const err = await expectToReject(() => createCustomLinkAsReadUser(customLink)); + expect(err.res.status).to.be(403); + }); + + it('fetches a custom link', async () => { + const { status, body } = await searchCustomLinks({ + 'service.name': 'baz', + 'transaction.type': 'qux', + }); + const { label, url, filters } = body.customLinks[0]; + + expect(status).to.equal(200); + expect({ label, url, filters }).to.eql({ + label: 'with filters', + url: 'https://elastic.co', + filters: [ + { key: 'service.name', value: 'baz' }, + { key: 'transaction.type', value: 'qux' }, + ], + }); + }); + + it(`creates a custom link as write user`, async () => { + const customLink = { + url: 'https://elastic.co', + label: 'with filters', + filters: [ + { key: 'service.name', value: 'baz' }, + { key: 'transaction.type', value: 'qux' }, + ], + } as CustomLink; + + await createCustomLink(customLink); + }); + + it(`updates a custom link as write user`, async () => { + const { status, body } = await searchCustomLinks({ + 'service.name': 'baz', + 'transaction.type': 'qux', + }); + expect(status).to.equal(200); + + const id = body.customLinks[0].id!; + await updateCustomLink(id, { + label: 'foo', + url: 'https://elastic.co?service.name={{service.name}}', + filters: [ + { key: 'service.name', value: 'quz' }, + { key: 'transaction.name', value: 'bar' }, + ], + }); + + const { status: newStatus, body: newBody } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', + }); + + const { label, url, filters } = newBody.customLinks[0]; + expect(newStatus).to.equal(200); + expect({ label, url, filters }).to.eql({ + label: 'foo', + url: 'https://elastic.co?service.name={{service.name}}', + filters: [ + { key: 'service.name', value: 'quz' }, + { key: 'transaction.name', value: 'bar' }, + ], + }); + }); + + it(`deletes a custom link as write user`, async () => { + const { status, body } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', + }); + expect(status).to.equal(200); + expect(body.customLinks.length).to.be(1); + + const id = body.customLinks[0].id!; + await deleteCustomLink(id); + + const { status: newStatus, body: newBody } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', + }); + expect(newStatus).to.equal(200); + expect(newBody.customLinks.length).to.be(0); + }); + }); + + function searchCustomLinks(filters?: any) { + return apmApiClient.readUser({ + endpoint: 'GET /internal/apm/settings/custom_links', + params: { + query: filters, + }, + }); + } + + async function createCustomLink(customLink: CustomLink) { + log.debug('creating configuration', customLink); + + return apmApiClient.writeUser({ + endpoint: 'POST /internal/apm/settings/custom_links', + params: { + body: customLink, + }, + }); + } + + async function createCustomLinkAsReadUser(customLink: CustomLink) { + log.debug('creating configuration', customLink); + + return apmApiClient.readUser({ + endpoint: 'POST /internal/apm/settings/custom_links', + params: { + body: customLink, + }, + }); + } + + async function updateCustomLink(id: string, customLink: CustomLink) { + log.debug('updating configuration', id, customLink); + + return apmApiClient.writeUser({ + endpoint: 'PUT /internal/apm/settings/custom_links/{id}', + params: { + path: { id }, + body: customLink, + }, + }); + } + + async function deleteCustomLink(id: string) { + log.debug('deleting configuration', id); + + return apmApiClient.writeUser({ + endpoint: 'DELETE /internal/apm/settings/custom_links/{id}', + params: { path: { id } }, + }); + } +} + +async function expectToReject(fn: () => Promise): Promise { + try { + await fn(); + } catch (e) { + return e; + } + throw new Error(`Expected fn to throw`); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/index.ts new file mode 100644 index 0000000000000..5690ce79690c3 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/settings/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('settings', () => { + loadTestFile(require.resolve('./agent_keys/agent_keys.spec.ts')); + loadTestFile(require.resolve('./anomaly_detection/basic.spec.ts')); + loadTestFile(require.resolve('./anomaly_detection/read_user.spec.ts')); + loadTestFile(require.resolve('./apm_indices/apm_indices.spec.ts')); + loadTestFile(require.resolve('./custom_link/custom_link.spec.ts')); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/traces/__snapshots__/top_traces.spec.snap b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/__snapshots__/top_traces.spec.snap similarity index 53% rename from x-pack/test/apm_api_integration/tests/traces/__snapshots__/top_traces.spec.snap rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/__snapshots__/top_traces.spec.snap index 77aba0cdd3bf6..b2a69a7a098d5 100644 --- a/x-pack/test/apm_api_integration/tests/traces/__snapshots__/top_traces.spec.snap +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/__snapshots__/top_traces.spec.snap @@ -1,76 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`APM API tests traces/top_traces.spec.ts basic apm_8.0.0 Top traces when data is loaded returns the correct buckets 1`] = ` +exports[`Deployment-agnostic APM API integration tests APM Traces Top traces when data is loaded returns the correct buckets 1`] = ` Array [ - Object { - "agentName": "java", - "averageResponseTime": 1639, - "impact": 0, - "key": Object { - "service.name": "opbeans-java", - "transaction.name": "DispatcherServlet#doPost", - }, - "serviceName": "opbeans-java", - "transactionName": "DispatcherServlet#doPost", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 3279, - "impact": 0.00144735571024101, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "POST /api/orders", - }, - "serviceName": "opbeans-node", - "transactionName": "POST /api/orders", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 6175, - "impact": 0.00400317408637392, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/products/:id", - }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products/:id", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 3495, - "impact": 0.00472243927164613, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "POST Orders/Post", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "POST Orders/Post", - "transactionType": "request", - "transactionsPerMinute": 0.0666666666666667, - }, - Object { - "agentName": "python", - "averageResponseTime": 7039, - "impact": 0.00476568343615943, - "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.product", - }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.product", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - }, Object { "agentName": "ruby", - "averageResponseTime": 6303, - "impact": 0.00967875004525193, + "averageResponseTime": 5664, + "impact": 0, "key": Object { "service.name": "opbeans-ruby", "transaction.name": "Api::OrdersController#create", @@ -78,12 +13,12 @@ Array [ "serviceName": "opbeans-ruby", "transactionName": "Api::OrdersController#create", "transactionType": "request", - "transactionsPerMinute": 0.0666666666666667, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "java", - "averageResponseTime": 7209.66666666667, - "impact": 0.0176418540534865, + "averageResponseTime": 6031, + "impact": 0.000810693162092553, "key": Object { "service.name": "opbeans-java", "transaction.name": "APIRestController#products", @@ -91,12 +26,12 @@ Array [ "serviceName": "opbeans-java", "transactionName": "APIRestController#products", "transactionType": "request", - "transactionsPerMinute": 0.1, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "java", - "averageResponseTime": 4511, - "impact": 0.0224401912465233, + "averageResponseTime": 4506.5, + "impact": 0.00739785122574376, "key": Object { "service.name": "opbeans-java", "transaction.name": "APIRestController#orders", @@ -104,103 +39,51 @@ Array [ "serviceName": "opbeans-java", "transactionName": "APIRestController#orders", "transactionType": "request", - "transactionsPerMinute": 0.2, - }, - Object { - "agentName": "python", - "averageResponseTime": 7607, - "impact": 0.0254072704525173, - "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.order", - }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.order", - "transactionType": "request", - "transactionsPerMinute": 0.133333333333333, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 10143, - "impact": 0.025408152986487, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/types", - }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/types", - "transactionType": "request", - "transactionsPerMinute": 0.1, - }, - Object { - "agentName": "ruby", - "averageResponseTime": 6105.66666666667, - "impact": 0.0308842762682221, - "key": Object { - "service.name": "opbeans-ruby", - "transaction.name": "Api::TypesController#index", - }, - "serviceName": "opbeans-ruby", - "transactionName": "Api::TypesController#index", - "transactionType": "request", - "transactionsPerMinute": 0.2, - }, - Object { - "agentName": "java", - "averageResponseTime": 6116.33333333333, - "impact": 0.0309407584422802, - "key": Object { - "service.name": "opbeans-java", - "transaction.name": "APIRestController#customerWhoBought", - }, - "serviceName": "opbeans-java", - "transactionName": "APIRestController#customerWhoBought", - "transactionType": "request", - "transactionsPerMinute": 0.2, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "java", - "averageResponseTime": 12543, - "impact": 0.0317623975680329, + "averageResponseTime": 9534, + "impact": 0.00854872625966807, "key": Object { "service.name": "opbeans-java", - "transaction.name": "APIRestController#customers", + "transaction.name": "APIRestController#product", }, "serviceName": "opbeans-java", - "transactionName": "APIRestController#customers", + "transactionName": "APIRestController#product", "transactionType": "request", - "transactionsPerMinute": 0.1, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "nodejs", - "averageResponseTime": 5551, - "impact": 0.0328461492827744, + "averageResponseTime": 10075, + "impact": 0.00974378075746663, "key": Object { "service.name": "opbeans-node", - "transaction.name": "GET /api/orders/:id", + "transaction.name": "POST /api", }, "serviceName": "opbeans-node", - "transactionName": "GET /api/orders/:id", + "transactionName": "POST /api", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "java", - "averageResponseTime": 13183, - "impact": 0.0334568627897785, + "averageResponseTime": 4839.33333333333, + "impact": 0.0195582486571321, "key": Object { "service.name": "opbeans-java", - "transaction.name": "APIRestController#stats", + "transaction.name": "APIRestController#topProducts", }, "serviceName": "opbeans-java", - "transactionName": "APIRestController#stats", + "transactionName": "APIRestController#topProducts", "transactionType": "request", - "transactionsPerMinute": 0.1, + "transactionsPerMinute": 0.05, }, Object { "agentName": "go", - "averageResponseTime": 8050.2, - "impact": 0.0340764016364792, + "averageResponseTime": 7530.5, + "impact": 0.020757721101318, "key": Object { "service.name": "opbeans-go", "transaction.name": "POST /api/orders", @@ -208,51 +91,25 @@ Array [ "serviceName": "opbeans-go", "transactionName": "POST /api/orders", "transactionType": "request", - "transactionsPerMinute": 0.166666666666667, - }, - Object { - "agentName": "ruby", - "averageResponseTime": 10079, - "impact": 0.0341337663445071, - "key": Object { - "service.name": "opbeans-ruby", - "transaction.name": "Api::OrdersController#show", - }, - "serviceName": "opbeans-ruby", - "transactionName": "Api::OrdersController#show", - "transactionType": "request", - "transactionsPerMinute": 0.133333333333333, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 8463, - "impact": 0.0358979517498557, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/products/:id/customers", - }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/products/:id/customers", - "transactionType": "request", - "transactionsPerMinute": 0.166666666666667, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "ruby", - "averageResponseTime": 10799, - "impact": 0.0366754641771254, + "averageResponseTime": 7582.5, + "impact": 0.0209874543134642, "key": Object { "service.name": "opbeans-ruby", - "transaction.name": "Api::ProductsController#show", + "transaction.name": "Api::CustomersController#show", }, "serviceName": "opbeans-ruby", - "transactionName": "Api::ProductsController#show", + "transactionName": "Api::CustomersController#show", "transactionType": "request", - "transactionsPerMinute": 0.133333333333333, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "ruby", - "averageResponseTime": 7428.33333333333, - "impact": 0.0378880658514371, + "averageResponseTime": 8001, + "impact": 0.0228363648766017, "key": Object { "service.name": "opbeans-ruby", "transaction.name": "Api::TypesController#show", @@ -260,12 +117,12 @@ Array [ "serviceName": "opbeans-ruby", "transactionName": "Api::TypesController#show", "transactionType": "request", - "transactionsPerMinute": 0.2, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "java", - "averageResponseTime": 3105.13333333333, - "impact": 0.039659311528543, + "averageResponseTime": 3259.4, + "impact": 0.0234880119687469, "key": Object { "service.name": "opbeans-java", "transaction.name": "ResourceHttpRequestHandler", @@ -273,454 +130,402 @@ Array [ "serviceName": "opbeans-java", "transactionName": "ResourceHttpRequestHandler", "transactionType": "request", - "transactionsPerMinute": 0.5, + "transactionsPerMinute": 0.0833333333333333, }, Object { - "agentName": "java", - "averageResponseTime": 6883.57142857143, - "impact": 0.0410784261517549, + "agentName": "nodejs", + "averageResponseTime": 5675, + "impact": 0.0250961444537697, "key": Object { - "service.name": "opbeans-java", - "transaction.name": "APIRestController#order", + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/top", }, - "serviceName": "opbeans-java", - "transactionName": "APIRestController#order", + "serviceName": "opbeans-node", + "transactionName": "GET /api/products/top", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.05, }, Object { - "agentName": "dotnet", - "averageResponseTime": 3505, - "impact": 0.0480460318422139, + "agentName": "nodejs", + "averageResponseTime": 8537, + "impact": 0.0252043841402617, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Products/Get", + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/:id", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Products/Get", + "serviceName": "opbeans-node", + "transactionName": "GET /api/products/:id", "transactionType": "request", - "transactionsPerMinute": 0.533333333333333, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "java", - "averageResponseTime": 5621.4, - "impact": 0.0481642913941483, + "averageResponseTime": 6006.33333333333, + "impact": 0.0272918638083201, "key": Object { "service.name": "opbeans-java", - "transaction.name": "APIRestController#topProducts", + "transaction.name": "APIRestController#customerWhoBought", }, "serviceName": "opbeans-java", - "transactionName": "APIRestController#topProducts", - "transactionType": "request", - "transactionsPerMinute": 0.333333333333333, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 8428.71428571429, - "impact": 0.0506239135675883, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/orders", - }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/orders", + "transactionName": "APIRestController#customerWhoBought", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.05, }, Object { "agentName": "nodejs", - "averageResponseTime": 8520.14285714286, - "impact": 0.0511887353081702, + "averageResponseTime": 18064, + "impact": 0.0273912676020372, "key": Object { "service.name": "opbeans-node", - "transaction.name": "GET /api/customers/:id", + "transaction.name": "GET /api/products", }, "serviceName": "opbeans-node", - "transactionName": "GET /api/customers/:id", + "transactionName": "GET /api/products", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "nodejs", - "averageResponseTime": 6683.44444444444, - "impact": 0.0516388276326964, + "averageResponseTime": 19217, + "impact": 0.0299382136943879, "key": Object { "service.name": "opbeans-node", - "transaction.name": "GET /api/products/top", + "transaction.name": "GET /api/customers", }, "serviceName": "opbeans-node", - "transactionName": "GET /api/products/top", - "transactionType": "request", - "transactionsPerMinute": 0.3, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 3482.78947368421, - "impact": 0.0569534471979838, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Types/Get", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Types/Get", + "transactionName": "GET /api/customers", "transactionType": "request", - "transactionsPerMinute": 0.633333333333333, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "python", - "averageResponseTime": 16703, - "impact": 0.057517386404596, + "averageResponseTime": 22023, + "impact": 0.0361365924759457, "key": Object { "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.product_type", + "transaction.name": "GET opbeans.views.customer", }, "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.product_type", - "transactionType": "request", - "transactionsPerMinute": 0.133333333333333, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 4943, - "impact": 0.0596266425920813, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Products/Get {id}", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Products/Get {id}", - "transactionType": "request", - "transactionsPerMinute": 0.466666666666667, - }, - Object { - "agentName": "nodejs", - "averageResponseTime": 7892.33333333333, - "impact": 0.0612407972225879, - "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/types/:id", - }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/types/:id", + "transactionName": "GET opbeans.views.customer", "transactionType": "request", - "transactionsPerMinute": 0.3, + "transactionsPerMinute": 0.0166666666666667, }, Object { - "agentName": "dotnet", - "averageResponseTime": 6346.42857142857, - "impact": 0.0769666700279444, + "agentName": "ruby", + "averageResponseTime": 12106, + "impact": 0.0409720347969828, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Orders/Get {id}", + "service.name": "opbeans-ruby", + "transaction.name": "Api::ProductsController#index", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Orders/Get {id}", + "serviceName": "opbeans-ruby", + "transactionName": "Api::ProductsController#index", "transactionType": "request", - "transactionsPerMinute": 0.466666666666667, + "transactionsPerMinute": 0.0333333333333333, }, Object { - "agentName": "go", - "averageResponseTime": 7052.84615384615, - "impact": 0.0794704188998674, + "agentName": "ruby", + "averageResponseTime": 12331.5, + "impact": 0.0419682817073472, "key": Object { - "service.name": "opbeans-go", - "transaction.name": "GET /api/products", + "service.name": "opbeans-ruby", + "transaction.name": "Api::TypesController#index", }, - "serviceName": "opbeans-go", - "transactionName": "GET /api/products", + "serviceName": "opbeans-ruby", + "transactionName": "Api::TypesController#index", "transactionType": "request", - "transactionsPerMinute": 0.433333333333333, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "java", - "averageResponseTime": 10484.3333333333, - "impact": 0.0818285496667966, + "averageResponseTime": 12897.5, + "impact": 0.0444688393626299, "key": Object { "service.name": "opbeans-java", - "transaction.name": "APIRestController#product", + "transaction.name": "APIRestController#customers", }, "serviceName": "opbeans-java", - "transactionName": "APIRestController#product", + "transactionName": "APIRestController#customers", "transactionType": "request", - "transactionsPerMinute": 0.3, + "transactionsPerMinute": 0.0333333333333333, }, Object { - "agentName": "nodejs", - "averageResponseTime": 23711, - "impact": 0.0822565786420813, + "agentName": "java", + "averageResponseTime": 6831.75, + "impact": 0.0478529862953978, "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/stats", + "service.name": "opbeans-java", + "transaction.name": "APIRestController#customer", }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/stats", + "serviceName": "opbeans-java", + "transactionName": "APIRestController#customer", "transactionType": "request", - "transactionsPerMinute": 0.133333333333333, + "transactionsPerMinute": 0.0666666666666667, }, Object { - "agentName": "dotnet", - "averageResponseTime": 4491.36363636364, - "impact": 0.0857567083657495, + "agentName": "ruby", + "averageResponseTime": 29231, + "impact": 0.0520588712562267, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Types/Get {id}", + "service.name": "opbeans-ruby", + "transaction.name": "Api::ProductsController#show", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Types/Get {id}", + "serviceName": "opbeans-ruby", + "transactionName": "Api::ProductsController#show", "transactionType": "request", - "transactionsPerMinute": 0.733333333333333, + "transactionsPerMinute": 0.0166666666666667, }, Object { "agentName": "python", - "averageResponseTime": 20715.8, - "impact": 0.089965512867054, + "averageResponseTime": 16222.5, + "impact": 0.0591585111008193, "key": Object { "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.stats", + "transaction.name": "GET opbeans.views.orders", }, "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.stats", + "transactionName": "GET opbeans.views.orders", "transactionType": "request", - "transactionsPerMinute": 0.166666666666667, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "nodejs", - "averageResponseTime": 9036.33333333333, - "impact": 0.0942519803576885, + "averageResponseTime": 17629, + "impact": 0.065372352694733, "key": Object { "service.name": "opbeans-node", - "transaction.name": "GET /api/products", + "transaction.name": "GET /api/stats", }, "serviceName": "opbeans-node", - "transactionName": "GET /api/products", + "transactionName": "GET /api/stats", "transactionType": "request", - "transactionsPerMinute": 0.4, + "transactionsPerMinute": 0.0333333333333333, }, Object { - "agentName": "java", - "averageResponseTime": 7504.06666666667, - "impact": 0.0978924329825326, + "agentName": "ruby", + "averageResponseTime": 9031.5, + "impact": 0.0672897414268756, "key": Object { - "service.name": "opbeans-java", - "transaction.name": "APIRestController#customer", + "service.name": "opbeans-ruby", + "transaction.name": "Api::OrdersController#show", }, - "serviceName": "opbeans-java", - "transactionName": "APIRestController#customer", + "serviceName": "opbeans-ruby", + "transactionName": "Api::OrdersController#show", "transactionType": "request", - "transactionsPerMinute": 0.5, + "transactionsPerMinute": 0.0666666666666667, }, Object { - "agentName": "go", - "averageResponseTime": 4250.55555555556, - "impact": 0.0998375378516613, + "agentName": "python", + "averageResponseTime": 38278, + "impact": 0.0720434517397453, "key": Object { - "service.name": "opbeans-go", - "transaction.name": "GET /api/types/:id", + "service.name": "opbeans-python", + "transaction.name": "GET opbeans.views.products", }, - "serviceName": "opbeans-go", - "transactionName": "GET /api/types/:id", + "serviceName": "opbeans-python", + "transactionName": "GET opbeans.views.products", "transactionType": "request", - "transactionsPerMinute": 0.9, + "transactionsPerMinute": 0.0166666666666667, }, Object { - "agentName": "nodejs", - "averageResponseTime": 21343, - "impact": 0.11156906191034, + "agentName": "python", + "averageResponseTime": 19176.5, + "impact": 0.0722091247292738, "key": Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/customers", + "service.name": "opbeans-python", + "transaction.name": "GET opbeans.views.product", }, - "serviceName": "opbeans-node", - "transactionName": "GET /api/customers", + "serviceName": "opbeans-python", + "transactionName": "GET opbeans.views.product", "transactionType": "request", - "transactionsPerMinute": 0.2, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "ruby", - "averageResponseTime": 16655, - "impact": 0.116142352941114, + "averageResponseTime": 21443, + "impact": 0.0822224002163734, "key": Object { "service.name": "opbeans-ruby", - "transaction.name": "Api::ProductsController#top", + "transaction.name": "Api::OrdersController#index", }, "serviceName": "opbeans-ruby", - "transactionName": "Api::ProductsController#top", + "transactionName": "Api::OrdersController#index", "transactionType": "request", - "transactionsPerMinute": 0.266666666666667, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "go", - "averageResponseTime": 5749, - "impact": 0.12032203382142, + "averageResponseTime": 7299.66666666667, + "impact": 0.0842369837690393, "key": Object { "service.name": "opbeans-go", - "transaction.name": "GET /api/types", + "transaction.name": "GET /api/orders", }, "serviceName": "opbeans-go", - "transactionName": "GET /api/types", + "transactionName": "GET /api/orders", "transactionType": "request", - "transactionsPerMinute": 0.8, + "transactionsPerMinute": 0.1, }, Object { "agentName": "ruby", - "averageResponseTime": 9951, - "impact": 0.121502864272824, + "averageResponseTime": 11738, + "impact": 0.0912040852220091, "key": Object { "service.name": "opbeans-ruby", - "transaction.name": "Api::StatsController#index", + "transaction.name": "Api::ProductsController#top", }, "serviceName": "opbeans-ruby", - "transactionName": "Api::StatsController#index", + "transactionName": "Api::ProductsController#top", "transactionType": "request", - "transactionsPerMinute": 0.466666666666667, + "transactionsPerMinute": 0.0666666666666667, }, Object { - "agentName": "go", - "averageResponseTime": 14040.6, - "impact": 0.122466591367692, + "agentName": "nodejs", + "averageResponseTime": 9640.8, + "impact": 0.0939697196605374, "key": Object { - "service.name": "opbeans-go", - "transaction.name": "GET /api/customers", + "service.name": "opbeans-node", + "transaction.name": "GET /api/orders/:id", }, - "serviceName": "opbeans-go", - "transactionName": "GET /api/customers", + "serviceName": "opbeans-node", + "transactionName": "GET /api/orders/:id", "transactionType": "request", - "transactionsPerMinute": 0.333333333333333, + "transactionsPerMinute": 0.0833333333333333, }, Object { "agentName": "ruby", - "averageResponseTime": 20963.5714285714, - "impact": 0.128060974201361, + "averageResponseTime": 8349.33333333333, + "impact": 0.0981490969430418, "key": Object { "service.name": "opbeans-ruby", - "transaction.name": "Api::OrdersController#index", + "transaction.name": "Api::StatsController#index", }, "serviceName": "opbeans-ruby", - "transactionName": "Api::OrdersController#index", + "transactionName": "Api::StatsController#index", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.1, }, Object { - "agentName": "python", - "averageResponseTime": 22874.4285714286, - "impact": 0.139865748579522, + "agentName": "nodejs", + "averageResponseTime": 9213.16666666667, + "impact": 0.109598205006055, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.customer", + "service.name": "opbeans-node", + "transaction.name": "GET /api/orders", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.customer", + "serviceName": "opbeans-node", + "transactionName": "GET /api/orders", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.1, }, Object { - "agentName": "python", - "averageResponseTime": 32203.8, - "impact": 0.140658264084276, + "agentName": "nodejs", + "averageResponseTime": 14031.25, + "impact": 0.111466996327935, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.customers", + "service.name": "opbeans-node", + "transaction.name": "GET /api/types/:id", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.customers", + "serviceName": "opbeans-node", + "transactionName": "GET /api/types/:id", "transactionType": "request", - "transactionsPerMinute": 0.166666666666667, + "transactionsPerMinute": 0.0666666666666667, }, Object { - "agentName": "go", - "averageResponseTime": 4482.11111111111, - "impact": 0.140955678032051, + "agentName": "nodejs", + "averageResponseTime": 8779.85714285714, + "impact": 0.123249659343199, "key": Object { - "service.name": "opbeans-go", + "service.name": "opbeans-node", "transaction.name": "GET /api/customers/:id", }, - "serviceName": "opbeans-go", + "serviceName": "opbeans-node", "transactionName": "GET /api/customers/:id", "transactionType": "request", - "transactionsPerMinute": 1.2, + "transactionsPerMinute": 0.116666666666667, }, Object { - "agentName": "ruby", - "averageResponseTime": 12582.3846153846, - "impact": 0.142910490774846, + "agentName": "go", + "averageResponseTime": 6746.3, + "impact": 0.13651233439825, "key": Object { - "service.name": "opbeans-ruby", - "transaction.name": "Api::ProductsController#index", + "service.name": "opbeans-go", + "transaction.name": "GET /api/orders/:id", }, - "serviceName": "opbeans-ruby", - "transactionName": "Api::ProductsController#index", + "serviceName": "opbeans-go", + "transactionName": "GET /api/orders/:id", "transactionType": "request", - "transactionsPerMinute": 0.433333333333333, + "transactionsPerMinute": 0.166666666666667, }, Object { - "agentName": "ruby", - "averageResponseTime": 10009.9473684211, - "impact": 0.166401779979233, + "agentName": "go", + "averageResponseTime": 7179.9, + "impact": 0.146090442166188, "key": Object { - "service.name": "opbeans-ruby", - "transaction.name": "Api::CustomersController#show", + "service.name": "opbeans-go", + "transaction.name": "GET /api/types/:id", }, - "serviceName": "opbeans-ruby", - "transactionName": "Api::CustomersController#show", + "serviceName": "opbeans-go", + "transactionName": "GET /api/types/:id", "transactionType": "request", - "transactionsPerMinute": 0.633333333333333, + "transactionsPerMinute": 0.166666666666667, }, Object { - "agentName": "python", - "averageResponseTime": 27825.2857142857, - "impact": 0.170450845832029, + "agentName": "nodejs", + "averageResponseTime": 8171.11111111111, + "impact": 0.149936264496442, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.product_types", + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/:id/customers", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.product_types", + "serviceName": "opbeans-node", + "transactionName": "GET /api/products/:id/customers", "transactionType": "request", - "transactionsPerMinute": 0.233333333333333, + "transactionsPerMinute": 0.15, }, Object { - "agentName": "python", - "averageResponseTime": 20562.2, - "impact": 0.180021926732983, + "agentName": "go", + "averageResponseTime": 9247.625, + "impact": 0.150910421674869, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.orders", + "service.name": "opbeans-go", + "transaction.name": "GET /api/customers", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.orders", + "serviceName": "opbeans-go", + "transactionName": "GET /api/customers", "transactionType": "request", - "transactionsPerMinute": 0.333333333333333, + "transactionsPerMinute": 0.133333333333333, }, Object { - "agentName": "dotnet", - "averageResponseTime": 7106.76470588235, - "impact": 0.21180020991247, + "agentName": "python", + "averageResponseTime": 19205, + "impact": 0.157181696571819, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Customers/Get {id}", + "service.name": "opbeans-python", + "transaction.name": "GET opbeans.views.product_type", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Customers/Get {id}", + "serviceName": "opbeans-python", + "transactionName": "GET opbeans.views.product_type", "transactionType": "request", - "transactionsPerMinute": 1.13333333333333, + "transactionsPerMinute": 0.0666666666666667, }, Object { "agentName": "go", - "averageResponseTime": 8612.51724137931, - "impact": 0.218977858687708, + "averageResponseTime": 10272.25, + "impact": 0.169017374943732, "key": Object { "service.name": "opbeans-go", - "transaction.name": "GET /api/orders/:id", + "transaction.name": "GET /api/types", }, "serviceName": "opbeans-go", - "transactionName": "GET /api/orders/:id", + "transactionName": "GET /api/types", "transactionType": "request", - "transactionsPerMinute": 0.966666666666667, + "transactionsPerMinute": 0.133333333333333, }, Object { "agentName": "ruby", - "averageResponseTime": 11295, - "impact": 0.277663720068132, + "averageResponseTime": 10371, + "impact": 0.170762463766765, "key": Object { "service.name": "opbeans-ruby", "transaction.name": "Api::CustomersController#index", @@ -728,77 +533,64 @@ Array [ "serviceName": "opbeans-ruby", "transactionName": "Api::CustomersController#index", "transactionType": "request", - "transactionsPerMinute": 0.933333333333333, + "transactionsPerMinute": 0.133333333333333, }, Object { - "agentName": "python", - "averageResponseTime": 65035.8, - "impact": 0.285535040543522, + "agentName": "java", + "averageResponseTime": 28415.3333333333, + "impact": 0.175794504702042, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.product_customers", + "service.name": "opbeans-java", + "transaction.name": "DispatcherServlet#doGet", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.product_customers", + "serviceName": "opbeans-java", + "transactionName": "DispatcherServlet#doGet", "transactionType": "request", - "transactionsPerMinute": 0.166666666666667, + "transactionsPerMinute": 0.05, }, Object { "agentName": "go", - "averageResponseTime": 30999.4705882353, - "impact": 0.463640986028375, + "averageResponseTime": 6374, + "impact": 0.184608307744956, "key": Object { "service.name": "opbeans-go", - "transaction.name": "GET /api/stats", + "transaction.name": "GET /api/products", }, "serviceName": "opbeans-go", - "transactionName": "GET /api/stats", + "transactionName": "GET /api/products", "transactionType": "request", - "transactionsPerMinute": 0.566666666666667, + "transactionsPerMinute": 0.233333333333333, }, Object { "agentName": "go", - "averageResponseTime": 20197.4, - "impact": 0.622424732781511, + "averageResponseTime": 6257.46666666667, + "impact": 0.194827017739071, "key": Object { "service.name": "opbeans-go", - "transaction.name": "GET /api/products/:id/customers", + "transaction.name": "GET /api/customers/:id", }, "serviceName": "opbeans-go", - "transactionName": "GET /api/products/:id/customers", + "transactionName": "GET /api/customers/:id", "transactionType": "request", - "transactionsPerMinute": 1.16666666666667, + "transactionsPerMinute": 0.25, }, Object { "agentName": "python", - "averageResponseTime": 64681.6666666667, - "impact": 0.68355874339377, + "averageResponseTime": 111027.5, + "impact": 0.47800191836068, "key": Object { "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.top_products", + "transaction.name": "GET opbeans.views.stats", }, "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.top_products", - "transactionType": "request", - "transactionsPerMinute": 0.4, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 41416.1428571429, - "impact": 0.766127739061111, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Customers/Get", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Customers/Get", + "transactionName": "GET opbeans.views.stats", "transactionType": "request", - "transactionsPerMinute": 0.7, + "transactionsPerMinute": 0.0333333333333333, }, Object { "agentName": "go", - "averageResponseTime": 19429, - "impact": 0.821597646656097, + "averageResponseTime": 19844.9333333333, + "impact": 0.645042262296039, "key": Object { "service.name": "opbeans-go", "transaction.name": "GET /api/products/:id", @@ -806,38 +598,38 @@ Array [ "serviceName": "opbeans-go", "transactionName": "GET /api/products/:id", "transactionType": "request", - "transactionsPerMinute": 1.6, + "transactionsPerMinute": 0.25, }, Object { - "agentName": "dotnet", - "averageResponseTime": 62390.652173913, - "impact": 1.26497653527507, + "agentName": "python", + "averageResponseTime": 153199, + "impact": 0.664313344437989, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Products/Customerwhobought {id}", + "service.name": "opbeans-python", + "transaction.name": "GET opbeans.views.top_products", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Products/Customerwhobought {id}", + "serviceName": "opbeans-python", + "transactionName": "GET opbeans.views.top_products", "transactionType": "request", - "transactionsPerMinute": 0.766666666666667, + "transactionsPerMinute": 0.0333333333333333, }, Object { - "agentName": "python", - "averageResponseTime": 33266.2, - "impact": 1.76006661931225, + "agentName": "go", + "averageResponseTime": 22825, + "impact": 0.895045012467666, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "opbeans.tasks.sync_orders", + "service.name": "opbeans-go", + "transaction.name": "GET /api/stats", }, - "serviceName": "opbeans-python", - "transactionName": "opbeans.tasks.sync_orders", - "transactionType": "celery", - "transactionsPerMinute": 2, + "serviceName": "opbeans-go", + "transactionName": "GET /api/stats", + "transactionType": "request", + "transactionsPerMinute": 0.3, }, Object { "agentName": "nodejs", - "averageResponseTime": 38491.4444444444, - "impact": 1.83293391905112, + "averageResponseTime": 28576.8666666667, + "impact": 0.934371362235332, "key": Object { "service.name": "opbeans-node", "transaction.name": "GET /api", @@ -845,90 +637,77 @@ Array [ "serviceName": "opbeans-node", "transactionName": "GET /api", "transactionType": "request", - "transactionsPerMinute": 1.8, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 118488.6, - "impact": 2.08995781717084, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Stats/Get", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Stats/Get", - "transactionType": "request", - "transactionsPerMinute": 0.666666666666667, + "transactionsPerMinute": 0.25, }, Object { - "agentName": "dotnet", - "averageResponseTime": 250440.142857143, - "impact": 4.64001412901584, + "agentName": "go", + "averageResponseTime": 75613.8461538462, + "impact": 2.1588648457865, "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Products/Top", + "service.name": "opbeans-go", + "transaction.name": "GET /api/products/:id/customers", }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Products/Top", + "serviceName": "opbeans-go", + "transactionName": "GET /api/products/:id/customers", "transactionType": "request", - "transactionsPerMinute": 0.7, + "transactionsPerMinute": 0.216666666666667, }, Object { - "agentName": "java", - "averageResponseTime": 312096.523809524, - "impact": 5.782704992387, + "agentName": "python", + "averageResponseTime": 500211, + "impact": 2.19739375623124, "key": Object { - "service.name": "opbeans-java", - "transaction.name": "DispatcherServlet#doGet", + "service.name": "opbeans-python", + "transaction.name": "GET opbeans.views.customers", }, - "serviceName": "opbeans-java", - "transactionName": "DispatcherServlet#doGet", + "serviceName": "opbeans-python", + "transactionName": "GET opbeans.views.customers", "transactionType": "request", - "transactionsPerMinute": 0.7, + "transactionsPerMinute": 0.0333333333333333, }, Object { - "agentName": "ruby", - "averageResponseTime": 91519.7032967033, - "impact": 7.34855500859826, + "agentName": "rum-js", + "averageResponseTime": 631900, + "impact": 13.9459899869012, "key": Object { - "service.name": "opbeans-ruby", - "transaction.name": "Rack", + "service.name": "opbeans-rum", + "transaction.name": "/customers", }, - "serviceName": "opbeans-ruby", - "transactionName": "Rack", - "transactionType": "request", - "transactionsPerMinute": 3.03333333333333, + "serviceName": "opbeans-rum", + "transactionName": "/customers", + "transactionType": "page-load", + "transactionsPerMinute": 0.166666666666667, }, Object { "agentName": "rum-js", - "averageResponseTime": 648269.769230769, - "impact": 7.43611473386403, + "averageResponseTime": 1163466.66666667, + "impact": 38.5384885525045, "key": Object { "service.name": "opbeans-rum", - "transaction.name": "/customers", + "transaction.name": "/products", }, "serviceName": "opbeans-rum", - "transactionName": "/customers", + "transactionName": "/products", "transactionType": "page-load", - "transactionsPerMinute": 0.433333333333333, + "transactionsPerMinute": 0.25, }, Object { - "agentName": "python", - "averageResponseTime": 1398919.72727273, - "impact": 13.5790895084132, + "agentName": "ruby", + "averageResponseTime": 404792.666666667, + "impact": 40.2254151113471, "key": Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.products", + "service.name": "opbeans-ruby", + "transaction.name": "Rack", }, - "serviceName": "opbeans-python", - "transactionName": "GET opbeans.views.products", + "serviceName": "opbeans-ruby", + "transactionName": "Rack", "transactionType": "request", - "transactionsPerMinute": 0.366666666666667, + "transactionsPerMinute": 0.75, }, Object { "agentName": "rum-js", - "averageResponseTime": 1199907.57142857, - "impact": 14.8239822181408, + "averageResponseTime": 1756666.66666667, + "impact": 46.5526432992941, "key": Object { "service.name": "opbeans-rum", "transaction.name": "/orders", @@ -936,38 +715,12 @@ Array [ "serviceName": "opbeans-rum", "transactionName": "/orders", "transactionType": "page-load", - "transactionsPerMinute": 0.466666666666667, - }, - Object { - "agentName": "rum-js", - "averageResponseTime": 955876.052631579, - "impact": 16.026822184214, - "key": Object { - "service.name": "opbeans-rum", - "transaction.name": "/products", - }, - "serviceName": "opbeans-rum", - "transactionName": "/products", - "transactionType": "page-load", - "transactionsPerMinute": 0.633333333333333, - }, - Object { - "agentName": "go", - "averageResponseTime": 965009.526315789, - "impact": 16.1799735991728, - "key": Object { - "service.name": "opbeans-go", - "transaction.name": "GET /api/orders", - }, - "serviceName": "opbeans-go", - "transactionName": "GET /api/orders", - "transactionType": "request", - "transactionsPerMinute": 0.633333333333333, + "transactionsPerMinute": 0.2, }, Object { "agentName": "rum-js", - "averageResponseTime": 1213675.30769231, - "impact": 27.8474053933734, + "averageResponseTime": 1008291.66666667, + "impact": 53.4424306904839, "key": Object { "service.name": "opbeans-rum", "transaction.name": "/dashboard", @@ -975,12 +728,12 @@ Array [ "serviceName": "opbeans-rum", "transactionName": "/dashboard", "transactionType": "page-load", - "transactionsPerMinute": 0.866666666666667, + "transactionsPerMinute": 0.4, }, Object { "agentName": "nodejs", - "averageResponseTime": 924019.363636364, - "impact": 35.8796065162284, + "averageResponseTime": 987612.65, + "impact": 87.2518831606925, "key": Object { "service.name": "opbeans-node", "transaction.name": "Update shipping status", @@ -988,72 +741,33 @@ Array [ "serviceName": "opbeans-node", "transactionName": "Update shipping status", "transactionType": "Worker", - "transactionsPerMinute": 1.46666666666667, + "transactionsPerMinute": 0.666666666666667, }, Object { "agentName": "nodejs", - "averageResponseTime": 1060469.15384615, - "impact": 36.498655556576, + "averageResponseTime": 947544.214285714, + "impact": 87.8976786828476, "key": Object { "service.name": "opbeans-node", - "transaction.name": "Process payment", + "transaction.name": "Process completed order", }, "serviceName": "opbeans-node", - "transactionName": "Process payment", + "transactionName": "Process completed order", "transactionType": "Worker", - "transactionsPerMinute": 1.3, - }, - Object { - "agentName": "python", - "averageResponseTime": 118686.822222222, - "impact": 37.7068083771466, - "key": Object { - "service.name": "opbeans-python", - "transaction.name": "opbeans.tasks.update_stats", - }, - "serviceName": "opbeans-python", - "transactionName": "opbeans.tasks.update_stats", - "transactionType": "celery", - "transactionsPerMinute": 12, + "transactionsPerMinute": 0.7, }, Object { "agentName": "nodejs", - "averageResponseTime": 1039228.27659574, - "impact": 43.1048035741496, + "averageResponseTime": 1077989.66666667, + "impact": 100, "key": Object { "service.name": "opbeans-node", - "transaction.name": "Process completed order", + "transaction.name": "Process payment", }, "serviceName": "opbeans-node", - "transactionName": "Process completed order", + "transactionName": "Process payment", "transactionType": "Worker", - "transactionsPerMinute": 1.56666666666667, - }, - Object { - "agentName": "python", - "averageResponseTime": 1949922.55555556, - "impact": 61.9499776921889, - "key": Object { - "service.name": "opbeans-python", - "transaction.name": "opbeans.tasks.sync_customers", - }, - "serviceName": "opbeans-python", - "transactionName": "opbeans.tasks.sync_customers", - "transactionType": "celery", - "transactionsPerMinute": 1.2, - }, - Object { - "agentName": "dotnet", - "averageResponseTime": 5963775, - "impact": 100, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Orders/Get", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Orders/Get", - "transactionType": "request", - "transactionsPerMinute": 0.633333333333333, + "transactionsPerMinute": 0.7, }, ] `; diff --git a/x-pack/test/apm_api_integration/tests/traces/critical_path.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/critical_path.spec.ts similarity index 79% rename from x-pack/test/apm_api_integration/tests/traces/critical_path.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/critical_path.spec.ts index 6d55c55ba6dbf..1f1d28215307c 100644 --- a/x-pack/test/apm_api_integration/tests/traces/critical_path.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/critical_path.spec.ts @@ -10,13 +10,13 @@ import expect from '@kbn/expect'; import { Assign } from '@kbn/utility-types'; import { compact, invert, sortBy, uniq } from 'lodash'; import { Readable } from 'stream'; -import { SupertestReturnType } from '../../common/apm_api_supertest'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { SupertestReturnType } from '../../../../services/apm_api'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const start = new Date('2022-01-01T00:00:00.000Z').getTime(); const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; @@ -33,79 +33,86 @@ export default function ApiTest({ getService }: FtrProviderContext) { children: FormattedNode[]; } - // format tree in somewhat concise format for easier testing - function formatTree(nodes: HydratedNode[]): FormattedNode[] { - return sortBy( - nodes.map((node) => { - const name = - node.metadata?.['processor.event'] === 'transaction' - ? node.metadata['transaction.name'] - : node.metadata?.['span.name'] || 'root'; - return { name, value: node.countExclusive, children: formatTree(node.children) }; - }), - (node) => node.name - ); - } - - async function fetchAndBuildCriticalPathTree( - options: { fn: () => SynthtraceGenerator } & ( - | { serviceName: string; transactionName: string } - | {} - ) - ) { - const { fn } = options; - - const generator = fn(); - - const unserialized = Array.from(generator); - - const serialized = unserialized.flatMap((event) => event.serialize()); - - const traceIds = compact(uniq(serialized.map((event) => event['trace.id']))); - - await apmSynthtraceEsClient.index(Readable.from(unserialized)); - - return apmApiClient - .readUser({ - endpoint: 'POST /internal/apm/traces/aggregated_critical_path', - params: { - body: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - traceIds, - serviceName: 'serviceName' in options ? options.serviceName : null, - transactionName: 'transactionName' in options ? options.transactionName : null, + describe('Aggregated critical path', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + // format tree in somewhat concise format for easier testing + function formatTree(nodes: HydratedNode[]): FormattedNode[] { + return sortBy( + nodes.map((node) => { + const name = + node.metadata?.['processor.event'] === 'transaction' + ? node.metadata['transaction.name'] + : node.metadata?.['span.name'] || 'root'; + return { name, value: node.countExclusive, children: formatTree(node.children) }; + }), + (node) => node.name + ); + } + + async function fetchAndBuildCriticalPathTree( + options: { fn: () => SynthtraceGenerator } & ( + | { serviceName: string; transactionName: string } + | {} + ) + ) { + const { fn } = options; + + const generator = fn(); + + const unserialized = Array.from(generator); + + const serialized = unserialized.flatMap((event) => event.serialize()); + + const traceIds = compact(uniq(serialized.map((event) => event['trace.id']))); + + await apmSynthtraceEsClient.index(Readable.from(unserialized)); + + return apmApiClient + .readUser({ + endpoint: 'POST /internal/apm/traces/aggregated_critical_path', + params: { + body: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + traceIds, + serviceName: 'serviceName' in options ? options.serviceName : null, + transactionName: 'transactionName' in options ? options.transactionName : null, + }, }, - }, - }) - .then((response) => { - const criticalPath = response.body.criticalPath!; + }) + .then((response) => { + const criticalPath = response.body.criticalPath!; - const nodeIdByOperationId = invert(criticalPath.operationIdByNodeId); + const nodeIdByOperationId = invert(criticalPath.operationIdByNodeId); - const { rootNodes, maxDepth } = getAggregatedCriticalPathRootNodes({ - criticalPath, - }); + const { rootNodes, maxDepth } = getAggregatedCriticalPathRootNodes({ + criticalPath, + }); + + function hydrateNode(node: Node): HydratedNode { + return { + ...node, + metadata: criticalPath.metadata[criticalPath.operationIdByNodeId[node.nodeId]], + children: node.children.map(hydrateNode), + }; + } - function hydrateNode(node: Node): HydratedNode { return { - ...node, - metadata: criticalPath.metadata[criticalPath.operationIdByNodeId[node.nodeId]], - children: node.children.map(hydrateNode), + rootNodes: rootNodes.map(hydrateNode), + maxDepth, + criticalPath, + nodeIdByOperationId, }; - } - - return { - rootNodes: rootNodes.map(hydrateNode), - maxDepth, - criticalPath, - nodeIdByOperationId, - }; - }); - } + }); + } + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + + after(() => apmSynthtraceEsClient.clean()); - // FLAKY: https://github.com/elastic/kibana/issues/177542 - registry.when('Aggregated critical path', { config: 'basic', archives: [] }, () => { it('builds up the correct tree for a single transaction', async () => { const java = apm .service({ name: 'java', environment: 'production', agentName: 'java' }) @@ -427,7 +434,5 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, ]); }); - - after(() => apmSynthtraceEsClient.clean()); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/find_traces.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/find_traces.spec.ts new file mode 100644 index 0000000000000..b1bd8467456d9 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/find_traces.spec.ts @@ -0,0 +1,232 @@ +/* + * 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 { apm, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { TraceSearchType } from '@kbn/apm-plugin/common/trace_explorer'; +import { Environment } from '@kbn/apm-plugin/common/environment_rt'; +import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; +import { sortBy } from 'lodash'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { ApmApiError } from '../../../../services/apm_api'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import { generateTrace } from './generate_trace'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = new Date('2022-01-01T00:00:00.000Z').getTime(); + const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; + + // for EQL sequences to work, events need a slight time offset, + // as ES will sort based on @timestamp. to acommodate this offset + // we also add a little bit of a buffer to the requested time range + const endWithOffset = end + 100000; + + describe('Find traces', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + async function fetchTraceSamples({ + query, + type, + environment, + }: { + query: string; + type: TraceSearchType; + environment: Environment; + }) { + return apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/find`, + params: { + query: { + query, + type, + start: new Date(start).toISOString(), + end: new Date(endWithOffset).toISOString(), + environment, + }, + }, + }); + } + + function fetchTraces(traceSamples: Array<{ traceId: string; transactionId: string }>) { + if (!traceSamples.length) { + return []; + } + + return Promise.all( + traceSamples.map(async ({ traceId, transactionId }) => { + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/{traceId}`, + params: { + path: { traceId }, + query: { + start: new Date(start).toISOString(), + end: new Date(endWithOffset).toISOString(), + entryTransactionId: transactionId, + }, + }, + }); + return response.body.traceItems.traceDocs; + }) + ); + } + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('when traces do not exist', () => { + it('handles empty state', async () => { + const response = await fetchTraceSamples({ + query: '', + type: TraceSearchType.kql, + environment: ENVIRONMENT_ALL.value, + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ + traceSamples: [], + }); + }); + }); + + describe('when traces exist', () => { + before(() => { + const java = apm + .service({ name: 'java', environment: 'production', agentName: 'java' }) + .instance('java'); + + const node = apm + .service({ name: 'node', environment: 'development', agentName: 'nodejs' }) + .instance('node'); + + const python = apm + .service({ name: 'python', environment: 'production', agentName: 'python' }) + .instance('python'); + + return apmSynthtraceEsClient.index( + timerange(start, end) + .interval('15m') + .rate(1) + .generator((timestamp) => { + return [ + generateTrace(timestamp, [java, node]), + generateTrace(timestamp, [node, java], 'redis'), + generateTrace(timestamp, [python], 'redis'), + generateTrace(timestamp, [python, node, java], 'elasticsearch'), + generateTrace(timestamp, [java, python, node]), + ]; + }) + ); + }); + + describe('when using KQL', () => { + describe('and the query is empty', () => { + it('returns all trace samples', async () => { + const { + body: { traceSamples }, + } = await fetchTraceSamples({ + query: '', + type: TraceSearchType.kql, + environment: 'ENVIRONMENT_ALL', + }); + + expect(traceSamples.length).to.eql(5); + }); + }); + + describe('and query is set', () => { + it('returns the relevant traces', async () => { + const { + body: { traceSamples }, + } = await fetchTraceSamples({ + query: 'span.destination.service.resource:elasticsearch', + type: TraceSearchType.kql, + environment: 'ENVIRONMENT_ALL', + }); + + expect(traceSamples.length).to.eql(1); + }); + }); + }); + + describe('when using EQL', () => { + describe('and the query is invalid', () => { + it.skip('returns a 400', async function () { + try { + await fetchTraceSamples({ + query: '', + type: TraceSearchType.eql, + environment: 'ENVIRONMENT_ALL', + }); + this.fail(); + } catch (error: unknown) { + const apiError = error as ApmApiError; + expect(apiError.res.status).to.eql(400); + } + }); + }); + + describe('and the query is set', () => { + it('returns the correct trace samples for transaction sequences', async () => { + const { + body: { traceSamples }, + } = await fetchTraceSamples({ + query: `sequence by trace.id + [ transaction where service.name == "java" ] + [ transaction where service.name == "node" ]`, + type: TraceSearchType.eql, + environment: 'ENVIRONMENT_ALL', + }); + + const traces = await fetchTraces(traceSamples); + + expect(traces.length).to.eql(2); + + const mapped = traces.map((traceDocs) => { + return sortBy(traceDocs, '@timestamp') + .filter((doc) => doc.processor.event === 'transaction') + .map((doc) => doc.service.name); + }); + + expect(mapped).to.eql([ + ['java', 'node'], + ['java', 'python', 'node'], + ]); + }); + }); + + it('returns the correct trace samples for join sequences', async () => { + const { + body: { traceSamples }, + } = await fetchTraceSamples({ + query: `sequence by trace.id + [ span where service.name == "java" ] by span.id + [ transaction where service.name == "python" ] by parent.id`, + type: TraceSearchType.eql, + environment: 'ENVIRONMENT_ALL', + }); + + const traces = await fetchTraces(traceSamples); + + expect(traces.length).to.eql(1); + + const mapped = traces.map((traceDocs) => { + return sortBy(traceDocs, '@timestamp') + .filter((doc) => doc.processor.event === 'transaction') + .map((doc) => doc.service.name); + }); + + expect(mapped).to.eql([['java', 'python', 'node']]); + }); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/traces/generate_trace.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/generate_trace.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/traces/generate_trace.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/generate_trace.ts diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/index.ts new file mode 100644 index 0000000000000..d54216b3f5d8f --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) { + describe('Traces', () => { + loadTestFile(require.resolve('./large_trace/large_trace.spec.ts')); + loadTestFile(require.resolve('./critical_path.spec.ts')); + loadTestFile(require.resolve('./find_traces.spec.ts')); + loadTestFile(require.resolve('./span_details.spec.ts')); + loadTestFile(require.resolve('./top_traces.spec.ts')); + loadTestFile(require.resolve('./trace_by_id.spec.ts')); + loadTestFile(require.resolve('./transaction_details.spec.ts')); + }); +} diff --git a/x-pack/test/apm_api_integration/tests/traces/large_trace/generate_large_trace.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/large_trace/generate_large_trace.ts similarity index 100% rename from x-pack/test/apm_api_integration/tests/traces/large_trace/generate_large_trace.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/large_trace/generate_large_trace.ts diff --git a/x-pack/test/apm_api_integration/tests/traces/large_trace/large_trace.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/large_trace/large_trace.spec.ts similarity index 86% rename from x-pack/test/apm_api_integration/tests/traces/large_trace/large_trace.spec.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/large_trace/large_trace.spec.ts index 023db5c0d2ba0..7a0952b856c6b 100644 --- a/x-pack/test/apm_api_integration/tests/traces/large_trace/large_trace.spec.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/large_trace/large_trace.spec.ts @@ -14,8 +14,9 @@ import { import type { Client } from '@elastic/elasticsearch'; import type { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; import expect from '@kbn/expect'; -import { ApmApiClient } from '../../../common/config'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { ApmApiClient } from '../../../../../services/apm_api'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../../ftr_provider_context'; import { generateLargeTrace } from './generate_large_trace'; const start = new Date('2023-01-01T00:00:00.000Z').getTime(); @@ -23,16 +24,17 @@ const end = new Date('2023-01-01T00:01:00.000Z').getTime() - 1; const rootTransactionName = 'Long trace'; const environment = 'long_trace_scenario'; -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); const es = getService('es'); - // FLAKY: https://github.com/elastic/kibana/issues/177660 - registry.when('Large trace', { config: 'basic', archives: [] }, () => { + describe('Large trace', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + describe('when the trace is large (>15.000 items)', () => { - before(() => { + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); return generateLargeTrace({ start, end, diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/span_details.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/span_details.spec.ts new file mode 100644 index 0000000000000..d5b2efc3479a6 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/span_details.spec.ts @@ -0,0 +1,134 @@ +/* + * 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 { apm, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { Readable } from 'stream'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = new Date('2022-01-01T00:00:00.000Z').getTime(); + const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; + + describe('Span details', () => { + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + async function fetchSpanDetails({ + traceId, + spanId, + parentTransactionId, + }: { + traceId: string; + spanId: string; + parentTransactionId?: string; + }) { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/{traceId}/spans/{spanId}`, + params: { + path: { traceId, spanId }, + query: { + parentTransactionId, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + }, + }, + }); + } + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await fetchSpanDetails({ + traceId: 'foo', + spanId: 'bar', + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + let traceId: string; + let spanId: string; + let parentTransactionId: string; + before(async () => { + const instanceJava = apm + .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) + .instance('instance-b'); + const events = timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return [ + instanceJava + .transaction({ transactionName: 'GET /apple 🍏' }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceJava + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + .children( + instanceJava + .span({ + spanName: 'get_green_apple_🍏', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .timestamp(timestamp + 50) + .duration(900) + .success() + ), + ]; + }); + + const unserialized = Array.from(events); + + const entities = unserialized.flatMap((event) => event.serialize()); + + const span = entities.find((entity) => { + return entity['processor.event'] === 'span'; + }); + spanId = span?.['span.id']!; + parentTransactionId = span?.['parent.id']!; + traceId = span?.['trace.id']!; + + await apmSynthtraceEsClient.index(Readable.from(unserialized)); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('span details', () => { + let spanDetails: Awaited>['body']; + before(async () => { + const response = await fetchSpanDetails({ + traceId, + spanId, + parentTransactionId, + }); + expect(response.status).to.eql(200); + spanDetails = response.body; + }); + it('returns span details', () => { + expect(spanDetails.span?.span.name).to.eql('get_green_apple_🍏'); + expect(spanDetails.parentTransaction?.transaction.name).to.eql('GET /apple 🍏'); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/top_traces.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/top_traces.spec.ts new file mode 100644 index 0000000000000..1f2abda3d42f8 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/top_traces.spec.ts @@ -0,0 +1,144 @@ +/* + * 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 { sortBy } from 'lodash'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; +import archives_metadata from '../constants/archives_metadata'; +import { ARCHIVER_ROUTES } from '../constants/archiver'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const esArchiver = getService('esArchiver'); + + const archiveName = '8.0.0'; + const metadata = archives_metadata[archiveName]; + + // url parameters + const { start, end } = metadata; + + describe('Top traces', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces`, + params: { + query: { + start, + end, + kuery: '', + environment: 'ENVIRONMENT_ALL', + probability: 1, + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body.items.length).to.be(0); + }); + }); + + describe('when data is loaded', () => { + let response: any; + before(async () => { + await esArchiver.load(ARCHIVER_ROUTES[archiveName]); + response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/traces', + params: { + query: { + start, + end, + kuery: '', + environment: 'ENVIRONMENT_ALL', + probability: 1, + }, + }, + }); + }); + + after(async () => { + await esArchiver.unload(ARCHIVER_ROUTES[archiveName]); + }); + + it('returns the correct status code', () => { + expect(response.status).to.be(200); + }); + + it('returns the correct number of buckets', () => { + expectSnapshot(response.body.items.length).toMatchInline(`59`); + }); + + it('returns the correct buckets', () => { + const sortedItems = sortBy(response.body.items, 'impact'); + + const firstItem = sortedItems[0]; + const lastItem = sortedItems[sortedItems.length - 1]; + + const groups = sortedItems.map((item) => item.key).slice(0, 5); + + expectSnapshot(sortedItems).toMatch(); + + expectSnapshot(firstItem).toMatchInline(` + Object { + "agentName": "ruby", + "averageResponseTime": 5664, + "impact": 0, + "key": Object { + "service.name": "opbeans-ruby", + "transaction.name": "Api::OrdersController#create", + }, + "serviceName": "opbeans-ruby", + "transactionName": "Api::OrdersController#create", + "transactionType": "request", + "transactionsPerMinute": 0.0166666666666667, + } + `); + + expectSnapshot(lastItem).toMatchInline(` + Object { + "agentName": "nodejs", + "averageResponseTime": 1077989.66666667, + "impact": 100, + "key": Object { + "service.name": "opbeans-node", + "transaction.name": "Process payment", + }, + "serviceName": "opbeans-node", + "transactionName": "Process payment", + "transactionType": "Worker", + "transactionsPerMinute": 0.7, + } + `); + + expectSnapshot(groups).toMatchInline(` + Array [ + Object { + "service.name": "opbeans-ruby", + "transaction.name": "Api::OrdersController#create", + }, + Object { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#products", + }, + Object { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#orders", + }, + Object { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#product", + }, + Object { + "service.name": "opbeans-node", + "transaction.name": "POST /api", + }, + ] + `); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/trace_by_id.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/trace_by_id.spec.ts new file mode 100644 index 0000000000000..5599844e744b0 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/trace_by_id.spec.ts @@ -0,0 +1,148 @@ +/* + * 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 { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { apm, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { Readable } from 'stream'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = new Date('2022-01-01T00:00:00.000Z').getTime(); + const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; + + describe('Trace by ID', () => { + describe('Trace does not exist', () => { + it('handles empty state', async () => { + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/{traceId}`, + params: { + path: { traceId: 'foo' }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + entryTransactionId: 'foo', + }, + }, + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ + traceItems: { + exceedsMax: false, + traceDocs: [], + errorDocs: [], + spanLinksCountById: {}, + traceDocsTotal: 0, + maxTraceItems: 5000, + }, + }); + }); + }); + + describe('Trace exists', () => { + let entryTransactionId: string; + let serviceATraceId: string; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + const instanceJava = apm + .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) + .instance('instance-b'); + const events = timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return [ + instanceJava + .transaction({ transactionName: 'GET /apple 🍏' }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceJava + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + .children( + instanceJava + .span({ + spanName: 'get_green_apple_🍏', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .timestamp(timestamp + 50) + .duration(900) + .success() + ), + ]; + }); + const unserialized = Array.from(events); + + const serialized = unserialized.flatMap((event) => event.serialize()); + + entryTransactionId = serialized[0]['transaction.id']!; + serviceATraceId = serialized[0]['trace.id']!; + + await apmSynthtraceEsClient.index(Readable.from(unserialized)); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('return trace', () => { + let traces: APIReturnType<'GET /internal/apm/traces/{traceId}'>; + before(async () => { + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/{traceId}`, + params: { + path: { traceId: serviceATraceId }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + entryTransactionId, + }, + }, + }); + + expect(response.status).to.eql(200); + traces = response.body; + }); + + it('returns some errors', () => { + expect(traces.traceItems.errorDocs.length).to.be.greaterThan(0); + expect(traces.traceItems.errorDocs[0].error.exception?.[0].message).to.eql( + '[ResponseError] index_not_found_exception' + ); + }); + + it('returns some trace docs', () => { + expect(traces.traceItems.traceDocs.length).to.be.greaterThan(0); + expect( + traces.traceItems.traceDocs.map((item) => { + if (item.span && 'name' in item.span) { + return item.span.name; + } + if (item.transaction && 'name' in item.transaction) { + return item.transaction.name; + } + }) + ).to.eql(['GET /apple 🍏', 'get_green_apple_🍏']); + }); + + it('returns entry transaction details', () => { + expect(traces.entryTransaction).to.not.be(undefined); + expect(traces.entryTransaction?.transaction.id).to.equal(entryTransactionId); + expect(traces.entryTransaction?.transaction.name).to.equal('GET /apple 🍏'); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/transaction_details.spec.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/transaction_details.spec.ts new file mode 100644 index 0000000000000..e29006e29989c --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/apm/traces/transaction_details.spec.ts @@ -0,0 +1,124 @@ +/* + * 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 { apm, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { Readable } from 'stream'; +import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) { + const apmApiClient = getService('apmApi'); + const synthtrace = getService('synthtrace'); + + const start = new Date('2022-01-01T00:00:00.000Z').getTime(); + const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; + + async function fetchTransactionDetails({ + traceId, + transactionId, + }: { + traceId: string; + transactionId: string; + }) { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/traces/{traceId}/transactions/{transactionId}`, + params: { + path: { + traceId, + transactionId, + }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + }, + }, + }); + } + + describe('Transaction details', () => { + describe('when data is not loaded', () => { + it('handles empty state', async () => { + const response = await fetchTransactionDetails({ + traceId: 'foo', + transactionId: 'bar', + }); + + expect(response.status).to.be(200); + expect(response.body).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + let traceId: string; + let transactionId: string; + let apmSynthtraceEsClient: ApmSynthtraceEsClient; + + before(async () => { + apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient(); + + const instanceJava = apm + .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) + .instance('instance-b'); + const events = timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return [ + instanceJava + .transaction({ transactionName: 'GET /apple 🍏' }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instanceJava + .error({ message: '[ResponseError] index_not_found_exception' }) + .timestamp(timestamp + 50) + ) + .children( + instanceJava + .span({ + spanName: 'get_green_apple_🍏', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .timestamp(timestamp + 50) + .duration(900) + .success() + ), + ]; + }); + + const unserialized = Array.from(events); + + const entities = unserialized.flatMap((event) => event.serialize()); + + const transaction = entities[0]; + transactionId = transaction?.['transaction.id']!; + traceId = transaction?.['trace.id']!; + + await apmSynthtraceEsClient.index(Readable.from(unserialized)); + }); + + after(() => apmSynthtraceEsClient.clean()); + + describe('transaction details', () => { + let transactionDetails: Awaited>['body']; + before(async () => { + const response = await fetchTransactionDetails({ + traceId, + transactionId, + }); + expect(response.status).to.eql(200); + transactionDetails = response.body; + }); + it('returns transaction details', () => { + expect(transactionDetails.transaction.name).to.eql('GET /apple 🍏'); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/default_configs/stateful.config.base.ts b/x-pack/test/api_integration/deployment_agnostic/default_configs/stateful.config.base.ts index bd423762255a5..1cf8493347a6a 100644 --- a/x-pack/test/api_integration/deployment_agnostic/default_configs/stateful.config.base.ts +++ b/x-pack/test/api_integration/deployment_agnostic/default_configs/stateful.config.base.ts @@ -124,7 +124,6 @@ export function createStatefulTestConfig = (TEndpoint extends InternalApi - ? {} - : ExternalEndpointParams) & { +type Options = { type?: 'form-data'; endpoint: TEndpoint; spaceId?: string; @@ -33,33 +24,28 @@ type Options = (TEndpoint extends InternalApi params?: { query?: { _inspect?: boolean } }; }; -function isPublicApi( - options: Options -): options is Options & ExternalEndpointParams { - return !INTERNAL_API_REGEX.test(options.endpoint); -} +type InternalEndpoint = T extends `${string} /internal/${string}` + ? T + : never; + +type PublicEndpoint = T extends `${string} /api/${string}` ? T : never; -function createApmApiClient({ getService }: DeploymentAgnosticFtrProviderContext, role: string) { +function createApmApiClient({ getService }: DeploymentAgnosticFtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const samlAuth = getService('samlAuth'); const logger = getService('log'); - return async ( - options: Options - ): Promise> => { + async function makeApiRequest({ + options, + headers, + }: { + options: Options; + headers: Record; + }): Promise> { const { endpoint, type } = options; const params = 'params' in options ? (options.params as Record) : {}; - const credentials = isPublicApi(options) - ? options.roleAuthc.apiKeyHeader - : await samlAuth.getM2MApiCookieCredentialsWithRoleScope(role); - - const headers: Record = { - ...samlAuth.getInternalRequestHeader(), - ...credentials, - }; - const { method, pathname, version } = formatRequest(endpoint, params.path); const pathnameWithSpaceId = options.spaceId ? `/s/${options.spaceId}${pathname}` : pathname; const url = format({ pathname: pathnameWithSpaceId, query: params?.query }); @@ -71,6 +57,7 @@ function createApmApiClient({ getService }: DeploymentAgnosticFtrProviderContext } let res: request.Response; + if (type === 'form-data') { const fields: Array<[string, any]> = Object.entries(params.body); const formDataRequest = supertestWithoutAuth[method](url) @@ -94,6 +81,45 @@ function createApmApiClient({ getService }: DeploymentAgnosticFtrProviderContext } return res; + } + + function makeInternalApiRequest(role: string) { + return async >( + options: Options + ): Promise> => { + const headers: Record = { + ...samlAuth.getInternalRequestHeader(), + ...(await samlAuth.getM2MApiCookieCredentialsWithRoleScope(role)), + }; + + return makeApiRequest({ + options, + headers, + }); + }; + } + + function makePublicApiRequest() { + return async >( + options: Options & { + roleAuthc: RoleCredentials; + } + ): Promise> => { + const headers: Record = { + ...samlAuth.getInternalRequestHeader(), + ...options.roleAuthc.apiKeyHeader, + }; + + return makeApiRequest({ + options, + headers, + }); + }; + } + + return { + makeInternalApiRequest, + makePublicApiRequest, }; } @@ -129,10 +155,12 @@ export interface SupertestReturnType { } export function ApmApiProvider(context: DeploymentAgnosticFtrProviderContext) { + const apmClient = createApmApiClient(context); return { - readUser: createApmApiClient(context, 'viewer'), - adminUser: createApmApiClient(context, 'admin'), - writeUser: createApmApiClient(context, 'editor'), + readUser: apmClient.makeInternalApiRequest('viewer'), + adminUser: apmClient.makeInternalApiRequest('admin'), + writeUser: apmClient.makeInternalApiRequest('editor'), + publicApi: apmClient.makePublicApiRequest(), }; } diff --git a/x-pack/test/apm_api_integration/tests/settings/agent_keys/agent_keys.spec.ts b/x-pack/test/apm_api_integration/tests/settings/agent_keys/agent_keys.spec.ts index 82c869dd09fe2..8d8808c282a8b 100644 --- a/x-pack/test/apm_api_integration/tests/settings/agent_keys/agent_keys.spec.ts +++ b/x-pack/test/apm_api_integration/tests/settings/agent_keys/agent_keys.spec.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; import { first } from 'lodash'; -import { PrivilegeType, ClusterPrivilegeType } from '@kbn/apm-plugin/common/privilege_type'; +import { PrivilegeType } from '@kbn/apm-plugin/common/privilege_type'; import { ApmUsername } from '@kbn/apm-plugin/server/test_helpers/create_apm_users/authentication'; import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { ApmApiError, ApmApiSupertest } from '../../../common/apm_api_supertest'; @@ -19,7 +19,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { const agentKeyName = 'test'; const allApplicationPrivileges = [PrivilegeType.AGENT_CONFIG, PrivilegeType.EVENT]; - const clusterPrivileges = [ClusterPrivilegeType.MANAGE_OWN_API_KEY]; async function createAgentKey(apiClient: ApmApiSupertest, privileges = allApplicationPrivileges) { return await apiClient({ @@ -50,37 +49,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { 'When the user does not have the required privileges', { config: 'basic', archives: [] }, () => { - describe('When the user does not have the required cluster privileges', () => { - it('should return an error when creating an agent key', async () => { - const error = await expectToReject(() => - createAgentKey(apmApiClient.writeUser) - ); - expect(error.res.status).to.be(403); - expect(error.res.body.message).contain('is missing the following requested privilege'); - expect(error.res.body.attributes).to.eql({ - _inspect: [], - data: { - missingPrivileges: allApplicationPrivileges, - missingClusterPrivileges: clusterPrivileges, - }, - }); - }); - - it('should return an error when invalidating an agent key', async () => { - const error = await expectToReject(() => - invalidateAgentKey(apmApiClient.writeUser, agentKeyName) - ); - expect(error.res.status).to.be(500); - }); - - it('should return an error when getting a list of agent keys', async () => { - const error = await expectToReject(() => - getAgentKeys(apmApiClient.writeUser) - ); - expect(error.res.status).to.be(500); - }); - }); - describe('When the user does not have the required application privileges', () => { allApplicationPrivileges.map((privilege) => { it(`should return an error when creating an agent key with ${privilege} privilege`, async () => { diff --git a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/read_user.spec.ts b/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/read_user.spec.ts index cc56731fec07b..fa9bcb1d0700d 100644 --- a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/read_user.spec.ts +++ b/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/read_user.spec.ts @@ -35,37 +35,35 @@ export default function apiTest({ getService }: FtrProviderContext) { } registry.when('ML jobs', { config: 'trial', archives: [] }, () => { - (['readUser', 'apmAllPrivilegesWithoutWriteSettingsUser'] as ApmApiClientKey[]).forEach( - (user) => { - describe(`when ${user} has read access to ML`, () => { - before(async () => { - const res = await getJobs({ user }); - const jobIds = res.body.jobs.map((job: any) => job.jobId); - await deleteJobs(jobIds); - }); + (['apmAllPrivilegesWithoutWriteSettingsUser'] as ApmApiClientKey[]).forEach((user) => { + describe(`when ${user} has read access to ML`, () => { + before(async () => { + const res = await getJobs({ user }); + const jobIds = res.body.jobs.map((job: any) => job.jobId); + await deleteJobs(jobIds); + }); - describe('when calling the endpoint for listing jobs', () => { - it('returns a list of jobs', async () => { - const { body } = await getJobs({ user }); + describe('when calling the endpoint for listing jobs', () => { + it('returns a list of jobs', async () => { + const { body } = await getJobs({ user }); - expect(body.jobs.length).to.be(0); - expect(body.hasLegacyJobs).to.be(false); - }); + expect(body.jobs.length).to.be(0); + expect(body.hasLegacyJobs).to.be(false); }); + }); - describe('when calling create endpoint', () => { - it('returns an error because the user does not have access', async () => { - try { - await createJobs(['production', 'staging'], { user }); - expect(true).to.be(false); - } catch (e) { - const err = e as ApmApiError; - expect(err.res.status).to.be(403); - } - }); + describe('when calling create endpoint', () => { + it('returns an error because the user does not have access', async () => { + try { + await createJobs(['production', 'staging'], { user }); + expect(true).to.be(false); + } catch (e) { + const err = e as ApmApiError; + expect(err.res.status).to.be(403); + } }); }); - } - ); + }); + }); }); } diff --git a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/write_user.spec.ts b/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/write_user.spec.ts index 652da64384dd7..40e62b1ddc969 100644 --- a/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/write_user.spec.ts +++ b/x-pack/test/apm_api_integration/tests/settings/anomaly_detection/write_user.spec.ts @@ -35,59 +35,57 @@ export default function apiTest({ getService }: FtrProviderContext) { } registry.when('ML jobs', { config: 'trial', archives: [] }, () => { - (['writeUser', 'apmReadPrivilegesWithWriteSettingsUser'] as ApmApiClientKey[]).forEach( - (user) => { - describe(`when ${user} has write access to ML`, () => { - before(async () => { - const res = await getJobs({ user }); - const jobIds = res.body.jobs.map((job: any) => job.jobId); - await deleteJobs(jobIds); - }); + (['apmReadPrivilegesWithWriteSettingsUser'] as ApmApiClientKey[]).forEach((user) => { + describe(`when ${user} has write access to ML`, () => { + before(async () => { + const res = await getJobs({ user }); + const jobIds = res.body.jobs.map((job: any) => job.jobId); + await deleteJobs(jobIds); + }); + + after(async () => { + const res = await getJobs({ user }); + const jobIds = res.body.jobs.map((job: any) => job.jobId); + await deleteJobs(jobIds); + }); - after(async () => { - const res = await getJobs({ user }); - const jobIds = res.body.jobs.map((job: any) => job.jobId); - await deleteJobs(jobIds); + describe('when calling the endpoint for listing jobs', () => { + it('returns a list of jobs', async () => { + const { body } = await getJobs({ user }); + expect(body.jobs.length).to.be(0); + expect(body.hasLegacyJobs).to.be(false); }); + }); - describe('when calling the endpoint for listing jobs', () => { - it('returns a list of jobs', async () => { - const { body } = await getJobs({ user }); - expect(body.jobs.length).to.be(0); - expect(body.hasLegacyJobs).to.be(false); + describe('when calling create endpoint', () => { + it('creates two jobs', async () => { + await createJobs(['production', 'staging'], { user }); + + const { body } = await getJobs({ user }); + expect(body.hasLegacyJobs).to.be(false); + expect(countBy(body.jobs, 'environment')).to.eql({ + production: 1, + staging: 1, }); }); - describe('when calling create endpoint', () => { - it('creates two jobs', async () => { + describe('with existing ML jobs', () => { + before(async () => { await createJobs(['production', 'staging'], { user }); + }); + it('skips duplicate job creation', async () => { + await createJobs(['production', 'test'], { user }); const { body } = await getJobs({ user }); - expect(body.hasLegacyJobs).to.be(false); expect(countBy(body.jobs, 'environment')).to.eql({ production: 1, staging: 1, - }); - }); - - describe('with existing ML jobs', () => { - before(async () => { - await createJobs(['production', 'staging'], { user }); - }); - it('skips duplicate job creation', async () => { - await createJobs(['production', 'test'], { user }); - - const { body } = await getJobs({ user }); - expect(countBy(body.jobs, 'environment')).to.eql({ - production: 1, - staging: 1, - test: 1, - }); + test: 1, }); }); }); }); - } - ); + }); + }); }); } diff --git a/x-pack/test/apm_api_integration/tests/settings/apm_indices/apm_indices.spec.ts b/x-pack/test/apm_api_integration/tests/settings/apm_indices/apm_indices.spec.ts index 41bc0448e063e..6fb5977626259 100644 --- a/x-pack/test/apm_api_integration/tests/settings/apm_indices/apm_indices.spec.ts +++ b/x-pack/test/apm_api_integration/tests/settings/apm_indices/apm_indices.spec.ts @@ -107,40 +107,6 @@ export default function apmIndicesTests({ getService }: FtrProviderContext) { await deleteSavedObject(); }); - it('[trial] returns APM Indices', async () => { - const response = await apmApiClient.readUser({ - endpoint: 'GET /internal/apm/settings/apm-indices', - }); - expect(response.status).to.be(200); - expect(response.body).to.eql({ - transaction: 'traces-apm*,apm-*,traces-*.otel-*', - span: 'traces-apm*,apm-*,traces-*.otel-*', - error: 'logs-apm*,apm-*,logs-*.otel-*', - metric: 'metrics-apm*,apm-*,metrics-*.otel-*', - onboarding: 'apm-*', - sourcemap: 'apm-*', - }); - }); - - it('[trial] updates apm indices', async () => { - const INDEX_VALUE = 'foo-*'; - - const writeResponse = await apmApiClient.writeUser({ - endpoint: 'POST /internal/apm/settings/apm-indices/save', - params: { - body: { transaction: INDEX_VALUE }, - }, - }); - expect(writeResponse.status).to.be(200); - - const readResponse = await apmApiClient.readUser({ - endpoint: 'GET /internal/apm/settings/apm-indices', - }); - - expect(readResponse.status).to.be(200); - expect(readResponse.body.transaction).to.eql(INDEX_VALUE); - }); - it('[trial] updates apm indices as read privileges with modify settings user', async () => { const INDEX_VALUE = 'foo-*'; diff --git a/x-pack/test/apm_api_integration/tests/settings/custom_link/custom_link.spec.ts b/x-pack/test/apm_api_integration/tests/settings/custom_link/custom_link.spec.ts index 490a2fc768688..e6b565cde2b34 100644 --- a/x-pack/test/apm_api_integration/tests/settings/custom_link/custom_link.spec.ts +++ b/x-pack/test/apm_api_integration/tests/settings/custom_link/custom_link.spec.ts @@ -91,79 +91,77 @@ export default function customLinksTests({ getService }: FtrProviderContext) { }); }); - (['writeUser', 'apmReadPrivilegesWithWriteSettingsUser'] as ApmApiClientKey[]).forEach( - (user) => { - it(`creates a custom link as ${user}`, async () => { - const customLink = { - url: 'https://elastic.co', - label: 'with filters', - filters: [ - { key: 'service.name', value: 'baz' }, - { key: 'transaction.type', value: 'qux' }, - ], - } as CustomLink; + (['apmReadPrivilegesWithWriteSettingsUser'] as ApmApiClientKey[]).forEach((user) => { + it(`creates a custom link as ${user}`, async () => { + const customLink = { + url: 'https://elastic.co', + label: 'with filters', + filters: [ + { key: 'service.name', value: 'baz' }, + { key: 'transaction.type', value: 'qux' }, + ], + } as CustomLink; + + await createCustomLink(customLink, { user }); + }); - await createCustomLink(customLink, { user }); + it(`updates a custom link as ${user}`, async () => { + const { status, body } = await searchCustomLinks({ + 'service.name': 'baz', + 'transaction.type': 'qux', }); + expect(status).to.equal(200); - it(`updates a custom link as ${user}`, async () => { - const { status, body } = await searchCustomLinks({ - 'service.name': 'baz', - 'transaction.type': 'qux', - }); - expect(status).to.equal(200); - - const id = body.customLinks[0].id!; - await updateCustomLink( - id, - { - label: 'foo', - url: 'https://elastic.co?service.name={{service.name}}', - filters: [ - { key: 'service.name', value: 'quz' }, - { key: 'transaction.name', value: 'bar' }, - ], - }, - { user } - ); - - const { status: newStatus, body: newBody } = await searchCustomLinks({ - 'service.name': 'quz', - 'transaction.name': 'bar', - }); - - const { label, url, filters } = newBody.customLinks[0]; - expect(newStatus).to.equal(200); - expect({ label, url, filters }).to.eql({ + const id = body.customLinks[0].id!; + await updateCustomLink( + id, + { label: 'foo', url: 'https://elastic.co?service.name={{service.name}}', filters: [ { key: 'service.name', value: 'quz' }, { key: 'transaction.name', value: 'bar' }, ], - }); + }, + { user } + ); + + const { status: newStatus, body: newBody } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', }); - it(`deletes a custom link as ${user}`, async () => { - const { status, body } = await searchCustomLinks({ - 'service.name': 'quz', - 'transaction.name': 'bar', - }); - expect(status).to.equal(200); - expect(body.customLinks.length).to.be(1); - - const id = body.customLinks[0].id!; - await deleteCustomLink(id, { user }); - - const { status: newStatus, body: newBody } = await searchCustomLinks({ - 'service.name': 'quz', - 'transaction.name': 'bar', - }); - expect(newStatus).to.equal(200); - expect(newBody.customLinks.length).to.be(0); + const { label, url, filters } = newBody.customLinks[0]; + expect(newStatus).to.equal(200); + expect({ label, url, filters }).to.eql({ + label: 'foo', + url: 'https://elastic.co?service.name={{service.name}}', + filters: [ + { key: 'service.name', value: 'quz' }, + { key: 'transaction.name', value: 'bar' }, + ], }); - } - ); + }); + + it(`deletes a custom link as ${user}`, async () => { + const { status, body } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', + }); + expect(status).to.equal(200); + expect(body.customLinks.length).to.be(1); + + const id = body.customLinks[0].id!; + await deleteCustomLink(id, { user }); + + const { status: newStatus, body: newBody } = await searchCustomLinks({ + 'service.name': 'quz', + 'transaction.name': 'bar', + }); + expect(newStatus).to.equal(200); + expect(newBody.customLinks.length).to.be(0); + }); + }); it('fetches a transaction sample', async () => { const response = await apmApiClient.readUser({ diff --git a/x-pack/test/apm_api_integration/tests/traces/find_traces.spec.ts b/x-pack/test/apm_api_integration/tests/traces/find_traces.spec.ts deleted file mode 100644 index 369490ae06d44..0000000000000 --- a/x-pack/test/apm_api_integration/tests/traces/find_traces.spec.ts +++ /dev/null @@ -1,225 +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 { apm, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { TraceSearchType } from '@kbn/apm-plugin/common/trace_explorer'; -import { Environment } from '@kbn/apm-plugin/common/environment_rt'; -import { ENVIRONMENT_ALL } from '@kbn/apm-plugin/common/environment_filter_values'; -import { sortBy } from 'lodash'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { ApmApiError } from '../../common/apm_api_supertest'; -import { generateTrace } from './generate_trace'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - - const start = new Date('2022-01-01T00:00:00.000Z').getTime(); - const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; - - // for EQL sequences to work, events need a slight time offset, - // as ES will sort based on @timestamp. to acommodate this offset - // we also add a little bit of a buffer to the requested time range - const endWithOffset = end + 100000; - - async function fetchTraceSamples({ - query, - type, - environment, - }: { - query: string; - type: TraceSearchType; - environment: Environment; - }) { - return apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/find`, - params: { - query: { - query, - type, - start: new Date(start).toISOString(), - end: new Date(endWithOffset).toISOString(), - environment, - }, - }, - }); - } - - function fetchTraces(traceSamples: Array<{ traceId: string; transactionId: string }>) { - if (!traceSamples.length) { - return []; - } - - return Promise.all( - traceSamples.map(async ({ traceId, transactionId }) => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/{traceId}`, - params: { - path: { traceId }, - query: { - start: new Date(start).toISOString(), - end: new Date(endWithOffset).toISOString(), - entryTransactionId: transactionId, - }, - }, - }); - return response.body.traceItems.traceDocs; - }) - ); - } - - registry.when('Find traces when traces do not exist', { config: 'basic', archives: [] }, () => { - it('handles empty state', async () => { - const response = await fetchTraceSamples({ - query: '', - type: TraceSearchType.kql, - environment: ENVIRONMENT_ALL.value, - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({ - traceSamples: [], - }); - }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177543 - registry.when('Find traces when traces exist', { config: 'basic', archives: [] }, () => { - before(() => { - const java = apm - .service({ name: 'java', environment: 'production', agentName: 'java' }) - .instance('java'); - - const node = apm - .service({ name: 'node', environment: 'development', agentName: 'nodejs' }) - .instance('node'); - - const python = apm - .service({ name: 'python', environment: 'production', agentName: 'python' }) - .instance('python'); - - return apmSynthtraceEsClient.index( - timerange(start, end) - .interval('15m') - .rate(1) - .generator((timestamp) => { - return [ - generateTrace(timestamp, [java, node]), - generateTrace(timestamp, [node, java], 'redis'), - generateTrace(timestamp, [python], 'redis'), - generateTrace(timestamp, [python, node, java], 'elasticsearch'), - generateTrace(timestamp, [java, python, node]), - ]; - }) - ); - }); - - describe('when using KQL', () => { - describe('and the query is empty', () => { - it('returns all trace samples', async () => { - const { - body: { traceSamples }, - } = await fetchTraceSamples({ - query: '', - type: TraceSearchType.kql, - environment: 'ENVIRONMENT_ALL', - }); - - expect(traceSamples.length).to.eql(5); - }); - }); - - describe('and query is set', () => { - it('returns the relevant traces', async () => { - const { - body: { traceSamples }, - } = await fetchTraceSamples({ - query: 'span.destination.service.resource:elasticsearch', - type: TraceSearchType.kql, - environment: 'ENVIRONMENT_ALL', - }); - - expect(traceSamples.length).to.eql(1); - }); - }); - }); - - describe('when using EQL', () => { - describe('and the query is invalid', () => { - it.skip('returns a 400', async function () { - try { - await fetchTraceSamples({ - query: '', - type: TraceSearchType.eql, - environment: 'ENVIRONMENT_ALL', - }); - this.fail(); - } catch (error: unknown) { - const apiError = error as ApmApiError; - expect(apiError.res.status).to.eql(400); - } - }); - }); - - describe('and the query is set', () => { - it('returns the correct trace samples for transaction sequences', async () => { - const { - body: { traceSamples }, - } = await fetchTraceSamples({ - query: `sequence by trace.id - [ transaction where service.name == "java" ] - [ transaction where service.name == "node" ]`, - type: TraceSearchType.eql, - environment: 'ENVIRONMENT_ALL', - }); - - const traces = await fetchTraces(traceSamples); - - expect(traces.length).to.eql(2); - - const mapped = traces.map((traceDocs) => { - return sortBy(traceDocs, '@timestamp') - .filter((doc) => doc.processor.event === 'transaction') - .map((doc) => doc.service.name); - }); - - expect(mapped).to.eql([ - ['java', 'node'], - ['java', 'python', 'node'], - ]); - }); - }); - - it('returns the correct trace samples for join sequences', async () => { - const { - body: { traceSamples }, - } = await fetchTraceSamples({ - query: `sequence by trace.id - [ span where service.name == "java" ] by span.id - [ transaction where service.name == "python" ] by parent.id`, - type: TraceSearchType.eql, - environment: 'ENVIRONMENT_ALL', - }); - - const traces = await fetchTraces(traceSamples); - - expect(traces.length).to.eql(1); - - const mapped = traces.map((traceDocs) => { - return sortBy(traceDocs, '@timestamp') - .filter((doc) => doc.processor.event === 'transaction') - .map((doc) => doc.service.name); - }); - - expect(mapped).to.eql([['java', 'python', 'node']]); - }); - }); - - after(() => apmSynthtraceEsClient.clean()); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/traces/span_details.spec.ts b/x-pack/test/apm_api_integration/tests/traces/span_details.spec.ts deleted file mode 100644 index a428ea9cb2e50..0000000000000 --- a/x-pack/test/apm_api_integration/tests/traces/span_details.spec.ts +++ /dev/null @@ -1,125 +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 { apm, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { Readable } from 'stream'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - - const start = new Date('2022-01-01T00:00:00.000Z').getTime(); - const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; - - async function fetchSpanDetails({ - traceId, - spanId, - parentTransactionId, - }: { - traceId: string; - spanId: string; - parentTransactionId?: string; - }) { - return await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/{traceId}/spans/{spanId}`, - params: { - path: { traceId, spanId }, - query: { - parentTransactionId, - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - }, - }, - }); - } - - registry.when('Span details dont exist', { config: 'basic', archives: [] }, () => { - it('handles empty state', async () => { - const response = await fetchSpanDetails({ - traceId: 'foo', - spanId: 'bar', - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({}); - }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177544 - registry.when('Span details', { config: 'basic', archives: [] }, () => { - let traceId: string; - let spanId: string; - let parentTransactionId: string; - before(async () => { - const instanceJava = apm - .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) - .instance('instance-b'); - const events = timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => { - return [ - instanceJava - .transaction({ transactionName: 'GET /apple 🍏' }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceJava - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - .children( - instanceJava - .span({ - spanName: 'get_green_apple_🍏', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .timestamp(timestamp + 50) - .duration(900) - .success() - ), - ]; - }); - - const unserialized = Array.from(events); - - const entities = unserialized.flatMap((event) => event.serialize()); - - const span = entities.find((entity) => { - return entity['processor.event'] === 'span'; - }); - spanId = span?.['span.id']!; - parentTransactionId = span?.['parent.id']!; - traceId = span?.['trace.id']!; - - await apmSynthtraceEsClient.index(Readable.from(unserialized)); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('span details', () => { - let spanDetails: Awaited>['body']; - before(async () => { - const response = await fetchSpanDetails({ - traceId, - spanId, - parentTransactionId, - }); - expect(response.status).to.eql(200); - spanDetails = response.body; - }); - it('returns span details', () => { - expect(spanDetails.span?.span.name).to.eql('get_green_apple_🍏'); - expect(spanDetails.parentTransaction?.transaction.name).to.eql('GET /apple 🍏'); - }); - }); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/traces/top_traces.spec.ts b/x-pack/test/apm_api_integration/tests/traces/top_traces.spec.ts deleted file mode 100644 index b49133240c865..0000000000000 --- a/x-pack/test/apm_api_integration/tests/traces/top_traces.spec.ts +++ /dev/null @@ -1,140 +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 expect from '@kbn/expect'; -import { sortBy } from 'lodash'; -import archives_metadata from '../../common/fixtures/es_archiver/archives_metadata'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - - const archiveName = 'apm_8.0.0'; - const metadata = archives_metadata[archiveName]; - - // url parameters - const { start, end } = metadata; - - registry.when('Top traces when data is not loaded', { config: 'basic', archives: [] }, () => { - it('handles empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces`, - params: { - query: { - start, - end, - kuery: '', - environment: 'ENVIRONMENT_ALL', - probability: 1, - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body.items.length).to.be(0); - }); - }); - - registry.when( - 'Top traces when data is loaded', - { config: 'basic', archives: [archiveName] }, - () => { - let response: any; - before(async () => { - response = await apmApiClient.readUser({ - endpoint: 'GET /internal/apm/traces', - params: { - query: { - start, - end, - kuery: '', - environment: 'ENVIRONMENT_ALL', - probability: 1, - }, - }, - }); - }); - - it('returns the correct status code', async () => { - expect(response.status).to.be(200); - }); - - it('returns the correct number of buckets', async () => { - expectSnapshot(response.body.items.length).toMatchInline(`81`); - }); - - it('returns the correct buckets', async () => { - const sortedItems = sortBy(response.body.items, 'impact'); - - const firstItem = sortedItems[0]; - const lastItem = sortedItems[sortedItems.length - 1]; - - const groups = sortedItems.map((item) => item.key).slice(0, 5); - - expectSnapshot(sortedItems).toMatch(); - - expectSnapshot(firstItem).toMatchInline(` - Object { - "agentName": "java", - "averageResponseTime": 1639, - "impact": 0, - "key": Object { - "service.name": "opbeans-java", - "transaction.name": "DispatcherServlet#doPost", - }, - "serviceName": "opbeans-java", - "transactionName": "DispatcherServlet#doPost", - "transactionType": "request", - "transactionsPerMinute": 0.0333333333333333, - } - `); - - expectSnapshot(lastItem).toMatchInline(` - Object { - "agentName": "dotnet", - "averageResponseTime": 5963775, - "impact": 100, - "key": Object { - "service.name": "opbeans-dotnet", - "transaction.name": "GET Orders/Get", - }, - "serviceName": "opbeans-dotnet", - "transactionName": "GET Orders/Get", - "transactionType": "request", - "transactionsPerMinute": 0.633333333333333, - } - `); - - expectSnapshot(groups).toMatchInline(` - Array [ - Object { - "service.name": "opbeans-java", - "transaction.name": "DispatcherServlet#doPost", - }, - Object { - "service.name": "opbeans-node", - "transaction.name": "POST /api/orders", - }, - Object { - "service.name": "opbeans-node", - "transaction.name": "GET /api/products/:id", - }, - Object { - "service.name": "opbeans-dotnet", - "transaction.name": "POST Orders/Post", - }, - Object { - "service.name": "opbeans-python", - "transaction.name": "GET opbeans.views.product", - }, - ] - `); - }); - } - ); -} diff --git a/x-pack/test/apm_api_integration/tests/traces/trace_by_id.spec.ts b/x-pack/test/apm_api_integration/tests/traces/trace_by_id.spec.ts deleted file mode 100644 index de07f3664104c..0000000000000 --- a/x-pack/test/apm_api_integration/tests/traces/trace_by_id.spec.ts +++ /dev/null @@ -1,145 +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 { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; -import { apm, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { Readable } from 'stream'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - - const start = new Date('2022-01-01T00:00:00.000Z').getTime(); - const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; - - registry.when('Trace does not exist', { config: 'basic', archives: [] }, () => { - it('handles empty state', async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/{traceId}`, - params: { - path: { traceId: 'foo' }, - query: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - entryTransactionId: 'foo', - }, - }, - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({ - traceItems: { - exceedsMax: false, - traceDocs: [], - errorDocs: [], - spanLinksCountById: {}, - traceDocsTotal: 0, - maxTraceItems: 5000, - }, - }); - }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177545 - registry.when('Trace exists', { config: 'basic', archives: [] }, () => { - let entryTransactionId: string; - let serviceATraceId: string; - - before(async () => { - const instanceJava = apm - .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) - .instance('instance-b'); - const events = timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => { - return [ - instanceJava - .transaction({ transactionName: 'GET /apple 🍏' }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceJava - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - .children( - instanceJava - .span({ - spanName: 'get_green_apple_🍏', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .timestamp(timestamp + 50) - .duration(900) - .success() - ), - ]; - }); - const unserialized = Array.from(events); - - const serialized = unserialized.flatMap((event) => event.serialize()); - - entryTransactionId = serialized[0]['transaction.id']!; - serviceATraceId = serialized[0]['trace.id']!; - - await apmSynthtraceEsClient.index(Readable.from(unserialized)); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('return trace', () => { - let traces: APIReturnType<'GET /internal/apm/traces/{traceId}'>; - before(async () => { - const response = await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/{traceId}`, - params: { - path: { traceId: serviceATraceId }, - query: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - entryTransactionId, - }, - }, - }); - - expect(response.status).to.eql(200); - traces = response.body; - }); - - it('returns some errors', () => { - expect(traces.traceItems.errorDocs.length).to.be.greaterThan(0); - expect(traces.traceItems.errorDocs[0].error.exception?.[0].message).to.eql( - '[ResponseError] index_not_found_exception' - ); - }); - - it('returns some trace docs', () => { - expect(traces.traceItems.traceDocs.length).to.be.greaterThan(0); - expect( - traces.traceItems.traceDocs.map((item) => { - if (item.span && 'name' in item.span) { - return item.span.name; - } - if (item.transaction && 'name' in item.transaction) { - return item.transaction.name; - } - }) - ).to.eql(['GET /apple 🍏', 'get_green_apple_🍏']); - }); - - it('returns entry transaction details', () => { - expect(traces.entryTransaction).to.not.be(undefined); - expect(traces.entryTransaction?.transaction.id).to.equal(entryTransactionId); - expect(traces.entryTransaction?.transaction.name).to.equal('GET /apple 🍏'); - }); - }); - }); -} diff --git a/x-pack/test/apm_api_integration/tests/traces/transaction_details.spec.ts b/x-pack/test/apm_api_integration/tests/traces/transaction_details.spec.ts deleted file mode 100644 index 3665bfd8e8ea6..0000000000000 --- a/x-pack/test/apm_api_integration/tests/traces/transaction_details.spec.ts +++ /dev/null @@ -1,119 +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 { apm, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { Readable } from 'stream'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const apmApiClient = getService('apmApiClient'); - const apmSynthtraceEsClient = getService('apmSynthtraceEsClient'); - - const start = new Date('2022-01-01T00:00:00.000Z').getTime(); - const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; - - async function fetchTransactionDetails({ - traceId, - transactionId, - }: { - traceId: string; - transactionId: string; - }) { - return await apmApiClient.readUser({ - endpoint: `GET /internal/apm/traces/{traceId}/transactions/{transactionId}`, - params: { - path: { - traceId, - transactionId, - }, - query: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - }, - }, - }); - } - - registry.when('Transaction details dont exist', { config: 'basic', archives: [] }, () => { - it('handles empty state', async () => { - const response = await fetchTransactionDetails({ - traceId: 'foo', - transactionId: 'bar', - }); - - expect(response.status).to.be(200); - expect(response.body).to.eql({}); - }); - }); - - // FLAKY: https://github.com/elastic/kibana/issues/177546 - registry.when('Transaction details', { config: 'basic', archives: [] }, () => { - let traceId: string; - let transactionId: string; - before(async () => { - const instanceJava = apm - .service({ name: 'synth-apple', environment: 'production', agentName: 'java' }) - .instance('instance-b'); - const events = timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => { - return [ - instanceJava - .transaction({ transactionName: 'GET /apple 🍏' }) - .timestamp(timestamp) - .duration(1000) - .failure() - .errors( - instanceJava - .error({ message: '[ResponseError] index_not_found_exception' }) - .timestamp(timestamp + 50) - ) - .children( - instanceJava - .span({ - spanName: 'get_green_apple_🍏', - spanType: 'db', - spanSubtype: 'elasticsearch', - }) - .timestamp(timestamp + 50) - .duration(900) - .success() - ), - ]; - }); - - const unserialized = Array.from(events); - - const entities = unserialized.flatMap((event) => event.serialize()); - - const transaction = entities[0]; - transactionId = transaction?.['transaction.id']!; - traceId = transaction?.['trace.id']!; - - await apmSynthtraceEsClient.index(Readable.from(unserialized)); - }); - - after(() => apmSynthtraceEsClient.clean()); - - describe('transaction details', () => { - let transactionDetails: Awaited>['body']; - before(async () => { - const response = await fetchTransactionDetails({ - traceId, - transactionId, - }); - expect(response.status).to.eql(200); - transactionDetails = response.body; - }); - it('returns transaction details', () => { - expect(transactionDetails.transaction.name).to.eql('GET /apple 🍏'); - }); - }); - }); -} diff --git a/x-pack/test/functional/apps/api_keys/home_page.ts b/x-pack/test/functional/apps/api_keys/home_page.ts index 2c212c11166f2..a12973bac24b0 100644 --- a/x-pack/test/functional/apps/api_keys/home_page.ts +++ b/x-pack/test/functional/apps/api_keys/home_page.ts @@ -419,5 +419,134 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); }); }); + + describe('querying API keys', function () { + before(async () => { + await clearAllApiKeys(es, log); + await security.testUser.setRoles(['kibana_admin', 'test_api_keys']); + + await es.transport.request({ + method: 'POST', + path: '/_security/cross_cluster/api_key', + body: { + name: 'test_cross_cluster', + expiration: '1d', + access: { + search: [ + { + names: ['*'], + }, + ], + replication: [ + { + names: ['*'], + }, + ], + }, + }, + }); + + await es.security.createApiKey({ + name: 'my api key', + expiration: '1d', + role_descriptors: { + role_1: {}, + }, + metadata: { + managed: true, + }, + }); + + await es.security.createApiKey({ + name: 'Alerting: Managed', + expiration: '1d', + role_descriptors: { + role_1: {}, + }, + }); + + await es.security.createApiKey({ + name: 'test_api_key', + expiration: '1s', + role_descriptors: { + role_1: {}, + }, + }); + + await es.security.grantApiKey({ + api_key: { + name: 'test_user_api_key', + expiration: '1d', + }, + grant_type: 'password', + run_as: 'test_user', + username: 'elastic', + password: 'changeme', + }); + + await pageObjects.common.navigateToApp('apiKeys'); + }); + + after(async () => { + await security.testUser.restoreDefaults(); + await clearAllApiKeys(es, log); + }); + + it('active/expired filter buttons work as expected', async () => { + await pageObjects.apiKeys.clickExpiryFilters('active'); + await ensureApiKeysExist(['my api key', 'Alerting: Managed', 'test_cross_cluster']); + expect(await pageObjects.apiKeys.doesApiKeyExist('test_api_key')).to.be(false); + + await pageObjects.apiKeys.clickExpiryFilters('expired'); + await ensureApiKeysExist(['test_api_key']); + expect(await pageObjects.apiKeys.doesApiKeyExist('my api key')).to.be(false); + + // reset filter buttons + await pageObjects.apiKeys.clickExpiryFilters('expired'); + }); + + it('api key type filter buttons work as expected', async () => { + await pageObjects.apiKeys.clickTypeFilters('personal'); + + await ensureApiKeysExist(['test_api_key']); + + await pageObjects.apiKeys.clickTypeFilters('cross_cluster'); + + await ensureApiKeysExist(['test_cross_cluster']); + + await pageObjects.apiKeys.clickTypeFilters('managed'); + + await ensureApiKeysExist(['my api key', 'Alerting: Managed']); + + // reset filters by simulate clicking the managed filter button again + await pageObjects.apiKeys.clickTypeFilters('managed'); + }); + + it('username filter buttons work as expected', async () => { + await pageObjects.apiKeys.clickUserNameDropdown(); + expect( + await testSubjects.exists('userProfileSelectableOption-system_indices_superuser') + ).to.be(true); + expect(await testSubjects.exists('userProfileSelectableOption-test_user')).to.be(true); + + await testSubjects.click('userProfileSelectableOption-test_user'); + + await ensureApiKeysExist(['test_user_api_key']); + await testSubjects.click('userProfileSelectableOption-test_user'); + + await testSubjects.click('userProfileSelectableOption-system_indices_superuser'); + + await ensureApiKeysExist(['my api key', 'Alerting: Managed', 'test_cross_cluster']); + }); + + it.skip('search bar works as expected', async () => { + await pageObjects.apiKeys.setSearchBarValue('test_user_api_key'); + + await ensureApiKeysExist(['test_user_api_key']); + + await pageObjects.apiKeys.setSearchBarValue('"my api key"'); + await ensureApiKeysExist(['my api key']); + }); + }); }); }; diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts index d2171544aa993..0d27f9afe153b 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts @@ -59,7 +59,6 @@ export default function ({ getService }: FtrProviderContext) { expand_wildcards: ['open'], ignore_unavailable: false, allow_no_indices: true, - ignore_throttled: true, }, query: { match_all: {}, @@ -140,7 +139,6 @@ export default function ({ getService }: FtrProviderContext) { expand_wildcards: ['open'], ignore_unavailable: false, allow_no_indices: true, - ignore_throttled: true, }, query: { bool: { @@ -217,7 +215,6 @@ export default function ({ getService }: FtrProviderContext) { expand_wildcards: ['open'], ignore_unavailable: false, allow_no_indices: true, - ignore_throttled: true, }, query: { match_all: {}, @@ -317,7 +314,6 @@ export default function ({ getService }: FtrProviderContext) { expand_wildcards: ['open'], ignore_unavailable: false, allow_no_indices: true, - ignore_throttled: true, }, query: { bool: { diff --git a/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts b/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts index dbc62293f035f..408d4686252cf 100644 --- a/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts +++ b/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts @@ -302,6 +302,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { { identifier: 'percentiles(products.base_price)', label: 'products.base_price.percentiles', + form: { + transformPercentilesAggPercentsSelector: [1, 25, 50, 75, 100], + }, }, { identifier: 'filter(customer_phone)', diff --git a/x-pack/test/functional/page_objects/api_keys_page.ts b/x-pack/test/functional/page_objects/api_keys_page.ts index 9b196f70eeef0..efff9930f10a9 100644 --- a/x-pack/test/functional/page_objects/api_keys_page.ts +++ b/x-pack/test/functional/page_objects/api_keys_page.ts @@ -157,5 +157,34 @@ export function ApiKeysPageProvider({ getService }: FtrProviderContext) { const toast = await testSubjects.find('updateApiKeySuccessToast'); return toast.getVisibleText(); }, + + async clickExpiryFilters(type: 'active' | 'expired') { + const button = await testSubjects.find( + type === 'active' ? 'activeFilterButton' : 'expiredFilterButton' + ); + return button.click(); + }, + + async clickTypeFilters(type: 'personal' | 'managed' | 'cross_cluster') { + const buttonMap = { + personal: 'personalFilterButton', + managed: 'managedFilterButton', + cross_cluster: 'crossClusterFilterButton', + }; + + const button = await testSubjects.find(buttonMap[type]); + return button.click(); + }, + + async clickUserNameDropdown() { + const button = await testSubjects.find('ownerFilterButton'); + return button.click(); + }, + + async setSearchBarValue(query: string) { + const searchBar = await testSubjects.find('apiKeysSearchBar'); + await searchBar.clearValue(); + return searchBar.type(query); + }, }; } diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index e5a2604294675..e0e2a555540be 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -221,14 +221,33 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }, async expectIndexIsDeleted(indexName: string) { - const table = await find.byCssSelector('table'); - const rows = await table.findAllByTestSubject('indexTableRow'); - const indexNames: string[] = await Promise.all( - rows.map(async (row) => { - return await (await row.findByTestSubject('indexTableIndexNameLink')).getVisibleText(); - }) - ); - expect(indexNames.includes(indexName)).to.be(false); + try { + const table = await find.byCssSelector('table'); + const rows = await table.findAllByTestSubject('indexTableRow'); + + const indexNames = await Promise.all( + rows.map(async (row) => { + try { + return await ( + await row.findByTestSubject('indexTableIndexNameLink') + ).getVisibleText(); + } catch (error) { + // If the current row is stale, it has already been removed + if (error.name === 'StaleElementReferenceError') return undefined; + throw error; // Rethrow unexpected errors + } + }) + ).then((names) => names.filter((name) => name !== undefined)); + + expect(indexNames.includes(indexName)).to.be(false); + } catch (error) { + if (error.name === 'StaleElementReferenceError') { + // If the table itself is stale, it means all rows have been removed + return; // Pass the test since the table is gone + } else { + throw error; // Rethrow unexpected errors + } + } }, async manageIndex(indexName: string) { const id = `checkboxSelectIndex-${indexName}`; diff --git a/x-pack/test/functional/services/transform/wizard.ts b/x-pack/test/functional/services/transform/wizard.ts index 7d113c30ffeb1..dd5546e65a368 100644 --- a/x-pack/test/functional/services/transform/wizard.ts +++ b/x-pack/test/functional/services/transform/wizard.ts @@ -605,6 +605,12 @@ export function TransformWizardProvider({ getService, getPageObjects }: FtrProvi expectedLabel: string, formData: Record ) { + const isPopoverFormVisible = await testSubjects.exists( + `transformAggPopoverForm_${expectedLabel}` + ); + if (!isPopoverFormVisible) { + await this.openPopoverForm(expectedLabel); + } await testSubjects.existOrFail(`transformAggPopoverForm_${expectedLabel}`); for (const [testObj, value] of Object.entries(formData)) { @@ -615,12 +621,19 @@ export function TransformWizardProvider({ getService, getPageObjects }: FtrProvi case 'transformFilterTermValueSelector': await this.fillFilterTermValue(value); break; + case 'transformPercentilesAggPercentsSelector': + await this.fillPercentilesAggPercents(value); + break; } } await testSubjects.clickWhenNotDisabled('transformApplyAggChanges'); await testSubjects.missingOrFail(`transformAggPopoverForm_${expectedLabel}`); }, + async openPopoverForm(expectedLabel: string) { + await testSubjects.click(`transformAggregationEntryEditButton_${expectedLabel}`); + }, + async selectFilerAggType(value: string) { await testSubjects.selectValue('transformFilterAggTypeSelector', value); }, @@ -629,6 +642,14 @@ export function TransformWizardProvider({ getService, getPageObjects }: FtrProvi await comboBox.set('transformFilterTermValueSelector', value); }, + async fillPercentilesAggPercents(value: number[]) { + await comboBox.clear('transformPercentilesAggPercentsSelector'); + for (const val of value) { + // Cast to string since Percentiles are usually passed as numbers + await comboBox.setCustom('transformPercentilesAggPercentsSelector', val.toString()); + } + }, + async assertAdvancedPivotEditorContent(expectedValue: string[]) { const wrapper = await testSubjects.find('transformAdvancedPivotEditor'); const editor = await wrapper.findByCssSelector('.monaco-editor .view-lines'); diff --git a/x-pack/test/kibana.jsonc b/x-pack/test/kibana.jsonc index 609e591270853..89a09b07fb7df 100644 --- a/x-pack/test/kibana.jsonc +++ b/x-pack/test/kibana.jsonc @@ -2,5 +2,7 @@ "type": "test-helper", "id": "@kbn/test-suites-xpack", "owner": [], + "group": "platform", + "visibility": "shared", "devOnly": true } diff --git a/x-pack/test/security_api_integration/packages/helpers/kibana.jsonc b/x-pack/test/security_api_integration/packages/helpers/kibana.jsonc index accbad4620166..f85c93d50ca51 100644 --- a/x-pack/test/security_api_integration/packages/helpers/kibana.jsonc +++ b/x-pack/test/security_api_integration/packages/helpers/kibana.jsonc @@ -1,6 +1,10 @@ { "type": "shared-common", "id": "@kbn/security-api-integration-helpers", - "owner": "@elastic/kibana-security", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private", "devOnly": true -} +} \ No newline at end of file diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts index 8bad52ae41bdb..0c5d86fa54800 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/entity_store.ts @@ -14,7 +14,8 @@ export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const utils = EntityStoreUtils(getService); - describe('@ess @skipInServerlessMKI Entity Store APIs', () => { + // Failing: See https://github.com/elastic/kibana/issues/200758 + describe.skip('@ess @skipInServerlessMKI Entity Store APIs', () => { const dataView = dataViewRouteHelpersFactory(supertest); before(async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/draft_timeline.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/draft_timeline.ts index dafb08124b0e5..210cf28163f5c 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/draft_timeline.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/draft_timeline.ts @@ -27,8 +27,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: 'default', }); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body.data && response.body; expect(savedObjectId).to.not.be.empty(); expect(version).to.not.be.empty(); @@ -49,7 +48,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType, templateTimelineId, templateTimelineVersion, - } = response.body.data && response.body.data.persistTimeline.timeline; + } = response.body.data && response.body; expect(savedObjectId).to.not.be.empty(); expect(version).to.not.be.empty(); @@ -72,7 +71,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { pinnedEventIds: initialPinnedEventIds, noteIds: initialNoteIds, version: initialVersion, - } = response.body.data && response.body.data.persistTimeline.timeline; + } = response.body.data && response.body; expect(initialPinnedEventIds).to.have.length(0, 'should not have any pinned events'); expect(initialNoteIds).to.have.length(0, 'should not have any notes'); @@ -107,7 +106,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { pinnedEventIds, noteIds, status: newStatus, - } = getTimelineRequest.body.data && getTimelineRequest.body.data.getOneTimeline; + } = getTimelineRequest.body.data && getTimelineRequest.body; expect(newStatus).to.be.equal('draft', 'status should still be draft'); expect(pinnedEventIds).to.have.length(1, 'should have one pinned event'); @@ -126,8 +125,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { pinnedEventIds: cleanedPinnedEventIds, noteIds: cleanedNoteIds, version: cleanedVersion, - } = cleanDraftTimelineRequest.body.data && - cleanDraftTimelineRequest.body.data.persistTimeline.timeline; + } = cleanDraftTimelineRequest.body.data && cleanDraftTimelineRequest.body; expect(cleanedPinnedEventIds).to.have.length(0, 'should not have pinned events anymore'); expect(cleanedNoteIds).to.have.length(0, 'should not have notes anymore'); diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts index 8e897509aaf98..f210eb88f9c4d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts @@ -35,8 +35,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { note: { note: myNote, timelineId: 'testTimelineId' }, }); - const { note, noteId, timelineId, version } = - response.body.data && response.body.data.persistNote.note; + const { note, noteId, timelineId, version } = response.body && response.body.note; expect(note).to.be(myNote); expect(noteId).to.not.be.empty(); @@ -56,8 +55,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { note: { note: myNote, timelineId: 'testTimelineId' }, }); - const { noteId, timelineId, version } = - response.body.data && response.body.data.persistNote.note; + const { noteId, timelineId, version } = response.body && response.body.note; const myNewNote = 'new world test'; const responseToTest = await supertest @@ -70,9 +68,9 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { note: { note: myNewNote, timelineId }, }); - expect(responseToTest.body.data!.persistNote.note.note).to.be(myNewNote); - expect(responseToTest.body.data!.persistNote.note.noteId).to.be(noteId); - expect(responseToTest.body.data!.persistNote.note.version).to.not.be.eql(version); + expect(responseToTest.body.note.note).to.be(myNewNote); + expect(responseToTest.body.note.noteId).to.be(noteId); + expect(responseToTest.body.note.version).to.not.be.eql(version); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/pinned_events.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/pinned_events.ts index 183c56fc2d8f3..3ef92b6a2f219 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/pinned_events.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/pinned_events.ts @@ -28,8 +28,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineId: 'testId', eventId: 'bv4QSGsB9v5HJNSH-7fi', }); - const { eventId, pinnedEventId, timelineId, version } = - response.body.data && response.body.data.persistPinnedEventOnTimeline; + const { eventId, pinnedEventId, timelineId, version } = response.body; expect(eventId).to.be('bv4QSGsB9v5HJNSH-7fi'); expect(pinnedEventId).to.not.be.empty(); @@ -39,7 +38,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { }); describe('unpin an event', () => { - it('returns null', async () => { + it('returns { unpinned: true }', async () => { const response = await supertest .patch(PINNED_EVENT_URL) .set('elastic-api-version', '2023-10-31') @@ -49,8 +48,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { eventId: 'bv4QSGsB9v5HJNSH-7fi', timelineId: 'testId', }); - const { eventId, pinnedEventId, timelineId } = - response.body.data && response.body.data.persistPinnedEventOnTimeline; + const { eventId, pinnedEventId, timelineId } = response.body; const responseToTest = await supertest .patch(PINNED_EVENT_URL) @@ -61,7 +59,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { eventId, timelineId, }); - expect(responseToTest.body.data!.persistPinnedEventOnTimeline).to.be(null); + expect(responseToTest.body).to.eql({ unpinned: true }); }); }); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/timeline.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/timeline.ts index 8029fce1c7b90..bd818ddc893a9 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/timeline.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/timeline.ts @@ -6,10 +6,7 @@ */ import expect from '@kbn/expect'; -import { - TimelineResponse, - TimelineTypeEnum, -} from '@kbn/security-solution-plugin/common/api/timeline'; +import { TimelineTypeEnum } from '@kbn/security-solution-plugin/common/api/timeline'; import { TIMELINE_URL } from '@kbn/security-solution-plugin/common/constants'; import TestAgent from 'supertest/lib/agent'; import { FtrProviderContextWithSpaces } from '../../../../ftr_provider_context_with_spaces'; @@ -26,8 +23,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { it('Create a timeline just with a title', async () => { const titleToSaved = 'hello title'; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, title, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, title, version } = response.body; expect(title).to.be(titleToSaved); expect(savedObjectId).to.not.be.empty(); @@ -152,8 +148,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { sort, title, version, - } = - response.body.data && omitTypenameInTimeline(response.body.data.persistTimeline.timeline); + } = response.body; expect(columns.map((col: { id: string }) => col.id)).to.eql( timelineObject.columns.map((col) => col.id) @@ -172,8 +167,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { it('Update a timeline with a new title', async () => { const titleToSaved = 'hello title'; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body; const newTitle = 'new title'; @@ -187,11 +181,9 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { title: newTitle, }, }); - expect(responseToTest.body.data!.persistTimeline.timeline.savedObjectId).to.eql( - savedObjectId - ); - expect(responseToTest.body.data!.persistTimeline.timeline.title).to.be(newTitle); - expect(responseToTest.body.data!.persistTimeline.timeline.version).to.not.be.eql(version); + expect(responseToTest.body.savedObjectId).to.eql(savedObjectId); + expect(responseToTest.body.title).to.be(newTitle); + expect(responseToTest.body.version).to.not.be.eql(version); }); }); @@ -200,8 +192,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { const titleToSaved = 'hello title'; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body; const responseToTest = await supertest .patch('/api/timeline/_favorite') @@ -213,14 +204,12 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: TimelineTypeEnum.default, }); - expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.body.data!.persistFavorite.favorite.length).to.be(1); - expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.default - ); + expect(responseToTest.body.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.favorite.length).to.be(1); + expect(responseToTest.body.version).to.not.be.eql(version); + expect(responseToTest.body.templateTimelineId).to.be.eql(null); + expect(responseToTest.body.templateTimelineVersion).to.be.eql(null); + expect(responseToTest.body.timelineType).to.be.eql(TimelineTypeEnum.default); }); it('to an existing timeline template', async () => { @@ -228,8 +217,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { const templateTimelineIdFromStore = 'f4a90a2d-365c-407b-9fef-c1dcb33a6ab3'; const templateTimelineVersionFromStore = 1; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body; const responseToTest = await supertest .patch('/api/timeline/_favorite') @@ -240,25 +228,20 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { templateTimelineVersion: templateTimelineVersionFromStore, timelineType: TimelineTypeEnum.template, }); - expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.body.data!.persistFavorite.favorite.length).to.be(1); - expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql( - templateTimelineIdFromStore - ); - expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( + expect(responseToTest.body.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.favorite.length).to.be(1); + expect(responseToTest.body.version).to.not.be.eql(version); + expect(responseToTest.body.templateTimelineId).to.be.eql(templateTimelineIdFromStore); + expect(responseToTest.body.templateTimelineVersion).to.be.eql( templateTimelineVersionFromStore ); - expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.template - ); + expect(responseToTest.body.timelineType).to.be.eql(TimelineTypeEnum.template); }); it('to Unfavorite an existing timeline', async () => { const titleToSaved = 'hello title'; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body; await supertest.patch('/api/timeline/_favorite').set('kbn-xsrf', 'true').send({ timelineId: savedObjectId, @@ -277,14 +260,12 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: TimelineTypeEnum.default, }); - expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.body.data!.persistFavorite.favorite).to.be.empty(); - expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.default - ); + expect(responseToTest.body.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.favorite).to.be.empty(); + expect(responseToTest.body.version).to.not.be.eql(version); + expect(responseToTest.body.templateTimelineId).to.be.eql(null); + expect(responseToTest.body.templateTimelineVersion).to.be.eql(null); + expect(responseToTest.body.timelineType).to.be.eql(TimelineTypeEnum.default); }); it('to Unfavorite an existing timeline template', async () => { @@ -292,8 +273,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { const templateTimelineIdFromStore = 'f4a90a2d-365c-407b-9fef-c1dcb33a6ab3'; const templateTimelineVersionFromStore = 1; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId, version } = - response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId, version } = response.body; await supertest.patch('/api/timeline/_favorite').set('kbn-xsrf', 'true').send({ timelineId: savedObjectId, @@ -312,18 +292,14 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: TimelineTypeEnum.template, }); - expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.body.data!.persistFavorite.favorite).to.be.empty(); - expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql( - templateTimelineIdFromStore - ); - expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( + expect(responseToTest.body.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.favorite).to.be.empty(); + expect(responseToTest.body.version).to.not.be.eql(version); + expect(responseToTest.body.templateTimelineId).to.be.eql(templateTimelineIdFromStore); + expect(responseToTest.body.templateTimelineVersion).to.be.eql( templateTimelineVersionFromStore ); - expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.template - ); + expect(responseToTest.body.timelineType).to.be.eql(TimelineTypeEnum.template); }); it('to a timeline without a timelineId', async () => { @@ -337,14 +313,12 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: TimelineTypeEnum.default, }); - expect(response.body.data!.persistFavorite.savedObjectId).to.not.be.empty(); - expect(response.body.data!.persistFavorite.favorite.length).to.be(1); - expect(response.body.data!.persistFavorite.version).to.not.be.empty(); - expect(response.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(response.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(response.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.default - ); + expect(response.body.savedObjectId).to.not.be.empty(); + expect(response.body.favorite.length).to.be(1); + expect(response.body.version).to.not.be.empty(); + expect(response.body.templateTimelineId).to.be.eql(null); + expect(response.body.templateTimelineVersion).to.be.eql(null); + expect(response.body.timelineType).to.be.eql(TimelineTypeEnum.default); }); it('to a timeline template without a timelineId', async () => { @@ -361,18 +335,12 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { timelineType: TimelineTypeEnum.template, }); - expect(response.body.data!.persistFavorite.savedObjectId).to.not.be.empty(); - expect(response.body.data!.persistFavorite.favorite.length).to.be(1); - expect(response.body.data!.persistFavorite.version).to.not.be.empty(); - expect(response.body.data!.persistFavorite.templateTimelineId).to.be.eql( - templateTimelineIdFromStore - ); - expect(response.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( - templateTimelineVersionFromStore - ); - expect(response.body.data!.persistFavorite.timelineType).to.be.eql( - TimelineTypeEnum.template - ); + expect(response.body.savedObjectId).to.not.be.empty(); + expect(response.body.favorite.length).to.be(1); + expect(response.body.version).to.not.be.empty(); + expect(response.body.templateTimelineId).to.be.eql(templateTimelineIdFromStore); + expect(response.body.templateTimelineVersion).to.be.eql(templateTimelineVersionFromStore); + expect(response.body.timelineType).to.be.eql(TimelineTypeEnum.template); }); }); @@ -380,7 +348,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { it('one timeline', async () => { const titleToSaved = 'hello title'; const response = await createBasicTimeline(supertest, titleToSaved); - const { savedObjectId } = response.body.data && response.body.data.persistTimeline.timeline; + const { savedObjectId } = response.body; const responseToTest = await supertest .delete(TIMELINE_URL) @@ -389,22 +357,16 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { savedObjectIds: [savedObjectId], }); - expect(responseToTest.body.data!.deleteTimeline).to.be(true); + expect(responseToTest.statusCode).to.be(200); }); it('multiple timelines', async () => { const titleToSaved = 'hello title'; const response1 = await createBasicTimeline(supertest, titleToSaved); - const savedObjectId1 = - response1.body.data && response1.body.data.persistTimeline.timeline - ? response1.body.data.persistTimeline.timeline.savedObjectId - : ''; + const savedObjectId1 = response1.body ? response1.body.savedObjectId : ''; const response2 = await createBasicTimeline(supertest, titleToSaved); - const savedObjectId2 = - response2.body.data && response2.body.data.persistTimeline.timeline - ? response2.body.data.persistTimeline.timeline.savedObjectId - : ''; + const savedObjectId2 = response2.body ? response2.body.savedObjectId : ''; const responseToTest = await supertest .delete(TIMELINE_URL) @@ -413,14 +375,8 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { savedObjectIds: [savedObjectId1, savedObjectId2], }); - expect(responseToTest.body.data!.deleteTimeline).to.be(true); + expect(responseToTest.status).to.be(200); }); }); }); } - -const omitTypename = (key: string, value: keyof TimelineResponse) => - key === '__typename' ? undefined : value; - -const omitTypenameInTimeline = (timeline: TimelineResponse) => - JSON.parse(JSON.stringify(timeline), omitTypename); diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/timeline_migrations.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/timeline_migrations.ts index 2e8a8fd4aaa94..a3a2bc27932c6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/timeline_migrations.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/timeline/tests/timeline_migrations.ts @@ -68,9 +68,9 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(resolveWithSpaceApi) .query({ id: '1e2e9850-25f8-11ec-a981-b77847c6ef30' }); - expect(resp.body.data.outcome).to.be('aliasMatch'); - expect(resp.body.data.alias_target_id).to.not.be(undefined); - expect(resp.body.data.timeline.title).to.be('An awesome timeline'); + expect(resp.body.outcome).to.be('aliasMatch'); + expect(resp.body.alias_target_id).to.not.be(undefined); + expect(resp.body.timeline.title).to.be('An awesome timeline'); }); describe('notes', () => { @@ -79,7 +79,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(resolveWithSpaceApi) .query({ id: '1e2e9850-25f8-11ec-a981-b77847c6ef30' }); - expect(resp.body.data.timeline.notes[0].eventId).to.be('StU_UXwBAowmaxx6YdiS'); + expect(resp.body.timeline.notes[0].eventId).to.be('StU_UXwBAowmaxx6YdiS'); }); it('should return notes with the timelineId matching the resolved timeline id', async () => { @@ -87,12 +87,8 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(resolveWithSpaceApi) .query({ id: '1e2e9850-25f8-11ec-a981-b77847c6ef30' }); - expect(resp.body.data.timeline.notes[0].timelineId).to.be( - resp.body.data.timeline.savedObjectId - ); - expect(resp.body.data.timeline.notes[1].timelineId).to.be( - resp.body.data.timeline.savedObjectId - ); + expect(resp.body.timeline.notes[0].timelineId).to.be(resp.body.timeline.savedObjectId); + expect(resp.body.timeline.notes[1].timelineId).to.be(resp.body.timeline.savedObjectId); }); }); @@ -102,7 +98,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(resolveWithSpaceApi) .query({ id: '1e2e9850-25f8-11ec-a981-b77847c6ef30' }); - expect(resp.body.data.timeline.pinnedEventsSaveObject[0].eventId).to.be( + expect(resp.body.timeline.pinnedEventsSaveObject[0].eventId).to.be( 'StU_UXwBAowmaxx6YdiS' ); }); @@ -112,8 +108,8 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(resolveWithSpaceApi) .query({ id: '1e2e9850-25f8-11ec-a981-b77847c6ef30' }); - expect(resp.body.data.timeline.pinnedEventsSaveObject[0].timelineId).to.be( - resp.body.data.timeline.savedObjectId + expect(resp.body.timeline.pinnedEventsSaveObject[0].timelineId).to.be( + resp.body.timeline.savedObjectId ); }); }); @@ -161,7 +157,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '6484cc90-126e-11ec-83d2-db1096c73738' }); - expect(resp.body.data.getOneTimeline.notes[0].eventId).to.be('Edo00XsBEVtyvU-8LGNe'); + expect(resp.body.notes[0].eventId).to.be('Edo00XsBEVtyvU-8LGNe'); }); it('returns the timelineId in the response', async () => { @@ -169,12 +165,8 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '6484cc90-126e-11ec-83d2-db1096c73738' }); - expect(resp.body.data.getOneTimeline.notes[0].timelineId).to.be( - '6484cc90-126e-11ec-83d2-db1096c73738' - ); - expect(resp.body.data.getOneTimeline.notes[1].timelineId).to.be( - '6484cc90-126e-11ec-83d2-db1096c73738' - ); + expect(resp.body.notes[0].timelineId).to.be('6484cc90-126e-11ec-83d2-db1096c73738'); + expect(resp.body.notes[1].timelineId).to.be('6484cc90-126e-11ec-83d2-db1096c73738'); }); }); @@ -198,7 +190,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '8dc70950-1012-11ec-9ad3-2d7c6600c0f7' }); - expect(resp.body.data.getOneTimeline.title).to.be('Awesome Timeline'); + expect(resp.body.title).to.be('Awesome Timeline'); }); it('returns the savedQueryId in the response', async () => { @@ -206,7 +198,7 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '8dc70950-1012-11ec-9ad3-2d7c6600c0f7' }); - expect(resp.body.data.getOneTimeline.savedQueryId).to.be("It's me"); + expect(resp.body.savedQueryId).to.be("It's me"); }); }); describe('pinned events timelineId', () => { @@ -238,12 +230,8 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '6484cc90-126e-11ec-83d2-db1096c73738' }); - expect(resp.body.data.getOneTimeline.pinnedEventsSaveObject[0].eventId).to.be( - 'DNo00XsBEVtyvU-8LGNe' - ); - expect(resp.body.data.getOneTimeline.pinnedEventsSaveObject[1].eventId).to.be( - 'Edo00XsBEVtyvU-8LGNe' - ); + expect(resp.body.pinnedEventsSaveObject[0].eventId).to.be('DNo00XsBEVtyvU-8LGNe'); + expect(resp.body.pinnedEventsSaveObject[1].eventId).to.be('Edo00XsBEVtyvU-8LGNe'); }); it('returns the timelineId in the response', async () => { @@ -251,10 +239,10 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { .get(TIMELINE_URL) .query({ id: '6484cc90-126e-11ec-83d2-db1096c73738' }); - expect(resp.body.data.getOneTimeline.pinnedEventsSaveObject[0].timelineId).to.be( + expect(resp.body.pinnedEventsSaveObject[0].timelineId).to.be( '6484cc90-126e-11ec-83d2-db1096c73738' ); - expect(resp.body.data.getOneTimeline.pinnedEventsSaveObject[1].timelineId).to.be( + expect(resp.body.pinnedEventsSaveObject[1].timelineId).to.be( '6484cc90-126e-11ec-83d2-db1096c73738' ); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows.cy.ts index 438743dd01a70..f7f343c11b674 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/common_flows.cy.ts @@ -59,7 +59,7 @@ describe('Common rule creation flows', { tags: ['@ess', '@serverless'] }, () => deleteAlertsAndRules(); createTimeline() .then((response) => { - return response.body.data.persistTimeline.timeline.savedObjectId; + return response.body.savedObjectId; }) .as('timelineId'); visit(CREATE_RULE_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/common_flows.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/common_flows.cy.ts index 6aded7a9a1f85..4ab4444ad968d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/common_flows.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/common_flows.cy.ts @@ -72,8 +72,8 @@ describe( tags: ruleFields.ruleTags, false_positives: ruleFields.falsePositives, note: ruleFields.investigationGuide, - timeline_id: response.body.data.persistTimeline.timeline.savedObjectId, - timeline_title: response.body.data.persistTimeline.timeline.title ?? '', + timeline_id: response.body.savedObjectId, + timeline_title: response.body.title ?? '', interval: ruleFields.ruleInterval, from: `now-1h`, query: ruleFields.ruleQuery, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/non_default_space.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/non_default_space.cy.ts index 6b7cb3309e921..bef28e2112a4b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/non_default_space.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_details/non_default_space.cy.ts @@ -37,8 +37,8 @@ describe('Non-default space rule detail page', { tags: ['@ess'] }, function () { tags: ruleFields.ruleTags, false_positives: ruleFields.falsePositives, note: ruleFields.investigationGuide, - timeline_id: response.body.data.persistTimeline.timeline.savedObjectId, - timeline_title: response.body.data.persistTimeline.timeline.title ?? '', + timeline_id: response.body.savedObjectId, + timeline_title: response.body.title ?? '', interval: ruleFields.ruleInterval, from: `now-1h`, query: ruleFields.ruleQuery, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts index 68d14715d4641..56eab1675ac81 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts @@ -28,7 +28,7 @@ describe('attach timeline to case', { tags: ['@ess', '@serverless'] }, () => { deleteTimelines(); deleteCases(); createTimeline().then((response) => { - cy.wrap(response.body.data.persistTimeline.timeline).as('myTimeline'); + cy.wrap(response.body).as('myTimeline'); }); }); @@ -63,9 +63,7 @@ describe('attach timeline to case', { tags: ['@ess', '@serverless'] }, () => { login(); deleteTimelines(); deleteCases(); - createTimeline().then((response) => - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId') - ); + createTimeline().then((response) => cy.wrap(response.body.savedObjectId).as('timelineId')); createCase(getCase1()).then((response) => cy.wrap(response.body.id).as('caseId')); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts index 05d2cddc8eaca..12cb30a5775aa 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/creation.cy.ts @@ -67,7 +67,7 @@ describe('Cases', { tags: ['@ess', '@serverless'] }, () => { ...getCase1(), timeline: { ...getCase1().timeline, - id: response.body.data.persistTimeline.timeline.savedObjectId, + id: response.body.savedObjectId, }, }) .as('mycase') diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts index a9025ba319acd..5f2b61b3de410 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts @@ -44,8 +44,6 @@ describe('Inspect Explore pages', { tags: ['@ess', '@serverless'] }, () => { * Group all tests of a page into one "it" call to improve speed */ it(`inspect ${pageName} page`, () => { - login(); - visitWithTimeRange(url, { visitOptions: { onLoad: () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts index 78135fbd77235..0248f403b6107 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/overview/overview.cy.ts @@ -52,7 +52,7 @@ describe('Overview Page', { tags: ['@ess', '@serverless'] }, () => { describe('Favorite Timelines', { tags: ['@skipInServerless'] }, () => { it('should appear on overview page', () => { createTimeline() - .then((response) => response.body.data.persistTimeline.timeline.savedObjectId) + .then((response) => response.body.savedObjectId) .then((timelineId: string) => { favoriteTimeline({ timelineId, timelineType: 'default' }).then(() => { visitWithTimeRange(OVERVIEW_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts index 7531cf30a7752..b5189b846225f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts @@ -304,7 +304,7 @@ describe('url state', { tags: ['@ess', '@skipInServerless'] }, () => { cy.wait('@timeline').then(({ response }) => { closeTimeline(); cy.wrap(response?.statusCode).should('eql', 200); - const timelineId = response?.body.data.persistTimeline.timeline.savedObjectId; + const timelineId = response?.body.savedObjectId; visitWithTimeRange('/app/home'); visitWithTimeRange(`/app/security/timelines?timeline=(id:'${timelineId}',isOpen:!t)`); cy.get(DATE_PICKER_APPLY_BUTTON_TIMELINE).should('exist'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts index 107a170e9cc2d..f1fcf7f76cba7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_cell_actions.cy.ts @@ -47,57 +47,67 @@ describe('Alerts cell actions', { tags: ['@ess', '@serverless'] }, () => { waitForAlertsToPopulate(); }); - it('should filter in and out existing values', () => { - scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_SEVERITY_HEADER, () => { - cy.get(ALERT_TABLE_SEVERITY_VALUES) - .first() - .invoke('text') - .then((severityVal) => { - filterForAlertProperty(ALERT_TABLE_SEVERITY_VALUES, 0); - cy.get(FILTER_BADGE).first().should('have.text', `kibana.alert.severity: ${severityVal}`); - }); - removeKqlFilter(); - }); + // Flaky in Serverless MKI only + // https://github.com/elastic/kibana/issues/201117 + it( + 'should filter in and out existing values', + { + tags: ['@skipInServerlessMKI'], + }, + () => { + scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_SEVERITY_HEADER, () => { + cy.get(ALERT_TABLE_SEVERITY_VALUES) + .first() + .invoke('text') + .then((severityVal) => { + filterForAlertProperty(ALERT_TABLE_SEVERITY_VALUES, 0); + cy.get(FILTER_BADGE) + .first() + .should('have.text', `kibana.alert.severity: ${severityVal}`); + }); + removeKqlFilter(); + }); - cy.log('should work for empty properties'); - // add query condition to make sure the field is empty - fillKqlQueryBar('not file.name: *{enter}'); + cy.log('should work for empty properties'); + // add query condition to make sure the field is empty + fillKqlQueryBar('not file.name: *{enter}'); - scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_FILE_NAME_HEADER, () => { - cy.log('filter for alert property'); + scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_FILE_NAME_HEADER, () => { + cy.log('filter for alert property'); - filterForAlertProperty(ALERT_TABLE_FILE_NAME_VALUES, 0); + filterForAlertProperty(ALERT_TABLE_FILE_NAME_VALUES, 0); - cy.get(FILTER_BADGE).first().should('have.text', 'NOT file.name: exists'); - removeKqlFilter(); - }); + cy.get(FILTER_BADGE).first().should('have.text', 'NOT file.name: exists'); + removeKqlFilter(); + }); - cy.log('filter out alert property'); + cy.log('filter out alert property'); - scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_FILE_NAME_HEADER, () => { - cy.get(ALERT_TABLE_FILE_NAME_VALUES) - .first() - .then(() => { - filterOutAlertProperty(ALERT_TABLE_FILE_NAME_VALUES, 0); - cy.get(FILTER_BADGE).first().should('have.text', 'file.name: exists'); - }); - removeKqlFilter(); - }); - - cy.log('should filter out a non-empty property'); + scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_FILE_NAME_HEADER, () => { + cy.get(ALERT_TABLE_FILE_NAME_VALUES) + .first() + .then(() => { + filterOutAlertProperty(ALERT_TABLE_FILE_NAME_VALUES, 0); + cy.get(FILTER_BADGE).first().should('have.text', 'file.name: exists'); + }); + removeKqlFilter(); + }); - scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_SEVERITY_HEADER, () => { - cy.get(ALERT_TABLE_SEVERITY_VALUES) - .first() - .invoke('text') - .then((severityVal) => { - filterOutAlertProperty(ALERT_TABLE_SEVERITY_VALUES, 0); - cy.get(FILTER_BADGE) - .first() - .should('have.text', `NOT kibana.alert.severity: ${severityVal}`); - }); - }); - }); + cy.log('should filter out a non-empty property'); + + scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_SEVERITY_HEADER, () => { + cy.get(ALERT_TABLE_SEVERITY_VALUES) + .first() + .invoke('text') + .then((severityVal) => { + filterOutAlertProperty(ALERT_TABLE_SEVERITY_VALUES, 0); + cy.get(FILTER_BADGE) + .first() + .should('have.text', `NOT kibana.alert.severity: ${severityVal}`); + }); + }); + } + ); it('should allow copy paste', () => { scrollAlertTableColumnIntoViewAndTest(ALERT_TABLE_SEVERITY_HEADER, () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts index c7078783466e9..6fb8492cf57c8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts @@ -52,7 +52,7 @@ describe('Ransomware Prevention Alerts', { tags: ['@ess', '@serverless'] }, () = deleteTimelines(); login(); createTimeline({ ...getTimeline(), query: 'event.code: "ransomware"' }).then((response) => { - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId'); + cy.wrap(response.body.savedObjectId).as('timelineId'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts index 9d2e1ac2e11a5..9d5b77919d548 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts @@ -100,11 +100,9 @@ describe('Timeline scope', { tags: ['@ess', '@serverless', '@skipInServerless'] beforeEach(() => { login(); deleteTimelines(); - createTimeline().then((response) => - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId') - ); + createTimeline().then((response) => cy.wrap(response.body.savedObjectId).as('timelineId')); createTimeline(getTimelineModifiedSourcerer()).then((response) => - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('auditbeatTimelineId') + cy.wrap(response.body.savedObjectId).as('auditbeatTimelineId') ); visitWithTimeRange(TIMELINES_URL); refreshUntilAlertsIndexExists(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts index 4e2da9bc9170b..5c4ad0f8d4712 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts @@ -83,7 +83,7 @@ describe.skip('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { closeTimeline(); cy.wait('@timeline').then(({ response }) => { - const { createdBy, savedObjectId } = response?.body.data.persistTimeline.timeline; + const { createdBy, savedObjectId } = response?.body; cy.log('Verify template shows on the table in the templates tab'); @@ -122,7 +122,7 @@ describe.skip('Timeline Templates', { tags: ['@ess', '@serverless'] }, () => { addNameToTimelineAndSave(savedName); cy.wait('@timeline').then(({ response }) => { - const { createdBy, savedObjectId } = response?.body.data.persistTimeline.timeline; + const { createdBy, savedObjectId } = response?.body; cy.log('Check that the template has been created correctly'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts index 3c407a7506762..8c77cd61ebc29 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/export.cy.ts @@ -20,8 +20,8 @@ describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { deleteTimelines(); createTimelineTemplate().then((response) => { cy.wrap(response).as('templateResponse'); - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('templateId'); - cy.wrap(response.body.data.persistTimeline.timeline.title).as('templateTitle'); + cy.wrap(response.body.savedObjectId).as('templateId'); + cy.wrap(response.body.title).as('templateTitle'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts index 64ed8564626df..64ef95cd21b96 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts @@ -26,7 +26,7 @@ describe('Correlation tab', { tags: ['@ess', '@serverless'] }, () => { cy.intercept('PATCH', '/api/timeline').as('updateTimeline'); createTimeline().then((response) => { visit(TIMELINES_URL); - openTimeline(response.body.data.persistTimeline.timeline.savedObjectId); + openTimeline(response.body.savedObjectId); addEqlToTimeline(eql); saveTimeline(); cy.wait('@updateTimeline'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts index 75d0ddd63dc2a..b4d0f1b0e0235 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts @@ -53,8 +53,7 @@ const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; const TIMELINE_REQ_WITH_SAVED_SEARCH = 'TIMELINE_REQ_WITH_SAVED_SEARCH'; const TIMELINE_PATCH_REQ = 'TIMELINE_PATCH_REQ'; -const TIMELINE_RESPONSE_SAVED_OBJECT_ID_PATH = - 'response.body.data.persistTimeline.timeline.savedObjectId'; +const TIMELINE_RESPONSE_SAVED_OBJECT_ID_PATH = 'response.body.savedObjectId'; const esqlQuery = 'from auditbeat-* | where ecs.version == "8.0.0"'; const handleIntercepts = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts index 0800c2b610a27..ba0ec381ddeb8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts @@ -34,11 +34,11 @@ describe.skip('Export timelines', { tags: ['@ess', '@serverless'] }, () => { }).as('export'); createTimeline().then((response) => { cy.wrap(response).as('timelineResponse1'); - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId1'); + cy.wrap(response.body.savedObjectId).as('timelineId1'); }); createTimeline().then((response) => { cy.wrap(response).as('timelineResponse2'); - cy.wrap(response.body.data.persistTimeline.timeline.savedObjectId).as('timelineId2'); + cy.wrap(response.body.savedObjectId).as('timelineId2'); }); visit(TIMELINES_URL); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/notes_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/notes_tab.cy.ts index 7eead20dcb8c1..de32f28223214 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/notes_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/notes_tab.cy.ts @@ -33,7 +33,7 @@ describe('Timeline notes tab', { tags: ['@ess', '@serverless'] }, () => { deleteTimelines(); createTimeline(getTimelineNonValidQuery()) - .then((response) => response.body.data.persistTimeline.timeline.savedObjectId) + .then((response) => response.body.savedObjectId) .then((timelineId: string) => { login(); visitTimeline(timelineId); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/open_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/open_timeline.cy.ts index 73b6fff4fa8ec..feee9a36168b2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/open_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/open_timeline.cy.ts @@ -35,7 +35,7 @@ describe('Open timeline modal', { tags: ['@serverless', '@ess'] }, () => { login(); visit(TIMELINES_URL); createTimeline() - .then((response) => response.body.data.persistTimeline.timeline.savedObjectId) + .then((response) => response.body.savedObjectId) .then((timelineId: string) => { refreshTimelinesUntilTimeLinePresent(timelineId) // This cy.wait is here because we cannot do a pipe on a timeline as that will introduce multiple URL diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts index ebc3591adfe15..9ae02b1223f00 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts @@ -77,9 +77,7 @@ describe('Row renderers', { tags: ['@ess', '@serverless'] }, () => { addNameToTimelineAndSave('Test'); cy.wait('@excludedNetflow').then((interception) => { - expect( - interception?.response?.body.data.persistTimeline.timeline.excludedRowRendererIds - ).to.contain('netflow'); + expect(interception?.response?.body.excludedRowRendererIds).to.contain('netflow'); }); // open modal, filter and check @@ -93,9 +91,7 @@ describe('Row renderers', { tags: ['@ess', '@serverless'] }, () => { saveTimeline(); cy.wait('@includedNetflow').then((interception) => { - expect( - interception?.response?.body.data.persistTimeline.timeline.excludedRowRendererIds - ).not.to.contain('netflow'); + expect(interception?.response?.body.excludedRowRendererIds).not.to.contain('netflow'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts index 617bfce6b5caa..25a21ecde3b9c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/search_or_filter.cy.ts @@ -66,7 +66,7 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => addNameToTimelineAndSave('Test'); cy.wait('@update').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); - cy.wrap(response?.body.data.persistTimeline.timeline.kqlMode).should('eql', 'filter'); + cy.wrap(response?.body.kqlMode).should('eql', 'filter'); cy.get(ADD_FILTER).should('exist'); }); }); @@ -76,7 +76,7 @@ describe('Timeline search and filters', { tags: ['@ess', '@serverless'] }, () => addNameToTimelineAndSave('Test'); cy.wait('@update').then(({ response }) => { cy.wrap(response?.statusCode).should('eql', 200); - cy.wrap(response?.body.data.persistTimeline.timeline.kqlMode).should('eql', 'search'); + cy.wrap(response?.body.kqlMode).should('eql', 'search'); cy.get(ADD_FILTER).should('not.exist'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts index fe0e60afa785c..24c4c5ded0e88 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts @@ -40,7 +40,7 @@ describe.skip('timeline overview search', { tags: ['@ess', '@serverless'] }, () // create timeline and favorite it // we're doing it through the UI because doing it through the API currently has a problem on MKI environment createTimeline(mockFavoritedTimeline) - .then((response) => response.body.data.persistTimeline.timeline.savedObjectId) + .then((response) => response.body.savedObjectId) .then((timelineId) => { refreshTimelinesUntilTimeLinePresent(timelineId); openTimelineById(timelineId); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts index df80bb4c50363..3fa1d2dc5902f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/url_state.cy.ts @@ -24,8 +24,8 @@ describe('Open timeline', { tags: ['@serverless', '@ess'] }, () => { deleteTimelines(); visit(TIMELINES_URL); createTimeline().then((response) => { - timelineSavedObjectId = response.body.data.persistTimeline.timeline.savedObjectId; - return response.body.data.persistTimeline.timeline.savedObjectId; + timelineSavedObjectId = response.body.savedObjectId; + return response.body.savedObjectId; }); createRule(getNewRule()); visitWithTimeRange(ALERTS_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts b/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts index 1aea82de6612d..aab0cbd06b54b 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/timeline.ts @@ -72,7 +72,7 @@ export const expectedExportedTimelineTemplate = ( templateResponse: Cypress.Response, username: string ) => { - const timelineTemplateBody = templateResponse.body.data.persistTimeline.timeline; + const timelineTemplateBody = templateResponse.body; return { savedObjectId: timelineTemplateBody.savedObjectId, @@ -118,7 +118,7 @@ export const expectedExportedTimeline = ( timelineResponse: Cypress.Response, username: string ) => { - const timelineBody = timelineResponse.body.data.persistTimeline.timeline; + const timelineBody = timelineResponse.body; return { savedObjectId: timelineBody.savedObjectId, diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts index 055d98a2efcfd..b33ed2e14235b 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts @@ -6,7 +6,6 @@ */ import type { - DeleteTimelinesResponse, GetTimelinesResponse, PatchTimelineResponse, } from '@kbn/security-solution-plugin/common/api/timeline'; @@ -168,7 +167,7 @@ export const getAllTimelines = () => export const deleteTimelines = () => { getAllTimelines().then(($timelines) => { const savedObjectIds = $timelines.body.timeline.map((timeline) => timeline.savedObjectId); - rootRequest({ + rootRequest({ method: 'DELETE', url: 'api/timeline', body: { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts index 580b96bfd2340..e40563c78c8af 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_solution_integrations.ts @@ -86,21 +86,15 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); await pageObjects.timeline.navigateToTimelineList(); - await pageObjects.timeline.openTimelineById( - timeline.data.persistTimeline.timeline.savedObjectId - ); + await pageObjects.timeline.openTimelineById(timeline.savedObjectId); await pageObjects.timeline.setDateRange('Last 1 year'); await pageObjects.timeline.waitForEvents(60_000 * 2); }); after(async () => { if (timeline) { - log.info( - `Cleaning up created timeline [${timeline.data.persistTimeline.timeline.title} - ${timeline.data.persistTimeline.timeline.savedObjectId}]` - ); - await timelineTestService.deleteTimeline( - timeline.data.persistTimeline.timeline.savedObjectId - ); + log.info(`Cleaning up created timeline [${timeline.title} - ${timeline.savedObjectId}]`); + await timelineTestService.deleteTimeline(timeline.savedObjectId); } }); diff --git a/x-pack/test/security_solution_ftr/services/timeline/index.ts b/x-pack/test/security_solution_ftr/services/timeline/index.ts index 8195f63ffc246..4288e073519c4 100644 --- a/x-pack/test/security_solution_ftr/services/timeline/index.ts +++ b/x-pack/test/security_solution_ftr/services/timeline/index.ts @@ -9,7 +9,6 @@ import { Response } from 'superagent'; import { EndpointError } from '@kbn/security-solution-plugin/common/endpoint/errors'; import { TIMELINE_DRAFT_URL, TIMELINE_URL } from '@kbn/security-solution-plugin/common/constants'; import { - DeleteTimelinesResponse, GetDraftTimelinesResponse, PatchTimelineResponse, SavedTimeline, @@ -58,15 +57,13 @@ export class TimelineTestService extends FtrService { */ async createTimeline(title: string): Promise { // Create a new timeline draft - const createdTimeline = ( - await this.supertest - .post(TIMELINE_DRAFT_URL) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') - .send({ timelineType: 'default' }) - .then(this.getHttpResponseFailureHandler()) - .then((response) => response.body as GetDraftTimelinesResponse) - ).data.persistTimeline.timeline; + const createdTimeline = await this.supertest + .post(TIMELINE_DRAFT_URL) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31') + .send({ timelineType: 'default' }) + .then(this.getHttpResponseFailureHandler()) + .then((response) => response.body as GetDraftTimelinesResponse); this.log.info('Draft timeline:'); this.log.indent(4, () => { @@ -137,7 +134,7 @@ export class TimelineTestService extends FtrService { savedObjectIds: Array.isArray(id) ? id : [id], }) .then(this.getHttpResponseFailureHandler()) - .then((response) => response.body as DeleteTimelinesResponse); + .then((response) => response.body); } /** @@ -183,7 +180,7 @@ export class TimelineTestService extends FtrService { const { expression, esQuery } = this.getEndpointAlertsKqlQuery(endpointAgentId); const updatedTimeline = await this.updateTimeline( - newTimeline.data.persistTimeline.timeline.savedObjectId, + newTimeline.savedObjectId, { title, kqlQuery: { @@ -197,7 +194,7 @@ export class TimelineTestService extends FtrService { }, savedSearchId: null, }, - newTimeline.data.persistTimeline.timeline.version + newTimeline.version ); return updatedTimeline; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts index 7ee5513e1352d..7bd4b7f3e7a22 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/mock_data.ts @@ -6,42 +6,40 @@ */ export const mockAutoOpsResponse = { - metrics: { - ingest_rate: [ - { - name: 'metrics-system.cpu-default', - error: null, - data: [ - [1726858530000, 13756849], - [1726862130000, 14657904], - ], - }, - { - name: 'logs-nginx.access-default', - error: null, - data: [ - [1726858530000, 12894623], - [1726862130000, 14436905], - ], - }, - ], - storage_retained: [ - { - name: 'metrics-system.cpu-default', - error: null, - data: [ - [1726858530000, 12576413], - [1726862130000, 13956423], - ], - }, - { - name: 'logs-nginx.access-default', - error: null, - data: [ - [1726858530000, 12894623], - [1726862130000, 14436905], - ], - }, - ], - }, + ingest_rate: [ + { + name: 'metrics-system.cpu-default', + error: null, + data: [ + [1726858530000, 13756849], + [1726862130000, 14657904], + ], + }, + { + name: 'logs-nginx.access-default', + error: null, + data: [ + [1726858530000, 12894623], + [1726862130000, 14436905], + ], + }, + ], + storage_retained: [ + { + name: 'metrics-system.cpu-default', + error: null, + data: [ + [1726858530000, 12576413], + [1726862130000, 13956423], + ], + }, + { + name: 'logs-nginx.access-default', + error: null, + data: [ + [1726858530000, 12894623], + [1726862130000, 14436905], + ], + }, + ], }; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/data_streams.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/data_streams.ts index d805b8ccff6fe..b6559c3efc9b6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/data_streams.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/data_streams.ts @@ -6,9 +6,9 @@ */ import expect from '@kbn/expect'; -import { SupertestWithRoleScope } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services/role_scoped_supertest'; import { DataStreamsResponseBodySchemaBody } from '@kbn/data-usage-plugin/common/rest_types'; import { DATA_USAGE_DATA_STREAMS_API_ROUTE } from '@kbn/data-usage-plugin/common'; +import { SupertestWithRoleScope } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services/role_scoped_supertest'; import { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -43,14 +43,5 @@ export default function ({ getService }: FtrProviderContext) { expect(foundStream?.storageSizeBytes).to.be(0); expect(res.statusCode).to.be(200); }); - it('returns system indices', async () => { - const res = await supertestAdminWithCookieCredentials - .get(DATA_USAGE_DATA_STREAMS_API_ROUTE) - .set('elastic-api-version', '1'); - const dataStreams: DataStreamsResponseBodySchemaBody = res.body; - const systemDataStreams = dataStreams.filter((stream) => stream.name.startsWith('.')); - expect(systemDataStreams.length).to.be.greaterThan(0); - expect(res.statusCode).to.be(200); - }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts index 8985757ab1cab..5460b750a5b21 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/data_usage/tests/metrics.ts @@ -16,6 +16,12 @@ import { FtrProviderContext } from '../../../../ftr_provider_context'; import { setupMockServer } from '../mock_api'; import { mockAutoOpsResponse } from '../mock_data'; +const now = new Date(); +const to = now.toISOString(); // Current time in ISO format + +const nowMinus24Hours = new Date(now.getTime() - 24 * 60 * 60 * 1000); +const from = nowMinus24Hours.toISOString(); + export default function ({ getService }: FtrProviderContext) { const svlDatastreamsHelpers = getService('svlDatastreamsHelpers'); const roleScopedSupertest = getService('roleScopedSupertest'); @@ -46,8 +52,8 @@ export default function ({ getService }: FtrProviderContext) { after(async () => await svlDatastreamsHelpers.deleteDataStream(testDataStreamName)); it('returns 400 with non-existent data streams', async () => { const requestBody: UsageMetricsRequestBody = { - from: 'now-24h/h', - to: 'now', + from, + to, metricTypes: ['ingest_rate', 'storage_retained'], dataStreams: ['invalid-data-stream'], }; @@ -61,8 +67,8 @@ export default function ({ getService }: FtrProviderContext) { it('returns 400 when requesting no data streams', async () => { const requestBody = { - from: 'now-24h/h', - to: 'now', + from, + to, metricTypes: ['ingest_rate'], dataStreams: [], }; @@ -76,8 +82,8 @@ export default function ({ getService }: FtrProviderContext) { it('returns 400 when requesting an invalid metric type', async () => { const requestBody = { - from: 'now-24h/h', - to: 'now', + from, + to, metricTypes: [testDataStreamName], dataStreams: ['datastream'], }; @@ -93,8 +99,8 @@ export default function ({ getService }: FtrProviderContext) { it('returns 200 with valid request', async () => { const requestBody: UsageMetricsRequestBody = { - from: 'now-24h/h', - to: 'now', + from, + to, metricTypes: ['ingest_rate', 'storage_retained'], dataStreams: [testDataStreamName], }; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts index 385040bd9754f..cd6ebf4923ab6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/complete/complete.spec.ts @@ -63,8 +63,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, ]; - // FLAKY: https://github.com/elastic/kibana/issues/197175 - describe.skip('/internal/observability_ai_assistant/chat/complete', function () { + describe('/internal/observability_ai_assistant/chat/complete', function () { // TODO: https://github.com/elastic/kibana/issues/192751 this.tags(['skipMKI']); let proxy: LlmProxy; @@ -186,7 +185,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { const parsedEvents = decodeEvents(receivedChunks.join('')); - expect(parsedEvents.map((event) => event.type)).to.eql([ + expect( + parsedEvents + .map((event) => event.type) + .filter((eventType) => eventType !== StreamingChatResponseEventType.BufferFlush) + ).to.eql([ StreamingChatResponseEventType.MessageAdd, StreamingChatResponseEventType.MessageAdd, StreamingChatResponseEventType.ChatCompletionChunk, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/traces/critical_path.ts b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/traces/critical_path.ts deleted file mode 100644 index 50aab783b4cf5..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/traces/critical_path.ts +++ /dev/null @@ -1,99 +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 expect from 'expect'; -import { apm, ApmFields, SynthtraceGenerator, timerange } from '@kbn/apm-synthtrace-client'; -import { compact, uniq } from 'lodash'; -import { Readable } from 'stream'; -import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; -import type { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; -import { APMFtrContextProvider } from '../common/services'; - -export default function ({ getService }: APMFtrContextProvider) { - const apmApiClient = getService('apmApiClient'); - const svlUserManager = getService('svlUserManager'); - const svlCommonApi = getService('svlCommonApi'); - const synthtrace = getService('synthtrace'); - - const start = new Date('2022-01-01T00:00:00.000Z').getTime(); - const end = new Date('2022-01-01T00:15:00.000Z').getTime() - 1; - - async function fetchAndBuildCriticalPathTree( - synthtraceEsClient: ApmSynthtraceEsClient, - options: { - fn: () => SynthtraceGenerator; - roleAuthc: RoleCredentials; - internalReqHeader: InternalRequestHeader; - } & ({ serviceName: string; transactionName: string } | {}) - ) { - const { fn, roleAuthc, internalReqHeader } = options; - - const generator = fn(); - - const unserialized = Array.from(generator); - const serialized = unserialized.flatMap((event) => event.serialize()); - const traceIds = compact(uniq(serialized.map((event) => event['trace.id']))); - - await synthtraceEsClient.index(Readable.from(unserialized)); - - return apmApiClient.slsUser({ - endpoint: 'POST /internal/apm/traces/aggregated_critical_path', - params: { - body: { - start: new Date(start).toISOString(), - end: new Date(end).toISOString(), - traceIds, - serviceName: 'serviceName' in options ? options.serviceName : null, - transactionName: 'transactionName' in options ? options.transactionName : null, - }, - }, - roleAuthc, - internalReqHeader, - }); - } - - describe('APM Aggregated critical path', () => { - let roleAuthc: RoleCredentials; - let internalReqHeader: InternalRequestHeader; - let synthtraceEsClient: ApmSynthtraceEsClient; - - before(async () => { - synthtraceEsClient = await synthtrace.createSynthtraceEsClient(); - internalReqHeader = svlCommonApi.getInternalRequestHeader(); - roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); - }); - - after(async () => { - await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); - return synthtraceEsClient.clean(); - }); - - it('returns service map elements', async () => { - const java = apm - .service({ name: 'java', environment: 'production', agentName: 'java' }) - .instance('java'); - - const duration = 1000; - const rate = 10; - - const response = await fetchAndBuildCriticalPathTree(synthtraceEsClient, { - fn: () => - timerange(start, end) - .interval('15m') - .rate(rate) - .generator((timestamp) => { - return java.transaction('GET /api').timestamp(timestamp).duration(duration); - }), - roleAuthc, - internalReqHeader, - }); - - expect(response.status).toBe(200); - expect(response.body.criticalPath).not.toBeUndefined(); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts index 89543982f2d44..d3d8d4805695a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts @@ -12,7 +12,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { this.tags(['esGate']); loadTestFile(require.resolve('./apm_api_integration/feature_flags.ts')); - loadTestFile(require.resolve('./apm_api_integration/traces/critical_path')); loadTestFile(require.resolve('./cases')); loadTestFile(require.resolve('./synthetics')); loadTestFile(require.resolve('./dataset_quality_api_integration')); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts index 1e3ca0eecfafe..e49a9ed45871e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts @@ -10108,6 +10108,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:uptime-synthetics-api-key/find", "saved_object:uptime-synthetics-api-key/open_point_in_time", "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:synthetics-private-location/bulk_get", + "saved_object:synthetics-private-location/get", + "saved_object:synthetics-private-location/find", + "saved_object:synthetics-private-location/open_point_in_time", + "saved_object:synthetics-private-location/close_point_in_time", "saved_object:synthetics-privates-locations/bulk_get", "saved_object:synthetics-privates-locations/get", "saved_object:synthetics-privates-locations/find", @@ -10399,6 +10404,11 @@ export default function ({ getService }: FtrProviderContext) { "saved_object:uptime-synthetics-api-key/find", "saved_object:uptime-synthetics-api-key/open_point_in_time", "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:synthetics-private-location/bulk_get", + "saved_object:synthetics-private-location/get", + "saved_object:synthetics-private-location/find", + "saved_object:synthetics-private-location/open_point_in_time", + "saved_object:synthetics-private-location/close_point_in_time", "saved_object:synthetics-privates-locations/bulk_get", "saved_object:synthetics-privates-locations/get", "saved_object:synthetics-privates-locations/find", diff --git a/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts b/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts index fa6e4199bdc09..0b59557229cd4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts +++ b/x-pack/test_serverless/functional/test_suites/common/data_usage/main.ts @@ -24,8 +24,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.svlManagementPage.clickDataUsageManagementCard(); }); - after(async () => {}); - it('renders data usage page', async () => { await retry.waitFor('page to be visible', async () => { return await testSubjects.exists('DataUsagePage'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts index 157100ccb903e..0d39a9139e688 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_additional_cell_actions.ts @@ -15,6 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'discover', 'header', 'unifiedFieldList', + 'context', 'svlCommonPage', ]); const dataViews = getService('dataViews'); @@ -37,7 +38,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); let alert = await browser.getAlert(); try { @@ -45,7 +46,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -65,7 +66,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 2); + await dataGrid.clickCellExpandButton(0, { columnName: 'message' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( true ); @@ -84,7 +85,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( false ); @@ -94,8 +95,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/193367 - describe.skip('data view mode', () => { + describe('data view mode', () => { it('should render additional cell actions for logs data source', async () => { await PageObjects.common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, @@ -103,7 +103,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-logs'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); let alert = await browser.getAlert(); try { @@ -111,7 +111,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -127,7 +127,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await browser.refresh(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('example-data-source-action'); alert = await browser.getAlert(); try { @@ -135,7 +136,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } finally { await alert?.dismiss(); } - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); await dataGrid.clickCellExpandPopoverAction('another-example-data-source-action'); alert = await browser.getAlert(); try { @@ -152,7 +153,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-logs'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 2); + await dataGrid.clickCellExpandButton(0, { columnName: 'message' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( true ); @@ -168,7 +169,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataViews.switchTo('my-example-metrics'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickCellExpandButtonExcludingControlColumns(0, 0); + await dataGrid.clickCellExpandButton(0, { columnName: '@timestamp' }); expect(await dataGrid.cellExpandPopoverActionExists('example-data-source-action')).to.be( false ); 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 03dc8cea4a100..dd975d5425de4 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 @@ -38,9 +38,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }; describe('discover esql view', function () { - // see details: https://github.com/elastic/kibana/issues/188816 - this.tags(['failsOnMKI']); - before(async () => { await kibanaServer.savedObjects.cleanStandardList(); log.debug('load kibana index with default index pattern'); diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts index 0d8f091123627..a88d1977a0abb 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts @@ -15,6 +15,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const esDeleteAllIndices = getService('esDeleteAllIndices'); const testIndexName = `index-ftr-test-${Math.random()}`; const es = getService('es'); + const retry = getService('retry'); describe('Indices', function () { this.tags(['skipSvlSearch']); @@ -73,7 +74,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('can delete index', async () => { await pageObjects.indexManagement.confirmDeleteModalIsVisible(); - await pageObjects.indexManagement.expectIndexIsDeleted(testIndexName); + await retry.try(async () => { + await pageObjects.indexManagement.expectIndexIsDeleted(testIndexName); + }); }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/search/connectors/connectors_overview.ts b/x-pack/test_serverless/functional/test_suites/search/connectors/connectors_overview.ts index 5ada9a50d45c3..95b35381a3d1e 100644 --- a/x-pack/test_serverless/functional/test_suites/search/connectors/connectors_overview.ts +++ b/x-pack/test_serverless/functional/test_suites/search/connectors/connectors_overview.ts @@ -18,7 +18,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ]); const testSubjects = getService('testSubjects'); const browser = getService('browser'); - describe('connectors', function () { + // FLAKY: https://github.com/elastic/kibana/issues/197019 + describe.skip('connectors', function () { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); await pageObjects.svlCommonNavigation.sidenav.clickLink({ diff --git a/x-pack/test_serverless/kibana.jsonc b/x-pack/test_serverless/kibana.jsonc index 2ad994687ff92..a25f8d1fc1418 100644 --- a/x-pack/test_serverless/kibana.jsonc +++ b/x-pack/test_serverless/kibana.jsonc @@ -2,5 +2,7 @@ "type": "test-helper", "id": "@kbn/test-suites-serverless", "owner": [], - "devOnly": true + "devOnly": true, + "group": "platform", + "visibility": "shared" } diff --git a/yarn.lock b/yarn.lock index d5acff31b563b..b8abc0d2e5f2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4606,6 +4606,10 @@ version "0.0.0" uid "" +"@kbn/core-http-server-utils@link:packages/core/http/core-http-server-utils": + version "0.0.0" + uid "" + "@kbn/core-http-server@link:packages/core/http/core-http-server": version "0.0.0" uid "" @@ -6910,6 +6914,10 @@ version "0.0.0" uid "" +"@kbn/search-navigation@link:x-pack/plugins/search_solution/search_navigation": + version "0.0.0" + uid "" + "@kbn/search-notebooks@link:x-pack/plugins/search_notebooks": version "0.0.0" uid ""