diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx
index 35093363d3dbc..ec10aa0381ec3 100644
--- a/api_docs/actions.mdx
+++ b/api_docs/actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions
title: "actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the actions plugin
-date: 2023-09-14
+date: 2023-09-18
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 a93afa2822200..d08d30c9fc885 100644
--- a/api_docs/advanced_settings.mdx
+++ b/api_docs/advanced_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings
title: "advancedSettings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the advancedSettings plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings']
---
import advancedSettingsObj from './advanced_settings.devdocs.json';
diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx
index df636eddf2fb0..22129ac36386a 100644
--- a/api_docs/aiops.mdx
+++ b/api_docs/aiops.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops
title: "aiops"
image: https://source.unsplash.com/400x175/?github
description: API docs for the aiops plugin
-date: 2023-09-14
+date: 2023-09-18
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 eb8b14a66c29e..665da1f4db254 100644
--- a/api_docs/alerting.mdx
+++ b/api_docs/alerting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting
title: "alerting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the alerting plugin
-date: 2023-09-14
+date: 2023-09-18
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 8d11f15439375..b2e749852e2c4 100644
--- a/api_docs/apm.mdx
+++ b/api_docs/apm.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm
title: "apm"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apm plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm']
---
import apmObj from './apm.devdocs.json';
diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx
index 64ae8eec8edd0..feab1dca03106 100644
--- a/api_docs/apm_data_access.mdx
+++ b/api_docs/apm_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess
title: "apmDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the apmDataAccess plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess']
---
import apmDataAccessObj from './apm_data_access.devdocs.json';
diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx
index 81ac546db1f45..09173916ebc7b 100644
--- a/api_docs/asset_manager.mdx
+++ b/api_docs/asset_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager
title: "assetManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the assetManager plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager']
---
import assetManagerObj from './asset_manager.devdocs.json';
diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx
index 58ad99d1ad05d..4e6124d0da1e3 100644
--- a/api_docs/banners.mdx
+++ b/api_docs/banners.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners
title: "banners"
image: https://source.unsplash.com/400x175/?github
description: API docs for the banners plugin
-date: 2023-09-14
+date: 2023-09-18
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 95a9b7a35ee67..9bdba93323168 100644
--- a/api_docs/bfetch.mdx
+++ b/api_docs/bfetch.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch
title: "bfetch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the bfetch plugin
-date: 2023-09-14
+date: 2023-09-18
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 ae4f9906f81c1..078a3b3cf59ba 100644
--- a/api_docs/canvas.mdx
+++ b/api_docs/canvas.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas
title: "canvas"
image: https://source.unsplash.com/400x175/?github
description: API docs for the canvas plugin
-date: 2023-09-14
+date: 2023-09-18
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 cd313321fc84c..488f95f130377 100644
--- a/api_docs/cases.mdx
+++ b/api_docs/cases.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases
title: "cases"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cases plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases']
---
import casesObj from './cases.devdocs.json';
diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx
index 066ebf6eaa6d0..d188312c403ba 100644
--- a/api_docs/charts.mdx
+++ b/api_docs/charts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts
title: "charts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the charts plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts']
---
import chartsObj from './charts.devdocs.json';
diff --git a/api_docs/cloud.devdocs.json b/api_docs/cloud.devdocs.json
index ea1d5a9f36d07..c9f43718fec8d 100644
--- a/api_docs/cloud.devdocs.json
+++ b/api_docs/cloud.devdocs.json
@@ -191,7 +191,7 @@
"label": "serverless",
"description": [],
"signature": [
- "{ project_id: string; } | undefined"
+ "{ project_id: string; project_name?: string | undefined; } | undefined"
],
"path": "x-pack/plugins/cloud/public/plugin.tsx",
"deprecated": false,
@@ -454,7 +454,7 @@
"\nServerless configuration"
],
"signature": [
- "{ projectId?: string | undefined; }"
+ "{ projectId?: string | undefined; projectName?: string | undefined; }"
],
"path": "x-pack/plugins/cloud/public/types.ts",
"deprecated": false,
@@ -790,7 +790,7 @@
"\nServerless configuration"
],
"signature": [
- "{ projectId?: string | undefined; }"
+ "{ projectId?: string | undefined; projectName?: string | undefined; }"
],
"path": "x-pack/plugins/cloud/public/types.ts",
"deprecated": false,
@@ -1053,7 +1053,7 @@
"\nServerless configuration.\n"
],
"signature": [
- "{ projectId?: string | undefined; }"
+ "{ projectId?: string | undefined; projectName?: string | undefined; }"
],
"path": "x-pack/plugins/cloud/server/plugin.ts",
"deprecated": false,
diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx
index 7490751ff56f9..7090e8b3a20f6 100644
--- a/api_docs/cloud.mdx
+++ b/api_docs/cloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud
title: "cloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloud plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud']
---
import cloudObj from './cloud.devdocs.json';
diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx
index 00aa0e12d4d06..72f5f85adf384 100644
--- a/api_docs/cloud_chat.mdx
+++ b/api_docs/cloud_chat.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat
title: "cloudChat"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudChat plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat']
---
import cloudChatObj from './cloud_chat.devdocs.json';
diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx
index 492d34e66c3fb..9cd5eada5f214 100644
--- a/api_docs/cloud_chat_provider.mdx
+++ b/api_docs/cloud_chat_provider.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider
title: "cloudChatProvider"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudChatProvider plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider']
---
import cloudChatProviderObj from './cloud_chat_provider.devdocs.json';
diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx
index 3e5dad06541d4..7ab8225b5da92 100644
--- a/api_docs/cloud_data_migration.mdx
+++ b/api_docs/cloud_data_migration.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration
title: "cloudDataMigration"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDataMigration plugin
-date: 2023-09-14
+date: 2023-09-18
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 0f1e93445d99e..9b4e09565cc55 100644
--- a/api_docs/cloud_defend.mdx
+++ b/api_docs/cloud_defend.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend
title: "cloudDefend"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudDefend plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend']
---
import cloudDefendObj from './cloud_defend.devdocs.json';
diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx
index 5a897679a94aa..87757ffac273e 100644
--- a/api_docs/cloud_experiments.mdx
+++ b/api_docs/cloud_experiments.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments
title: "cloudExperiments"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudExperiments plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments']
---
import cloudExperimentsObj from './cloud_experiments.devdocs.json';
diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx
index db26f11574c87..8cdc61a0538aa 100644
--- a/api_docs/cloud_security_posture.mdx
+++ b/api_docs/cloud_security_posture.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture
title: "cloudSecurityPosture"
image: https://source.unsplash.com/400x175/?github
description: API docs for the cloudSecurityPosture plugin
-date: 2023-09-14
+date: 2023-09-18
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 1ed549faca80a..3038c1157ca8b 100644
--- a/api_docs/console.mdx
+++ b/api_docs/console.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console
title: "console"
image: https://source.unsplash.com/400x175/?github
description: API docs for the console plugin
-date: 2023-09-14
+date: 2023-09-18
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 3e189bf8b3ec3..ceb657dd5c70c 100644
--- a/api_docs/content_management.mdx
+++ b/api_docs/content_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement
title: "contentManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the contentManagement plugin
-date: 2023-09-14
+date: 2023-09-18
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 878b8803dc482..8b253434ce6a7 100644
--- a/api_docs/controls.mdx
+++ b/api_docs/controls.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls
title: "controls"
image: https://source.unsplash.com/400x175/?github
description: API docs for the controls plugin
-date: 2023-09-14
+date: 2023-09-18
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 d723a7d4e437e..0e4a43b4a8c92 100644
--- a/api_docs/custom_integrations.mdx
+++ b/api_docs/custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations
title: "customIntegrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the customIntegrations plugin
-date: 2023-09-14
+date: 2023-09-18
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 c6dca702c096a..ff420d61f1ac3 100644
--- a/api_docs/dashboard.mdx
+++ b/api_docs/dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard
title: "dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboard plugin
-date: 2023-09-14
+date: 2023-09-18
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 0caf30d26e0ac..de635c35fcc04 100644
--- a/api_docs/dashboard_enhanced.mdx
+++ b/api_docs/dashboard_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced
title: "dashboardEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the dashboardEnhanced plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced']
---
import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json';
diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json
index 84b3aa93242c4..9e9f9e9eff6bb 100644
--- a/api_docs/data.devdocs.json
+++ b/api_docs/data.devdocs.json
@@ -5147,36 +5147,31 @@
},
{
"parentPluginId": "data",
- "id": "def-public.parseSearchSourceJSON",
+ "id": "def-public.OpenIncompleteResultsModalButton",
"type": "Function",
"tags": [],
- "label": "parseSearchSourceJSON",
+ "label": "OpenIncompleteResultsModalButton",
"description": [],
"signature": [
- "(searchSourceJSON: string) => ",
- {
- "pluginId": "data",
- "scope": "common",
- "docId": "kibDataSearchPluginApi",
- "section": "def-common.SerializedSearchSourceFields",
- "text": "SerializedSearchSourceFields"
- }
+ "(props: ",
+ "OpenIncompleteResultsModalButtonProps",
+ ") => JSX.Element"
],
- "path": "src/plugins/data/common/search/search_source/parse_json.ts",
+ "path": "src/plugins/data/public/incomplete_results_modal/index.tsx",
"deprecated": false,
"trackAdoption": false,
"children": [
{
"parentPluginId": "data",
- "id": "def-public.parseSearchSourceJSON.$1",
- "type": "string",
+ "id": "def-public.OpenIncompleteResultsModalButton.$1",
+ "type": "Object",
"tags": [],
- "label": "searchSourceJSON",
+ "label": "props",
"description": [],
"signature": [
- "string"
+ "OpenIncompleteResultsModalButtonProps"
],
- "path": "src/plugins/data/common/search/search_source/parse_json.ts",
+ "path": "src/plugins/data/public/incomplete_results_modal/index.tsx",
"deprecated": false,
"trackAdoption": false,
"isRequired": true
@@ -5187,31 +5182,36 @@
},
{
"parentPluginId": "data",
- "id": "def-public.ShardFailureOpenModalButton",
+ "id": "def-public.parseSearchSourceJSON",
"type": "Function",
"tags": [],
- "label": "ShardFailureOpenModalButton",
+ "label": "parseSearchSourceJSON",
"description": [],
"signature": [
- "(props: ",
- "ShardFailureOpenModalButtonProps",
- ") => JSX.Element"
+ "(searchSourceJSON: string) => ",
+ {
+ "pluginId": "data",
+ "scope": "common",
+ "docId": "kibDataSearchPluginApi",
+ "section": "def-common.SerializedSearchSourceFields",
+ "text": "SerializedSearchSourceFields"
+ }
],
- "path": "src/plugins/data/public/shard_failure_modal/index.tsx",
+ "path": "src/plugins/data/common/search/search_source/parse_json.ts",
"deprecated": false,
"trackAdoption": false,
"children": [
{
"parentPluginId": "data",
- "id": "def-public.ShardFailureOpenModalButton.$1",
- "type": "Object",
+ "id": "def-public.parseSearchSourceJSON.$1",
+ "type": "string",
"tags": [],
- "label": "props",
+ "label": "searchSourceJSON",
"description": [],
"signature": [
- "ShardFailureOpenModalButtonProps"
+ "string"
],
- "path": "src/plugins/data/public/shard_failure_modal/index.tsx",
+ "path": "src/plugins/data/common/search/search_source/parse_json.ts",
"deprecated": false,
"trackAdoption": false,
"isRequired": true
@@ -9595,104 +9595,6 @@
}
],
"initialIsOpen": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest",
- "type": "Interface",
- "tags": [],
- "label": "ShardFailureRequest",
- "description": [],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "children": [
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest.docvalue_fields",
- "type": "Array",
- "tags": [],
- "label": "docvalue_fields",
- "description": [],
- "signature": [
- "string[]"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest._source",
- "type": "Unknown",
- "tags": [],
- "label": "_source",
- "description": [],
- "signature": [
- "unknown"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest.query",
- "type": "Unknown",
- "tags": [],
- "label": "query",
- "description": [],
- "signature": [
- "unknown"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest.script_fields",
- "type": "Unknown",
- "tags": [],
- "label": "script_fields",
- "description": [],
- "signature": [
- "unknown"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest.sort",
- "type": "Unknown",
- "tags": [],
- "label": "sort",
- "description": [],
- "signature": [
- "unknown"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- },
- {
- "parentPluginId": "data",
- "id": "def-public.ShardFailureRequest.stored_fields",
- "type": "Array",
- "tags": [],
- "label": "stored_fields",
- "description": [],
- "signature": [
- "string[]"
- ],
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_types.ts",
- "deprecated": false,
- "trackAdoption": false
- }
- ],
- "initialIsOpen": false
}
],
"enums": [
@@ -10152,7 +10054,7 @@
"section": "def-common.TimeRange",
"text": "TimeRange"
},
- " | undefined; disableShardWarnings?: boolean | undefined; }"
+ " | undefined; disableWarningToasts?: boolean | undefined; }"
],
"path": "src/plugins/data/common/search/expressions/kibana_context_type.ts",
"deprecated": false,
@@ -13803,18 +13705,6 @@
"plugin": "timelines",
"path": "x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts"
},
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
- },
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
- },
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts"
- },
{
"plugin": "apm",
"path": "x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts"
@@ -13923,6 +13813,18 @@
"plugin": "graph",
"path": "x-pack/plugins/graph/public/state_management/persistence.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
+ },
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
+ },
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts"
+ },
{
"plugin": "securitySolution",
"path": "x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts"
@@ -14812,14 +14714,14 @@
"deprecated": true,
"trackAdoption": false,
"references": [
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts"
- },
{
"plugin": "graph",
"path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts"
+ },
{
"plugin": "graph",
"path": "x-pack/plugins/graph/public/state_management/datasource.test.ts"
@@ -21544,18 +21446,6 @@
"plugin": "timelines",
"path": "x-pack/plugins/timelines/server/search_strategy/index_fields/index.ts"
},
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
- },
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
- },
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts"
- },
{
"plugin": "apm",
"path": "x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts"
@@ -21664,6 +21554,18 @@
"plugin": "graph",
"path": "x-pack/plugins/graph/public/state_management/persistence.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
+ },
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/common/index_patterns_utils.ts"
+ },
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/lib/get_fields.ts"
+ },
{
"plugin": "securitySolution",
"path": "x-pack/plugins/security_solution/public/common/containers/sourcerer/create_sourcerer_data_view.ts"
@@ -22553,14 +22455,14 @@
"deprecated": true,
"trackAdoption": false,
"references": [
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts"
- },
{
"plugin": "graph",
"path": "x-pack/plugins/graph/public/services/persistence/deserialize.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts"
+ },
{
"plugin": "graph",
"path": "x-pack/plugins/graph/public/state_management/datasource.test.ts"
diff --git a/api_docs/data.mdx b/api_docs/data.mdx
index f9e0407c3fd9b..973262fd2738f 100644
--- a/api_docs/data.mdx
+++ b/api_docs/data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data
title: "data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data']
---
import dataObj from './data.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 3311 | 33 | 2584 | 26 |
+| 3308 | 33 | 2577 | 24 |
## Client
diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx
index fb06d06c4cdcb..dad7f8db144b5 100644
--- a/api_docs/data_query.mdx
+++ b/api_docs/data_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query
title: "data.query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the data.query plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query']
---
import dataQueryObj from './data_query.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 3311 | 33 | 2584 | 26 |
+| 3308 | 33 | 2577 | 24 |
## Client
diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json
index ceb9136800672..f3cf4a4662778 100644
--- a/api_docs/data_search.devdocs.json
+++ b/api_docs/data_search.devdocs.json
@@ -915,6 +915,75 @@
],
"initialIsOpen": false
},
+ {
+ "parentPluginId": "data",
+ "id": "def-public.SearchResponseIncompleteWarning",
+ "type": "Interface",
+ "tags": [],
+ "label": "SearchResponseIncompleteWarning",
+ "description": [
+ "\nA warning object for a search response with incomplete ES results\nES returns incomplete results when:\n1) Set timeout flag on search and the timeout expires on cluster\n2) Some shard failures on a cluster\n3) skipped remote(s) (skip_unavailable=true)\n a. all shards failed\n b. disconnected/not-connected"
+ ],
+ "path": "src/plugins/data/public/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "data",
+ "id": "def-public.SearchResponseIncompleteWarning.type",
+ "type": "string",
+ "tags": [],
+ "label": "type",
+ "description": [
+ "\ntype: for sorting out incomplete warnings"
+ ],
+ "signature": [
+ "\"incomplete\""
+ ],
+ "path": "src/plugins/data/public/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "data",
+ "id": "def-public.SearchResponseIncompleteWarning.message",
+ "type": "string",
+ "tags": [],
+ "label": "message",
+ "description": [
+ "\nmessage: human-friendly message"
+ ],
+ "path": "src/plugins/data/public/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "data",
+ "id": "def-public.SearchResponseIncompleteWarning.clusters",
+ "type": "Object",
+ "tags": [],
+ "label": "clusters",
+ "description": [
+ "\nclusters: cluster details."
+ ],
+ "signature": [
+ "{ [x: string]: ",
+ {
+ "pluginId": "@kbn/es-types",
+ "scope": "common",
+ "docId": "kibKbnEsTypesPluginApi",
+ "section": "def-common.ClusterDetails",
+ "text": "ClusterDetails"
+ },
+ "; }"
+ ],
+ "path": "src/plugins/data/public/search/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "data",
"id": "def-public.SearchSessionInfoProvider",
@@ -1448,9 +1517,13 @@
"\nA warning object for a search response with warnings"
],
"signature": [
- "SearchResponseTimeoutWarning",
- " | ",
- "SearchResponseShardFailureWarning"
+ {
+ "pluginId": "data",
+ "scope": "public",
+ "docId": "kibDataSearchPluginApi",
+ "section": "def-public.SearchResponseIncompleteWarning",
+ "text": "SearchResponseIncompleteWarning"
+ }
],
"path": "src/plugins/data/public/search/types.ts",
"deprecated": false,
@@ -7144,7 +7217,7 @@
"section": "def-common.RequestAdapter",
"text": "RequestAdapter"
},
- " | undefined, abortSignal?: AbortSignal | undefined, searchSessionId?: string | undefined, disableShardFailureWarning?: boolean | undefined) => Promise<",
+ " | undefined, abortSignal?: AbortSignal | undefined, searchSessionId?: string | undefined, disableWarningToasts?: boolean | undefined) => Promise<",
"SearchResponse",
" | ml, stackAlerts | - |
| | ruleRegistry, ml, securitySolution, observability, infra, monitoring, stackAlerts, synthetics, transform, uptime | - |
-| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, visTypeTimeseries, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - |
-| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, visTypeTimeseries, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - |
-| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, data, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, visTypeTimeseries, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega | - |
+| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - |
+| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - |
+| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, data, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, @kbn/event-annotation-components, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega | - |
| | home, data, esUiShared, savedObjectsManagement, ml, exploratoryView, fleet, observability, apm, indexLifecycleManagement, observabilityOnboarding, synthetics, upgradeAssistant, uptime, ux, kibanaOverview | - |
| | share, uiActions, guidedOnboarding, home, management, spaces, security, savedObjects, indexManagement, serverless, visualizations, controls, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, alerting, triggersActionsUi, cases, licenseManagement, advancedSettings, maps, dataVisualizer, aiops, ml, exploratoryView, fleet, observability, infra, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, enterpriseSearch, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, ingestPipelines, logstash, monitoring, observabilityOnboarding, osquery, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - |
| | encryptedSavedObjects, actions, data, ml, securitySolution, logstash, cloudChat | - |
@@ -45,7 +45,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | securitySolution | - |
| | securitySolution | - |
| | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjectsTaggingOss, savedObjectsTagging, securitySolution, lists, upgradeAssistant, savedObjectsManagement, @kbn/core-saved-objects-api-server, @kbn/core-saved-objects-import-export-server-internal, home, canvas, savedObjects, @kbn/core-saved-objects-browser-mocks, @kbn/core-ui-settings-server-internal | - |
-| | @kbn/core-saved-objects-migration-server-internal, actions, dataViews, data, alerting, lens, lists, cases, savedObjectsTagging, securitySolution, visualizations, savedSearch, canvas, graph, maps, dashboard, @kbn/core-test-helpers-so-type-serializer | - |
+| | @kbn/core-saved-objects-migration-server-internal, actions, dataViews, data, alerting, lens, lists, cases, savedObjectsTagging, securitySolution, savedSearch, canvas, graph, visualizations, maps, dashboard, @kbn/core-test-helpers-so-type-serializer | - |
| | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - |
| | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - |
| | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - |
@@ -98,9 +98,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | @kbn/core-saved-objects-browser-internal | - |
| | home, osquery | - |
| | @kbn/core-root-browser-internal, @kbn/core-saved-objects-browser-mocks | - |
-| | visTypeTimeseries, graph, dataViewManagement, dataViews | - |
-| | visTypeTimeseries, graph, dataViewManagement, dataViews | - |
-| | visTypeTimeseries, graph, dataViewManagement | - |
+| | graph, visTypeTimeseries, dataViewManagement, dataViews | - |
+| | graph, visTypeTimeseries, dataViewManagement, dataViews | - |
+| | graph, visTypeTimeseries, dataViewManagement | - |
| | visualizations, graph | - |
| | @kbn/core, lens, savedObjects | - |
| | dataViews, maps | - |
diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx
index d913f540e4fed..6ab4419267ce6 100644
--- a/api_docs/deprecations_by_plugin.mdx
+++ b/api_docs/deprecations_by_plugin.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin
slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin
title: Deprecated API usage by plugin
description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by.
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
@@ -573,7 +573,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [get_display_value.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/get_display_value.ts#:~:text=title), [inspector_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts#:~:text=title), [response_writer.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/response_writer.ts#:~:text=title), [painless_error.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/errors/painless_error.tsx#:~:text=title), [field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/param_types/field.ts#:~:text=title), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=title), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [rare_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/rare_terms.test.ts#:~:text=title)+ 3 more | - |
| | [get_display_value.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/get_display_value.ts#:~:text=title), [inspector_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts#:~:text=title), [response_writer.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/response_writer.ts#:~:text=title), [painless_error.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/errors/painless_error.tsx#:~:text=title), [field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/param_types/field.ts#:~:text=title), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=title), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [rare_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/rare_terms.test.ts#:~:text=title)+ 3 more | - |
| | [get_display_value.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/get_display_value.ts#:~:text=title), [inspector_stats.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts#:~:text=title), [response_writer.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/response_writer.ts#:~:text=title), [painless_error.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/errors/painless_error.tsx#:~:text=title), [field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/param_types/field.ts#:~:text=title), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=title), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [multi_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/multi_terms.test.ts#:~:text=title), [rare_terms.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/rare_terms.test.ts#:~:text=title)+ 3 more | - |
-| | [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [shard_failure_open_modal_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx#:~:text=toMountPoint), [shard_failure_open_modal_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx#:~:text=toMountPoint), [handle_warnings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/fetch/handle_warnings.tsx#:~:text=toMountPoint), [handle_warnings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/fetch/handle_warnings.tsx#:~:text=toMountPoint), [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint), [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint)+ 8 more | - |
+| | [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [open_incomplete_results_modal_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx#:~:text=toMountPoint), [open_incomplete_results_modal_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx#:~:text=toMountPoint), [handle_warnings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/fetch/handle_warnings.tsx#:~:text=toMountPoint), [handle_warnings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/fetch/handle_warnings.tsx#:~:text=toMountPoint), [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint), [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint)+ 8 more | - |
| | [get_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/lib/get_columns.tsx#:~:text=RedirectAppLinks), [get_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/lib/get_columns.tsx#:~:text=RedirectAppLinks), [get_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/lib/get_columns.tsx#:~:text=RedirectAppLinks), [connected_search_session_indicator.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/session_indicator/connected_search_session_indicator/connected_search_session_indicator.tsx#:~:text=RedirectAppLinks), [connected_search_session_indicator.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/session_indicator/connected_search_session_indicator/connected_search_session_indicator.tsx#:~:text=RedirectAppLinks), [connected_search_session_indicator.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/session_indicator/connected_search_session_indicator/connected_search_session_indicator.tsx#:~:text=RedirectAppLinks) | - |
| | [session_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/session/session_service.ts#:~:text=authc) | - |
| | [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions), [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions) | - |
@@ -1564,7 +1564,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/
| ---------------|-----------|-----------|
| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/server/alert_rules/common.ts#:~:text=alertFactory), [message_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/server/alert_rules/tls_rule/message_utils.ts#:~:text=alertFactory), [tls_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/server/alert_rules/tls_rule/tls_rule.ts#:~:text=alertFactory), [monitor_status_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts#:~:text=alertFactory) | - |
| | [stderr_logs.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx#:~:text=indexPatternId) | - |
-| | [toast_title.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/toast_title.tsx#:~:text=toMountPoint), [toast_title.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/toast_title.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [browser_test_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx#:~:text=toMountPoint), [browser_test_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint)+ 6 more | - |
+| | [toast_title.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/toast_title.tsx#:~:text=toMountPoint), [toast_title.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/toast_title.tsx#:~:text=toMountPoint), [browser_test_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx#:~:text=toMountPoint), [browser_test_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [delete_monitor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint), [delete_param.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/settings/global_params/delete_param.tsx#:~:text=toMountPoint)+ 6 more | - |
| | [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=RedirectAppLinks), [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=RedirectAppLinks), [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=RedirectAppLinks) | - |
| | [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=KibanaThemeProvider), [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=KibanaThemeProvider), [synthetics_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/synthetics_app.tsx#:~:text=KibanaThemeProvider) | - |
diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx
index 315c8c78a8917..16dceface5bbd 100644
--- a/api_docs/deprecations_by_team.mdx
+++ b/api_docs/deprecations_by_team.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam
slug: /kibana-dev-docs/api-meta/deprecations-due-by-team
title: Deprecated APIs due to be removed, by team
description: Lists the teams that are referencing deprecated APIs with a remove by date.
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx
index 0cd62fa26270d..976492edbf317 100644
--- a/api_docs/dev_tools.mdx
+++ b/api_docs/dev_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools
title: "devTools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the devTools plugin
-date: 2023-09-14
+date: 2023-09-18
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 015dcbce6b836..b79ef12dc8080 100644
--- a/api_docs/discover.mdx
+++ b/api_docs/discover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover
title: "discover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discover plugin
-date: 2023-09-14
+date: 2023-09-18
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 4a1da36700607..bcf59ecd7d6a5 100644
--- a/api_docs/discover_enhanced.mdx
+++ b/api_docs/discover_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced
title: "discoverEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the discoverEnhanced plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced']
---
import discoverEnhancedObj from './discover_enhanced.devdocs.json';
diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx
index a5322683fb44b..35a1968cb6df0 100644
--- a/api_docs/ecs_data_quality_dashboard.mdx
+++ b/api_docs/ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard
title: "ecsDataQualityDashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ecsDataQualityDashboard plugin
-date: 2023-09-14
+date: 2023-09-18
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 a86798d4d29b8..b112d4399f1a4 100644
--- a/api_docs/elastic_assistant.mdx
+++ b/api_docs/elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant
title: "elasticAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the elasticAssistant plugin
-date: 2023-09-14
+date: 2023-09-18
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 1738d56ba1509..84c572d1da40a 100644
--- a/api_docs/embeddable.mdx
+++ b/api_docs/embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable
title: "embeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddable plugin
-date: 2023-09-14
+date: 2023-09-18
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 92f129b847ad9..af5ac6accfcce 100644
--- a/api_docs/embeddable_enhanced.mdx
+++ b/api_docs/embeddable_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced
title: "embeddableEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the embeddableEnhanced plugin
-date: 2023-09-14
+date: 2023-09-18
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 badf64955f4b2..f4694fcb25c9c 100644
--- a/api_docs/encrypted_saved_objects.mdx
+++ b/api_docs/encrypted_saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects
title: "encryptedSavedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the encryptedSavedObjects plugin
-date: 2023-09-14
+date: 2023-09-18
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 3799a6ca4878b..b68e141559ffd 100644
--- a/api_docs/enterprise_search.mdx
+++ b/api_docs/enterprise_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch
title: "enterpriseSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the enterpriseSearch plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch']
---
import enterpriseSearchObj from './enterprise_search.devdocs.json';
diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx
index aa32d7a7fc638..8e9345631fef1 100644
--- a/api_docs/es_ui_shared.mdx
+++ b/api_docs/es_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared
title: "esUiShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the esUiShared plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared']
---
import esUiSharedObj from './es_ui_shared.devdocs.json';
diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx
index 49b80bac48a1b..dedb47d332ea0 100644
--- a/api_docs/event_annotation.mdx
+++ b/api_docs/event_annotation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation
title: "eventAnnotation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventAnnotation plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation']
---
import eventAnnotationObj from './event_annotation.devdocs.json';
diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx
index a8a483f57833d..fb698e796989d 100644
--- a/api_docs/event_log.mdx
+++ b/api_docs/event_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog
title: "eventLog"
image: https://source.unsplash.com/400x175/?github
description: API docs for the eventLog plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog']
---
import eventLogObj from './event_log.devdocs.json';
diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx
index ed645d5a14f12..59d62906310d1 100644
--- a/api_docs/exploratory_view.mdx
+++ b/api_docs/exploratory_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView
title: "exploratoryView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the exploratoryView plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView']
---
import exploratoryViewObj from './exploratory_view.devdocs.json';
diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx
index bad78b8a935e3..e8d9ebde4c48f 100644
--- a/api_docs/expression_error.mdx
+++ b/api_docs/expression_error.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError
title: "expressionError"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionError plugin
-date: 2023-09-14
+date: 2023-09-18
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 1b52b4404c1dd..b361ce4e564d6 100644
--- a/api_docs/expression_gauge.mdx
+++ b/api_docs/expression_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge
title: "expressionGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionGauge plugin
-date: 2023-09-14
+date: 2023-09-18
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 94348ddd9719e..c64fc4239c208 100644
--- a/api_docs/expression_heatmap.mdx
+++ b/api_docs/expression_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap
title: "expressionHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionHeatmap plugin
-date: 2023-09-14
+date: 2023-09-18
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 26ca1b91211e0..c4900a48fecb5 100644
--- a/api_docs/expression_image.mdx
+++ b/api_docs/expression_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage
title: "expressionImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionImage plugin
-date: 2023-09-14
+date: 2023-09-18
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 d458ee09812f6..6159ddc9b73b2 100644
--- a/api_docs/expression_legacy_metric_vis.mdx
+++ b/api_docs/expression_legacy_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis
title: "expressionLegacyMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionLegacyMetricVis plugin
-date: 2023-09-14
+date: 2023-09-18
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 62bf87a47d9fe..33ea6a3a360d3 100644
--- a/api_docs/expression_metric.mdx
+++ b/api_docs/expression_metric.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric
title: "expressionMetric"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetric plugin
-date: 2023-09-14
+date: 2023-09-18
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 5017d0b58cc46..26732fe7b12fb 100644
--- a/api_docs/expression_metric_vis.mdx
+++ b/api_docs/expression_metric_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis
title: "expressionMetricVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionMetricVis plugin
-date: 2023-09-14
+date: 2023-09-18
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 b799b8837d5af..9b9ce414a9575 100644
--- a/api_docs/expression_partition_vis.mdx
+++ b/api_docs/expression_partition_vis.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis
title: "expressionPartitionVis"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionPartitionVis plugin
-date: 2023-09-14
+date: 2023-09-18
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 3f5bd50684c31..ddcda1fd4cf74 100644
--- a/api_docs/expression_repeat_image.mdx
+++ b/api_docs/expression_repeat_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage
title: "expressionRepeatImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRepeatImage plugin
-date: 2023-09-14
+date: 2023-09-18
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 93cd5576a11b5..57495fa4fe25e 100644
--- a/api_docs/expression_reveal_image.mdx
+++ b/api_docs/expression_reveal_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage
title: "expressionRevealImage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionRevealImage plugin
-date: 2023-09-14
+date: 2023-09-18
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 dafa9fdafb89d..347a0c8b5b2ca 100644
--- a/api_docs/expression_shape.mdx
+++ b/api_docs/expression_shape.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape
title: "expressionShape"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionShape plugin
-date: 2023-09-14
+date: 2023-09-18
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 cd06e685ac2e8..e16ba3c35ef63 100644
--- a/api_docs/expression_tagcloud.mdx
+++ b/api_docs/expression_tagcloud.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud
title: "expressionTagcloud"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionTagcloud plugin
-date: 2023-09-14
+date: 2023-09-18
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 c83b94e3bea25..72cb6439e6bee 100644
--- a/api_docs/expression_x_y.mdx
+++ b/api_docs/expression_x_y.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY
title: "expressionXY"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressionXY plugin
-date: 2023-09-14
+date: 2023-09-18
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 cb925007908f8..5559664660786 100644
--- a/api_docs/expressions.mdx
+++ b/api_docs/expressions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions
title: "expressions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the expressions plugin
-date: 2023-09-14
+date: 2023-09-18
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 d09603476ddcb..d58cd3ebc7e1d 100644
--- a/api_docs/features.mdx
+++ b/api_docs/features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features
title: "features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the features plugin
-date: 2023-09-14
+date: 2023-09-18
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 3f2760ed18466..70b550e4a8b4b 100644
--- a/api_docs/field_formats.mdx
+++ b/api_docs/field_formats.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats
title: "fieldFormats"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fieldFormats plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats']
---
import fieldFormatsObj from './field_formats.devdocs.json';
diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx
index 55e152a8dd0e6..6e8aaec01e2ae 100644
--- a/api_docs/file_upload.mdx
+++ b/api_docs/file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload
title: "fileUpload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fileUpload plugin
-date: 2023-09-14
+date: 2023-09-18
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 ce2bda25bbb89..747f1e89eb6b6 100644
--- a/api_docs/files.mdx
+++ b/api_docs/files.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files
title: "files"
image: https://source.unsplash.com/400x175/?github
description: API docs for the files plugin
-date: 2023-09-14
+date: 2023-09-18
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 8309fe669b68a..a62527194108d 100644
--- a/api_docs/files_management.mdx
+++ b/api_docs/files_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement
title: "filesManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the filesManagement plugin
-date: 2023-09-14
+date: 2023-09-18
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 1189b703da422..45e011f7068ff 100644
--- a/api_docs/fleet.mdx
+++ b/api_docs/fleet.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet
title: "fleet"
image: https://source.unsplash.com/400x175/?github
description: API docs for the fleet plugin
-date: 2023-09-14
+date: 2023-09-18
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 e403a829ca589..d90a640e051d4 100644
--- a/api_docs/global_search.mdx
+++ b/api_docs/global_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch
title: "globalSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the globalSearch plugin
-date: 2023-09-14
+date: 2023-09-18
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 115839221c841..2fd5915e5325d 100644
--- a/api_docs/guided_onboarding.mdx
+++ b/api_docs/guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding
title: "guidedOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the guidedOnboarding plugin
-date: 2023-09-14
+date: 2023-09-18
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 20bf23f93dae4..883c85a14ba5a 100644
--- a/api_docs/home.mdx
+++ b/api_docs/home.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home
title: "home"
image: https://source.unsplash.com/400x175/?github
description: API docs for the home plugin
-date: 2023-09-14
+date: 2023-09-18
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 b7c5339227511..677d05ae1be0c 100644
--- a/api_docs/image_embeddable.mdx
+++ b/api_docs/image_embeddable.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable
title: "imageEmbeddable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the imageEmbeddable plugin
-date: 2023-09-14
+date: 2023-09-18
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 995d74c09c7a7..3014a97dca8c0 100644
--- a/api_docs/index_lifecycle_management.mdx
+++ b/api_docs/index_lifecycle_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement
title: "indexLifecycleManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexLifecycleManagement plugin
-date: 2023-09-14
+date: 2023-09-18
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 f777cf7b8cb05..210c8db0b2901 100644
--- a/api_docs/index_management.mdx
+++ b/api_docs/index_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement
title: "indexManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the indexManagement plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement']
---
import indexManagementObj from './index_management.devdocs.json';
diff --git a/api_docs/infra.devdocs.json b/api_docs/infra.devdocs.json
index 96f62ca88f47d..2e4e16322dc43 100644
--- a/api_docs/infra.devdocs.json
+++ b/api_docs/infra.devdocs.json
@@ -651,67 +651,6 @@
"path": "x-pack/plugins/infra/server/types.ts",
"deprecated": false,
"trackAdoption": false
- },
- {
- "parentPluginId": "infra",
- "id": "def-server.InfraPluginStart.getMetricIndices",
- "type": "Function",
- "tags": [],
- "label": "getMetricIndices",
- "description": [],
- "signature": [
- "(savedObjectsClient: ",
- {
- "pluginId": "@kbn/core-saved-objects-api-server",
- "scope": "common",
- "docId": "kibKbnCoreSavedObjectsApiServerPluginApi",
- "section": "def-common.SavedObjectsClientContract",
- "text": "SavedObjectsClientContract"
- },
- ", sourceId?: string | undefined) => Promise"
- ],
- "path": "x-pack/plugins/infra/server/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "children": [
- {
- "parentPluginId": "infra",
- "id": "def-server.InfraPluginStart.getMetricIndices.$1",
- "type": "Object",
- "tags": [],
- "label": "savedObjectsClient",
- "description": [],
- "signature": [
- {
- "pluginId": "@kbn/core-saved-objects-api-server",
- "scope": "common",
- "docId": "kibKbnCoreSavedObjectsApiServerPluginApi",
- "section": "def-common.SavedObjectsClientContract",
- "text": "SavedObjectsClientContract"
- }
- ],
- "path": "x-pack/plugins/infra/server/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "isRequired": true
- },
- {
- "parentPluginId": "infra",
- "id": "def-server.InfraPluginStart.getMetricIndices.$2",
- "type": "string",
- "tags": [],
- "label": "sourceId",
- "description": [],
- "signature": [
- "string | undefined"
- ],
- "path": "x-pack/plugins/infra/server/types.ts",
- "deprecated": false,
- "trackAdoption": false,
- "isRequired": false
- }
- ],
- "returnComment": []
}
],
"lifecycle": "start",
diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx
index edcc3fc7bcc35..e7fcfd4448bda 100644
--- a/api_docs/infra.mdx
+++ b/api_docs/infra.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra
title: "infra"
image: https://source.unsplash.com/400x175/?github
description: API docs for the infra plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra']
---
import infraObj from './infra.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 45 | 0 | 42 | 11 |
+| 42 | 0 | 39 | 11 |
## Client
diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx
index e2e55c9d3bea0..c327ce577ffab 100644
--- a/api_docs/inspector.mdx
+++ b/api_docs/inspector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector
title: "inspector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the inspector plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector']
---
import inspectorObj from './inspector.devdocs.json';
diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx
index c5088b0fcc3fd..7e77600558565 100644
--- a/api_docs/interactive_setup.mdx
+++ b/api_docs/interactive_setup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup
title: "interactiveSetup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the interactiveSetup plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup']
---
import interactiveSetupObj from './interactive_setup.devdocs.json';
diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx
index b147821915736..08ecddbf0e546 100644
--- a/api_docs/kbn_ace.mdx
+++ b/api_docs/kbn_ace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace
title: "@kbn/ace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ace plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace']
---
import kbnAceObj from './kbn_ace.devdocs.json';
diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx
index 2ef6d1201982a..52e226fe31f38 100644
--- a/api_docs/kbn_aiops_components.mdx
+++ b/api_docs/kbn_aiops_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components
title: "@kbn/aiops-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-components plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components']
---
import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json';
diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx
index 9729ddc7e5822..d413952770e9c 100644
--- a/api_docs/kbn_aiops_utils.mdx
+++ b/api_docs/kbn_aiops_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils
title: "@kbn/aiops-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/aiops-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils']
---
import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json';
diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx
index cfbbe6416aa73..74a7c194b58e2 100644
--- a/api_docs/kbn_alerting_api_integration_helpers.mdx
+++ b/api_docs/kbn_alerting_api_integration_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers
title: "@kbn/alerting-api-integration-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-api-integration-helpers plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers']
---
import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json';
diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx
index 135cc02b5dfad..1155edfa57925 100644
--- a/api_docs/kbn_alerting_state_types.mdx
+++ b/api_docs/kbn_alerting_state_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types
title: "@kbn/alerting-state-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerting-state-types plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types']
---
import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json';
diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx
index d249532a088ae..56b6a659a1cfa 100644
--- a/api_docs/kbn_alerts_as_data_utils.mdx
+++ b/api_docs/kbn_alerts_as_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils
title: "@kbn/alerts-as-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-as-data-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils']
---
import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json';
diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx
index 53d9eb5130b6e..dcc3e6917906c 100644
--- a/api_docs/kbn_alerts_ui_shared.mdx
+++ b/api_docs/kbn_alerts_ui_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared
title: "@kbn/alerts-ui-shared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/alerts-ui-shared plugin
-date: 2023-09-14
+date: 2023-09-18
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 1431fba1f5603..5e7d5cda6a907 100644
--- a/api_docs/kbn_analytics.mdx
+++ b/api_docs/kbn_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics
title: "@kbn/analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics']
---
import kbnAnalyticsObj from './kbn_analytics.devdocs.json';
diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx
index ffe3d3bface57..1431b10b96c02 100644
--- a/api_docs/kbn_analytics_client.mdx
+++ b/api_docs/kbn_analytics_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client
title: "@kbn/analytics-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-client plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client']
---
import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
index 3c96fe25ac23f..98abb678e022e 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser
title: "@kbn/analytics-shippers-elastic-v3-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser']
---
import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
index 4c61af7418529..75fdab72a1664 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common
title: "@kbn/analytics-shippers-elastic-v3-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common']
---
import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
index cc69b90b02ab1..db0ce46c2cca1 100644
--- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
+++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server
title: "@kbn/analytics-shippers-elastic-v3-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server']
---
import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx
index fb42c84c8d60f..fe5d6301ae0a9 100644
--- a/api_docs/kbn_analytics_shippers_fullstory.mdx
+++ b/api_docs/kbn_analytics_shippers_fullstory.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory
title: "@kbn/analytics-shippers-fullstory"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-fullstory plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory']
---
import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json';
diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx
index 790648d321309..1e5c56e8540ed 100644
--- a/api_docs/kbn_analytics_shippers_gainsight.mdx
+++ b/api_docs/kbn_analytics_shippers_gainsight.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight
title: "@kbn/analytics-shippers-gainsight"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/analytics-shippers-gainsight plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight']
---
import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json';
diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx
index d089126f3ecae..b5a17f95e4914 100644
--- a/api_docs/kbn_apm_config_loader.mdx
+++ b/api_docs/kbn_apm_config_loader.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader
title: "@kbn/apm-config-loader"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-config-loader plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader']
---
import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json';
diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx
index c0b66a4bb4b33..269e6c2fe51e0 100644
--- a/api_docs/kbn_apm_synthtrace.mdx
+++ b/api_docs/kbn_apm_synthtrace.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace
title: "@kbn/apm-synthtrace"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace plugin
-date: 2023-09-14
+date: 2023-09-18
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 83ef540bf9c02..c3b4b0ccf6851 100644
--- a/api_docs/kbn_apm_synthtrace_client.mdx
+++ b/api_docs/kbn_apm_synthtrace_client.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client
title: "@kbn/apm-synthtrace-client"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-synthtrace-client plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client']
---
import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json';
diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx
index b1722beaf22d7..7ffe42df8b83c 100644
--- a/api_docs/kbn_apm_utils.mdx
+++ b/api_docs/kbn_apm_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils
title: "@kbn/apm-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/apm-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils']
---
import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json';
diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx
index f6d8149c4718b..ea5a3a98abe3a 100644
--- a/api_docs/kbn_axe_config.mdx
+++ b/api_docs/kbn_axe_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config
title: "@kbn/axe-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/axe-config plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config']
---
import kbnAxeConfigObj from './kbn_axe_config.devdocs.json';
diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx
index 9c89365ea8091..fbe7866473bcb 100644
--- a/api_docs/kbn_cases_components.mdx
+++ b/api_docs/kbn_cases_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components
title: "@kbn/cases-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cases-components plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components']
---
import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json';
diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx
index 74ca45ec6775e..25522ed3865a2 100644
--- a/api_docs/kbn_cell_actions.mdx
+++ b/api_docs/kbn_cell_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions
title: "@kbn/cell-actions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cell-actions plugin
-date: 2023-09-14
+date: 2023-09-18
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 b019c44193b56..878f101e79d36 100644
--- a/api_docs/kbn_chart_expressions_common.mdx
+++ b/api_docs/kbn_chart_expressions_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common
title: "@kbn/chart-expressions-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-expressions-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 aa9cf36e37845..1658fd746d357 100644
--- a/api_docs/kbn_chart_icons.mdx
+++ b/api_docs/kbn_chart_icons.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons
title: "@kbn/chart-icons"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/chart-icons plugin
-date: 2023-09-14
+date: 2023-09-18
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 ac83bc1e33802..57da814dd2406 100644
--- a/api_docs/kbn_ci_stats_core.mdx
+++ b/api_docs/kbn_ci_stats_core.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core
title: "@kbn/ci-stats-core"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-core plugin
-date: 2023-09-14
+date: 2023-09-18
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 aa19a99c0f9c8..1876e4a29dd0c 100644
--- a/api_docs/kbn_ci_stats_performance_metrics.mdx
+++ b/api_docs/kbn_ci_stats_performance_metrics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics
title: "@kbn/ci-stats-performance-metrics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-performance-metrics plugin
-date: 2023-09-14
+date: 2023-09-18
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 3462658ae8b2f..9f601981e3dad 100644
--- a/api_docs/kbn_ci_stats_reporter.mdx
+++ b/api_docs/kbn_ci_stats_reporter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter
title: "@kbn/ci-stats-reporter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ci-stats-reporter plugin
-date: 2023-09-14
+date: 2023-09-18
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 553d65ee47bc1..aa9afe0e6bdf5 100644
--- a/api_docs/kbn_cli_dev_mode.mdx
+++ b/api_docs/kbn_cli_dev_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode
title: "@kbn/cli-dev-mode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cli-dev-mode plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode']
---
import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json';
diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx
index 8e0277e7db7aa..109fe7aff525b 100644
--- a/api_docs/kbn_code_editor.mdx
+++ b/api_docs/kbn_code_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor
title: "@kbn/code-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor']
---
import kbnCodeEditorObj from './kbn_code_editor.devdocs.json';
diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx
index 867cba81c5307..6d063326b3b3a 100644
--- a/api_docs/kbn_code_editor_mocks.mdx
+++ b/api_docs/kbn_code_editor_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks
title: "@kbn/code-editor-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/code-editor-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks']
---
import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json';
diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx
index 3e9391da6d281..fca9a8c5c322f 100644
--- a/api_docs/kbn_coloring.mdx
+++ b/api_docs/kbn_coloring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring
title: "@kbn/coloring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/coloring plugin
-date: 2023-09-14
+date: 2023-09-18
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 c49af4c7a5f6e..4d3fb887f21b8 100644
--- a/api_docs/kbn_config.mdx
+++ b/api_docs/kbn_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config
title: "@kbn/config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config plugin
-date: 2023-09-14
+date: 2023-09-18
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 27822dcba6cb8..c92f82b27df0a 100644
--- a/api_docs/kbn_config_mocks.mdx
+++ b/api_docs/kbn_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks
title: "@kbn/config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 578480beca5d5..46a571dffd4fd 100644
--- a/api_docs/kbn_config_schema.mdx
+++ b/api_docs/kbn_config_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema
title: "@kbn/config-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/config-schema plugin
-date: 2023-09-14
+date: 2023-09-18
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 ef0033a143904..2c20cab969269 100644
--- a/api_docs/kbn_content_management_content_editor.mdx
+++ b/api_docs/kbn_content_management_content_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor
title: "@kbn/content-management-content-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-content-editor plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor']
---
import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json';
diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
index 7e415409a156a..883d8a78c250a 100644
--- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx
+++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view
title: "@kbn/content-management-tabbed-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-tabbed-table-list-view plugin
-date: 2023-09-14
+date: 2023-09-18
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 c0669b3adb2a5..5b542d0d61354 100644
--- a/api_docs/kbn_content_management_table_list_view.mdx
+++ b/api_docs/kbn_content_management_table_list_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view
title: "@kbn/content-management-table-list-view"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view']
---
import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json';
diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx
index 3054e3eb47f1b..5df2b5a15f823 100644
--- a/api_docs/kbn_content_management_table_list_view_table.mdx
+++ b/api_docs/kbn_content_management_table_list_view_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table
title: "@kbn/content-management-table-list-view-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-table-list-view-table plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table']
---
import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json';
diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx
index 5955c4c99eb31..6050db97f3548 100644
--- a/api_docs/kbn_content_management_utils.mdx
+++ b/api_docs/kbn_content_management_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils
title: "@kbn/content-management-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/content-management-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 8cf13fd3492c6..2e69f191ad449 100644
--- a/api_docs/kbn_core_analytics_browser.mdx
+++ b/api_docs/kbn_core_analytics_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser
title: "@kbn/core-analytics-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 9b9b39d89f1c0..9ee1d9e495b79 100644
--- a/api_docs/kbn_core_analytics_browser_internal.mdx
+++ b/api_docs/kbn_core_analytics_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal
title: "@kbn/core-analytics-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 0aa2e732fc2cd..93ebce24da602 100644
--- a/api_docs/kbn_core_analytics_browser_mocks.mdx
+++ b/api_docs/kbn_core_analytics_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks
title: "@kbn/core-analytics-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 dcf96e0908c96..6d269f9294534 100644
--- a/api_docs/kbn_core_analytics_server.mdx
+++ b/api_docs/kbn_core_analytics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server
title: "@kbn/core-analytics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 2fbb2da333f13..f4ca8e4ae41f7 100644
--- a/api_docs/kbn_core_analytics_server_internal.mdx
+++ b/api_docs/kbn_core_analytics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal
title: "@kbn/core-analytics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 c5edfca8f1ab2..787c930535c49 100644
--- a/api_docs/kbn_core_analytics_server_mocks.mdx
+++ b/api_docs/kbn_core_analytics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks
title: "@kbn/core-analytics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-analytics-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 20b6ccdffcea9..ad2393d79632d 100644
--- a/api_docs/kbn_core_application_browser.mdx
+++ b/api_docs/kbn_core_application_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser
title: "@kbn/core-application-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 ed0f55dc30423..b7aab6b4c493b 100644
--- a/api_docs/kbn_core_application_browser_internal.mdx
+++ b/api_docs/kbn_core_application_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal
title: "@kbn/core-application-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 1793b350dc471..dac9fa29a97d4 100644
--- a/api_docs/kbn_core_application_browser_mocks.mdx
+++ b/api_docs/kbn_core_application_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks
title: "@kbn/core-application-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 7da5ba0598cdc..f665e9d9ecf20 100644
--- a/api_docs/kbn_core_application_common.mdx
+++ b/api_docs/kbn_core_application_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common
title: "@kbn/core-application-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-application-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 f315cedc79d56..02cf4fd9f4802 100644
--- a/api_docs/kbn_core_apps_browser_internal.mdx
+++ b/api_docs/kbn_core_apps_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal
title: "@kbn/core-apps-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 d65efcc0dbc1c..fb1d9f90941ee 100644
--- a/api_docs/kbn_core_apps_browser_mocks.mdx
+++ b/api_docs/kbn_core_apps_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks
title: "@kbn/core-apps-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 7ef3b141a0b68..3056c91730b4c 100644
--- a/api_docs/kbn_core_apps_server_internal.mdx
+++ b/api_docs/kbn_core_apps_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal
title: "@kbn/core-apps-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-apps-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 027859db64e84..0e94e11483833 100644
--- a/api_docs/kbn_core_base_browser_mocks.mdx
+++ b/api_docs/kbn_core_base_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks
title: "@kbn/core-base-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 91722fa6e8732..bb292f3a80240 100644
--- a/api_docs/kbn_core_base_common.mdx
+++ b/api_docs/kbn_core_base_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common
title: "@kbn/core-base-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 d4d37b94994a9..431280d8f8b7a 100644
--- a/api_docs/kbn_core_base_server_internal.mdx
+++ b/api_docs/kbn_core_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal
title: "@kbn/core-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 d7b50cd1dc902..6d49d7b89f56e 100644
--- a/api_docs/kbn_core_base_server_mocks.mdx
+++ b/api_docs/kbn_core_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks
title: "@kbn/core-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-base-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 c28f64d47c4dd..4ee2badf63701 100644
--- a/api_docs/kbn_core_capabilities_browser_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks
title: "@kbn/core-capabilities-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 0659818dd5dcd..462cdb9ec9936 100644
--- a/api_docs/kbn_core_capabilities_common.mdx
+++ b/api_docs/kbn_core_capabilities_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common
title: "@kbn/core-capabilities-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 52d171cd61828..ff970404a1927 100644
--- a/api_docs/kbn_core_capabilities_server.mdx
+++ b/api_docs/kbn_core_capabilities_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server
title: "@kbn/core-capabilities-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 782d1c71df942..3ef941bbc2da4 100644
--- a/api_docs/kbn_core_capabilities_server_mocks.mdx
+++ b/api_docs/kbn_core_capabilities_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks
title: "@kbn/core-capabilities-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-capabilities-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 4a67c2411d8c2..b1455cebda134 100644
--- a/api_docs/kbn_core_chrome_browser.mdx
+++ b/api_docs/kbn_core_chrome_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser
title: "@kbn/core-chrome-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 714f0c599fd2d..6cd2f87cf2dc0 100644
--- a/api_docs/kbn_core_chrome_browser_mocks.mdx
+++ b/api_docs/kbn_core_chrome_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks
title: "@kbn/core-chrome-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-chrome-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 e835a5a187806..8bab8235009e8 100644
--- a/api_docs/kbn_core_config_server_internal.mdx
+++ b/api_docs/kbn_core_config_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal
title: "@kbn/core-config-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-config-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 6b9b1308ee859..12d2604c35bc0 100644
--- a/api_docs/kbn_core_custom_branding_browser.mdx
+++ b/api_docs/kbn_core_custom_branding_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser
title: "@kbn/core-custom-branding-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 287a669467bd7..51c469f2d721a 100644
--- a/api_docs/kbn_core_custom_branding_browser_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal
title: "@kbn/core-custom-branding-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 ed20a5c0e6ef0..7bdbcde0b681c 100644
--- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks
title: "@kbn/core-custom-branding-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 c35070cbf836f..6657a1b5a5463 100644
--- a/api_docs/kbn_core_custom_branding_common.mdx
+++ b/api_docs/kbn_core_custom_branding_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common
title: "@kbn/core-custom-branding-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 01825cb8f95bd..1ccdf52e0fe0c 100644
--- a/api_docs/kbn_core_custom_branding_server.mdx
+++ b/api_docs/kbn_core_custom_branding_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server
title: "@kbn/core-custom-branding-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 e8b19f7738fac..792727a53527e 100644
--- a/api_docs/kbn_core_custom_branding_server_internal.mdx
+++ b/api_docs/kbn_core_custom_branding_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal
title: "@kbn/core-custom-branding-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 2cdbbdc2a31cf..288845aab22dd 100644
--- a/api_docs/kbn_core_custom_branding_server_mocks.mdx
+++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks
title: "@kbn/core-custom-branding-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-custom-branding-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 404775d535b34..1b01571ae584a 100644
--- a/api_docs/kbn_core_deprecations_browser.mdx
+++ b/api_docs/kbn_core_deprecations_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser
title: "@kbn/core-deprecations-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 0dcd881edefc2..a04805f49b4a2 100644
--- a/api_docs/kbn_core_deprecations_browser_internal.mdx
+++ b/api_docs/kbn_core_deprecations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal
title: "@kbn/core-deprecations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 4dd04a4a2417e..3a1d96a5885a5 100644
--- a/api_docs/kbn_core_deprecations_browser_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks
title: "@kbn/core-deprecations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 ac35a73fa16db..dfa0926e1b443 100644
--- a/api_docs/kbn_core_deprecations_common.mdx
+++ b/api_docs/kbn_core_deprecations_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common
title: "@kbn/core-deprecations-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 4e22df08f088f..bc5bb99a112c4 100644
--- a/api_docs/kbn_core_deprecations_server.mdx
+++ b/api_docs/kbn_core_deprecations_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server
title: "@kbn/core-deprecations-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 843a16e17f3f1..0f359f6490541 100644
--- a/api_docs/kbn_core_deprecations_server_internal.mdx
+++ b/api_docs/kbn_core_deprecations_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal
title: "@kbn/core-deprecations-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 4caf7ee701b9d..644431b6e0b48 100644
--- a/api_docs/kbn_core_deprecations_server_mocks.mdx
+++ b/api_docs/kbn_core_deprecations_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks
title: "@kbn/core-deprecations-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-deprecations-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 579d71ecd3f45..0b15fef58826c 100644
--- a/api_docs/kbn_core_doc_links_browser.mdx
+++ b/api_docs/kbn_core_doc_links_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser
title: "@kbn/core-doc-links-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 a037e10ce4868..de6e8725476a2 100644
--- a/api_docs/kbn_core_doc_links_browser_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks
title: "@kbn/core-doc-links-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 c3807f2afe0cc..3846540cb7906 100644
--- a/api_docs/kbn_core_doc_links_server.mdx
+++ b/api_docs/kbn_core_doc_links_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server
title: "@kbn/core-doc-links-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 ebeff75721071..53e296cccb735 100644
--- a/api_docs/kbn_core_doc_links_server_mocks.mdx
+++ b/api_docs/kbn_core_doc_links_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks
title: "@kbn/core-doc-links-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-doc-links-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 b497966eaec95..d79a6e6ee117d 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal
title: "@kbn/core-elasticsearch-client-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 ca00222785147..1e70b4deff0ff 100644
--- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks
title: "@kbn/core-elasticsearch-client-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 eeb5ceccc4e21..c2d71495027f5 100644
--- a/api_docs/kbn_core_elasticsearch_server.mdx
+++ b/api_docs/kbn_core_elasticsearch_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server
title: "@kbn/core-elasticsearch-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 77e47f46d4f12..fbc988f9558e7 100644
--- a/api_docs/kbn_core_elasticsearch_server_internal.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal
title: "@kbn/core-elasticsearch-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 4c9d1b3c4dc4e..ade0799dcf68d 100644
--- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx
+++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks
title: "@kbn/core-elasticsearch-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-elasticsearch-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 5805fae6acecb..9cb38caf49621 100644
--- a/api_docs/kbn_core_environment_server_internal.mdx
+++ b/api_docs/kbn_core_environment_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal
title: "@kbn/core-environment-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 f3c1b316ed386..4043cf0a22cc3 100644
--- a/api_docs/kbn_core_environment_server_mocks.mdx
+++ b/api_docs/kbn_core_environment_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks
title: "@kbn/core-environment-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-environment-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 6dbbfbbfefcde..f8ce8edd5401e 100644
--- a/api_docs/kbn_core_execution_context_browser.mdx
+++ b/api_docs/kbn_core_execution_context_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser
title: "@kbn/core-execution-context-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 62d00f3533b03..6b2ac0d00c16e 100644
--- a/api_docs/kbn_core_execution_context_browser_internal.mdx
+++ b/api_docs/kbn_core_execution_context_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal
title: "@kbn/core-execution-context-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 4836ca5f632ef..f22969795aff9 100644
--- a/api_docs/kbn_core_execution_context_browser_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks
title: "@kbn/core-execution-context-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 c65d904f71434..18d451571c778 100644
--- a/api_docs/kbn_core_execution_context_common.mdx
+++ b/api_docs/kbn_core_execution_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common
title: "@kbn/core-execution-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 9aab545bd7478..60f68cf242fb2 100644
--- a/api_docs/kbn_core_execution_context_server.mdx
+++ b/api_docs/kbn_core_execution_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server
title: "@kbn/core-execution-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 765ba28ef92ea..7f3f4539da535 100644
--- a/api_docs/kbn_core_execution_context_server_internal.mdx
+++ b/api_docs/kbn_core_execution_context_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal
title: "@kbn/core-execution-context-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 50876d64f5387..09f3d6fcb46df 100644
--- a/api_docs/kbn_core_execution_context_server_mocks.mdx
+++ b/api_docs/kbn_core_execution_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks
title: "@kbn/core-execution-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-execution-context-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 d8bdc0d69d7be..d018a5094916a 100644
--- a/api_docs/kbn_core_fatal_errors_browser.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser
title: "@kbn/core-fatal-errors-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 edff2673e1499..179b02de80b0d 100644
--- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
+++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks
title: "@kbn/core-fatal-errors-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks']
---
import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx
index bc0f5bba42573..a93cbfa77ccd2 100644
--- a/api_docs/kbn_core_http_browser.mdx
+++ b/api_docs/kbn_core_http_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser
title: "@kbn/core-http-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 f893bfda491bb..d0da7439de20c 100644
--- a/api_docs/kbn_core_http_browser_internal.mdx
+++ b/api_docs/kbn_core_http_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal
title: "@kbn/core-http-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 989ce9e75592f..66fff8819a731 100644
--- a/api_docs/kbn_core_http_browser_mocks.mdx
+++ b/api_docs/kbn_core_http_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks
title: "@kbn/core-http-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 bceadcaaddbc5..59e3c8228a8f7 100644
--- a/api_docs/kbn_core_http_common.mdx
+++ b/api_docs/kbn_core_http_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common
title: "@kbn/core-http-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 7efd3d945f7c3..c30a85d63af01 100644
--- a/api_docs/kbn_core_http_context_server_mocks.mdx
+++ b/api_docs/kbn_core_http_context_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks
title: "@kbn/core-http-context-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-context-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 b0b1f97a2bd95..1fd82b970a60a 100644
--- a/api_docs/kbn_core_http_request_handler_context_server.mdx
+++ b/api_docs/kbn_core_http_request_handler_context_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server
title: "@kbn/core-http-request-handler-context-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-request-handler-context-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 18166b29ee95f..d0b005dd9764e 100644
--- a/api_docs/kbn_core_http_resources_server.mdx
+++ b/api_docs/kbn_core_http_resources_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server
title: "@kbn/core-http-resources-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 c3ef79d35e115..1293623fbe915 100644
--- a/api_docs/kbn_core_http_resources_server_internal.mdx
+++ b/api_docs/kbn_core_http_resources_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal
title: "@kbn/core-http-resources-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 e373873a994d8..c74dbcd1e7a72 100644
--- a/api_docs/kbn_core_http_resources_server_mocks.mdx
+++ b/api_docs/kbn_core_http_resources_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks
title: "@kbn/core-http-resources-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-resources-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 fea6f17a74d5d..6849af81def92 100644
--- a/api_docs/kbn_core_http_router_server_internal.mdx
+++ b/api_docs/kbn_core_http_router_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal
title: "@kbn/core-http-router-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 42a2a1996e9b4..696f0c9915184 100644
--- a/api_docs/kbn_core_http_router_server_mocks.mdx
+++ b/api_docs/kbn_core_http_router_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks
title: "@kbn/core-http-router-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-router-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks']
---
import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json
index 796deb8bd12d2..a21966bd7c9be 100644
--- a/api_docs/kbn_core_http_server.devdocs.json
+++ b/api_docs/kbn_core_http_server.devdocs.json
@@ -3703,14 +3703,6 @@
"plugin": "triggersActionsUi",
"path": "x-pack/plugins/triggers_actions_ui/server/routes/config.ts"
},
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/routes/fields.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "profiling",
"path": "x-pack/plugins/profiling/server/routes/flamechart.ts"
@@ -4323,6 +4315,14 @@
"plugin": "indexLifecycleManagement",
"path": "x-pack/plugins/index_lifecycle_management/server/routes/api/snapshot_repositories/register_fetch_route.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/routes/fields.ts"
+ },
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "ingestPipelines",
"path": "x-pack/plugins/ingest_pipelines/server/routes/api/get.ts"
@@ -6269,14 +6269,6 @@
"plugin": "triggersActionsUi",
"path": "x-pack/plugins/triggers_actions_ui/server/data/routes/indices.ts"
},
- {
- "plugin": "visTypeTimeseries",
- "path": "src/plugins/vis_types/timeseries/server/routes/vis.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "profiling",
"path": "x-pack/plugins/profiling/server/routes/setup.ts"
@@ -6745,6 +6737,14 @@
"plugin": "indexLifecycleManagement",
"path": "x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_add_policy_route.ts"
},
+ {
+ "plugin": "visTypeTimeseries",
+ "path": "src/plugins/vis_types/timeseries/server/routes/vis.ts"
+ },
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "ingestPipelines",
"path": "x-pack/plugins/ingest_pipelines/server/routes/api/create.ts"
@@ -7971,10 +7971,6 @@
"plugin": "securitySolution",
"path": "x-pack/plugins/security_solution/server/lib/risk_score/stored_scripts/create_script_route.ts"
},
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "reporting",
"path": "x-pack/plugins/reporting/server/routes/internal/deprecations/deprecations.ts"
@@ -8187,6 +8183,10 @@
"plugin": "enterpriseSearch",
"path": "x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts"
},
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "ingestPipelines",
"path": "x-pack/plugins/ingest_pipelines/server/routes/api/update.ts"
@@ -8637,10 +8637,6 @@
"plugin": "securitySolution",
"path": "x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts"
},
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "enterpriseSearch",
"path": "x-pack/plugins/enterprise_search/server/routes/workplace_search/security.ts"
@@ -8653,6 +8649,10 @@
"plugin": "enterpriseSearch",
"path": "x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts"
},
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "@kbn/core-http-router-server-internal",
"path": "packages/core/http/core-http-router-server-internal/src/router.ts"
@@ -8999,10 +8999,6 @@
"plugin": "observability",
"path": "x-pack/plugins/observability/server/lib/annotations/register_annotation_apis.ts"
},
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "assetManager",
"path": "x-pack/plugins/asset_manager/server/routes/sample_assets.ts"
@@ -9155,6 +9151,10 @@
"plugin": "indexLifecycleManagement",
"path": "x-pack/plugins/index_lifecycle_management/server/routes/api/policies/register_delete_route.ts"
},
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "ingestPipelines",
"path": "x-pack/plugins/ingest_pipelines/server/routes/api/delete.ts"
@@ -13457,14 +13457,6 @@
"plugin": "@kbn/core-http-router-server-mocks",
"path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts"
},
- {
- "plugin": "logsShared",
- "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/custom_elements/find.ts"
@@ -13525,10 +13517,18 @@
"plugin": "cloudSecurityPosture",
"path": "x-pack/plugins/cloud_security_posture/server/routes/detection_engine/get_detection_engine_alerts_count_by_rule_tags.ts"
},
+ {
+ "plugin": "logsShared",
+ "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "fileUpload",
"path": "x-pack/plugins/file_upload/server/routes.ts"
},
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "kubernetesSecurity",
"path": "x-pack/plugins/kubernetes_security/server/routes/aggregate.ts"
@@ -13933,14 +13933,6 @@
"plugin": "@kbn/core-http-router-server-mocks",
"path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts"
},
- {
- "plugin": "logsShared",
- "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/custom_elements/update.ts"
@@ -13957,6 +13949,14 @@
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/workpad/update.ts"
},
+ {
+ "plugin": "logsShared",
+ "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "transform",
"path": "x-pack/plugins/transform/server/routes/api/transforms.ts"
@@ -14681,14 +14681,6 @@
"plugin": "aiops",
"path": "x-pack/plugins/aiops/server/routes/log_categorization.ts"
},
- {
- "plugin": "logsShared",
- "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/custom_elements/create.ts"
@@ -14705,6 +14697,10 @@
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/workpad/import.ts"
},
+ {
+ "plugin": "logsShared",
+ "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "fileUpload",
"path": "x-pack/plugins/file_upload/server/routes.ts"
@@ -14721,6 +14717,10 @@
"plugin": "fileUpload",
"path": "x-pack/plugins/file_upload/server/routes.ts"
},
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "maps",
"path": "x-pack/plugins/maps/server/data_indexing/indexing_routes.ts"
@@ -15109,14 +15109,6 @@
"plugin": "@kbn/core-http-router-server-mocks",
"path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts"
},
- {
- "plugin": "logsShared",
- "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
- {
- "plugin": "infra",
- "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
- },
{
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/custom_elements/delete.ts"
@@ -15125,6 +15117,14 @@
"plugin": "canvas",
"path": "x-pack/plugins/canvas/server/routes/workpad/delete.ts"
},
+ {
+ "plugin": "logsShared",
+ "path": "x-pack/plugins/logs_shared/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
+ {
+ "plugin": "infra",
+ "path": "x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts"
+ },
{
"plugin": "maps",
"path": "x-pack/plugins/maps/server/data_indexing/indexing_routes.ts"
diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx
index f1a9420a6dba2..298398a7f5a54 100644
--- a/api_docs/kbn_core_http_server.mdx
+++ b/api_docs/kbn_core_http_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server
title: "@kbn/core-http-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 a96ffb4fee0d4..17d5d133c2463 100644
--- a/api_docs/kbn_core_http_server_internal.mdx
+++ b/api_docs/kbn_core_http_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal
title: "@kbn/core-http-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 f67324d54b8f4..51baa670cab43 100644
--- a/api_docs/kbn_core_http_server_mocks.mdx
+++ b/api_docs/kbn_core_http_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks
title: "@kbn/core-http-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-http-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a96a91913ae81..261e646001d24 100644
--- a/api_docs/kbn_core_i18n_browser.mdx
+++ b/api_docs/kbn_core_i18n_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser
title: "@kbn/core-i18n-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 2c3fb7dddb5b2..b7ee03010b886 100644
--- a/api_docs/kbn_core_i18n_browser_mocks.mdx
+++ b/api_docs/kbn_core_i18n_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks
title: "@kbn/core-i18n-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 c1acb799daa47..e7f9952279cf4 100644
--- a/api_docs/kbn_core_i18n_server.mdx
+++ b/api_docs/kbn_core_i18n_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server
title: "@kbn/core-i18n-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 752d43dde339a..e8228cb7d60e4 100644
--- a/api_docs/kbn_core_i18n_server_internal.mdx
+++ b/api_docs/kbn_core_i18n_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal
title: "@kbn/core-i18n-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 15946d8856b5a..7191da5e32a3f 100644
--- a/api_docs/kbn_core_i18n_server_mocks.mdx
+++ b/api_docs/kbn_core_i18n_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks
title: "@kbn/core-i18n-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-i18n-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 9990c6d12c3ea..c467d2d9db7b5 100644
--- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
+++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks
title: "@kbn/core-injected-metadata-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 0322ce21d3a61..0b57a707a4340 100644
--- a/api_docs/kbn_core_integrations_browser_internal.mdx
+++ b/api_docs/kbn_core_integrations_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal
title: "@kbn/core-integrations-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 25332d56bb401..5204c013e6522 100644
--- a/api_docs/kbn_core_integrations_browser_mocks.mdx
+++ b/api_docs/kbn_core_integrations_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks
title: "@kbn/core-integrations-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-integrations-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 3c6c7326baff9..b622e4db7e5ca 100644
--- a/api_docs/kbn_core_lifecycle_browser.mdx
+++ b/api_docs/kbn_core_lifecycle_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser
title: "@kbn/core-lifecycle-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 3516f844e6a8c..a0a5de8e7c817 100644
--- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks
title: "@kbn/core-lifecycle-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a1bd756124637..a2dbc53cfbbf5 100644
--- a/api_docs/kbn_core_lifecycle_server.mdx
+++ b/api_docs/kbn_core_lifecycle_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server
title: "@kbn/core-lifecycle-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 9aab97336ed24..914263632c7dc 100644
--- a/api_docs/kbn_core_lifecycle_server_mocks.mdx
+++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks
title: "@kbn/core-lifecycle-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-lifecycle-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 974185fd2efcf..efb31ba738c76 100644
--- a/api_docs/kbn_core_logging_browser_mocks.mdx
+++ b/api_docs/kbn_core_logging_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks
title: "@kbn/core-logging-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 2a77b6fb5968d..4c69941b73b1c 100644
--- a/api_docs/kbn_core_logging_common_internal.mdx
+++ b/api_docs/kbn_core_logging_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal
title: "@kbn/core-logging-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-common-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 cc2730ee5b6f8..db2a6494b510b 100644
--- a/api_docs/kbn_core_logging_server.mdx
+++ b/api_docs/kbn_core_logging_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server
title: "@kbn/core-logging-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 6c29e1af11ed3..ee9a5d7bec2af 100644
--- a/api_docs/kbn_core_logging_server_internal.mdx
+++ b/api_docs/kbn_core_logging_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal
title: "@kbn/core-logging-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 17f58e583716b..d0925febd283e 100644
--- a/api_docs/kbn_core_logging_server_mocks.mdx
+++ b/api_docs/kbn_core_logging_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks
title: "@kbn/core-logging-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-logging-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a016dda6748a1..83081f4298ff7 100644
--- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal
title: "@kbn/core-metrics-collectors-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 3dfadf831a780..7e051793035e9 100644
--- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks
title: "@kbn/core-metrics-collectors-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 ef9713312b60f..a4ca66623ec38 100644
--- a/api_docs/kbn_core_metrics_server.mdx
+++ b/api_docs/kbn_core_metrics_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server
title: "@kbn/core-metrics-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 837a9c3abc1ca..8975c66a01909 100644
--- a/api_docs/kbn_core_metrics_server_internal.mdx
+++ b/api_docs/kbn_core_metrics_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal
title: "@kbn/core-metrics-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 669e6a6f0e541..c75429f789019 100644
--- a/api_docs/kbn_core_metrics_server_mocks.mdx
+++ b/api_docs/kbn_core_metrics_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks
title: "@kbn/core-metrics-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-metrics-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a6f0d2993a50a..56985d429d014 100644
--- a/api_docs/kbn_core_mount_utils_browser.mdx
+++ b/api_docs/kbn_core_mount_utils_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser
title: "@kbn/core-mount-utils-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-mount-utils-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 82dcf89027474..53c800bf77235 100644
--- a/api_docs/kbn_core_node_server.mdx
+++ b/api_docs/kbn_core_node_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server
title: "@kbn/core-node-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 004a7825bcaab..5b288cdc669fe 100644
--- a/api_docs/kbn_core_node_server_internal.mdx
+++ b/api_docs/kbn_core_node_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal
title: "@kbn/core-node-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 d0eb2e765f638..dac349ca70d9a 100644
--- a/api_docs/kbn_core_node_server_mocks.mdx
+++ b/api_docs/kbn_core_node_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks
title: "@kbn/core-node-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-node-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 8211fe121ad3f..426e2d9d885e2 100644
--- a/api_docs/kbn_core_notifications_browser.mdx
+++ b/api_docs/kbn_core_notifications_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser
title: "@kbn/core-notifications-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 a367383620f51..f1452901935d6 100644
--- a/api_docs/kbn_core_notifications_browser_internal.mdx
+++ b/api_docs/kbn_core_notifications_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal
title: "@kbn/core-notifications-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 0feed1a4dc481..7b1a64a5f00bb 100644
--- a/api_docs/kbn_core_notifications_browser_mocks.mdx
+++ b/api_docs/kbn_core_notifications_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks
title: "@kbn/core-notifications-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-notifications-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 7f50121077049..1ed1d5c2a29f6 100644
--- a/api_docs/kbn_core_overlays_browser.mdx
+++ b/api_docs/kbn_core_overlays_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser
title: "@kbn/core-overlays-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 f28268d85f9ee..f8c3ea677f86c 100644
--- a/api_docs/kbn_core_overlays_browser_internal.mdx
+++ b/api_docs/kbn_core_overlays_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal
title: "@kbn/core-overlays-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 71f1f2870f428..30f96c1e4f43f 100644
--- a/api_docs/kbn_core_overlays_browser_mocks.mdx
+++ b/api_docs/kbn_core_overlays_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks
title: "@kbn/core-overlays-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-overlays-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 f5f0ca49ac3aa..3192af74101fc 100644
--- a/api_docs/kbn_core_plugins_browser.mdx
+++ b/api_docs/kbn_core_plugins_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser
title: "@kbn/core-plugins-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 8197bd50889f6..572c6b1634a23 100644
--- a/api_docs/kbn_core_plugins_browser_mocks.mdx
+++ b/api_docs/kbn_core_plugins_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks
title: "@kbn/core-plugins-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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_server.mdx b/api_docs/kbn_core_plugins_server.mdx
index 19c7afaccde3f..a9822c3d4077d 100644
--- a/api_docs/kbn_core_plugins_server.mdx
+++ b/api_docs/kbn_core_plugins_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server
title: "@kbn/core-plugins-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 abb50e8d40852..a7daae67a7a2d 100644
--- a/api_docs/kbn_core_plugins_server_mocks.mdx
+++ b/api_docs/kbn_core_plugins_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks
title: "@kbn/core-plugins-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-plugins-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 e6b8d44f41d8b..68f95feb68b9f 100644
--- a/api_docs/kbn_core_preboot_server.mdx
+++ b/api_docs/kbn_core_preboot_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server
title: "@kbn/core-preboot-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 e3b4cfa4588fb..dacfbf9915c25 100644
--- a/api_docs/kbn_core_preboot_server_mocks.mdx
+++ b/api_docs/kbn_core_preboot_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks
title: "@kbn/core-preboot-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-preboot-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks']
---
import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx
index a15f7b5970710..d286e2d69b056 100644
--- a/api_docs/kbn_core_rendering_browser_mocks.mdx
+++ b/api_docs/kbn_core_rendering_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks
title: "@kbn/core-rendering-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 ffd669a1e801e..5a7b7cb7a1fe1 100644
--- a/api_docs/kbn_core_rendering_server_internal.mdx
+++ b/api_docs/kbn_core_rendering_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal
title: "@kbn/core-rendering-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 2829f1442d7df..3359aaded3d2d 100644
--- a/api_docs/kbn_core_rendering_server_mocks.mdx
+++ b/api_docs/kbn_core_rendering_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks
title: "@kbn/core-rendering-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-rendering-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a1470d638f330..4863232770f61 100644
--- a/api_docs/kbn_core_root_server_internal.mdx
+++ b/api_docs/kbn_core_root_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal
title: "@kbn/core-root-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-root-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 e83b208794440..5a2d7db857479 100644
--- a/api_docs/kbn_core_saved_objects_api_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_api_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser
title: "@kbn/core-saved-objects-api-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 2420e3603c5eb..39530ce692860 100644
--- a/api_docs/kbn_core_saved_objects_api_server.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server
title: "@kbn/core-saved-objects-api-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 add3549a127fa..24f0dea6e5c04 100644
--- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks
title: "@kbn/core-saved-objects-api-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 fdd88c1aa1869..7d22f6aa11a17 100644
--- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal
title: "@kbn/core-saved-objects-base-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 c7510a30ff213..8c67cb966603a 100644
--- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks
title: "@kbn/core-saved-objects-base-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 9ace18c845371..e971f33061cd7 100644
--- a/api_docs/kbn_core_saved_objects_browser.mdx
+++ b/api_docs/kbn_core_saved_objects_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser
title: "@kbn/core-saved-objects-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 09904d03543aa..ee3ac1456960e 100644
--- a/api_docs/kbn_core_saved_objects_browser_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal
title: "@kbn/core-saved-objects-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 c35a0d8b2c798..72855ce3e1eff 100644
--- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks
title: "@kbn/core-saved-objects-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 732f44f569c58..79c45d96b59a4 100644
--- a/api_docs/kbn_core_saved_objects_common.mdx
+++ b/api_docs/kbn_core_saved_objects_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common
title: "@kbn/core-saved-objects-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 28cb0a346cc7d..d4a4fe336bd23 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal
title: "@kbn/core-saved-objects-import-export-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 202a674c2d221..a0fda632df250 100644
--- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks
title: "@kbn/core-saved-objects-import-export-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 3ea27ffed6e3d..32b422843d7e9 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal
title: "@kbn/core-saved-objects-migration-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 fed47eab18bd0..212909e4659f4 100644
--- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks
title: "@kbn/core-saved-objects-migration-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 2af69eecce1fe..ee9337a701759 100644
--- a/api_docs/kbn_core_saved_objects_server.devdocs.json
+++ b/api_docs/kbn_core_saved_objects_server.devdocs.json
@@ -10555,10 +10555,6 @@
"plugin": "securitySolution",
"path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_saved_object_mappings.ts"
},
- {
- "plugin": "visualizations",
- "path": "src/plugins/visualizations/server/saved_objects/visualization.ts"
- },
{
"plugin": "savedSearch",
"path": "src/plugins/saved_search/server/saved_objects/search.ts"
@@ -10575,6 +10571,10 @@
"plugin": "graph",
"path": "x-pack/plugins/graph/server/saved_objects/graph_workspace.ts"
},
+ {
+ "plugin": "visualizations",
+ "path": "src/plugins/visualizations/server/saved_objects/visualization.ts"
+ },
{
"plugin": "maps",
"path": "x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts"
diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx
index afac337ae7dad..a7150e07904cb 100644
--- a/api_docs/kbn_core_saved_objects_server.mdx
+++ b/api_docs/kbn_core_saved_objects_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server
title: "@kbn/core-saved-objects-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 13b3c24264e00..799789f205b97 100644
--- a/api_docs/kbn_core_saved_objects_server_internal.mdx
+++ b/api_docs/kbn_core_saved_objects_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal
title: "@kbn/core-saved-objects-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 66cfea3f106dd..2b463d9af2251 100644
--- a/api_docs/kbn_core_saved_objects_server_mocks.mdx
+++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks
title: "@kbn/core-saved-objects-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 da82559da4d03..8eac443364007 100644
--- a/api_docs/kbn_core_saved_objects_utils_server.mdx
+++ b/api_docs/kbn_core_saved_objects_utils_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server
title: "@kbn/core-saved-objects-utils-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-saved-objects-utils-server plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server']
---
import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json';
diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx
index ab8719fc0005e..a8af77f4e07dd 100644
--- a/api_docs/kbn_core_status_common.mdx
+++ b/api_docs/kbn_core_status_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common
title: "@kbn/core-status-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common']
---
import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json';
diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx
index 4e6661a26f4b3..97e05f1f56e9d 100644
--- a/api_docs/kbn_core_status_common_internal.mdx
+++ b/api_docs/kbn_core_status_common_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal
title: "@kbn/core-status-common-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-common-internal plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal']
---
import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json';
diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx
index 51bca68764d14..2fab3b6865ee1 100644
--- a/api_docs/kbn_core_status_server.mdx
+++ b/api_docs/kbn_core_status_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server
title: "@kbn/core-status-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 920d0bcd76e69..82caac3b7207d 100644
--- a/api_docs/kbn_core_status_server_internal.mdx
+++ b/api_docs/kbn_core_status_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal
title: "@kbn/core-status-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 68cdd48f61caf..0ed44aa66d3a0 100644
--- a/api_docs/kbn_core_status_server_mocks.mdx
+++ b/api_docs/kbn_core_status_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks
title: "@kbn/core-status-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-status-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 426faf14ad724..c6d8bc542ae7e 100644
--- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
+++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters
title: "@kbn/core-test-helpers-deprecations-getters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin
-date: 2023-09-14
+date: 2023-09-18
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 43dadecb6b675..4b781320cf1fe 100644
--- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
+++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser
title: "@kbn/core-test-helpers-http-setup-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 c2588c80c2d4c..5672f3d52aa9b 100644
--- a/api_docs/kbn_core_test_helpers_kbn_server.mdx
+++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server
title: "@kbn/core-test-helpers-kbn-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-kbn-server plugin
-date: 2023-09-14
+date: 2023-09-18
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_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
index 806dd2ddf74c3..258647b6c3505 100644
--- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
+++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer
title: "@kbn/core-test-helpers-so-type-serializer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin
-date: 2023-09-14
+date: 2023-09-18
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 ab36199531b08..b29ba5eb5e17c 100644
--- a/api_docs/kbn_core_test_helpers_test_utils.mdx
+++ b/api_docs/kbn_core_test_helpers_test_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils
title: "@kbn/core-test-helpers-test-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-test-helpers-test-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 87e64b3e9dc6e..3af24d09e0d5f 100644
--- a/api_docs/kbn_core_theme_browser.mdx
+++ b/api_docs/kbn_core_theme_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser
title: "@kbn/core-theme-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 723fdc031cd8c..12e8d0b8989a6 100644
--- a/api_docs/kbn_core_theme_browser_mocks.mdx
+++ b/api_docs/kbn_core_theme_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks
title: "@kbn/core-theme-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-theme-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 a4d5850c6d7f3..b46b10d809e39 100644
--- a/api_docs/kbn_core_ui_settings_browser.mdx
+++ b/api_docs/kbn_core_ui_settings_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser
title: "@kbn/core-ui-settings-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 443d4510da17a..cb27068c19def 100644
--- a/api_docs/kbn_core_ui_settings_browser_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal
title: "@kbn/core-ui-settings-browser-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 10366c7a81a92..dae886fc71071 100644
--- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks
title: "@kbn/core-ui-settings-browser-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-browser-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 0bbd38008d772..c24531d244a0e 100644
--- a/api_docs/kbn_core_ui_settings_common.mdx
+++ b/api_docs/kbn_core_ui_settings_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common
title: "@kbn/core-ui-settings-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 3f38fdf89d796..a7656c32d5db0 100644
--- a/api_docs/kbn_core_ui_settings_server.mdx
+++ b/api_docs/kbn_core_ui_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server
title: "@kbn/core-ui-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 d42ce278136f5..99c46bf0e0f8e 100644
--- a/api_docs/kbn_core_ui_settings_server_internal.mdx
+++ b/api_docs/kbn_core_ui_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal
title: "@kbn/core-ui-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 4592965584fc8..b11a59c15233f 100644
--- a/api_docs/kbn_core_ui_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks
title: "@kbn/core-ui-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-ui-settings-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 06f3590f9d9e7..05b7761d655a8 100644
--- a/api_docs/kbn_core_usage_data_server.mdx
+++ b/api_docs/kbn_core_usage_data_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server
title: "@kbn/core-usage-data-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 83b3e653bc2a2..98a3e7c86f0fc 100644
--- a/api_docs/kbn_core_usage_data_server_internal.mdx
+++ b/api_docs/kbn_core_usage_data_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal
title: "@kbn/core-usage-data-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
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 8ffb29e7099d1..c43e35cb935bb 100644
--- a/api_docs/kbn_core_usage_data_server_mocks.mdx
+++ b/api_docs/kbn_core_usage_data_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks
title: "@kbn/core-usage-data-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-usage-data-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks']
---
import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx
index fd59fd322103d..736a8ca1281a3 100644
--- a/api_docs/kbn_core_user_settings_server.mdx
+++ b/api_docs/kbn_core_user_settings_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server
title: "@kbn/core-user-settings-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server']
---
import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx
index 3d6eeab4a5e3a..5ec810328d0cb 100644
--- a/api_docs/kbn_core_user_settings_server_internal.mdx
+++ b/api_docs/kbn_core_user_settings_server_internal.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal
title: "@kbn/core-user-settings-server-internal"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-internal plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal']
---
import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json';
diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx
index 468f9209653a3..1aaa32301de89 100644
--- a/api_docs/kbn_core_user_settings_server_mocks.mdx
+++ b/api_docs/kbn_core_user_settings_server_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks
title: "@kbn/core-user-settings-server-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/core-user-settings-server-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 6d2c66efaf58d..88e83bf782815 100644
--- a/api_docs/kbn_crypto.mdx
+++ b/api_docs/kbn_crypto.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto
title: "@kbn/crypto"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto plugin
-date: 2023-09-14
+date: 2023-09-18
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 402265ddb45f1..900b43cb49882 100644
--- a/api_docs/kbn_crypto_browser.mdx
+++ b/api_docs/kbn_crypto_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser
title: "@kbn/crypto-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/crypto-browser plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser']
---
import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json';
diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx
index b4f2d3606d4e7..1007fc2590a40 100644
--- a/api_docs/kbn_custom_integrations.mdx
+++ b/api_docs/kbn_custom_integrations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations
title: "@kbn/custom-integrations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/custom-integrations plugin
-date: 2023-09-14
+date: 2023-09-18
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 f68f57dc9f816..ef22f71dada8c 100644
--- a/api_docs/kbn_cypress_config.mdx
+++ b/api_docs/kbn_cypress_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config
title: "@kbn/cypress-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/cypress-config plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config']
---
import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json';
diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx
index e937e3c729b2c..b8406bfeaf364 100644
--- a/api_docs/kbn_data_service.mdx
+++ b/api_docs/kbn_data_service.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service
title: "@kbn/data-service"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/data-service plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service']
---
import kbnDataServiceObj from './kbn_data_service.devdocs.json';
diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx
index ea8ff98efe846..17344e3694c95 100644
--- a/api_docs/kbn_datemath.mdx
+++ b/api_docs/kbn_datemath.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath
title: "@kbn/datemath"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/datemath plugin
-date: 2023-09-14
+date: 2023-09-18
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 84a272a284f97..38b0b339633da 100644
--- a/api_docs/kbn_deeplinks_analytics.mdx
+++ b/api_docs/kbn_deeplinks_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics
title: "@kbn/deeplinks-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-analytics plugin
-date: 2023-09-14
+date: 2023-09-18
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 9ebcd52088c75..9b2cd1dd73e46 100644
--- a/api_docs/kbn_deeplinks_devtools.mdx
+++ b/api_docs/kbn_deeplinks_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools
title: "@kbn/deeplinks-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-devtools plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools']
---
import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json';
diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx
index eda0c8946c248..e23a5569093cd 100644
--- a/api_docs/kbn_deeplinks_management.mdx
+++ b/api_docs/kbn_deeplinks_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management
title: "@kbn/deeplinks-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-management plugin
-date: 2023-09-14
+date: 2023-09-18
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 a48227bed454c..d26d4bdd1015c 100644
--- a/api_docs/kbn_deeplinks_ml.mdx
+++ b/api_docs/kbn_deeplinks_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml
title: "@kbn/deeplinks-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-ml plugin
-date: 2023-09-14
+date: 2023-09-18
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 8c0262e7e0169..13a36afd533b6 100644
--- a/api_docs/kbn_deeplinks_observability.mdx
+++ b/api_docs/kbn_deeplinks_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability
title: "@kbn/deeplinks-observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-observability plugin
-date: 2023-09-14
+date: 2023-09-18
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 691a7af9f0c12..2534468bae29b 100644
--- a/api_docs/kbn_deeplinks_search.mdx
+++ b/api_docs/kbn_deeplinks_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search
title: "@kbn/deeplinks-search"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/deeplinks-search plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search']
---
import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json';
diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx
index 08a7afa549976..2b06c2bb2042a 100644
--- a/api_docs/kbn_default_nav_analytics.mdx
+++ b/api_docs/kbn_default_nav_analytics.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics
title: "@kbn/default-nav-analytics"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-analytics plugin
-date: 2023-09-14
+date: 2023-09-18
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 7c5d8f4e48386..d7fc0710f0c04 100644
--- a/api_docs/kbn_default_nav_devtools.mdx
+++ b/api_docs/kbn_default_nav_devtools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools
title: "@kbn/default-nav-devtools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-devtools plugin
-date: 2023-09-14
+date: 2023-09-18
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 26e3ce6933cd4..9b0714523566e 100644
--- a/api_docs/kbn_default_nav_management.mdx
+++ b/api_docs/kbn_default_nav_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management
title: "@kbn/default-nav-management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-management plugin
-date: 2023-09-14
+date: 2023-09-18
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 117f01f9ccc77..1be19bb4c38ea 100644
--- a/api_docs/kbn_default_nav_ml.mdx
+++ b/api_docs/kbn_default_nav_ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml
title: "@kbn/default-nav-ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/default-nav-ml plugin
-date: 2023-09-14
+date: 2023-09-18
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 7a9d4a4e7f555..47c5d25300748 100644
--- a/api_docs/kbn_dev_cli_errors.mdx
+++ b/api_docs/kbn_dev_cli_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors
title: "@kbn/dev-cli-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-errors plugin
-date: 2023-09-14
+date: 2023-09-18
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 7930f66a603c1..043cd313f02ae 100644
--- a/api_docs/kbn_dev_cli_runner.mdx
+++ b/api_docs/kbn_dev_cli_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner
title: "@kbn/dev-cli-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-cli-runner plugin
-date: 2023-09-14
+date: 2023-09-18
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 b568836c5f628..95d2fd6e024b9 100644
--- a/api_docs/kbn_dev_proc_runner.mdx
+++ b/api_docs/kbn_dev_proc_runner.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner
title: "@kbn/dev-proc-runner"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-proc-runner plugin
-date: 2023-09-14
+date: 2023-09-18
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 252b4e0cdc5d0..753c14572dfc4 100644
--- a/api_docs/kbn_dev_utils.mdx
+++ b/api_docs/kbn_dev_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils
title: "@kbn/dev-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dev-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils']
---
import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json';
diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx
index 9196470355b68..ecca452457fea 100644
--- a/api_docs/kbn_discover_utils.mdx
+++ b/api_docs/kbn_discover_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils
title: "@kbn/discover-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/discover-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 1c58a1d31e1d0..edec1337ab437 100644
--- a/api_docs/kbn_doc_links.mdx
+++ b/api_docs/kbn_doc_links.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links
title: "@kbn/doc-links"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/doc-links plugin
-date: 2023-09-14
+date: 2023-09-18
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 e4bcef45d816a..3be23a991425c 100644
--- a/api_docs/kbn_docs_utils.mdx
+++ b/api_docs/kbn_docs_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils
title: "@kbn/docs-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/docs-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 d7b92de184d4d..02143a5104363 100644
--- a/api_docs/kbn_dom_drag_drop.mdx
+++ b/api_docs/kbn_dom_drag_drop.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop
title: "@kbn/dom-drag-drop"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/dom-drag-drop plugin
-date: 2023-09-14
+date: 2023-09-18
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 7388513782a13..75ecd6c5cf4a9 100644
--- a/api_docs/kbn_ebt_tools.mdx
+++ b/api_docs/kbn_ebt_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools
title: "@kbn/ebt-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ebt-tools plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools']
---
import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json';
diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx
index 0843aa27ff8c5..1f2687ca6997e 100644
--- a/api_docs/kbn_ecs.mdx
+++ b/api_docs/kbn_ecs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs
title: "@kbn/ecs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ecs plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs']
---
import kbnEcsObj from './kbn_ecs.devdocs.json';
diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx
index b353843e9e332..63be0ad1b7d9f 100644
--- a/api_docs/kbn_ecs_data_quality_dashboard.mdx
+++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard
title: "@kbn/ecs-data-quality-dashboard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ecs-data-quality-dashboard plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard']
---
import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json';
diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx
index 1ba4e728e49b7..ed958ef6c2198 100644
--- a/api_docs/kbn_elastic_assistant.mdx
+++ b/api_docs/kbn_elastic_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant
title: "@kbn/elastic-assistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/elastic-assistant plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant']
---
import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json';
diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx
index 89ff7c10892f4..3149649da72e8 100644
--- a/api_docs/kbn_es.mdx
+++ b/api_docs/kbn_es.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es
title: "@kbn/es"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es plugin
-date: 2023-09-14
+date: 2023-09-18
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 28c637702b55c..4e1af85d1a805 100644
--- a/api_docs/kbn_es_archiver.mdx
+++ b/api_docs/kbn_es_archiver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver
title: "@kbn/es-archiver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-archiver plugin
-date: 2023-09-14
+date: 2023-09-18
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 34c58173357d0..43ff688e3bc5c 100644
--- a/api_docs/kbn_es_errors.mdx
+++ b/api_docs/kbn_es_errors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors
title: "@kbn/es-errors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-errors plugin
-date: 2023-09-14
+date: 2023-09-18
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 1066715039485..9523f191412e4 100644
--- a/api_docs/kbn_es_query.mdx
+++ b/api_docs/kbn_es_query.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query
title: "@kbn/es-query"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-query plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query']
---
import kbnEsQueryObj from './kbn_es_query.devdocs.json';
diff --git a/api_docs/kbn_es_types.devdocs.json b/api_docs/kbn_es_types.devdocs.json
index 7b364b08e03a3..37cab03f85e11 100644
--- a/api_docs/kbn_es_types.devdocs.json
+++ b/api_docs/kbn_es_types.devdocs.json
@@ -20,6 +20,100 @@
"classes": [],
"functions": [],
"interfaces": [
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails",
+ "type": "Interface",
+ "tags": [],
+ "label": "ClusterDetails",
+ "description": [],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails.status",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "status",
+ "description": [],
+ "signature": [
+ "\"running\" | \"failed\" | \"partial\" | \"skipped\" | \"successful\""
+ ],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails.indices",
+ "type": "string",
+ "tags": [],
+ "label": "indices",
+ "description": [],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails.took",
+ "type": "number",
+ "tags": [],
+ "label": "took",
+ "description": [],
+ "signature": [
+ "number | undefined"
+ ],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails.timed_out",
+ "type": "boolean",
+ "tags": [],
+ "label": "timed_out",
+ "description": [],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails._shards",
+ "type": "Object",
+ "tags": [],
+ "label": "_shards",
+ "description": [],
+ "signature": [
+ "ShardStatistics",
+ " | undefined"
+ ],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
+ {
+ "parentPluginId": "@kbn/es-types",
+ "id": "def-common.ClusterDetails.failures",
+ "type": "Array",
+ "tags": [],
+ "label": "failures",
+ "description": [],
+ "signature": [
+ "ShardFailure",
+ "[] | undefined"
+ ],
+ "path": "packages/kbn-es-types/src/search.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "initialIsOpen": false
+ },
{
"parentPluginId": "@kbn/es-types",
"id": "def-common.ESSearchOptions",
diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx
index 836c776c853d3..9eec8a4311789 100644
--- a/api_docs/kbn_es_types.mdx
+++ b/api_docs/kbn_es_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types
title: "@kbn/es-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/es-types plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types']
---
import kbnEsTypesObj from './kbn_es_types.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 12 | 0 | 12 | 0 |
+| 19 | 0 | 19 | 0 |
## Common
diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx
index 072dee410b69f..17fbcc350321a 100644
--- a/api_docs/kbn_eslint_plugin_imports.mdx
+++ b/api_docs/kbn_eslint_plugin_imports.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports
title: "@kbn/eslint-plugin-imports"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/eslint-plugin-imports plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports']
---
import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json';
diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx
index a214bd2bd202e..a3da0c0af61dc 100644
--- a/api_docs/kbn_event_annotation_common.mdx
+++ b/api_docs/kbn_event_annotation_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common
title: "@kbn/event-annotation-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 f51d5e245f997..f9b6795731703 100644
--- a/api_docs/kbn_event_annotation_components.mdx
+++ b/api_docs/kbn_event_annotation_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components
title: "@kbn/event-annotation-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/event-annotation-components plugin
-date: 2023-09-14
+date: 2023-09-18
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 fd0f9cc61e2b2..661fa78f6edd3 100644
--- a/api_docs/kbn_expandable_flyout.mdx
+++ b/api_docs/kbn_expandable_flyout.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout
title: "@kbn/expandable-flyout"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/expandable-flyout plugin
-date: 2023-09-14
+date: 2023-09-18
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 994d098957d04..0ba1019cc85a5 100644
--- a/api_docs/kbn_field_types.mdx
+++ b/api_docs/kbn_field_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types
title: "@kbn/field-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/field-types plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types']
---
import kbnFieldTypesObj from './kbn_field_types.devdocs.json';
diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx
index 3fc220ae3faa2..8a350c19db31d 100644
--- a/api_docs/kbn_find_used_node_modules.mdx
+++ b/api_docs/kbn_find_used_node_modules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules
title: "@kbn/find-used-node-modules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/find-used-node-modules plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules']
---
import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json';
diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx
index 3a1d3920ab33b..4d44fd3ed2377 100644
--- a/api_docs/kbn_ftr_common_functional_services.mdx
+++ b/api_docs/kbn_ftr_common_functional_services.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services
title: "@kbn/ftr-common-functional-services"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ftr-common-functional-services plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services']
---
import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json';
diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx
index 1c9f4f29d9916..521831ed4f87f 100644
--- a/api_docs/kbn_generate.mdx
+++ b/api_docs/kbn_generate.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate
title: "@kbn/generate"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate plugin
-date: 2023-09-14
+date: 2023-09-18
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 5fb0099ea25a7..32e35f6c68937 100644
--- a/api_docs/kbn_generate_console_definitions.mdx
+++ b/api_docs/kbn_generate_console_definitions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions
title: "@kbn/generate-console-definitions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-console-definitions plugin
-date: 2023-09-14
+date: 2023-09-18
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 cf6ac3b59e77c..0f0675b7e72aa 100644
--- a/api_docs/kbn_generate_csv.mdx
+++ b/api_docs/kbn_generate_csv.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv
title: "@kbn/generate-csv"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-csv plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv']
---
import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json';
diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx
index e435c1147127c..ad504d5ef9879 100644
--- a/api_docs/kbn_generate_csv_types.mdx
+++ b/api_docs/kbn_generate_csv_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types
title: "@kbn/generate-csv-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/generate-csv-types plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types']
---
import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json';
diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx
index ecac237884d1f..d7ff6d91a93e1 100644
--- a/api_docs/kbn_guided_onboarding.mdx
+++ b/api_docs/kbn_guided_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding
title: "@kbn/guided-onboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/guided-onboarding plugin
-date: 2023-09-14
+date: 2023-09-18
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 64d797f32e392..1ae352ca4528a 100644
--- a/api_docs/kbn_handlebars.mdx
+++ b/api_docs/kbn_handlebars.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars
title: "@kbn/handlebars"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/handlebars plugin
-date: 2023-09-14
+date: 2023-09-18
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 ffff5f3cd5b7f..2fcd643d290eb 100644
--- a/api_docs/kbn_hapi_mocks.mdx
+++ b/api_docs/kbn_hapi_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks
title: "@kbn/hapi-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/hapi-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 7d6a310835867..9d42b1ed35d60 100644
--- a/api_docs/kbn_health_gateway_server.mdx
+++ b/api_docs/kbn_health_gateway_server.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server
title: "@kbn/health-gateway-server"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/health-gateway-server plugin
-date: 2023-09-14
+date: 2023-09-18
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 cf2ff5525a876..9a21e2763d6ae 100644
--- a/api_docs/kbn_home_sample_data_card.mdx
+++ b/api_docs/kbn_home_sample_data_card.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card
title: "@kbn/home-sample-data-card"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-card plugin
-date: 2023-09-14
+date: 2023-09-18
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 5abf26c4f193a..d46698414584f 100644
--- a/api_docs/kbn_home_sample_data_tab.mdx
+++ b/api_docs/kbn_home_sample_data_tab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab
title: "@kbn/home-sample-data-tab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/home-sample-data-tab plugin
-date: 2023-09-14
+date: 2023-09-18
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 2a58622d1e73e..b23047fdb0988 100644
--- a/api_docs/kbn_i18n.mdx
+++ b/api_docs/kbn_i18n.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n
title: "@kbn/i18n"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n plugin
-date: 2023-09-14
+date: 2023-09-18
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 99279d187f7d2..84164e1c1021a 100644
--- a/api_docs/kbn_i18n_react.mdx
+++ b/api_docs/kbn_i18n_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react
title: "@kbn/i18n-react"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/i18n-react plugin
-date: 2023-09-14
+date: 2023-09-18
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 5058aace33308..03ee64eadafd9 100644
--- a/api_docs/kbn_import_resolver.mdx
+++ b/api_docs/kbn_import_resolver.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver
title: "@kbn/import-resolver"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/import-resolver plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver']
---
import kbnImportResolverObj from './kbn_import_resolver.devdocs.json';
diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx
index 9ac8718e3bed8..0dfcbf4a6d448 100644
--- a/api_docs/kbn_infra_forge.mdx
+++ b/api_docs/kbn_infra_forge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge
title: "@kbn/infra-forge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/infra-forge plugin
-date: 2023-09-14
+date: 2023-09-18
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 2ebcceaf52377..dc69d4fe7e3d3 100644
--- a/api_docs/kbn_interpreter.mdx
+++ b/api_docs/kbn_interpreter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter
title: "@kbn/interpreter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/interpreter plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter']
---
import kbnInterpreterObj from './kbn_interpreter.devdocs.json';
diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx
index 0404ed68cdb1f..980c4e4602d5f 100644
--- a/api_docs/kbn_io_ts_utils.mdx
+++ b/api_docs/kbn_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils
title: "@kbn/io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/io-ts-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils']
---
import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json';
diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx
index e0f9f068062d1..40bea63cfb251 100644
--- a/api_docs/kbn_jest_serializers.mdx
+++ b/api_docs/kbn_jest_serializers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers
title: "@kbn/jest-serializers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/jest-serializers plugin
-date: 2023-09-14
+date: 2023-09-18
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 5e3f0ce648169..8922002ca31d2 100644
--- a/api_docs/kbn_journeys.mdx
+++ b/api_docs/kbn_journeys.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys
title: "@kbn/journeys"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/journeys plugin
-date: 2023-09-14
+date: 2023-09-18
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 fe925e1ccef9e..1fd48308f8597 100644
--- a/api_docs/kbn_json_ast.mdx
+++ b/api_docs/kbn_json_ast.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast
title: "@kbn/json-ast"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/json-ast plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast']
---
import kbnJsonAstObj from './kbn_json_ast.devdocs.json';
diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx
index e6a7507a9dca2..14efba7045ebf 100644
--- a/api_docs/kbn_kibana_manifest_schema.mdx
+++ b/api_docs/kbn_kibana_manifest_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema
title: "@kbn/kibana-manifest-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/kibana-manifest-schema plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema']
---
import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json';
diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx
index c8e3d92d65f22..38ed5fa7534a9 100644
--- a/api_docs/kbn_language_documentation_popover.mdx
+++ b/api_docs/kbn_language_documentation_popover.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover
title: "@kbn/language-documentation-popover"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/language-documentation-popover plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover']
---
import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json';
diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx
index 512f4c1fa3ace..ba74e3f5d29c4 100644
--- a/api_docs/kbn_lens_embeddable_utils.mdx
+++ b/api_docs/kbn_lens_embeddable_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils
title: "@kbn/lens-embeddable-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/lens-embeddable-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils']
---
import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json';
diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx
index cf8e7b3840b89..44fc76a2206a1 100644
--- a/api_docs/kbn_logging.mdx
+++ b/api_docs/kbn_logging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging
title: "@kbn/logging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging plugin
-date: 2023-09-14
+date: 2023-09-18
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 d01bce98b250e..4261974ca6180 100644
--- a/api_docs/kbn_logging_mocks.mdx
+++ b/api_docs/kbn_logging_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks
title: "@kbn/logging-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/logging-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks']
---
import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json';
diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx
index 1b0c3a81d7747..b70b0c568806e 100644
--- a/api_docs/kbn_managed_vscode_config.mdx
+++ b/api_docs/kbn_managed_vscode_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config
title: "@kbn/managed-vscode-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/managed-vscode-config plugin
-date: 2023-09-14
+date: 2023-09-18
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 731a39b4a0759..486f24f9706ee 100644
--- a/api_docs/kbn_management_cards_navigation.mdx
+++ b/api_docs/kbn_management_cards_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation
title: "@kbn/management-cards-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-cards-navigation plugin
-date: 2023-09-14
+date: 2023-09-18
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_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx
index deb1878538c85..e86271e016cd4 100644
--- a/api_docs/kbn_management_settings_components_field_input.mdx
+++ b/api_docs/kbn_management_settings_components_field_input.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input
title: "@kbn/management-settings-components-field-input"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-input plugin
-date: 2023-09-14
+date: 2023-09-18
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 2486a1bbea21a..eac7cac6eda48 100644
--- a/api_docs/kbn_management_settings_components_field_row.mdx
+++ b/api_docs/kbn_management_settings_components_field_row.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row
title: "@kbn/management-settings-components-field-row"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-components-field-row plugin
-date: 2023-09-14
+date: 2023-09-18
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_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx
index 5fde65dc8c8e9..76004044100b4 100644
--- a/api_docs/kbn_management_settings_field_definition.mdx
+++ b/api_docs/kbn_management_settings_field_definition.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition
title: "@kbn/management-settings-field-definition"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-field-definition plugin
-date: 2023-09-14
+date: 2023-09-18
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 1154b21edec99..ae544efb2c8dc 100644
--- a/api_docs/kbn_management_settings_ids.mdx
+++ b/api_docs/kbn_management_settings_ids.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids
title: "@kbn/management-settings-ids"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-ids plugin
-date: 2023-09-14
+date: 2023-09-18
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 3601315e30b87..84b6ad70d01a3 100644
--- a/api_docs/kbn_management_settings_section_registry.mdx
+++ b/api_docs/kbn_management_settings_section_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry
title: "@kbn/management-settings-section-registry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-section-registry plugin
-date: 2023-09-14
+date: 2023-09-18
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 56d44aa6d6f1f..d99f7f91b01ee 100644
--- a/api_docs/kbn_management_settings_types.mdx
+++ b/api_docs/kbn_management_settings_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types
title: "@kbn/management-settings-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 1fe994beecc27..eee12d35d8594 100644
--- a/api_docs/kbn_management_settings_utilities.mdx
+++ b/api_docs/kbn_management_settings_utilities.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities
title: "@kbn/management-settings-utilities"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-settings-utilities plugin
-date: 2023-09-14
+date: 2023-09-18
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 516d37b6560d1..cbd41ac3a1787 100644
--- a/api_docs/kbn_management_storybook_config.mdx
+++ b/api_docs/kbn_management_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config
title: "@kbn/management-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/management-storybook-config plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config']
---
import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx
index faf983b8c2848..b6962455b897e 100644
--- a/api_docs/kbn_mapbox_gl.mdx
+++ b/api_docs/kbn_mapbox_gl.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl
title: "@kbn/mapbox-gl"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/mapbox-gl plugin
-date: 2023-09-14
+date: 2023-09-18
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 c9169c7a742c8..c7d8b47e11d9c 100644
--- a/api_docs/kbn_maps_vector_tile_utils.mdx
+++ b/api_docs/kbn_maps_vector_tile_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils
title: "@kbn/maps-vector-tile-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/maps-vector-tile-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 9d09acf46725f..e61753b7c22f4 100644
--- a/api_docs/kbn_ml_agg_utils.mdx
+++ b/api_docs/kbn_ml_agg_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils
title: "@kbn/ml-agg-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-agg-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 dfbce3358cc19..de021f02fc0f5 100644
--- a/api_docs/kbn_ml_anomaly_utils.mdx
+++ b/api_docs/kbn_ml_anomaly_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils
title: "@kbn/ml-anomaly-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-anomaly-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils']
---
import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx
index da174530aea8b..dc4bfeedc783e 100644
--- a/api_docs/kbn_ml_category_validator.mdx
+++ b/api_docs/kbn_ml_category_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator
title: "@kbn/ml-category-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-category-validator plugin
-date: 2023-09-14
+date: 2023-09-18
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_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
index 6060c29616f76..c16d1e942bd0a 100644
--- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx
+++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils
title: "@kbn/ml-data-frame-analytics-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-frame-analytics-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 51d7c0f5233b2..b03e9c9a50664 100644
--- a/api_docs/kbn_ml_data_grid.mdx
+++ b/api_docs/kbn_ml_data_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid
title: "@kbn/ml-data-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-data-grid plugin
-date: 2023-09-14
+date: 2023-09-18
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 de595129f47a2..d81a340525546 100644
--- a/api_docs/kbn_ml_date_picker.mdx
+++ b/api_docs/kbn_ml_date_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker
title: "@kbn/ml-date-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-picker plugin
-date: 2023-09-14
+date: 2023-09-18
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 1babbce038986..ce66be19e0779 100644
--- a/api_docs/kbn_ml_date_utils.mdx
+++ b/api_docs/kbn_ml_date_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils
title: "@kbn/ml-date-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-date-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 41edd5cdb082b..ab86773a41e73 100644
--- a/api_docs/kbn_ml_error_utils.mdx
+++ b/api_docs/kbn_ml_error_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils
title: "@kbn/ml-error-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-error-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils']
---
import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx
index e014bb5bef501..a1d612ccf01d7 100644
--- a/api_docs/kbn_ml_in_memory_table.mdx
+++ b/api_docs/kbn_ml_in_memory_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table
title: "@kbn/ml-in-memory-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-in-memory-table plugin
-date: 2023-09-14
+date: 2023-09-18
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 d5081aa7708b8..e4ae50a5cc6af 100644
--- a/api_docs/kbn_ml_is_defined.mdx
+++ b/api_docs/kbn_ml_is_defined.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined
title: "@kbn/ml-is-defined"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-defined plugin
-date: 2023-09-14
+date: 2023-09-18
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 ab2ad4fe9e9b8..807cab5731d13 100644
--- a/api_docs/kbn_ml_is_populated_object.mdx
+++ b/api_docs/kbn_ml_is_populated_object.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object
title: "@kbn/ml-is-populated-object"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-is-populated-object plugin
-date: 2023-09-14
+date: 2023-09-18
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 303015211d79c..6e4a983975f49 100644
--- a/api_docs/kbn_ml_kibana_theme.mdx
+++ b/api_docs/kbn_ml_kibana_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme
title: "@kbn/ml-kibana-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-kibana-theme plugin
-date: 2023-09-14
+date: 2023-09-18
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 8ca1334f68f4a..37c7405981d6d 100644
--- a/api_docs/kbn_ml_local_storage.mdx
+++ b/api_docs/kbn_ml_local_storage.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage
title: "@kbn/ml-local-storage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-local-storage plugin
-date: 2023-09-14
+date: 2023-09-18
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 372d9706d3085..add1b5059ef85 100644
--- a/api_docs/kbn_ml_nested_property.mdx
+++ b/api_docs/kbn_ml_nested_property.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property
title: "@kbn/ml-nested-property"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-nested-property plugin
-date: 2023-09-14
+date: 2023-09-18
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 d821e2e580ab7..01878ec950d56 100644
--- a/api_docs/kbn_ml_number_utils.mdx
+++ b/api_docs/kbn_ml_number_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils
title: "@kbn/ml-number-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-number-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils']
---
import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx
index 67875c6b64084..a5745e288a26f 100644
--- a/api_docs/kbn_ml_query_utils.mdx
+++ b/api_docs/kbn_ml_query_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils
title: "@kbn/ml-query-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-query-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 19c752789f91f..1eab46981de16 100644
--- a/api_docs/kbn_ml_random_sampler_utils.mdx
+++ b/api_docs/kbn_ml_random_sampler_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils
title: "@kbn/ml-random-sampler-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-random-sampler-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 581ae125a9639..08d14a07501f7 100644
--- a/api_docs/kbn_ml_route_utils.mdx
+++ b/api_docs/kbn_ml_route_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils
title: "@kbn/ml-route-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-route-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 cbbf0b11237d1..fbe70cd84d797 100644
--- a/api_docs/kbn_ml_runtime_field_utils.mdx
+++ b/api_docs/kbn_ml_runtime_field_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils
title: "@kbn/ml-runtime-field-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-runtime-field-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 ab68d7e40e6ce..d86ec5423e505 100644
--- a/api_docs/kbn_ml_string_hash.mdx
+++ b/api_docs/kbn_ml_string_hash.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash
title: "@kbn/ml-string-hash"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-string-hash plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash']
---
import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json';
diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx
index 1c0a1d837d374..64f146d953e4f 100644
--- a/api_docs/kbn_ml_trained_models_utils.mdx
+++ b/api_docs/kbn_ml_trained_models_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils
title: "@kbn/ml-trained-models-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-trained-models-utils plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils']
---
import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json';
diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx
index 35fa94cf16087..1b68b5a668931 100644
--- a/api_docs/kbn_ml_url_state.mdx
+++ b/api_docs/kbn_ml_url_state.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state
title: "@kbn/ml-url-state"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ml-url-state plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state']
---
import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json';
diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx
index a850307aa3e2a..ba8fadbd9f1d9 100644
--- a/api_docs/kbn_monaco.mdx
+++ b/api_docs/kbn_monaco.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco
title: "@kbn/monaco"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/monaco plugin
-date: 2023-09-14
+date: 2023-09-18
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 52bbe51a7d3be..bedc7d19b1f82 100644
--- a/api_docs/kbn_object_versioning.mdx
+++ b/api_docs/kbn_object_versioning.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning
title: "@kbn/object-versioning"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/object-versioning plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning']
---
import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json';
diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx
index 591a7c52ba5a2..a660a81c7f964 100644
--- a/api_docs/kbn_observability_alert_details.mdx
+++ b/api_docs/kbn_observability_alert_details.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details
title: "@kbn/observability-alert-details"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/observability-alert-details plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details']
---
import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json';
diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx
index eb6f2c703fe14..f7c61706a1f21 100644
--- a/api_docs/kbn_optimizer.mdx
+++ b/api_docs/kbn_optimizer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer
title: "@kbn/optimizer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer plugin
-date: 2023-09-14
+date: 2023-09-18
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 26f754927bd8b..7d41c629bcd52 100644
--- a/api_docs/kbn_optimizer_webpack_helpers.mdx
+++ b/api_docs/kbn_optimizer_webpack_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers
title: "@kbn/optimizer-webpack-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/optimizer-webpack-helpers plugin
-date: 2023-09-14
+date: 2023-09-18
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 504e006161dde..4d90531ba9d5e 100644
--- a/api_docs/kbn_osquery_io_ts_types.mdx
+++ b/api_docs/kbn_osquery_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types
title: "@kbn/osquery-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/osquery-io-ts-types plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types']
---
import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json';
diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx
index 2ba81e7f255ca..05f4a33b937b3 100644
--- a/api_docs/kbn_performance_testing_dataset_extractor.mdx
+++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor
title: "@kbn/performance-testing-dataset-extractor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/performance-testing-dataset-extractor plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor']
---
import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json';
diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx
index 71f99b22df5eb..a241d0e6c04ce 100644
--- a/api_docs/kbn_plugin_generator.mdx
+++ b/api_docs/kbn_plugin_generator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator
title: "@kbn/plugin-generator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-generator plugin
-date: 2023-09-14
+date: 2023-09-18
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 1bd90b4d11f7f..14208a7e8e820 100644
--- a/api_docs/kbn_plugin_helpers.mdx
+++ b/api_docs/kbn_plugin_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers
title: "@kbn/plugin-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/plugin-helpers plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers']
---
import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json';
diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx
index 2e27bb4c68a28..4915ab0f1f4fd 100644
--- a/api_docs/kbn_profiling_utils.mdx
+++ b/api_docs/kbn_profiling_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils
title: "@kbn/profiling-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/profiling-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 477dafb3ec330..8ddfb291e3b6a 100644
--- a/api_docs/kbn_random_sampling.mdx
+++ b/api_docs/kbn_random_sampling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling
title: "@kbn/random-sampling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/random-sampling plugin
-date: 2023-09-14
+date: 2023-09-18
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 1c0d5b1c1d61a..4bcb5ed044922 100644
--- a/api_docs/kbn_react_field.mdx
+++ b/api_docs/kbn_react_field.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field
title: "@kbn/react-field"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-field plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field']
---
import kbnReactFieldObj from './kbn_react_field.devdocs.json';
diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx
index f79dc0412d77e..b1cd27a8dfd4d 100644
--- a/api_docs/kbn_react_kibana_context_common.mdx
+++ b/api_docs/kbn_react_kibana_context_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common
title: "@kbn/react-kibana-context-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-common plugin
-date: 2023-09-14
+date: 2023-09-18
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 d7647c1a488bc..eabdf6c60fcbb 100644
--- a/api_docs/kbn_react_kibana_context_render.mdx
+++ b/api_docs/kbn_react_kibana_context_render.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render
title: "@kbn/react-kibana-context-render"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-render plugin
-date: 2023-09-14
+date: 2023-09-18
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 69ee7b24992b8..dc72e40f42eb3 100644
--- a/api_docs/kbn_react_kibana_context_root.mdx
+++ b/api_docs/kbn_react_kibana_context_root.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root
title: "@kbn/react-kibana-context-root"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-root plugin
-date: 2023-09-14
+date: 2023-09-18
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 5120b8d20ce12..67d4c1be49a5c 100644
--- a/api_docs/kbn_react_kibana_context_styled.mdx
+++ b/api_docs/kbn_react_kibana_context_styled.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled
title: "@kbn/react-kibana-context-styled"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-styled plugin
-date: 2023-09-14
+date: 2023-09-18
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 b1d8235baf9a0..f976d9614b830 100644
--- a/api_docs/kbn_react_kibana_context_theme.mdx
+++ b/api_docs/kbn_react_kibana_context_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme
title: "@kbn/react-kibana-context-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-context-theme plugin
-date: 2023-09-14
+date: 2023-09-18
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 b4987ba08e900..6438631017692 100644
--- a/api_docs/kbn_react_kibana_mount.mdx
+++ b/api_docs/kbn_react_kibana_mount.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount
title: "@kbn/react-kibana-mount"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/react-kibana-mount plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount']
---
import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json';
diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx
index bf6f2dded5944..77919a302b08e 100644
--- a/api_docs/kbn_repo_file_maps.mdx
+++ b/api_docs/kbn_repo_file_maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps
title: "@kbn/repo-file-maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-file-maps plugin
-date: 2023-09-14
+date: 2023-09-18
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 4313545c41d0a..3bcc2a6abcf1e 100644
--- a/api_docs/kbn_repo_linter.mdx
+++ b/api_docs/kbn_repo_linter.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter
title: "@kbn/repo-linter"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-linter plugin
-date: 2023-09-14
+date: 2023-09-18
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 c5de295576a1f..b8d4c507e5426 100644
--- a/api_docs/kbn_repo_path.mdx
+++ b/api_docs/kbn_repo_path.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path
title: "@kbn/repo-path"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-path plugin
-date: 2023-09-14
+date: 2023-09-18
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 2caf813b19870..2d7d1f6344944 100644
--- a/api_docs/kbn_repo_source_classifier.mdx
+++ b/api_docs/kbn_repo_source_classifier.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier
title: "@kbn/repo-source-classifier"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/repo-source-classifier plugin
-date: 2023-09-14
+date: 2023-09-18
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 916ac5345bbca..4f18787a375af 100644
--- a/api_docs/kbn_reporting_common.mdx
+++ b/api_docs/kbn_reporting_common.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common
title: "@kbn/reporting-common"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/reporting-common plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common']
---
import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json';
diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx
index 71e35dbcd5313..414bcf7af9472 100644
--- a/api_docs/kbn_rison.mdx
+++ b/api_docs/kbn_rison.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison
title: "@kbn/rison"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rison plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison']
---
import kbnRisonObj from './kbn_rison.devdocs.json';
diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx
index fdd500a48db18..73169eb112e5c 100644
--- a/api_docs/kbn_rrule.mdx
+++ b/api_docs/kbn_rrule.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule
title: "@kbn/rrule"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rrule plugin
-date: 2023-09-14
+date: 2023-09-18
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 bd34be09c09c0..a20ebc06533ba 100644
--- a/api_docs/kbn_rule_data_utils.mdx
+++ b/api_docs/kbn_rule_data_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils
title: "@kbn/rule-data-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/rule-data-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 8f324f676defb..4cd9860a8c016 100644
--- a/api_docs/kbn_saved_objects_settings.mdx
+++ b/api_docs/kbn_saved_objects_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings
title: "@kbn/saved-objects-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/saved-objects-settings plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings']
---
import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json';
diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx
index 2fd3a476ec87b..6cd98d818f5bd 100644
--- a/api_docs/kbn_search_api_panels.mdx
+++ b/api_docs/kbn_search_api_panels.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels
title: "@kbn/search-api-panels"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-api-panels plugin
-date: 2023-09-14
+date: 2023-09-18
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 83b6d15f4958d..2b57cb9a42b07 100644
--- a/api_docs/kbn_search_connectors.mdx
+++ b/api_docs/kbn_search_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors
title: "@kbn/search-connectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-connectors plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors']
---
import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json';
diff --git a/api_docs/kbn_search_response_warnings.devdocs.json b/api_docs/kbn_search_response_warnings.devdocs.json
index aa22ec9dc5bdb..1ffcdaf144fb1 100644
--- a/api_docs/kbn_search_response_warnings.devdocs.json
+++ b/api_docs/kbn_search_response_warnings.devdocs.json
@@ -29,7 +29,7 @@
"\nIntercepts warnings for a search source request"
],
"signature": [
- "({ services, adapter, options, }: { services: { data: ",
+ "({ services, adapter, }: { services: { data: ",
{
"pluginId": "data",
"scope": "public",
@@ -53,7 +53,7 @@
"section": "def-common.RequestAdapter",
"text": "RequestAdapter"
},
- "; options?: { disableShardFailureWarning?: boolean | undefined; } | undefined; }) => ",
+ "; }) => ",
{
"pluginId": "@kbn/search-response-warnings",
"scope": "common",
@@ -61,7 +61,7 @@
"section": "def-common.SearchResponseInterceptedWarning",
"text": "SearchResponseInterceptedWarning"
},
- "[] | undefined"
+ "[]"
],
"path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
"deprecated": false,
@@ -72,7 +72,7 @@
"id": "def-common.getSearchResponseInterceptedWarnings.$1",
"type": "Object",
"tags": [],
- "label": "{\n services,\n adapter,\n options,\n}",
+ "label": "{\n services,\n adapter,\n}",
"description": [],
"path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
"deprecated": false,
@@ -127,20 +127,6 @@
"path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
"deprecated": false,
"trackAdoption": false
- },
- {
- "parentPluginId": "@kbn/search-response-warnings",
- "id": "def-common.getSearchResponseInterceptedWarnings.$1.options",
- "type": "Object",
- "tags": [],
- "label": "options",
- "description": [],
- "signature": [
- "{ disableShardFailureWarning?: boolean | undefined; } | undefined"
- ],
- "path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
- "deprecated": false,
- "trackAdoption": false
}
]
}
@@ -150,57 +136,46 @@
},
{
"parentPluginId": "@kbn/search-response-warnings",
- "id": "def-common.removeInterceptedWarningDuplicates",
+ "id": "def-common.hasUnsupportedDownsampledAggregationFailure",
"type": "Function",
"tags": [],
- "label": "removeInterceptedWarningDuplicates",
- "description": [
- "\nRemoves duplicated warnings"
- ],
+ "label": "hasUnsupportedDownsampledAggregationFailure",
+ "description": [],
"signature": [
- "(interceptedWarnings: ",
+ "(warning: ",
{
- "pluginId": "@kbn/search-response-warnings",
- "scope": "common",
- "docId": "kibKbnSearchResponseWarningsPluginApi",
- "section": "def-common.SearchResponseInterceptedWarning",
- "text": "SearchResponseInterceptedWarning"
- },
- "[] | undefined) => ",
- {
- "pluginId": "@kbn/search-response-warnings",
- "scope": "common",
- "docId": "kibKbnSearchResponseWarningsPluginApi",
- "section": "def-common.SearchResponseInterceptedWarning",
- "text": "SearchResponseInterceptedWarning"
+ "pluginId": "data",
+ "scope": "public",
+ "docId": "kibDataSearchPluginApi",
+ "section": "def-public.SearchResponseIncompleteWarning",
+ "text": "SearchResponseIncompleteWarning"
},
- "[] | undefined"
+ ") => boolean"
],
- "path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
+ "path": "packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.ts",
"deprecated": false,
"trackAdoption": false,
"children": [
{
"parentPluginId": "@kbn/search-response-warnings",
- "id": "def-common.removeInterceptedWarningDuplicates.$1",
- "type": "Array",
+ "id": "def-common.hasUnsupportedDownsampledAggregationFailure.$1",
+ "type": "Object",
"tags": [],
- "label": "interceptedWarnings",
+ "label": "warning",
"description": [],
"signature": [
{
- "pluginId": "@kbn/search-response-warnings",
- "scope": "common",
- "docId": "kibKbnSearchResponseWarningsPluginApi",
- "section": "def-common.SearchResponseInterceptedWarning",
- "text": "SearchResponseInterceptedWarning"
- },
- "[] | undefined"
+ "pluginId": "data",
+ "scope": "public",
+ "docId": "kibDataSearchPluginApi",
+ "section": "def-public.SearchResponseIncompleteWarning",
+ "text": "SearchResponseIncompleteWarning"
+ }
],
- "path": "packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx",
+ "path": "packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.ts",
"deprecated": false,
"trackAdoption": false,
- "isRequired": false
+ "isRequired": true
}
],
"returnComment": [],
@@ -275,14 +250,18 @@
{
"parentPluginId": "@kbn/search-response-warnings",
"id": "def-common.SearchResponseInterceptedWarning.originalWarning",
- "type": "CompoundType",
+ "type": "Object",
"tags": [],
"label": "originalWarning",
"description": [],
"signature": [
- "SearchResponseTimeoutWarning",
- " | ",
- "SearchResponseShardFailureWarning"
+ {
+ "pluginId": "data",
+ "scope": "public",
+ "docId": "kibDataSearchPluginApi",
+ "section": "def-public.SearchResponseIncompleteWarning",
+ "text": "SearchResponseIncompleteWarning"
+ }
],
"path": "packages/kbn-search-response-warnings/src/types.ts",
"deprecated": false,
diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx
index 78a1370ed3965..c375602c225f9 100644
--- a/api_docs/kbn_search_response_warnings.mdx
+++ b/api_docs/kbn_search_response_warnings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings
title: "@kbn/search-response-warnings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/search-response-warnings plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings']
---
import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 16 | 0 | 8 | 0 |
+| 15 | 0 | 8 | 0 |
## Common
diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx
index bd7ecdc91b562..8af9361955b31 100644
--- a/api_docs/kbn_security_solution_features.mdx
+++ b/api_docs/kbn_security_solution_features.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features
title: "@kbn/security-solution-features"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-features plugin
-date: 2023-09-14
+date: 2023-09-18
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 95ae6ed381a17..107b246b3c767 100644
--- a/api_docs/kbn_security_solution_navigation.mdx
+++ b/api_docs/kbn_security_solution_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation
title: "@kbn/security-solution-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-navigation plugin
-date: 2023-09-14
+date: 2023-09-18
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 10147d18823bf..b2a4867f57cfc 100644
--- a/api_docs/kbn_security_solution_side_nav.mdx
+++ b/api_docs/kbn_security_solution_side_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav
title: "@kbn/security-solution-side-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-side-nav plugin
-date: 2023-09-14
+date: 2023-09-18
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 fcdea65c6a604..01384ad40284d 100644
--- a/api_docs/kbn_security_solution_storybook_config.mdx
+++ b/api_docs/kbn_security_solution_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config
title: "@kbn/security-solution-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/security-solution-storybook-config plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config']
---
import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx
index 85107112b6ef7..2a3f0ac5656d6 100644
--- a/api_docs/kbn_securitysolution_autocomplete.mdx
+++ b/api_docs/kbn_securitysolution_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete
title: "@kbn/securitysolution-autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-autocomplete plugin
-date: 2023-09-14
+date: 2023-09-18
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 e132ae5f6d5bd..a1ef84571847b 100644
--- a/api_docs/kbn_securitysolution_data_table.mdx
+++ b/api_docs/kbn_securitysolution_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table
title: "@kbn/securitysolution-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-data-table plugin
-date: 2023-09-14
+date: 2023-09-18
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 9b92b516449ec..485eeeffe50a0 100644
--- a/api_docs/kbn_securitysolution_ecs.mdx
+++ b/api_docs/kbn_securitysolution_ecs.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs
title: "@kbn/securitysolution-ecs"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-ecs plugin
-date: 2023-09-14
+date: 2023-09-18
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 c652290741930..30eef9a93add6 100644
--- a/api_docs/kbn_securitysolution_es_utils.mdx
+++ b/api_docs/kbn_securitysolution_es_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils
title: "@kbn/securitysolution-es-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-es-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 42b688f775adb..11e350f034e92 100644
--- a/api_docs/kbn_securitysolution_exception_list_components.mdx
+++ b/api_docs/kbn_securitysolution_exception_list_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components
title: "@kbn/securitysolution-exception-list-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-exception-list-components plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components']
---
import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx
index 971c321115555..f3ec6cefb8679 100644
--- a/api_docs/kbn_securitysolution_grouping.mdx
+++ b/api_docs/kbn_securitysolution_grouping.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping
title: "@kbn/securitysolution-grouping"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-grouping plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping']
---
import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json';
diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx
index 3fe33fe354aa4..00fd04613319d 100644
--- a/api_docs/kbn_securitysolution_hook_utils.mdx
+++ b/api_docs/kbn_securitysolution_hook_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils
title: "@kbn/securitysolution-hook-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-hook-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 35db1fcf64345..0fd59393621be 100644
--- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types
title: "@kbn/securitysolution-io-ts-alerting-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 7a99dec44d648..9e7271703ea23 100644
--- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types
title: "@kbn/securitysolution-io-ts-list-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-list-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 f3f66c0e8831b..ba690c22bf736 100644
--- a/api_docs/kbn_securitysolution_io_ts_types.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types
title: "@kbn/securitysolution-io-ts-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 e9fd10ad113b6..2c850ce03d7ce 100644
--- a/api_docs/kbn_securitysolution_io_ts_utils.mdx
+++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils
title: "@kbn/securitysolution-io-ts-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-io-ts-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 0672746984568..782ea1a5bac52 100644
--- a/api_docs/kbn_securitysolution_list_api.mdx
+++ b/api_docs/kbn_securitysolution_list_api.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api
title: "@kbn/securitysolution-list-api"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-api plugin
-date: 2023-09-14
+date: 2023-09-18
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 4fd7663ca01f0..937a5512dcff5 100644
--- a/api_docs/kbn_securitysolution_list_constants.mdx
+++ b/api_docs/kbn_securitysolution_list_constants.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants
title: "@kbn/securitysolution-list-constants"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-constants plugin
-date: 2023-09-14
+date: 2023-09-18
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 59672d83f3691..c4906f5f860cf 100644
--- a/api_docs/kbn_securitysolution_list_hooks.mdx
+++ b/api_docs/kbn_securitysolution_list_hooks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks
title: "@kbn/securitysolution-list-hooks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-hooks plugin
-date: 2023-09-14
+date: 2023-09-18
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 91ee307dfee65..956c6c1c78f7b 100644
--- a/api_docs/kbn_securitysolution_list_utils.mdx
+++ b/api_docs/kbn_securitysolution_list_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils
title: "@kbn/securitysolution-list-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-list-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 c77a9a5e2044c..8d49fe6e71253 100644
--- a/api_docs/kbn_securitysolution_rules.mdx
+++ b/api_docs/kbn_securitysolution_rules.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules
title: "@kbn/securitysolution-rules"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-rules plugin
-date: 2023-09-14
+date: 2023-09-18
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 fa4faf0ea89ec..ae6f1af0c1eb3 100644
--- a/api_docs/kbn_securitysolution_t_grid.mdx
+++ b/api_docs/kbn_securitysolution_t_grid.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid
title: "@kbn/securitysolution-t-grid"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-t-grid plugin
-date: 2023-09-14
+date: 2023-09-18
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 2dd4d54677b50..9d3297430935d 100644
--- a/api_docs/kbn_securitysolution_utils.mdx
+++ b/api_docs/kbn_securitysolution_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils
title: "@kbn/securitysolution-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/securitysolution-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 af459ce9b9d96..490950e341549 100644
--- a/api_docs/kbn_server_http_tools.mdx
+++ b/api_docs/kbn_server_http_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools
title: "@kbn/server-http-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-http-tools plugin
-date: 2023-09-14
+date: 2023-09-18
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 e6a86607ba660..4d35f1dec4756 100644
--- a/api_docs/kbn_server_route_repository.mdx
+++ b/api_docs/kbn_server_route_repository.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository
title: "@kbn/server-route-repository"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/server-route-repository plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository']
---
import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json';
diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx
index 3267ec4aff5cd..8a5a155b864b5 100644
--- a/api_docs/kbn_serverless_common_settings.mdx
+++ b/api_docs/kbn_serverless_common_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings
title: "@kbn/serverless-common-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-common-settings plugin
-date: 2023-09-14
+date: 2023-09-18
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 176ff9a2ac21b..02e15e94dacb8 100644
--- a/api_docs/kbn_serverless_observability_settings.mdx
+++ b/api_docs/kbn_serverless_observability_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings
title: "@kbn/serverless-observability-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-observability-settings plugin
-date: 2023-09-14
+date: 2023-09-18
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 dc303152eab62..f1ccb53f39076 100644
--- a/api_docs/kbn_serverless_project_switcher.mdx
+++ b/api_docs/kbn_serverless_project_switcher.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher
title: "@kbn/serverless-project-switcher"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-project-switcher plugin
-date: 2023-09-14
+date: 2023-09-18
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 5426f18ee03fb..b1ed70cb6fd59 100644
--- a/api_docs/kbn_serverless_search_settings.mdx
+++ b/api_docs/kbn_serverless_search_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings
title: "@kbn/serverless-search-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-search-settings plugin
-date: 2023-09-14
+date: 2023-09-18
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 f40a9ed5229d8..3457a99184c02 100644
--- a/api_docs/kbn_serverless_security_settings.mdx
+++ b/api_docs/kbn_serverless_security_settings.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings
title: "@kbn/serverless-security-settings"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-security-settings plugin
-date: 2023-09-14
+date: 2023-09-18
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 2c9f4a5a20d2a..b72aa38d2025b 100644
--- a/api_docs/kbn_serverless_storybook_config.mdx
+++ b/api_docs/kbn_serverless_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config
title: "@kbn/serverless-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/serverless-storybook-config plugin
-date: 2023-09-14
+date: 2023-09-18
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 40e828cd991d9..f37218d128bda 100644
--- a/api_docs/kbn_shared_svg.mdx
+++ b/api_docs/kbn_shared_svg.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg
title: "@kbn/shared-svg"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-svg plugin
-date: 2023-09-14
+date: 2023-09-18
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 3e7b927bbf3f3..0002623242b1c 100644
--- a/api_docs/kbn_shared_ux_avatar_solution.mdx
+++ b/api_docs/kbn_shared_ux_avatar_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution
title: "@kbn/shared-ux-avatar-solution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-avatar-solution plugin
-date: 2023-09-14
+date: 2023-09-18
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_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx
index 6cd724e901483..8de39326b0045 100644
--- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx
+++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components
title: "@kbn/shared-ux-avatar-user-profile-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components']
---
import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.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 0a661891d862a..c1858a7d9c7e0 100644
--- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
+++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen
title: "@kbn/shared-ux-button-exit-full-screen"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin
-date: 2023-09-14
+date: 2023-09-18
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_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx
index 2a27439f35971..189f2bf682c33 100644
--- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx
+++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks
title: "@kbn/shared-ux-button-exit-full-screen-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks']
---
import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx
index 74ace59880f6c..450206107cf47 100644
--- a/api_docs/kbn_shared_ux_button_toolbar.mdx
+++ b/api_docs/kbn_shared_ux_button_toolbar.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar
title: "@kbn/shared-ux-button-toolbar"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-button-toolbar plugin
-date: 2023-09-14
+date: 2023-09-18
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 56888a0442d78..4516d012e01fc 100644
--- a/api_docs/kbn_shared_ux_card_no_data.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data
title: "@kbn/shared-ux-card-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data plugin
-date: 2023-09-14
+date: 2023-09-18
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 cebcf1586d85e..63f1b68e93502 100644
--- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks
title: "@kbn/shared-ux-card-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 d28dc17d88a95..775e32ac1d591 100644
--- a/api_docs/kbn_shared_ux_chrome_navigation.mdx
+++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation
title: "@kbn/shared-ux-chrome-navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-chrome-navigation plugin
-date: 2023-09-14
+date: 2023-09-18
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_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx
index 1c5fa25f9984f..b4e20b518fd71 100644
--- a/api_docs/kbn_shared_ux_file_context.mdx
+++ b/api_docs/kbn_shared_ux_file_context.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context
title: "@kbn/shared-ux-file-context"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-context plugin
-date: 2023-09-14
+date: 2023-09-18
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 af5b5f85ce6b6..3cdb4dd19a3d1 100644
--- a/api_docs/kbn_shared_ux_file_image.mdx
+++ b/api_docs/kbn_shared_ux_file_image.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image
title: "@kbn/shared-ux-file-image"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image plugin
-date: 2023-09-14
+date: 2023-09-18
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 8474b29295de4..458b29e3f52b9 100644
--- a/api_docs/kbn_shared_ux_file_image_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks
title: "@kbn/shared-ux-file-image-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-image-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 b2cca425f06f1..4094350d13a03 100644
--- a/api_docs/kbn_shared_ux_file_mocks.mdx
+++ b/api_docs/kbn_shared_ux_file_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks
title: "@kbn/shared-ux-file-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 f1be5726c7c66..af690c3cb1fa7 100644
--- a/api_docs/kbn_shared_ux_file_picker.mdx
+++ b/api_docs/kbn_shared_ux_file_picker.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker
title: "@kbn/shared-ux-file-picker"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-picker plugin
-date: 2023-09-14
+date: 2023-09-18
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 eb8f5f0d7a780..4c2cb02409dc6 100644
--- a/api_docs/kbn_shared_ux_file_types.mdx
+++ b/api_docs/kbn_shared_ux_file_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types
title: "@kbn/shared-ux-file-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 9db863d26dfd8..3db9d6b75b281 100644
--- a/api_docs/kbn_shared_ux_file_upload.mdx
+++ b/api_docs/kbn_shared_ux_file_upload.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload
title: "@kbn/shared-ux-file-upload"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-upload plugin
-date: 2023-09-14
+date: 2023-09-18
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 bccce31a1479b..03df6cec2614c 100644
--- a/api_docs/kbn_shared_ux_file_util.mdx
+++ b/api_docs/kbn_shared_ux_file_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util
title: "@kbn/shared-ux-file-util"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-file-util plugin
-date: 2023-09-14
+date: 2023-09-18
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 82c64d13096e3..8e111b5b1d767 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app
title: "@kbn/shared-ux-link-redirect-app"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app plugin
-date: 2023-09-14
+date: 2023-09-18
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 195e7d557c8f4..0e54b46146687 100644
--- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
+++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks
title: "@kbn/shared-ux-link-redirect-app-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 6a98fbfe31cf2..abe96717bfefe 100644
--- a/api_docs/kbn_shared_ux_markdown.mdx
+++ b/api_docs/kbn_shared_ux_markdown.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown
title: "@kbn/shared-ux-markdown"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown plugin
-date: 2023-09-14
+date: 2023-09-18
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 6f980e39f5251..cbff4ea009ab0 100644
--- a/api_docs/kbn_shared_ux_markdown_mocks.mdx
+++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks
title: "@kbn/shared-ux-markdown-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-markdown-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 8017bc4c513fb..8ae4faa00dd01 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data
title: "@kbn/shared-ux-page-analytics-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin
-date: 2023-09-14
+date: 2023-09-18
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 354751cf87fa9..360a418e01a07 100644
--- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks
title: "@kbn/shared-ux-page-analytics-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 3f081f6554ffb..8f069f7d7cee0 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data
title: "@kbn/shared-ux-page-kibana-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin
-date: 2023-09-14
+date: 2023-09-18
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 079004996788c..8541a86e06fe3 100644
--- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks
title: "@kbn/shared-ux-page-kibana-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 f486956b1bd0e..86ba3f6c258e9 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template
title: "@kbn/shared-ux-page-kibana-template"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template plugin
-date: 2023-09-14
+date: 2023-09-18
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 038d3d256afcc..2b0f90fa4f7a7 100644
--- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks
title: "@kbn/shared-ux-page-kibana-template-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 aa1dd8e4029ce..a67a353db51cb 100644
--- a/api_docs/kbn_shared_ux_page_no_data.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data
title: "@kbn/shared-ux-page-no-data"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data plugin
-date: 2023-09-14
+date: 2023-09-18
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 4887fd252eae0..bad42d222d1bc 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config
title: "@kbn/shared-ux-page-no-data-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config plugin
-date: 2023-09-14
+date: 2023-09-18
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 e59e6ebda66d1..e68403da9feaf 100644
--- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks
title: "@kbn/shared-ux-page-no-data-config-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 e9bb1f10afc5b..e4b7de52c8989 100644
--- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
+++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks
title: "@kbn/shared-ux-page-no-data-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 534efad7ac54d..d8ae81b6ca25a 100644
--- a/api_docs/kbn_shared_ux_page_solution_nav.mdx
+++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav
title: "@kbn/shared-ux-page-solution-nav"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-page-solution-nav plugin
-date: 2023-09-14
+date: 2023-09-18
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 8f578aee6a096..837161cdf2129 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views
title: "@kbn/shared-ux-prompt-no-data-views"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin
-date: 2023-09-14
+date: 2023-09-18
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 e670dee8e8a3a..a0823fda11128 100644
--- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
+++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks
title: "@kbn/shared-ux-prompt-no-data-views-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 8fc83e4704fbb..c53e51dc80d54 100644
--- a/api_docs/kbn_shared_ux_prompt_not_found.mdx
+++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found
title: "@kbn/shared-ux-prompt-not-found"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-prompt-not-found plugin
-date: 2023-09-14
+date: 2023-09-18
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 c5f70bf276486..09bddd7a54e30 100644
--- a/api_docs/kbn_shared_ux_router.mdx
+++ b/api_docs/kbn_shared_ux_router.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router
title: "@kbn/shared-ux-router"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router plugin
-date: 2023-09-14
+date: 2023-09-18
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 1338efd0d183d..5184e1446b8a2 100644
--- a/api_docs/kbn_shared_ux_router_mocks.mdx
+++ b/api_docs/kbn_shared_ux_router_mocks.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks
title: "@kbn/shared-ux-router-mocks"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-router-mocks plugin
-date: 2023-09-14
+date: 2023-09-18
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 b5de22da4030e..7ebf5efebf9a2 100644
--- a/api_docs/kbn_shared_ux_storybook_config.mdx
+++ b/api_docs/kbn_shared_ux_storybook_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config
title: "@kbn/shared-ux-storybook-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-config plugin
-date: 2023-09-14
+date: 2023-09-18
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 53c62c318f591..a8bc3c26196ca 100644
--- a/api_docs/kbn_shared_ux_storybook_mock.mdx
+++ b/api_docs/kbn_shared_ux_storybook_mock.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock
title: "@kbn/shared-ux-storybook-mock"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-storybook-mock plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock']
---
import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json';
diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx
index c3dee7255e7d8..da290c77fd32e 100644
--- a/api_docs/kbn_shared_ux_utility.mdx
+++ b/api_docs/kbn_shared_ux_utility.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility
title: "@kbn/shared-ux-utility"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/shared-ux-utility plugin
-date: 2023-09-14
+date: 2023-09-18
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 8e982b3f2cd78..d12f805781443 100644
--- a/api_docs/kbn_slo_schema.mdx
+++ b/api_docs/kbn_slo_schema.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema
title: "@kbn/slo-schema"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/slo-schema plugin
-date: 2023-09-14
+date: 2023-09-18
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 7d2197aaa897a..583f3965121e3 100644
--- a/api_docs/kbn_some_dev_log.mdx
+++ b/api_docs/kbn_some_dev_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log
title: "@kbn/some-dev-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/some-dev-log plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log']
---
import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json';
diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx
index 0cc09b6460982..da4c6fcd6c023 100644
--- a/api_docs/kbn_std.mdx
+++ b/api_docs/kbn_std.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std
title: "@kbn/std"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/std plugin
-date: 2023-09-14
+date: 2023-09-18
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 0b4ae1c278dd1..4df082183977e 100644
--- a/api_docs/kbn_stdio_dev_helpers.mdx
+++ b/api_docs/kbn_stdio_dev_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers
title: "@kbn/stdio-dev-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/stdio-dev-helpers plugin
-date: 2023-09-14
+date: 2023-09-18
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 6833bf1ce3d93..585462a2f6ac4 100644
--- a/api_docs/kbn_storybook.mdx
+++ b/api_docs/kbn_storybook.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook
title: "@kbn/storybook"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/storybook plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook']
---
import kbnStorybookObj from './kbn_storybook.devdocs.json';
diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx
index ddf2632a36bb0..b32da7cf7f3fe 100644
--- a/api_docs/kbn_telemetry_tools.mdx
+++ b/api_docs/kbn_telemetry_tools.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools
title: "@kbn/telemetry-tools"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/telemetry-tools plugin
-date: 2023-09-14
+date: 2023-09-18
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 a48c0e74988fe..6e9572c79bdca 100644
--- a/api_docs/kbn_test.mdx
+++ b/api_docs/kbn_test.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test
title: "@kbn/test"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test']
---
import kbnTestObj from './kbn_test.devdocs.json';
diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx
index 34ea200559bde..633fe98ae1264 100644
--- a/api_docs/kbn_test_jest_helpers.mdx
+++ b/api_docs/kbn_test_jest_helpers.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers
title: "@kbn/test-jest-helpers"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-jest-helpers plugin
-date: 2023-09-14
+date: 2023-09-18
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 d827660be313c..c1e2c8211bdcd 100644
--- a/api_docs/kbn_test_subj_selector.mdx
+++ b/api_docs/kbn_test_subj_selector.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector
title: "@kbn/test-subj-selector"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/test-subj-selector plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector']
---
import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json';
diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx
index aaaa841df69d8..8591347a02cb1 100644
--- a/api_docs/kbn_text_based_editor.mdx
+++ b/api_docs/kbn_text_based_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor
title: "@kbn/text-based-editor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/text-based-editor plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor']
---
import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json';
diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx
index eff4ad99be5d5..97589f58ef7f0 100644
--- a/api_docs/kbn_tooling_log.mdx
+++ b/api_docs/kbn_tooling_log.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log
title: "@kbn/tooling-log"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/tooling-log plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log']
---
import kbnToolingLogObj from './kbn_tooling_log.devdocs.json';
diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx
index c70c0f986b975..89815d8fb1d12 100644
--- a/api_docs/kbn_ts_projects.mdx
+++ b/api_docs/kbn_ts_projects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects
title: "@kbn/ts-projects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ts-projects plugin
-date: 2023-09-14
+date: 2023-09-18
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 ee2d43b18aa5e..2612a2b454a21 100644
--- a/api_docs/kbn_typed_react_router_config.mdx
+++ b/api_docs/kbn_typed_react_router_config.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config
title: "@kbn/typed-react-router-config"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/typed-react-router-config plugin
-date: 2023-09-14
+date: 2023-09-18
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 b4445f59aa88e..74f6d6f0c2818 100644
--- a/api_docs/kbn_ui_actions_browser.mdx
+++ b/api_docs/kbn_ui_actions_browser.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser
title: "@kbn/ui-actions-browser"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-actions-browser plugin
-date: 2023-09-14
+date: 2023-09-18
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 d7aa99c434fdd..f3b5125844c44 100644
--- a/api_docs/kbn_ui_shared_deps_src.mdx
+++ b/api_docs/kbn_ui_shared_deps_src.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src
title: "@kbn/ui-shared-deps-src"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-shared-deps-src plugin
-date: 2023-09-14
+date: 2023-09-18
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 8fba519f4211c..f7f6cb5f8e9c9 100644
--- a/api_docs/kbn_ui_theme.mdx
+++ b/api_docs/kbn_ui_theme.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme
title: "@kbn/ui-theme"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/ui-theme plugin
-date: 2023-09-14
+date: 2023-09-18
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 0affa2dac0ef5..0587485d89cf0 100644
--- a/api_docs/kbn_unified_data_table.mdx
+++ b/api_docs/kbn_unified_data_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table
title: "@kbn/unified-data-table"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-data-table plugin
-date: 2023-09-14
+date: 2023-09-18
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 f15ccfc67ab9c..8ebb478b85ecc 100644
--- a/api_docs/kbn_unified_doc_viewer.mdx
+++ b/api_docs/kbn_unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer
title: "@kbn/unified-doc-viewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-doc-viewer plugin
-date: 2023-09-14
+date: 2023-09-18
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 022cbe6a77a12..8c8f6f673fde3 100644
--- a/api_docs/kbn_unified_field_list.mdx
+++ b/api_docs/kbn_unified_field_list.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list
title: "@kbn/unified-field-list"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/unified-field-list plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list']
---
import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json';
diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx
index 1bddd4a9175cc..31e6a44eb52d9 100644
--- a/api_docs/kbn_url_state.mdx
+++ b/api_docs/kbn_url_state.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state
title: "@kbn/url-state"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/url-state plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state']
---
import kbnUrlStateObj from './kbn_url_state.devdocs.json';
diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx
index 7423b56aa2492..27cda631bb9e3 100644
--- a/api_docs/kbn_use_tracked_promise.mdx
+++ b/api_docs/kbn_use_tracked_promise.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise
title: "@kbn/use-tracked-promise"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/use-tracked-promise plugin
-date: 2023-09-14
+date: 2023-09-18
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 e998b0a3004c0..3a9bf3d8372a9 100644
--- a/api_docs/kbn_user_profile_components.mdx
+++ b/api_docs/kbn_user_profile_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components
title: "@kbn/user-profile-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/user-profile-components plugin
-date: 2023-09-14
+date: 2023-09-18
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 f12dca08b983f..2564b7f1ea610 100644
--- a/api_docs/kbn_utility_types.mdx
+++ b/api_docs/kbn_utility_types.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types
title: "@kbn/utility-types"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types plugin
-date: 2023-09-14
+date: 2023-09-18
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 a64c8ea4ea796..06faefc89efa0 100644
--- a/api_docs/kbn_utility_types_jest.mdx
+++ b/api_docs/kbn_utility_types_jest.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest
title: "@kbn/utility-types-jest"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utility-types-jest plugin
-date: 2023-09-14
+date: 2023-09-18
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 afe7a0f90adf1..14b0a78d5664d 100644
--- a/api_docs/kbn_utils.mdx
+++ b/api_docs/kbn_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils
title: "@kbn/utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 2656f1dd4e815..810ab3e64bbb0 100644
--- a/api_docs/kbn_visualization_ui_components.mdx
+++ b/api_docs/kbn_visualization_ui_components.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components
title: "@kbn/visualization-ui-components"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/visualization-ui-components plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components']
---
import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json';
diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx
index b696d62d43e3c..f6f601098955d 100644
--- a/api_docs/kbn_xstate_utils.mdx
+++ b/api_docs/kbn_xstate_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils
title: "@kbn/xstate-utils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/xstate-utils plugin
-date: 2023-09-14
+date: 2023-09-18
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 da89d97a29dc9..be886267160d9 100644
--- a/api_docs/kbn_yarn_lock_validator.mdx
+++ b/api_docs/kbn_yarn_lock_validator.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator
title: "@kbn/yarn-lock-validator"
image: https://source.unsplash.com/400x175/?github
description: API docs for the @kbn/yarn-lock-validator plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator']
---
import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json';
diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx
index 0ae0bc54ca9b9..5354c08d5a5f4 100644
--- a/api_docs/kibana_overview.mdx
+++ b/api_docs/kibana_overview.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview
title: "kibanaOverview"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaOverview plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview']
---
import kibanaOverviewObj from './kibana_overview.devdocs.json';
diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json
index 242e917a38c35..de4ee43837b29 100644
--- a/api_docs/kibana_react.devdocs.json
+++ b/api_docs/kibana_react.devdocs.json
@@ -3080,11 +3080,11 @@
},
{
"plugin": "data",
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx"
+ "path": "src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx"
},
{
"plugin": "data",
- "path": "src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx"
+ "path": "src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx"
},
{
"plugin": "data",
@@ -3844,11 +3844,11 @@
},
{
"plugin": "synthetics",
- "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx"
+ "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx"
},
{
"plugin": "synthetics",
- "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx"
+ "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx"
},
{
"plugin": "synthetics",
@@ -3856,11 +3856,11 @@
},
{
"plugin": "synthetics",
- "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx"
+ "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx"
},
{
"plugin": "synthetics",
- "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/test_now_mode/manual_test_run_mode/browser_test_results.tsx"
+ "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/delete_monitor.tsx"
},
{
"plugin": "synthetics",
diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx
index 960803d77f5ec..6e9101c7d7ae5 100644
--- a/api_docs/kibana_react.mdx
+++ b/api_docs/kibana_react.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact
title: "kibanaReact"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaReact plugin
-date: 2023-09-14
+date: 2023-09-18
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 473a7d41ad14f..b5d3ef10fc43f 100644
--- a/api_docs/kibana_utils.mdx
+++ b/api_docs/kibana_utils.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils
title: "kibanaUtils"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kibanaUtils plugin
-date: 2023-09-14
+date: 2023-09-18
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 506228812f476..569fb3ce1f001 100644
--- a/api_docs/kubernetes_security.mdx
+++ b/api_docs/kubernetes_security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity
title: "kubernetesSecurity"
image: https://source.unsplash.com/400x175/?github
description: API docs for the kubernetesSecurity plugin
-date: 2023-09-14
+date: 2023-09-18
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 b52db8e1a7205..06526a52eab03 100644
--- a/api_docs/lens.mdx
+++ b/api_docs/lens.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens
title: "lens"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lens plugin
-date: 2023-09-14
+date: 2023-09-18
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 d03854aac3992..3e5cdd134932c 100644
--- a/api_docs/license_api_guard.mdx
+++ b/api_docs/license_api_guard.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard
title: "licenseApiGuard"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseApiGuard plugin
-date: 2023-09-14
+date: 2023-09-18
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 0ebcc03ff206b..1b119d29e5364 100644
--- a/api_docs/license_management.mdx
+++ b/api_docs/license_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement
title: "licenseManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licenseManagement plugin
-date: 2023-09-14
+date: 2023-09-18
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 55fa11f532152..af4886734e265 100644
--- a/api_docs/licensing.mdx
+++ b/api_docs/licensing.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing
title: "licensing"
image: https://source.unsplash.com/400x175/?github
description: API docs for the licensing plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing']
---
import licensingObj from './licensing.devdocs.json';
diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx
index 0cd9c96168624..2a5783d872c37 100644
--- a/api_docs/lists.mdx
+++ b/api_docs/lists.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists
title: "lists"
image: https://source.unsplash.com/400x175/?github
description: API docs for the lists plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists']
---
import listsObj from './lists.devdocs.json';
diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx
index dffa92dfa40b4..48befa9dd754c 100644
--- a/api_docs/log_explorer.mdx
+++ b/api_docs/log_explorer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer
title: "logExplorer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logExplorer plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer']
---
import logExplorerObj from './log_explorer.devdocs.json';
diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx
index 3cfe24b5a2b9e..886c80a166b42 100644
--- a/api_docs/logs_shared.mdx
+++ b/api_docs/logs_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared
title: "logsShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the logsShared plugin
-date: 2023-09-14
+date: 2023-09-18
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 6ed5de543f8a9..34e545e5a278b 100644
--- a/api_docs/management.mdx
+++ b/api_docs/management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management
title: "management"
image: https://source.unsplash.com/400x175/?github
description: API docs for the management plugin
-date: 2023-09-14
+date: 2023-09-18
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 d82995ab37f42..fa4d670853041 100644
--- a/api_docs/maps.mdx
+++ b/api_docs/maps.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps
title: "maps"
image: https://source.unsplash.com/400x175/?github
description: API docs for the maps plugin
-date: 2023-09-14
+date: 2023-09-18
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 e7c35ae551778..c3055caaa3c2c 100644
--- a/api_docs/maps_ems.mdx
+++ b/api_docs/maps_ems.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms
title: "mapsEms"
image: https://source.unsplash.com/400x175/?github
description: API docs for the mapsEms plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms']
---
import mapsEmsObj from './maps_ems.devdocs.json';
diff --git a/api_docs/metrics_data_access.devdocs.json b/api_docs/metrics_data_access.devdocs.json
new file mode 100644
index 0000000000000..ed498fd981e05
--- /dev/null
+++ b/api_docs/metrics_data_access.devdocs.json
@@ -0,0 +1,319 @@
+{
+ "id": "metricsDataAccess",
+ "client": {
+ "classes": [],
+ "functions": [],
+ "interfaces": [],
+ "enums": [],
+ "misc": [],
+ "objects": []
+ },
+ "server": {
+ "classes": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient",
+ "type": "Class",
+ "tags": [],
+ "label": "MetricsDataClient",
+ "description": [],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.getMetricIndices",
+ "type": "Function",
+ "tags": [],
+ "label": "getMetricIndices",
+ "description": [],
+ "signature": [
+ "(options: ",
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.GetMetricIndicesOptions",
+ "text": "GetMetricIndicesOptions"
+ },
+ ") => Promise"
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.getMetricIndices.$1",
+ "type": "Object",
+ "tags": [],
+ "label": "options",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.GetMetricIndicesOptions",
+ "text": "GetMetricIndicesOptions"
+ }
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": []
+ },
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.updateMetricIndices",
+ "type": "Function",
+ "tags": [],
+ "label": "updateMetricIndices",
+ "description": [],
+ "signature": [
+ "(options: ",
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.UpdateMetricIndicesOptions",
+ "text": "UpdateMetricIndicesOptions"
+ },
+ ") => Promise<",
+ {
+ "pluginId": "@kbn/core-saved-objects-common",
+ "scope": "common",
+ "docId": "kibKbnCoreSavedObjectsCommonPluginApi",
+ "section": "def-common.SavedObject",
+ "text": "SavedObject"
+ },
+ "<{ metricIndices: string; }>>"
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.updateMetricIndices.$1",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "options",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.UpdateMetricIndicesOptions",
+ "text": "UpdateMetricIndicesOptions"
+ }
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": true
+ }
+ ],
+ "returnComment": []
+ },
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.setDefaultMetricIndicesHandler",
+ "type": "Function",
+ "tags": [],
+ "label": "setDefaultMetricIndicesHandler",
+ "description": [],
+ "signature": [
+ "(handler: ",
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.DefaultMetricIndicesHandler",
+ "text": "DefaultMetricIndicesHandler"
+ },
+ ") => void"
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataClient.setDefaultMetricIndicesHandler.$1",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "handler",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.DefaultMetricIndicesHandler",
+ "text": "DefaultMetricIndicesHandler"
+ }
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/client/client.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "isRequired": false
+ }
+ ],
+ "returnComment": []
+ }
+ ],
+ "initialIsOpen": false
+ }
+ ],
+ "functions": [],
+ "interfaces": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.GetMetricIndicesOptions",
+ "type": "Interface",
+ "tags": [],
+ "label": "GetMetricIndicesOptions",
+ "description": [],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.GetMetricIndicesOptions.savedObjectsClient",
+ "type": "Object",
+ "tags": [],
+ "label": "savedObjectsClient",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "@kbn/core-saved-objects-api-server",
+ "scope": "common",
+ "docId": "kibKbnCoreSavedObjectsApiServerPluginApi",
+ "section": "def-common.SavedObjectsClientContract",
+ "text": "SavedObjectsClientContract"
+ }
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "initialIsOpen": false
+ }
+ ],
+ "enums": [],
+ "misc": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.DefaultMetricIndicesHandler",
+ "type": "Type",
+ "tags": [],
+ "label": "DefaultMetricIndicesHandler",
+ "description": [],
+ "signature": [
+ "((options: ",
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.GetMetricIndicesOptions",
+ "text": "GetMetricIndicesOptions"
+ },
+ ") => Promise) | null"
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "initialIsOpen": false
+ },
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.metricsDataSourceSavedObjectName",
+ "type": "string",
+ "tags": [],
+ "label": "metricsDataSourceSavedObjectName",
+ "description": [],
+ "signature": [
+ "\"metrics-data-source\""
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/saved_objects/metrics_data_source/index.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "initialIsOpen": false
+ },
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.UpdateMetricIndicesOptions",
+ "type": "Type",
+ "tags": [],
+ "label": "UpdateMetricIndicesOptions",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.GetMetricIndicesOptions",
+ "text": "GetMetricIndicesOptions"
+ },
+ " & { metricIndices: string; }"
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "initialIsOpen": false
+ }
+ ],
+ "objects": [],
+ "setup": {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataPluginSetup",
+ "type": "Interface",
+ "tags": [],
+ "label": "MetricsDataPluginSetup",
+ "description": [],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "metricsDataAccess",
+ "id": "def-server.MetricsDataPluginSetup.client",
+ "type": "Object",
+ "tags": [],
+ "label": "client",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "metricsDataAccess",
+ "scope": "server",
+ "docId": "kibMetricsDataAccessPluginApi",
+ "section": "def-server.MetricsDataClient",
+ "text": "MetricsDataClient"
+ }
+ ],
+ "path": "x-pack/plugins/metrics_data_access/server/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "lifecycle": "setup",
+ "initialIsOpen": true
+ }
+ },
+ "common": {
+ "classes": [],
+ "functions": [],
+ "interfaces": [],
+ "enums": [],
+ "misc": [],
+ "objects": []
+ }
+}
\ No newline at end of file
diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx
new file mode 100644
index 0000000000000..0d7ff4bf9fa3a
--- /dev/null
+++ b/api_docs/metrics_data_access.mdx
@@ -0,0 +1,39 @@
+---
+####
+#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system.
+#### Reach out in #docs-engineering for more info.
+####
+id: kibMetricsDataAccessPluginApi
+slug: /kibana-dev-docs/api/metricsDataAccess
+title: "metricsDataAccess"
+image: https://source.unsplash.com/400x175/?github
+description: API docs for the metricsDataAccess plugin
+date: 2023-09-18
+tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess']
+---
+import metricsDataAccessObj from './metrics_data_access.devdocs.json';
+
+Exposes utilities for accessing metrics data
+
+Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) for questions regarding this plugin.
+
+**Code health stats**
+
+| Public API count | Any count | Items lacking comments | Missing exports |
+|-------------------|-----------|------------------------|-----------------|
+| 14 | 0 | 14 | 0 |
+
+## Server
+
+### Setup
+
+
+### Classes
+
+
+### Interfaces
+
+
+### Consts, variables and types
+
+
diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx
index e6360c3694d83..a0e2ab06193d7 100644
--- a/api_docs/ml.mdx
+++ b/api_docs/ml.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml
title: "ml"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ml plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml']
---
import mlObj from './ml.devdocs.json';
diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx
index dd955f501604f..34db03eb41c09 100644
--- a/api_docs/monitoring.mdx
+++ b/api_docs/monitoring.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring
title: "monitoring"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoring plugin
-date: 2023-09-14
+date: 2023-09-18
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 72a6163b39ff5..0d2e39a04287f 100644
--- a/api_docs/monitoring_collection.mdx
+++ b/api_docs/monitoring_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection
title: "monitoringCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the monitoringCollection plugin
-date: 2023-09-14
+date: 2023-09-18
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 f93621b8bcd27..9529b004070b7 100644
--- a/api_docs/navigation.mdx
+++ b/api_docs/navigation.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation
title: "navigation"
image: https://source.unsplash.com/400x175/?github
description: API docs for the navigation plugin
-date: 2023-09-14
+date: 2023-09-18
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 c48e3da752809..b5bc67c6e8226 100644
--- a/api_docs/newsfeed.mdx
+++ b/api_docs/newsfeed.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed
title: "newsfeed"
image: https://source.unsplash.com/400x175/?github
description: API docs for the newsfeed plugin
-date: 2023-09-14
+date: 2023-09-18
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 7457075758ca2..c0fe674b7ca24 100644
--- a/api_docs/no_data_page.mdx
+++ b/api_docs/no_data_page.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage
title: "noDataPage"
image: https://source.unsplash.com/400x175/?github
description: API docs for the noDataPage plugin
-date: 2023-09-14
+date: 2023-09-18
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 058800e439409..8064591412a7a 100644
--- a/api_docs/notifications.mdx
+++ b/api_docs/notifications.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications
title: "notifications"
image: https://source.unsplash.com/400x175/?github
description: API docs for the notifications plugin
-date: 2023-09-14
+date: 2023-09-18
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 f3d58438e7e44..55e5602e5d681 100644
--- a/api_docs/observability.mdx
+++ b/api_docs/observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability
title: "observability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observability plugin
-date: 2023-09-14
+date: 2023-09-18
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 42c960d9e25db..9e605b605838d 100644
--- a/api_docs/observability_a_i_assistant.mdx
+++ b/api_docs/observability_a_i_assistant.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant
title: "observabilityAIAssistant"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityAIAssistant plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant']
---
import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json';
diff --git a/api_docs/observability_onboarding.devdocs.json b/api_docs/observability_onboarding.devdocs.json
index 8cc4b9736bf0f..8a5eae27e9a29 100644
--- a/api_docs/observability_onboarding.devdocs.json
+++ b/api_docs/observability_onboarding.devdocs.json
@@ -119,6 +119,53 @@
}
],
"initialIsOpen": false
+ },
+ {
+ "parentPluginId": "observabilityOnboarding",
+ "id": "def-public.ObservabilityOnboardingLocatorParams",
+ "type": "Interface",
+ "tags": [],
+ "label": "ObservabilityOnboardingLocatorParams",
+ "description": [],
+ "signature": [
+ {
+ "pluginId": "observabilityOnboarding",
+ "scope": "public",
+ "docId": "kibObservabilityOnboardingPluginApi",
+ "section": "def-public.ObservabilityOnboardingLocatorParams",
+ "text": "ObservabilityOnboardingLocatorParams"
+ },
+ " extends ",
+ {
+ "pluginId": "@kbn/utility-types",
+ "scope": "common",
+ "docId": "kibKbnUtilityTypesPluginApi",
+ "section": "def-common.SerializableRecord",
+ "text": "SerializableRecord"
+ }
+ ],
+ "path": "x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts",
+ "deprecated": false,
+ "trackAdoption": false,
+ "children": [
+ {
+ "parentPluginId": "observabilityOnboarding",
+ "id": "def-public.ObservabilityOnboardingLocatorParams.source",
+ "type": "CompoundType",
+ "tags": [],
+ "label": "source",
+ "description": [
+ "If given, it will load the given map else will load the create a new map page."
+ ],
+ "signature": [
+ "\"customLogs\" | \"systemLogs\" | undefined"
+ ],
+ "path": "x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ }
+ ],
+ "initialIsOpen": false
}
],
"enums": [],
diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx
index a1e9999d0ad2e..ec7139b7b9326 100644
--- a/api_docs/observability_onboarding.mdx
+++ b/api_docs/observability_onboarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding
title: "observabilityOnboarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityOnboarding plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding']
---
import observabilityOnboardingObj from './observability_onboarding.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) for ques
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 15 | 0 | 15 | 0 |
+| 17 | 0 | 16 | 0 |
## Client
diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx
index 26769a22978f2..046939f5e474f 100644
--- a/api_docs/observability_shared.mdx
+++ b/api_docs/observability_shared.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared
title: "observabilityShared"
image: https://source.unsplash.com/400x175/?github
description: API docs for the observabilityShared plugin
-date: 2023-09-14
+date: 2023-09-18
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 65ef75ddaf21f..ba07abd8f4ea5 100644
--- a/api_docs/osquery.mdx
+++ b/api_docs/osquery.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery
title: "osquery"
image: https://source.unsplash.com/400x175/?github
description: API docs for the osquery plugin
-date: 2023-09-14
+date: 2023-09-18
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 f559cb24d3000..593ca0efd05b9 100644
--- a/api_docs/painless_lab.mdx
+++ b/api_docs/painless_lab.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab
title: "painlessLab"
image: https://source.unsplash.com/400x175/?github
description: API docs for the painlessLab plugin
-date: 2023-09-14
+date: 2023-09-18
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 8fce8f3b02a4a..e5a177c21266e 100644
--- a/api_docs/plugin_directory.mdx
+++ b/api_docs/plugin_directory.mdx
@@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory
slug: /kibana-dev-docs/api-meta/plugin-api-directory
title: Directory
description: Directory of public APIs available through plugins or packages.
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana']
---
@@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| Count | Plugins or Packages with a public API | Number of teams |
|--------------|----------|------------------------|
-| 688 | 579 | 43 |
+| 689 | 580 | 43 |
### Public API health stats
| API Count | Any Count | Missing comments | Missing exports |
|--------------|----------|-----------------|--------|
-| 74806 | 223 | 63863 | 1530 |
+| 74825 | 223 | 63875 | 1528 |
## Plugin Directory
@@ -57,7 +57,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 101 | 0 | 98 | 9 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 |
-| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3311 | 33 | 2584 | 26 |
+| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3308 | 33 | 2577 | 24 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 16 | 0 | 7 | 0 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 |
@@ -107,7 +107,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 |
| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 |
| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 194 | 0 | 189 | 4 |
-| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 45 | 0 | 42 | 11 |
+| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 42 | 0 | 39 | 11 |
| ingestPipelines | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 |
| inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 |
| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 123 | 2 | 96 | 4 |
@@ -128,6 +128,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 47 | 0 | 47 | 7 |
| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 259 | 0 | 258 | 28 |
| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 |
+| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | Exposes utilities for accessing metrics data | 14 | 0 | 14 | 0 |
| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 150 | 3 | 64 | 32 |
| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | - | 15 | 3 | 13 | 1 |
| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | - | 9 | 0 | 9 | 0 |
@@ -138,7 +139,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 543 | 2 | 534 | 14 |
| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 |
| observabilityLogExplorer | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 0 | 0 | 0 | 0 |
-| | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 15 | 0 | 15 | 0 |
+| | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 17 | 0 | 16 | 0 |
| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 281 | 1 | 279 | 11 |
| | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 7 |
| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 2 | 0 |
@@ -169,7 +170,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 |
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 119 | 0 | 60 | 10 |
| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 |
-| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 253 | 0 | 65 | 0 |
+| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 256 | 0 | 65 | 0 |
| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 24 | 0 | 24 | 3 |
| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 4 | 0 | 4 | 1 |
| synthetics | [@elastic/uptime](https://github.com/orgs/elastic/teams/uptime) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 |
@@ -441,7 +442,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 27 | 0 | 14 | 1 |
| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 3 | 0 |
| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 259 | 1 | 199 | 15 |
-| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 |
+| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 19 | 0 |
| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 |
| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 65 | 0 | 65 | 1 |
@@ -536,7 +537,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana']
| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 |
| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 68 | 0 | 68 | 0 |
| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 1678 | 0 | 1678 | 0 |
-| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 16 | 0 | 8 | 0 |
+| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 15 | 0 | 8 | 0 |
| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 |
| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 50 | 0 | 47 | 0 |
| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 29 | 0 | 23 | 0 |
diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx
index c67a3e2eb48a6..ab68bc1841ce5 100644
--- a/api_docs/presentation_util.mdx
+++ b/api_docs/presentation_util.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil
title: "presentationUtil"
image: https://source.unsplash.com/400x175/?github
description: API docs for the presentationUtil plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil']
---
import presentationUtilObj from './presentation_util.devdocs.json';
diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx
index 1585b393e8fb2..a02442989138b 100644
--- a/api_docs/profiling.mdx
+++ b/api_docs/profiling.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling
title: "profiling"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profiling plugin
-date: 2023-09-14
+date: 2023-09-18
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 f3f81c4db4787..d63c165720c51 100644
--- a/api_docs/profiling_data_access.mdx
+++ b/api_docs/profiling_data_access.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess
title: "profilingDataAccess"
image: https://source.unsplash.com/400x175/?github
description: API docs for the profilingDataAccess plugin
-date: 2023-09-14
+date: 2023-09-18
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 c7fab7c633cd4..81e8cd085aee9 100644
--- a/api_docs/remote_clusters.mdx
+++ b/api_docs/remote_clusters.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters
title: "remoteClusters"
image: https://source.unsplash.com/400x175/?github
description: API docs for the remoteClusters plugin
-date: 2023-09-14
+date: 2023-09-18
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 c9751c70fcf21..f3d3b7819c8b5 100644
--- a/api_docs/reporting.mdx
+++ b/api_docs/reporting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting
title: "reporting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the reporting plugin
-date: 2023-09-14
+date: 2023-09-18
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 f5c44d29c668c..529cd8de5302e 100644
--- a/api_docs/rollup.mdx
+++ b/api_docs/rollup.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup
title: "rollup"
image: https://source.unsplash.com/400x175/?github
description: API docs for the rollup plugin
-date: 2023-09-14
+date: 2023-09-18
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 ada92b12d2cd2..2aa4c6ce02ba0 100644
--- a/api_docs/rule_registry.mdx
+++ b/api_docs/rule_registry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry
title: "ruleRegistry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ruleRegistry plugin
-date: 2023-09-14
+date: 2023-09-18
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 906f17b83ea8f..801f96570ae65 100644
--- a/api_docs/runtime_fields.mdx
+++ b/api_docs/runtime_fields.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields
title: "runtimeFields"
image: https://source.unsplash.com/400x175/?github
description: API docs for the runtimeFields plugin
-date: 2023-09-14
+date: 2023-09-18
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 4ac4c465afa09..8f930fb9b2c1a 100644
--- a/api_docs/saved_objects.mdx
+++ b/api_docs/saved_objects.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects
title: "savedObjects"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjects plugin
-date: 2023-09-14
+date: 2023-09-18
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 6681b2e7c0659..c1471bbee241e 100644
--- a/api_docs/saved_objects_finder.mdx
+++ b/api_docs/saved_objects_finder.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder
title: "savedObjectsFinder"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsFinder plugin
-date: 2023-09-14
+date: 2023-09-18
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 c1d7c3156ce42..c9759ef6df70d 100644
--- a/api_docs/saved_objects_management.mdx
+++ b/api_docs/saved_objects_management.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement
title: "savedObjectsManagement"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsManagement plugin
-date: 2023-09-14
+date: 2023-09-18
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 7bf278ee69692..db932cbfa0310 100644
--- a/api_docs/saved_objects_tagging.mdx
+++ b/api_docs/saved_objects_tagging.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging
title: "savedObjectsTagging"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTagging plugin
-date: 2023-09-14
+date: 2023-09-18
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 adbf1a44e030e..c929b98b07a86 100644
--- a/api_docs/saved_objects_tagging_oss.mdx
+++ b/api_docs/saved_objects_tagging_oss.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss
title: "savedObjectsTaggingOss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedObjectsTaggingOss plugin
-date: 2023-09-14
+date: 2023-09-18
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 e23d96c778ef8..747d69708946a 100644
--- a/api_docs/saved_search.mdx
+++ b/api_docs/saved_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch
title: "savedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the savedSearch plugin
-date: 2023-09-14
+date: 2023-09-18
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 fb8c5b52438e3..7386a2e827192 100644
--- a/api_docs/screenshot_mode.mdx
+++ b/api_docs/screenshot_mode.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode
title: "screenshotMode"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotMode plugin
-date: 2023-09-14
+date: 2023-09-18
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 2891ae12dc009..fe0f03f33762a 100644
--- a/api_docs/screenshotting.mdx
+++ b/api_docs/screenshotting.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting
title: "screenshotting"
image: https://source.unsplash.com/400x175/?github
description: API docs for the screenshotting plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting']
---
import screenshottingObj from './screenshotting.devdocs.json';
diff --git a/api_docs/security.mdx b/api_docs/security.mdx
index 7f44e6c74461d..ea5a152a1d057 100644
--- a/api_docs/security.mdx
+++ b/api_docs/security.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security
title: "security"
image: https://source.unsplash.com/400x175/?github
description: API docs for the security plugin
-date: 2023-09-14
+date: 2023-09-18
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 f4ab2f7dd0457..5eba3ddebdd38 100644
--- a/api_docs/security_solution.mdx
+++ b/api_docs/security_solution.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution
title: "securitySolution"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolution plugin
-date: 2023-09-14
+date: 2023-09-18
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 1580db0b601a0..22cdb80677758 100644
--- a/api_docs/security_solution_ess.mdx
+++ b/api_docs/security_solution_ess.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss
title: "securitySolutionEss"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionEss plugin
-date: 2023-09-14
+date: 2023-09-18
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 df67d3400c279..c889923cb5830 100644
--- a/api_docs/security_solution_serverless.mdx
+++ b/api_docs/security_solution_serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless
title: "securitySolutionServerless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the securitySolutionServerless plugin
-date: 2023-09-14
+date: 2023-09-18
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 7de2691cf67d1..4e17e3d8b0466 100644
--- a/api_docs/serverless.mdx
+++ b/api_docs/serverless.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless
title: "serverless"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverless plugin
-date: 2023-09-14
+date: 2023-09-18
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 d2b5f949768b9..753f8d779b7b3 100644
--- a/api_docs/serverless_observability.mdx
+++ b/api_docs/serverless_observability.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability
title: "serverlessObservability"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessObservability plugin
-date: 2023-09-14
+date: 2023-09-18
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 fc62a4fba6fc0..15c5da35e4840 100644
--- a/api_docs/serverless_search.mdx
+++ b/api_docs/serverless_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch
title: "serverlessSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the serverlessSearch plugin
-date: 2023-09-14
+date: 2023-09-18
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 63f184e473b39..0de7aa5a518ee 100644
--- a/api_docs/session_view.mdx
+++ b/api_docs/session_view.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView
title: "sessionView"
image: https://source.unsplash.com/400x175/?github
description: API docs for the sessionView plugin
-date: 2023-09-14
+date: 2023-09-18
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 719645bb8ed8b..7c445037e8b5d 100644
--- a/api_docs/share.mdx
+++ b/api_docs/share.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share
title: "share"
image: https://source.unsplash.com/400x175/?github
description: API docs for the share plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share']
---
import shareObj from './share.devdocs.json';
diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx
index dac88da1f363d..70f90f3dc20ab 100644
--- a/api_docs/snapshot_restore.mdx
+++ b/api_docs/snapshot_restore.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore
title: "snapshotRestore"
image: https://source.unsplash.com/400x175/?github
description: API docs for the snapshotRestore plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore']
---
import snapshotRestoreObj from './snapshot_restore.devdocs.json';
diff --git a/api_docs/spaces.devdocs.json b/api_docs/spaces.devdocs.json
index 8ce91315daa63..2b4ff0b4dd02d 100644
--- a/api_docs/spaces.devdocs.json
+++ b/api_docs/spaces.devdocs.json
@@ -2832,7 +2832,7 @@
"\nSetup contract for the Spaces plugin."
],
"signature": [
- "{}"
+ "{ hasOnlyDefaultSpace: boolean; }"
],
"path": "x-pack/plugins/spaces/public/plugin.tsx",
"deprecated": false,
@@ -2907,6 +2907,19 @@
"children": [],
"returnComment": []
},
+ {
+ "parentPluginId": "spaces",
+ "id": "def-public.SpacesApi.hasOnlyDefaultSpace",
+ "type": "boolean",
+ "tags": [],
+ "label": "hasOnlyDefaultSpace",
+ "description": [
+ "\nDetermines whether Kibana supports multiple spaces or only the default space.\n\nWhen `xpack.spaces.maxSpaces` is set to 1 Kibana only supports the default space and any spaces related UI can safely be hidden."
+ ],
+ "path": "x-pack/plugins/spaces/public/types.ts",
+ "deprecated": false,
+ "trackAdoption": false
+ },
{
"parentPluginId": "spaces",
"id": "def-public.SpacesApi.ui",
@@ -4359,6 +4372,23 @@
"path": "x-pack/plugins/spaces/server/plugin.ts",
"deprecated": false,
"trackAdoption": false
+ },
+ {
+ "parentPluginId": "spaces",
+ "id": "def-server.SpacesPluginSetup.hasOnlyDefaultSpace$",
+ "type": "Object",
+ "tags": [],
+ "label": "hasOnlyDefaultSpace$",
+ "description": [
+ "\nDetermines whether Kibana supports multiple spaces or only the default space.\n\nWhen `xpack.spaces.maxSpaces` is set to 1 Kibana only supports the default space and any spaces related UI can safely be hidden."
+ ],
+ "signature": [
+ "Observable",
+ ""
+ ],
+ "path": "x-pack/plugins/spaces/server/plugin.ts",
+ "deprecated": false,
+ "trackAdoption": false
}
],
"lifecycle": "setup",
@@ -4398,6 +4428,23 @@
"path": "x-pack/plugins/spaces/server/plugin.ts",
"deprecated": false,
"trackAdoption": false
+ },
+ {
+ "parentPluginId": "spaces",
+ "id": "def-server.SpacesPluginStart.hasOnlyDefaultSpace$",
+ "type": "Object",
+ "tags": [],
+ "label": "hasOnlyDefaultSpace$",
+ "description": [
+ "\nDetermines whether Kibana supports multiple spaces or only the default space.\n\nWhen `xpack.spaces.maxSpaces` is set to 1 Kibana only supports the default space and any spaces related UI can safely be hidden."
+ ],
+ "signature": [
+ "Observable",
+ ""
+ ],
+ "path": "x-pack/plugins/spaces/server/plugin.ts",
+ "deprecated": false,
+ "trackAdoption": false
}
],
"lifecycle": "start",
diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx
index 69ff7c2ca418e..2c5bff59f99c8 100644
--- a/api_docs/spaces.mdx
+++ b/api_docs/spaces.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces
title: "spaces"
image: https://source.unsplash.com/400x175/?github
description: API docs for the spaces plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces']
---
import spacesObj from './spaces.devdocs.json';
@@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-
| Public API count | Any count | Items lacking comments | Missing exports |
|-------------------|-----------|------------------------|-----------------|
-| 253 | 0 | 65 | 0 |
+| 256 | 0 | 65 | 0 |
## Client
diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx
index fe29475632f72..6404d5f492fc2 100644
--- a/api_docs/stack_alerts.mdx
+++ b/api_docs/stack_alerts.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts
title: "stackAlerts"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackAlerts plugin
-date: 2023-09-14
+date: 2023-09-18
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 3785899ec39d8..189fefea6e009 100644
--- a/api_docs/stack_connectors.mdx
+++ b/api_docs/stack_connectors.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors
title: "stackConnectors"
image: https://source.unsplash.com/400x175/?github
description: API docs for the stackConnectors plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors']
---
import stackConnectorsObj from './stack_connectors.devdocs.json';
diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx
index 08c0ee81dd96d..8d678bc02daa7 100644
--- a/api_docs/task_manager.mdx
+++ b/api_docs/task_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager
title: "taskManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the taskManager plugin
-date: 2023-09-14
+date: 2023-09-18
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 85fe972cc9c69..7b494960ac3aa 100644
--- a/api_docs/telemetry.mdx
+++ b/api_docs/telemetry.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry
title: "telemetry"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetry plugin
-date: 2023-09-14
+date: 2023-09-18
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 1c923213f1995..e6aec2eb4a60c 100644
--- a/api_docs/telemetry_collection_manager.mdx
+++ b/api_docs/telemetry_collection_manager.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager
title: "telemetryCollectionManager"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionManager plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager']
---
import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json';
diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx
index a0a229d425878..354877d217b88 100644
--- a/api_docs/telemetry_collection_xpack.mdx
+++ b/api_docs/telemetry_collection_xpack.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack
title: "telemetryCollectionXpack"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryCollectionXpack plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack']
---
import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json';
diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx
index c461f62dc6774..eb0617a920f30 100644
--- a/api_docs/telemetry_management_section.mdx
+++ b/api_docs/telemetry_management_section.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection
title: "telemetryManagementSection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the telemetryManagementSection plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection']
---
import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json';
diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx
index 50eac70271edd..19a99a2b95e3d 100644
--- a/api_docs/text_based_languages.mdx
+++ b/api_docs/text_based_languages.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages
title: "textBasedLanguages"
image: https://source.unsplash.com/400x175/?github
description: API docs for the textBasedLanguages plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages']
---
import textBasedLanguagesObj from './text_based_languages.devdocs.json';
diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx
index bb62e8ac55691..78ca7b06f4108 100644
--- a/api_docs/threat_intelligence.mdx
+++ b/api_docs/threat_intelligence.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence
title: "threatIntelligence"
image: https://source.unsplash.com/400x175/?github
description: API docs for the threatIntelligence plugin
-date: 2023-09-14
+date: 2023-09-18
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 45c25410323dd..2539f40f5be8e 100644
--- a/api_docs/timelines.mdx
+++ b/api_docs/timelines.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines
title: "timelines"
image: https://source.unsplash.com/400x175/?github
description: API docs for the timelines plugin
-date: 2023-09-14
+date: 2023-09-18
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 e7211500b750d..fe698cfdcafeb 100644
--- a/api_docs/transform.mdx
+++ b/api_docs/transform.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform
title: "transform"
image: https://source.unsplash.com/400x175/?github
description: API docs for the transform plugin
-date: 2023-09-14
+date: 2023-09-18
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 8cad829571754..a14a53787e873 100644
--- a/api_docs/triggers_actions_ui.mdx
+++ b/api_docs/triggers_actions_ui.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi
title: "triggersActionsUi"
image: https://source.unsplash.com/400x175/?github
description: API docs for the triggersActionsUi plugin
-date: 2023-09-14
+date: 2023-09-18
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 6ffc98a21a1ed..36aae26dc9903 100644
--- a/api_docs/ui_actions.mdx
+++ b/api_docs/ui_actions.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions
title: "uiActions"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActions plugin
-date: 2023-09-14
+date: 2023-09-18
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 88e1395458c24..7b3f0faa027cf 100644
--- a/api_docs/ui_actions_enhanced.mdx
+++ b/api_docs/ui_actions_enhanced.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced
title: "uiActionsEnhanced"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uiActionsEnhanced plugin
-date: 2023-09-14
+date: 2023-09-18
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 0421a2cc43973..47599b58f8d07 100644
--- a/api_docs/unified_doc_viewer.mdx
+++ b/api_docs/unified_doc_viewer.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer
title: "unifiedDocViewer"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedDocViewer plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer']
---
import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json';
diff --git a/api_docs/unified_histogram.devdocs.json b/api_docs/unified_histogram.devdocs.json
index afa74e73e7990..4288127fabc2b 100644
--- a/api_docs/unified_histogram.devdocs.json
+++ b/api_docs/unified_histogram.devdocs.json
@@ -466,7 +466,7 @@
"section": "def-common.RequestAdapter",
"text": "RequestAdapter"
},
- " | undefined; } & Pick<",
+ " | undefined; isChartLoading?: boolean | undefined; } & Pick<",
"UnifiedHistogramLayoutProps",
", \"children\" | \"className\" | \"query\" | \"filters\" | \"columns\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"resizeRef\" | \"appendHitsCounter\" | \"onFilter\" | \"withDefaultActions\"> & React.RefAttributes<",
{
@@ -1176,7 +1176,7 @@
"section": "def-common.RequestAdapter",
"text": "RequestAdapter"
},
- " | undefined; } & Pick<",
+ " | undefined; isChartLoading?: boolean | undefined; } & Pick<",
"UnifiedHistogramLayoutProps",
", \"children\" | \"className\" | \"query\" | \"filters\" | \"columns\" | \"onBrushEnd\" | \"disabledActions\" | \"timeRange\" | \"services\" | \"dataView\" | \"relativeTimeRange\" | \"resizeRef\" | \"appendHitsCounter\" | \"onFilter\" | \"withDefaultActions\">"
],
diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx
index c3de85536fad8..4ad356e41031c 100644
--- a/api_docs/unified_histogram.mdx
+++ b/api_docs/unified_histogram.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram
title: "unifiedHistogram"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedHistogram plugin
-date: 2023-09-14
+date: 2023-09-18
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 8d2a45d60378d..b62b43f181db7 100644
--- a/api_docs/unified_search.mdx
+++ b/api_docs/unified_search.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch
title: "unifiedSearch"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch plugin
-date: 2023-09-14
+date: 2023-09-18
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 0b1205bf549e7..03b11994546df 100644
--- a/api_docs/unified_search_autocomplete.mdx
+++ b/api_docs/unified_search_autocomplete.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete
title: "unifiedSearch.autocomplete"
image: https://source.unsplash.com/400x175/?github
description: API docs for the unifiedSearch.autocomplete plugin
-date: 2023-09-14
+date: 2023-09-18
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 bdd26971bd8bf..a79fa233b60c2 100644
--- a/api_docs/uptime.mdx
+++ b/api_docs/uptime.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime
title: "uptime"
image: https://source.unsplash.com/400x175/?github
description: API docs for the uptime plugin
-date: 2023-09-14
+date: 2023-09-18
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 04ba8af801efe..879d342d58126 100644
--- a/api_docs/url_forwarding.mdx
+++ b/api_docs/url_forwarding.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding
title: "urlForwarding"
image: https://source.unsplash.com/400x175/?github
description: API docs for the urlForwarding plugin
-date: 2023-09-14
+date: 2023-09-18
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 512ef831467d1..967fe7880a4c5 100644
--- a/api_docs/usage_collection.mdx
+++ b/api_docs/usage_collection.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection
title: "usageCollection"
image: https://source.unsplash.com/400x175/?github
description: API docs for the usageCollection plugin
-date: 2023-09-14
+date: 2023-09-18
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 18551d40c26f4..96ca8d0ac6d0a 100644
--- a/api_docs/ux.mdx
+++ b/api_docs/ux.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux
title: "ux"
image: https://source.unsplash.com/400x175/?github
description: API docs for the ux plugin
-date: 2023-09-14
+date: 2023-09-18
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 309b891140656..4461569637176 100644
--- a/api_docs/vis_default_editor.mdx
+++ b/api_docs/vis_default_editor.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor
title: "visDefaultEditor"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visDefaultEditor plugin
-date: 2023-09-14
+date: 2023-09-18
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 72a4f8bca4191..e5ddc67d24f63 100644
--- a/api_docs/vis_type_gauge.mdx
+++ b/api_docs/vis_type_gauge.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge
title: "visTypeGauge"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeGauge plugin
-date: 2023-09-14
+date: 2023-09-18
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 8771fa90666d6..65d0487d4ba3b 100644
--- a/api_docs/vis_type_heatmap.mdx
+++ b/api_docs/vis_type_heatmap.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap
title: "visTypeHeatmap"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeHeatmap plugin
-date: 2023-09-14
+date: 2023-09-18
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 f5cccf308d3cd..15aa4f66931c6 100644
--- a/api_docs/vis_type_pie.mdx
+++ b/api_docs/vis_type_pie.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie
title: "visTypePie"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypePie plugin
-date: 2023-09-14
+date: 2023-09-18
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 159256d4eafd4..e238a48bbb921 100644
--- a/api_docs/vis_type_table.mdx
+++ b/api_docs/vis_type_table.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable
title: "visTypeTable"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTable plugin
-date: 2023-09-14
+date: 2023-09-18
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 730c543f5831c..830700d499f93 100644
--- a/api_docs/vis_type_timelion.mdx
+++ b/api_docs/vis_type_timelion.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion
title: "visTypeTimelion"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimelion plugin
-date: 2023-09-14
+date: 2023-09-18
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 7e4c66fa61d8e..3bf19e74f9f3d 100644
--- a/api_docs/vis_type_timeseries.mdx
+++ b/api_docs/vis_type_timeseries.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries
title: "visTypeTimeseries"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeTimeseries plugin
-date: 2023-09-14
+date: 2023-09-18
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 ffbbdc47f42b1..af39253166b07 100644
--- a/api_docs/vis_type_vega.mdx
+++ b/api_docs/vis_type_vega.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega
title: "visTypeVega"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVega plugin
-date: 2023-09-14
+date: 2023-09-18
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 687b221d4b076..139ad5a35f397 100644
--- a/api_docs/vis_type_vislib.mdx
+++ b/api_docs/vis_type_vislib.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib
title: "visTypeVislib"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeVislib plugin
-date: 2023-09-14
+date: 2023-09-18
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 70503945e3f7a..d069c100321aa 100644
--- a/api_docs/vis_type_xy.mdx
+++ b/api_docs/vis_type_xy.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy
title: "visTypeXy"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visTypeXy plugin
-date: 2023-09-14
+date: 2023-09-18
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 c18450f48713f..e5cb903be22db 100644
--- a/api_docs/visualizations.mdx
+++ b/api_docs/visualizations.mdx
@@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations
title: "visualizations"
image: https://source.unsplash.com/400x175/?github
description: API docs for the visualizations plugin
-date: 2023-09-14
+date: 2023-09-18
tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations']
---
import visualizationsObj from './visualizations.devdocs.json';
diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc
index 73a0bf8df1da0..a3d8de47a0ab2 100644
--- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc
+++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc
@@ -1003,6 +1003,7 @@ Any modifications made to this file will be overwritten.
action_response_properties
- Action response properties
config_properties_cases_webhook
- Connector request properties for Webhook - Case Management connector
config_properties_d3security
- Connector request properties for a D3 Security connector
+ config_properties_email
- Connector request properties for an email connector
config_properties_genai
- Connector request properties for a generative AI connector
config_properties_index
- Connector request properties for an index connector
config_properties_jira
- Connector request properties for a Jira connector
@@ -1092,6 +1093,7 @@ Any modifications made to this file will be overwritten.
run_connector_subaction_pushtoservice_subActionParams_incident_source_ip
-
secrets_properties_cases_webhook
- Connector secrets properties for Webhook - Case Management connector
secrets_properties_d3security
- Connector secrets properties for a D3 Security connector
+ secrets_properties_email
- Connector secrets properties for an email connector
secrets_properties_genai
- Connector secrets properties for a generative AI connector
secrets_properties_jira
- Connector secrets properties for a Jira connector
secrets_properties_opsgenie
- Connector secrets properties for an Opsgenie connector
@@ -1107,6 +1109,7 @@ Any modifications made to this file will be overwritten.
updateConnector_400_response
-
update_connector_request_cases_webhook
- Update Webhook - Case Managment connector request
update_connector_request_d3security
- Update D3 Security connector request
+ update_connector_request_email
- Update email connector request
update_connector_request_index
- Update index connector request
update_connector_request_jira
- Update Jira connector request
update_connector_request_opsgenie
- Update Opsgenie connector request
@@ -1119,6 +1122,7 @@ Any modifications made to this file will be overwritten.
update_connector_request_slack_webhook
- Update Slack connector request
update_connector_request_swimlane
- Update Swimlane connector request
update_connector_request_teams
- Update Microsoft Teams connector request
+ update_connector_request_webhook
- Update Webhook connector request
update_connector_request_xmatters
- Update xMatters connector request
@@ -1397,6 +1401,23 @@ Any modifications made to this file will be overwritten.
url
String The D3 Security API request URL. If you are using the
xpack.actions.allowedHosts
setting, add the hostname to the allowed hosts.
+
+
+
Defines properties for connectors when type is .email
.
+
+
clientId (optional)
String The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If
service
is
exchange_server
, this property is required.
+
from
String The from address for all emails sent by the connector. It must be specified in
user@host-name
format.
+
hasAuth (optional)
Boolean Specifies whether a user and password are required inside the secrets configuration.
+
host (optional)
String The host name of the service provider. If the
service
is
elastic_cloud
(for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If
service
is
other
, this property must be defined.
+
oauthTokenUrl (optional)
+
port (optional)
Integer The port to connect to on the service provider. If the
service
is
elastic_cloud
(for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If
service
is
other
, this property must be defined.
+
secure (optional)
Boolean Specifies whether the connection to the service provider will use TLS. If the
service
is
elastic_cloud
(for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.
+
service (optional)
String The name of the email service.
+
+
elastic_cloud
exchange_server
gmail
other
outlook365
ses
+
tenantId (optional)
String The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If
service
is
exchange_server
, this property is required.
+
+
Defines properties for connectors when type is .gen-ai
.
@@ -1561,7 +1582,7 @@ Any modifications made to this file will be overwritten.
-
config
+
config
connector_type_id
.email
@@ -1861,12 +1882,12 @@ Any modifications made to this file will be overwritten.
The email connector uses the SMTP protocol to send mail messages, using an integration of Nodemailer. An exception is Microsoft Exchange, which uses HTTP protocol for sending emails, Send mail. Email message text is sent as both plain text and html text.
-
config
+
config
connector_type_id
.email
name
String The display name for the connector.
-
secrets
+
secrets
@@ -2425,6 +2446,15 @@ Any modifications made to this file will be overwritten.
token
+
+
+
Defines secrets for connectors when type is .email
.
+
+
clientSecret (optional)
String The Microsoft Exchange Client secret for OAuth 2.0 client credentials authentication. It must be URL-encoded. If
service
is
exchange_server
, this property is required.
+
password (optional)
String The password for HTTP basic authentication. If
hasAuth
is set to
true
, this property is required.
+
user (optional)
String The username for HTTP basic authentication. If
hasAuth
is set to
true
, this property is required.
+
+
Defines secrets for connectors when type is .gen-ai
.
@@ -2548,6 +2578,15 @@ Any modifications made to this file will be overwritten.
secrets
+
+
+
+
+
config
+
name
String The display name for the connector.
+
secrets (optional)
+
+
@@ -2650,6 +2689,15 @@ Any modifications made to this file will be overwritten.
secrets
+
+
+
+
+
config
+
name
String The display name for the connector.
+
secrets
+
+
diff --git a/docs/management/cases/manage-cases.asciidoc b/docs/management/cases/manage-cases.asciidoc
index a3f0a40fd6009..e3896423b3f13 100644
--- a/docs/management/cases/manage-cases.asciidoc
+++ b/docs/management/cases/manage-cases.asciidoc
@@ -105,14 +105,13 @@ For self-managed {kib}:
+
--
NOTE: At this time, email notifications support only preconfigured connectors,
-which are defined in the `kibana.yml` file. For examples, refer to
-{kibana-ref}/email-action-type.html#preconfigured-email-configuration[Preconfigured email connector]
-and {kibana-ref}/email-action-type.html#configuring-email[Configuring email connectors for well-known services].
+which are defined in the `kibana.yml` file.
+For examples, refer to <
> and <>.
--
. Set the `notifications.connectors.default.email` {kib} setting to the name of
your email connector.
. If you want the email notifications to contain links back to the case, you
-must configure the {kibana-ref}/settings.html#server-publicBaseUrl[server.publicBaseUrl] setting.
+must configure the <> setting.
When you subsequently add assignees to cases, they receive an email.
// end::case-notifications[]
diff --git a/docs/management/connectors/action-types/email.asciidoc b/docs/management/connectors/action-types/email.asciidoc
index 0f652821a3661..c7cea7e1dceff 100644
--- a/docs/management/connectors/action-types/email.asciidoc
+++ b/docs/management/connectors/action-types/email.asciidoc
@@ -97,88 +97,12 @@ Username for login type authentication.
Password::
Password for login type authentication.
-[float]
-[[preconfigured-email-configuration]]
-=== Create preconfigured connectors
-
-If you are running {kib} on-prem, you can define connectors by
-adding `xpack.actions.preconfigured` settings to your `kibana.yml` file.
-For example:
-
-[source,text]
---
-xpack.actions.preconfigured:
- my-email:
- name: preconfigured-email-connector-type
- actionTypeId: .email
- config:
- service: other
- from: testsender@test.com
- host: validhostname
- port: 8080
- secure: false
- secrets:
- user: testuser
- password: passwordkeystorevalue
---
-
-Config defines information for the connector type.
-
-`service`::
-The name of the email service. If `service` is `elastic_cloud` (for Elastic
-Cloud notifications) or one of Nodemailer's well-known email service providers,
-the `host`, `port`, and `secure` properties are ignored. If `service` is `other`,
-the `host` and `port` properties must be defined. For more information on the
-`gmail` service value, refer to
-https://nodemailer.com/usage/using-gmail/[Nodemailer Gmail documentation]. If
-`service` is `exchange_server`, the `tenantId`, `clientId`, `clientSecret`
-properties are required instead of `host` and `port`.
-
-`from`::
-An email address that corresponds to *Sender*.
-
-`host`::
-A string that corresponds to *Host*.
-
-`port`::
-A number that corresponds to *Port*.
-
-`secure`::
-A boolean that corresponds to *Secure*.
-
-`hasAuth`::
-A boolean that corresponds to *Requires authentication*. If `true`, this
-connector will require values for `user` and `password` inside the secrets
-configuration. Defaults to `true`.
-
-`tenantId`::
-A GUID format value that corresponds to *Tenant ID*, which is a part of OAuth
-2.0 Client Credentials Authentication.
-
-`clientId`::
-A GUID format value that corresponds to *Client ID*, which is a part of OAuth
-2.0 Client Credentials Authentication.
-
-Secrets defines sensitive information for the connector type.
-
-`user`::
-A string that corresponds to *Username*. Required if `hasAuth` is set to `true`.
-
-`password`::
-A string that corresponds to *Password*. Should be stored in the
-<>. Required if `hasAuth` is set to `true`.
-
-`clientSecret`::
-A string that corresponds to *Client Secret*. Should be stored in the
-<>. Required if `service` is set to
-`exchange_server`, which uses OAuth 2.0 Client Credentials Authentication.
-
[float]
[[email-action-configuration]]
=== Test connectors
-You can test connectors with the <> or
-as you're creating or editing the connector in {kib}. For example:
+You can test connectors as you're creating or editing the connector in {kib}.
+For example:
[role="screenshot"]
image::management/connectors/images/email-params-test.png[Email params test]
@@ -214,14 +138,6 @@ settings. You can set configurations that apply to all your connectors or use
The email connector uses an integration of https://nodemailer.com/[Nodemailer] to send email from many popular SMTP email services.
For Microsoft Exchange email, it uses the Microsoft Graph API.
-To configure the email connector to work with common email systems, refer to:
-
-* <>
-* <>
-* <>
-* <>
-* <>
-
For other email servers, you can check the list of well-known services that
Nodemailer supports in the JSON file
https://github.com/nodemailer/nodemailer/blob/master/lib/well-known/services.json[well-known/services.json].
@@ -233,32 +149,17 @@ is considered `false`. Typically, `port: 465` uses `secure: true`, and
[float]
[[elasticcloud]]
-==== Sending email from Elastic Cloud
+==== {ecloud}
-Use the preconfigured email connector (`Elastic-Cloud-SMTP`) to send emails from
-Elastic Cloud.
+Use the preconfigured email connector (`Elastic-Cloud-SMTP`) to send emails from {ecloud}.
-NOTE: For more information on the preconfigured email connector, see link:{cloud}/ec-watcher.html#ec-cloud-email-service-limits[Elastic Cloud email service limits].
+NOTE: For more information on the preconfigured email connector, see link:{cloud}/ec-watcher.html#ec-cloud-email-service-limits[{ecloud} email service limits].
[float]
[[gmail]]
-==== Sending email from Gmail
-
-Use the following email connector configuration to send email from the
-https://mail.google.com[Gmail] SMTP service:
-
-[source,text]
---------------------------------------------------
- config:
- service: gmail
- // `host`, `port` and `secure` have the following default values and do not need to set:
- // host: smtp.gmail.com
- // port: 465
- // secure: true
- secrets:
- user:
- password:
---------------------------------------------------
+==== Gmail
+
+To create a connector that sends email from the https://mail.google.com[Gmail] SMTP service, set the **Service** to `Gmail`.
If you get an authentication error that indicates that you need to continue the
sign-in process from a web browser when the action attempts to send email, you
@@ -272,23 +173,10 @@ for more information.
[float]
[[outlook]]
-==== Sending email from Outlook.com
-
-Use the following email connector configuration to send email from the
-https://www.outlook.com/[Outlook.com] SMTP service:
-
-[source,text]
---------------------------------------------------
-config:
- service: outlook365
- // `host`, `port` and `secure` have the following default values and do not need to set:
- // host: smtp.office365.com
- // port: 587
- // secure: false
-secrets:
- user:
- password:
---------------------------------------------------
+==== Outlook.com
+
+To create a connector that sends email from the
+https://www.outlook.com/[Outlook.com] SMTP service, set the **Service** to `Outlook`.
When sending emails, you must provide a `from` address, either as the default
in your connector configuration or as part of the email action in the rule.
@@ -300,24 +188,10 @@ for more information.
[float]
[[amazon-ses]]
-==== Sending email from Amazon SES (Simple Email Service)
-
-Use the following email connector configuration to send email from the
-http://aws.amazon.com/ses[Amazon Simple Email Service] (SES) SMTP service:
-
-[source,text]
---------------------------------------------------
-config:
- service: ses
- // `host`, `port` and `secure` have the following default values and do not need to set:
- // host: email-smtp.us-east-1.amazonaws.com <1>
- // port: 465
- // secure: true
-secrets:
- user:
- password:
---------------------------------------------------
-<1> `config.host` varies depending on the region
+==== Amazon SES
+
+To create a connector that sends email from the
+http://aws.amazon.com/ses[Amazon Simple Email Service] (SES) SMTP service, set the **Service** to `Amazon SES`.
NOTE: You must use your Amazon SES SMTP credentials to send email through Amazon
SES. For more information, see
@@ -328,38 +202,19 @@ or
https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-domains.html[your whole domain]
at AWS.
-
[float]
[[exchange-basic-auth]]
-==== Sending email from Microsoft Exchange with Basic Authentication
+==== Microsoft Exchange with basic authentication
deprecated:[7.16.0,"This Microsoft Exchange configuration is deprecated and will be removed later because Microsoft is deprecating basic authentication."]
-[source,text]
---------------------------------------------------
-config:
- service: other
- host:
- port: 465
- secure: true
- from: <1>
-secrets:
- user: <2>
- password:
---------------------------------------------------
-<1> Some organizations configure Exchange to validate that the `from` field is a
- valid local email account.
-<2> Many organizations support use of your email address as your username.
- Check with your system administrator if you receive
- authentication-related failures.
-
To prepare for the removal of Basic Auth, you must update all existing Microsoft
Exchange connectors with the new configuration based on the
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow[OAuth 2.0 Client Credentials Authentication].
[float]
[[exchange]]
-==== Sending email from Microsoft Exchange with OAuth 2.0
+==== Microsoft Exchange with OAuth 2.0
NOTE: The email connector uses Microsoft Graph REST API v1.0, in particular the https://docs.microsoft.com/en-us/graph/api/user-sendmail[sendMail] endpoint. It supports only the https://learn.microsoft.com/en-us/graph/deployments#microsoft-graph-and-graph-explorer-service-root-endpoints[Microsoft Graph global service] root endpoint (`https://graph.microsoft.com`).
@@ -396,9 +251,9 @@ image::management/connectors/images/exchange-granted.png[MS Exchange grant confi
[float]
[[exchange-client-secret]]
-===== Configure Microsoft Exchange Client secret
+===== Configure the Microsoft Exchange Client secret
-To configure the Client secret , open *Manage > Certificates & secrets*.
+To configure the Microsoft Exchange Client secret, open *Manage > Certificates & secrets*:
[role="screenshot"]
image::management/connectors/images/exchange-secrets.png[MS Exchange secrets configuration]
@@ -408,29 +263,12 @@ the Microsoft Exchange email connector.
[float]
[[exchange-client-tenant-id]]
-===== Configure Microsoft Exchange Client ID and Tenant ID
+===== Configure the Microsoft Exchange client and tenant identifiers
-To find the application Client ID, open the *Overview* page.
+To find the Microsoft Exchange client and tenant IDs, open the *Overview* page:
[role="screenshot"]
image::management/connectors/images/exchange-client-tenant.png[MS Exchange Client ID and Tenant ID configuration]
-Copy and paste this values to the proper fields in the Microsoft Exchange email
-connector.
-
-Use the following email connector configuration to send email from Microsoft
-Exchange:
-
-[source,text]
---------------------------------------------------
-config:
- service: exchange_server
- clientId: <1>
- tenantId:
- from: <2>
-secrets:
- clientSecret:
---------------------------------------------------
-<1> This application information is on the https://go.microsoft.com/fwlink/?linkid=2083908[Azure portal – App registrations].
-<2> Some organizations configure Exchange to validate that the `from` field is a
- valid local email account.
+Create a connector and set the **Service** to `MS Exchange Server`.
+Copy and paste the values into the proper fields.
\ No newline at end of file
diff --git a/docs/management/connectors/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc
index 60e35eb510597..0cf5734f1ab77 100644
--- a/docs/management/connectors/pre-configured-connectors.asciidoc
+++ b/docs/management/connectors/pre-configured-connectors.asciidoc
@@ -108,6 +108,7 @@ Index names must start with `kibana-alert-history-` to take advantage of the pre
* <>
* <>
+* <>
* <>
* <>
* <>
@@ -138,6 +139,141 @@ xpack.actions.preconfigured:
<1> The D3 Security API request URL.
<2> The D3 Security token.
+[float]
+[[preconfigured-email-configuration]]
+==== Email connectors
+
+The following example creates an <>:
+
+[source,text]
+--
+xpack.actions.preconfigured:
+ my-email:
+ name: preconfigured-email-connector-type
+ actionTypeId: .email
+ config:
+ service: other <1>
+ from: testsender@test.com <2>
+ host: validhostname <3>
+ port: 8080 <4>
+ secure: false <5>
+ hasAuth: true <6>
+ secrets:
+ user: testuser <7>
+ password: passwordkeystorevalue <8>
+--
+
+<1> The name of the email service. If `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, the `host`, `port`, and `secure` properties are ignored. If `service` is `other`, the `host` and `port` properties must be defined. For more information on the `gmail` service value, refer to https://nodemailer.com/usage/using-gmail/[Nodemailer Gmail documentation]. If `service` is `exchange_server`, the `tenantId`, `clientId`, `clientSecret`
+properties are required instead of `host` and `port`.
+<2> The email address for all emails sent with this connector. It must be specified in `user@host-name` format.
+<3> The host name of the service provider.
+<4> The port to connect to on the service provider.
+<5> If true, the connection will use TLS when connecting to the service provider.
+<6> If `true`, this connector will require values for `user` and `password` inside the secrets configuration. Defaults to `true`.
+<7> A user name for authentication. Required if `hasAuth` is set to `true`.
+<8> A password for authentication. Should be stored in the <>. Required if `hasAuth` is set to `true`.
+
+
+[float]
+[[preconfigured-email-configuration-amazon-ses]]
+===== Amazon SES (Simple Email Service)
+
+Use the following email connector configuration to send email from the
+http://aws.amazon.com/ses[Amazon Simple Email Service] (SES) SMTP service:
+
+[source,text]
+--------------------------------------------------
+config:
+ service: ses
+ // `host`, `port` and `secure` have the following default values and do not need to set:
+ // host: email-smtp.us-east-1.amazonaws.com <1>
+ // port: 465
+ // secure: true
+secrets:
+ user:
+ password:
+--------------------------------------------------
+<1> `config.host` varies depending on the region
+
+[float]
+[[preconfigured-email-configuration-gmail]]
+===== Gmail
+
+Use the following email connector configuration to send email from the https://mail.google.com[Gmail] SMTP service:
+
+[source,text]
+--------------------------------------------------
+ config:
+ service: gmail
+ // `host`, `port` and `secure` have the following default values and do not need to set:
+ // host: smtp.gmail.com
+ // port: 465
+ // secure: true
+ secrets:
+ user:
+ password:
+--------------------------------------------------
+
+[float]
+[[preconfigured-email-configuration-exchange-basic-auth]]
+===== Microsoft Exchange with basic authentication
+
+deprecated:[7.16.0,"This Microsoft Exchange configuration is deprecated and will be removed later because Microsoft is deprecating basic authentication."]
+
+[source,text]
+--------------------------------------------------
+config:
+ service: other
+ host:
+ port: 465
+ secure: true
+ from: <1>
+secrets:
+ user: <2>
+ password:
+--------------------------------------------------
+<1> Some organizations configure Exchange to validate that the `from` field is a valid local email account.
+<2> Many organizations support use of your email address as your username. Check with your system administrator if you receive authentication-related failures.
+
+[float]
+[[preconfigured-email-configuration-exchange]]
+===== Microsoft Exchange with OAuth 2.0
+
+Use the following email connector configuration to send email from Microsoft Exchange:
+
+[source,text]
+--------------------------------------------------
+config:
+ service: exchange_server
+ clientId: <1>
+ tenantId:
+ from: <2>
+secrets:
+ clientSecret:
+--------------------------------------------------
+<1> This application information is on the https://go.microsoft.com/fwlink/?linkid=2083908[Azure portal – App registrations].
+<2> Some organizations configure Exchange to validate that the `from` field is a valid local email account.
+
+[float]
+[[preconfigured-email-configuration-outlook]]
+===== Outlook.com
+
+Use the following email connector configuration to send email from the
+https://www.outlook.com/[Outlook.com] SMTP service:
+
+[source,text]
+--------------------------------------------------
+config:
+ service: outlook365
+ // `host`, `port` and `secure` have the following default values and do not need to set:
+ // host: smtp.office365.com
+ // port: 587
+ // secure: false
+secrets:
+ user:
+ password:
+--------------------------------------------------
+
[float]
[[preconfigured-resilient-configuration]]
==== {ibm-r} connectors
diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc
index c86678ee3a775..88da0859858a0 100644
--- a/docs/settings/alert-action-settings.asciidoc
+++ b/docs/settings/alert-action-settings.asciidoc
@@ -270,6 +270,9 @@ A configuration URL that varies by connector:
NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts.
--
+`xpack.actions.preconfigured..config.clientId`::
+For an <>, specifies a GUID format value that corresponds to the client ID, which is a part of OAuth 2.0 client credentials authentication.
+
`xpack.actions.preconfigured..config.configUrl`::
For an <> with basic authentication, specifies the request URL for the Elastic Alerts trigger in xMatters.
@@ -306,6 +309,10 @@ For a <>, specifies a string f
`xpack.actions.preconfigured..config.executionTimeField`::
For an <>, a field that indicates when the document was indexed.
+`xpack.actions.preconfigured..config.from`::
+For an <>, specifies the from address for all emails sent by the connector.
+It must be specified in `user@host-name` format.
+
`xpack.actions.preconfigured..config.getIncidentResponseExternalTitleKey`::
For a <>, specifies a string from the response body of the get case method that corresponds to the external service title.
@@ -315,20 +322,38 @@ For a <>, specifies a REST API
NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure the hostname in the URL is added to the allowed hosts.
`xpack.actions.preconfigured..config.hasAuth`::
-For a <>, specifies whether a user and password are required inside the secrets configuration. Defaults to `true`.
+For an <>, <>, or <>, specifies whether a user and password are required inside the secrets configuration. Defaults to `true`.
`xpack.actions.preconfigured..config.headers`::
-For a <>, specifies a set of key-value pairs sent as headers with the request.
+For a <> or <>, specifies a set of key-value pairs sent as headers with the request.
+
+`xpack.actions.preconfigured..config.host`::
+For an <>, specifies the host name of the service provider.
`xpack.actions.preconfigured..config.index`::
For an <>, specifies the {es} index.
+`xpack.actions.preconfigured..config.method`::
+For a <>, specifies the HTTP request method, either `post` or `put`. Defaults to `post`.
+
`xpack.actions.preconfigured..config.orgId`::
For an <>, specifies the {ibm-r} organization identifier.
+`xpack.actions.preconfigured..config.port`::
+For an <>, specifies the port to connect to on the service provider.
+
`xpack.actions.preconfigured..config.projectKey`::
For a <>, specifies the Jira project key.
+`xpack.actions.preconfigured..config.secure`::
+For an <>, specifies whether the connection will use TLS when connecting to the service provider. If not true, the connection will initially connect over TCP then attempt to switch to TLS via the SMTP STARTTLS command.
+
+`xpack.actions.preconfigured..config.service`::
+For an <>, specifies the name of the email service. For example, `elastic_cloud`, `exchange_server`, `gmail`, `other`, `outlook365`, or `ses`.
+
+`xpack.actions.preconfigured..config.tenantId`::
+For an <>, specifies a GUID format value that corresponds to a tenant ID, which is a part of OAuth 2.0 client credentials authentication.
+
`xpack.actions.preconfigured..config.updateIncidentJson`::
For a <>, specifies a stringified JSON payload with Mustache variables that is sent to the update case URL to update a case. Required variables are `case.title` and `case.description`.
+
@@ -348,6 +373,7 @@ A configuration URL that varies by connector:
+
--
* For a <>, specifies the D3 Security API request URL.
+* For a <>, specifies the web service request URL.
NOTE: If you are using the `xpack.actions.allowedHosts` setting, make sure this hostname is added to the allowed hosts.
--
@@ -382,6 +408,15 @@ For an <>, specifies the authentication
`xpack.actions.preconfigured..secrets.apiToken`::
For a <>, specifies the API authentication token for HTTP basic authentication.
+`xpack.actions.preconfigured..secrets.clientSecret`::
+A client secret that varies by connector:
++
+--
+* For an <>, specifies the client secret that you generated for your app in the app registration portal. It is required when the email service is `exchange_server`, which uses OAuth 2.0 client credentials authentication.
+
+NOTE: The client secret must be URL-encoded.
+--
+
`xpack.actions.preconfigured..secrets.email`::
For a <>, specifies the account email for HTTP basic authentication.
@@ -389,7 +424,7 @@ For a <>, specifies the account email for HTTP
A password secret that varies by connector:
+
--
-* For a <>, specifies a password that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`.
+* For an <>, <>, or <>, specifies a password that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`.
* For an <>, specifies a password that is required when `xpack.actions.preconfigured..config.usesBasic` is `true`.
--
@@ -414,7 +449,7 @@ A token secret that varies by connector:
A user name secret that varies by connector:
+
--
-* For a <>, specifies a user name that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`.
+* For an <>, <>, or <>, specifies a user name that is required when `xpack.actions.preconfigured..config.hasAuth` is `true`.
* For an <>, specifies a user name that is required when `xpack.actions.preconfigured..config.usesBasic` is `true`.
--
diff --git a/examples/search_examples/public/search/app.tsx b/examples/search_examples/public/search/app.tsx
index 0fa13df35a4e9..84bc3e1cd79be 100644
--- a/examples/search_examples/public/search/app.tsx
+++ b/examples/search_examples/public/search/app.tsx
@@ -311,17 +311,15 @@ export const SearchExamplesApp = ({
const result = await lastValueFrom(
searchSource.fetch$({
abortSignal: abortController.signal,
- disableShardFailureWarning: !showWarningToastNotifications,
+ disableWarningToasts: !showWarningToastNotifications,
inspector,
})
);
setRawResponse(result.rawResponse);
- /* Here is an example of using showWarnings on the search service, using an optional callback to
- * intercept the warnings before notification warnings are shown.
- *
- * Suppressing the shard failure warning notification from appearing by default requires setting
- * { disableShardFailureWarning: true } in the SearchSourceSearchOptions passed to $fetch
+ /*
+ * Set disableWarningToasts to true to disable warning toasts and customize warning display.
+ * Then use showWarnings to customize warning notification.
*/
if (showWarningToastNotifications) {
setWarningContents([]);
@@ -498,7 +496,7 @@ export const SearchExamplesApp = ({
{' '}
{' '}
{' '}
{' '}
diff --git a/package.json b/package.json
index 220d685d29cab..d3f6a91735108 100644
--- a/package.json
+++ b/package.json
@@ -952,7 +952,7 @@
"object-hash": "^1.3.1",
"object-path-immutable": "^3.1.1",
"openai": "^3.3.0",
- "openpgp": "5.3.0",
+ "openpgp": "5.10.1",
"opn": "^5.5.0",
"ora": "^4.0.4",
"p-limit": "^3.0.1",
@@ -1098,6 +1098,7 @@
"@jest/reporters": "^29.6.1",
"@jest/transform": "^29.6.1",
"@jest/types": "^29.6.1",
+ "@kayahr/text-encoding": "^1.2.0",
"@kbn/alerting-api-integration-helpers": "link:x-pack/test/alerting_api_integration/packages/helpers",
"@kbn/ambient-common-types": "link:packages/kbn-ambient-common-types",
"@kbn/ambient-ftr-types": "link:packages/kbn-ambient-ftr-types",
diff --git a/packages/content-management/table_list_view_table/src/components/tag_filter_panel.tsx b/packages/content-management/table_list_view_table/src/components/tag_filter_panel.tsx
index 8b7c947fb0c85..844679ebcd971 100644
--- a/packages/content-management/table_list_view_table/src/components/tag_filter_panel.tsx
+++ b/packages/content-management/table_list_view_table/src/components/tag_filter_panel.tsx
@@ -176,8 +176,8 @@ export const TagFilterPanel: FC = ({
- {i18n.translate('contentManagement.tableList.tagFilterPanel.applyButtonLabel', {
- defaultMessage: 'Apply',
+ {i18n.translate('contentManagement.tableList.tagFilterPanel.doneButtonLabel', {
+ defaultMessage: 'Done',
})}
diff --git a/packages/core/http/core-http-router-server-internal/src/router.ts b/packages/core/http/core-http-router-server-internal/src/router.ts
index 5177464796291..5f7d970bc6bb6 100644
--- a/packages/core/http/core-http-router-server-internal/src/router.ts
+++ b/packages/core/http/core-http-router-server-internal/src/router.ts
@@ -200,7 +200,7 @@ export class Router = InferSearchResponseOf;
-export type { InferSearchResponseOf, AggregationResultOf, AggregationResultOfMap, SearchHit };
+export type {
+ InferSearchResponseOf,
+ AggregationResultOf,
+ AggregationResultOfMap,
+ SearchHit,
+ ClusterDetails,
+};
diff --git a/packages/kbn-es-types/src/search.ts b/packages/kbn-es-types/src/search.ts
index 13ebc02b65aa6..502a7464e5351 100644
--- a/packages/kbn-es-types/src/search.ts
+++ b/packages/kbn-es-types/src/search.ts
@@ -644,3 +644,12 @@ export type InferSearchResponseOf<
>;
};
};
+
+export interface ClusterDetails {
+ status: 'running' | 'successful' | 'partial' | 'skipped' | 'failed';
+ indices: string;
+ took?: number;
+ timed_out: boolean;
+ _shards?: estypes.ShardStatistics;
+ failures?: estypes.ShardFailure[];
+}
diff --git a/packages/kbn-guided-onboarding/src/components/landing_page/__snapshots__/guide_cards.test.tsx.snap b/packages/kbn-guided-onboarding/src/components/landing_page/__snapshots__/guide_cards.test.tsx.snap
index ab6e52ceabfef..45038434798f3 100644
--- a/packages/kbn-guided-onboarding/src/components/landing_page/__snapshots__/guide_cards.test.tsx.snap
+++ b/packages/kbn-guided-onboarding/src/components/landing_page/__snapshots__/guide_cards.test.tsx.snap
@@ -297,6 +297,33 @@ exports[`guide cards snapshots should render all cards 1`] = `
size="m"
/>
+
+
+
+
- 4
+ 1
@@ -68,84 +68,14 @@ exports[`SearchResponseWarnings renders "callout" correctly 1`] = `
class="euiText emotion-euiText-s"
data-test-subj="test1_warningTitle"
>
- Data might be incomplete because your request timed out
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
+ The data might be incomplete or wrong.
- test1
+ test
@@ -155,161 +85,7 @@ exports[`SearchResponseWarnings renders "callout" correctly 1`] = `
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
-
-
-
-
- test2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
-
-
-
-
- test3
-
-
-
-
-
-
- Data might be incomplete because your request timed out
-
-
-
-
-
-
-
-
-
- 3 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
-
-
-
-
- test1
-
-
-
-
-
-
-
-
-
- 3 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
-
-
-
-
- test2
-
-
-
-
-
-
-
-
-
- 1 of 4 shards failed
-
-
-
-
-
-
- The data might be incomplete or wrong.
-
+ The data might be incomplete or wrong.
- test3
+ test
diff --git a/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.test.tsx b/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.test.tsx
index 6e3c1b1a0d08d..ca51bd8babee8 100644
--- a/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.test.tsx
+++ b/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.test.tsx
@@ -9,12 +9,14 @@
import React from 'react';
import { mountWithIntl } from '@kbn/test-jest-helpers';
import { SearchResponseWarnings } from './search_response_warnings';
-import { searchResponseWarningsMock } from '../../__mocks__/search_response_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '../../__mocks__/search_response_warnings';
-const interceptedWarnings = searchResponseWarningsMock.map((originalWarning, index) => ({
- originalWarning,
- action: originalWarning.type === 'shard_failure' ? {`test${index}`} : undefined,
-}));
+const interceptedWarnings = [
+ {
+ originalWarning: searchResponseIncompleteWarningLocalCluster,
+ action: {`test`} ,
+ },
+];
describe('SearchResponseWarnings', () => {
it('renders "callout" correctly', () => {
diff --git a/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.tsx b/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.tsx
index 3c92096aa982b..8588e7275505e 100644
--- a/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.tsx
+++ b/packages/kbn-search-response-warnings/src/components/search_response_warnings/search_response_warnings.tsx
@@ -270,22 +270,13 @@ function WarningContent({
groupStyles?: Partial;
'data-test-subj': string;
}) {
- const hasDescription = 'text' in originalWarning;
-
return (
- {hasDescription ? {originalWarning.message} : originalWarning.message}
+ {originalWarning.message}
- {hasDescription ? (
-
-
- {originalWarning.text}
-
-
- ) : null}
{action ? {action} : null}
);
@@ -306,6 +297,7 @@ function CalloutTitleWrapper({
onClick={onCloseCallout}
type="button"
iconType="cross"
+ color="warning"
/>
diff --git a/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.test.tsx b/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.test.tsx
index 34ae546f42ba6..b6bf93169ae63 100644
--- a/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.test.tsx
+++ b/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.test.tsx
@@ -9,11 +9,8 @@
import { RequestAdapter } from '@kbn/inspector-plugin/common';
import { dataPluginMock } from '@kbn/data-plugin/public/mocks';
import { coreMock } from '@kbn/core/public/mocks';
-import {
- getSearchResponseInterceptedWarnings,
- removeInterceptedWarningDuplicates,
-} from './get_search_response_intercepted_warnings';
-import { searchResponseWarningsMock } from '../__mocks__/search_response_warnings';
+import { getSearchResponseInterceptedWarnings } from './get_search_response_intercepted_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '../__mocks__/search_response_warnings';
const servicesMock = {
data: dataPluginMock.createStartContract(),
@@ -23,162 +20,66 @@ const servicesMock = {
describe('getSearchResponseInterceptedWarnings', () => {
const adapter = new RequestAdapter();
- it('should catch warnings correctly', () => {
+ it('should return intercepted incomplete data warnings', () => {
const services = {
...servicesMock,
};
services.data.search.showWarnings = jest.fn((_, callback) => {
// @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[0], {});
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[1], {});
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[2], {});
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[3], {});
-
- // plus duplicates
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[0], {});
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[1], {});
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[2], {});
+ callback?.(searchResponseIncompleteWarningLocalCluster, {});
});
- expect(
- getSearchResponseInterceptedWarnings({
- services,
- adapter,
- options: {
- disableShardFailureWarning: true,
- },
- })
- ).toMatchInlineSnapshot(`
- Array [
- Object {
- "action": undefined,
- "originalWarning": Object {
- "message": "Data might be incomplete because your request timed out",
- "reason": undefined,
- "type": "timed_out",
- },
- },
- Object {
- "action": ,
- "originalWarning": Object {
- "message": "3 of 4 shards failed",
- "reason": Object {
- "reason": "Field [__anonymous_] of type [boolean] does not support custom formats",
- "type": "illegal_argument_exception",
- },
- "text": "The data might be incomplete or wrong.",
- "type": "shard_failure",
- },
- },
- Object {
- "action": ,
- "originalWarning": Object {
- "message": "3 of 4 shards failed",
- "reason": Object {
- "reason": "failed to create query: [.ds-kibana_sample_data_logs-2023.07.11-000001][0] Testing shard failures!",
- "type": "query_shard_exception",
+ const warnings = getSearchResponseInterceptedWarnings({
+ services,
+ adapter,
+ });
+
+ expect(warnings.length).toBe(1);
+ expect(warnings[0].originalWarning).toEqual(searchResponseIncompleteWarningLocalCluster);
+ expect(warnings[0].action).toMatchInlineSnapshot(`
+ ,
- "originalWarning": Object {
- "message": "1 of 4 shards failed",
- "reason": Object {
- "reason": "failed to create query: [.ds-kibana_sample_data_logs-2023.07.11-000001][0] Testing shard failures!",
- "type": "query_shard_exception",
+ "failures": Array [
+ Object {
+ "index": "sample-01-rollup",
+ "node": "VFTFJxpHSdaoiGxJFLSExQ",
+ "reason": Object {
+ "reason": "Field [kubernetes.container.memory.available.bytes] of type [aggregate_metric_double] is not supported for aggregation [percentiles]",
+ "type": "illegal_argument_exception",
+ },
+ "shard": 0,
+ },
+ ],
+ "indices": "",
+ "status": "partial",
+ "timed_out": false,
+ "took": 25,
+ },
},
- "text": "The data might be incomplete or wrong.",
- "type": "shard_failure",
- },
- },
- ]
+ "message": "The data might be incomplete or wrong.",
+ "type": "incomplete",
+ }
+ }
+ />
`);
});
-
- it('should not catch any warnings if disableShardFailureWarning is false', () => {
- const services = {
- ...servicesMock,
- };
- services.data.search.showWarnings = jest.fn((_, callback) => {
- // @ts-expect-error for empty meta
- callback?.(searchResponseWarningsMock[0], {});
- });
- expect(
- getSearchResponseInterceptedWarnings({
- services,
- adapter,
- options: {
- disableShardFailureWarning: false,
- },
- })
- ).toBeUndefined();
- });
-});
-
-describe('removeInterceptedWarningDuplicates', () => {
- it('should remove duplicates successfully', () => {
- const interceptedWarnings = searchResponseWarningsMock.map((originalWarning) => ({
- originalWarning,
- }));
-
- expect(removeInterceptedWarningDuplicates([interceptedWarnings[0]])).toEqual([
- interceptedWarnings[0],
- ]);
- expect(removeInterceptedWarningDuplicates(interceptedWarnings)).toEqual(interceptedWarnings);
- expect(
- removeInterceptedWarningDuplicates([...interceptedWarnings, ...interceptedWarnings])
- ).toEqual(interceptedWarnings);
- });
-
- it('should return undefined if the list is empty', () => {
- expect(removeInterceptedWarningDuplicates([])).toBeUndefined();
- expect(removeInterceptedWarningDuplicates(undefined)).toBeUndefined();
- });
});
diff --git a/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx b/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx
index 38ad0da2639f7..6518d12109a1d 100644
--- a/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx
+++ b/packages/kbn-search-response-warnings/src/utils/get_search_response_intercepted_warnings.tsx
@@ -7,11 +7,9 @@
*/
import React from 'react';
-import { uniqBy } from 'lodash';
import {
type DataPublicPluginStart,
- type ShardFailureRequest,
- ShardFailureOpenModalButton,
+ OpenIncompleteResultsModalButton,
} from '@kbn/data-plugin/public';
import type { RequestAdapter } from '@kbn/inspector-plugin/common';
import type { CoreStart } from '@kbn/core-lifecycle-browser';
@@ -26,21 +24,13 @@ import type { SearchResponseInterceptedWarning } from '../types';
export const getSearchResponseInterceptedWarnings = ({
services,
adapter,
- options,
}: {
services: {
data: DataPublicPluginStart;
theme: CoreStart['theme'];
};
adapter: RequestAdapter;
- options?: {
- disableShardFailureWarning?: boolean;
- };
-}): SearchResponseInterceptedWarning[] | undefined => {
- if (!options?.disableShardFailureWarning) {
- return undefined;
- }
-
+}): SearchResponseInterceptedWarning[] => {
const interceptedWarnings: SearchResponseInterceptedWarning[] = [];
services.data.search.showWarnings(adapter, (warning, meta) => {
@@ -49,13 +39,13 @@ export const getSearchResponseInterceptedWarnings = ({
interceptedWarnings.push({
originalWarning: warning,
action:
- warning.type === 'shard_failure' && warning.text && warning.message ? (
- ({
- request: request as ShardFailureRequest,
+ request,
response,
})}
color="primary"
@@ -66,23 +56,5 @@ export const getSearchResponseInterceptedWarnings = ({
return true; // suppress the default behaviour
});
- return removeInterceptedWarningDuplicates(interceptedWarnings);
-};
-
-/**
- * Removes duplicated warnings
- * @param interceptedWarnings
- */
-export const removeInterceptedWarningDuplicates = (
- interceptedWarnings: SearchResponseInterceptedWarning[] | undefined
-): SearchResponseInterceptedWarning[] | undefined => {
- if (!interceptedWarnings?.length) {
- return undefined;
- }
-
- const uniqInterceptedWarnings = uniqBy(interceptedWarnings, (interceptedWarning) =>
- JSON.stringify(interceptedWarning.originalWarning)
- );
-
- return uniqInterceptedWarnings?.length ? uniqInterceptedWarnings : undefined;
+ return interceptedWarnings;
};
diff --git a/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.test.ts b/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.test.ts
new file mode 100644
index 0000000000000..e8d722feb131a
--- /dev/null
+++ b/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.test.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import { hasUnsupportedDownsampledAggregationFailure } from './has_unsupported_downsampled_aggregation_failure';
+
+describe('hasUnsupportedDownsampledAggregationFailure', () => {
+ test('should return false when unsupported_aggregation_on_downsampled_index shard failure does not exist', () => {
+ expect(
+ hasUnsupportedDownsampledAggregationFailure({
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: {
+ '(local)': {
+ status: 'partial',
+ indices: '',
+ took: 25,
+ timed_out: false,
+ _shards: {
+ total: 4,
+ successful: 3,
+ skipped: 0,
+ failed: 1,
+ },
+ failures: [
+ {
+ shard: 0,
+ index: 'sample-01-rollup',
+ node: 'VFTFJxpHSdaoiGxJFLSExQ',
+ reason: {
+ type: 'illegal_argument_exception',
+ reason:
+ 'Field [kubernetes.container.memory.available.bytes] of type [aggregate_metric_double] is not supported for aggregation [percentiles]',
+ },
+ },
+ ],
+ },
+ },
+ })
+ ).toBe(false);
+ });
+
+ test('should return true when unsupported_aggregation_on_downsampled_index shard failure exists', () => {
+ expect(
+ hasUnsupportedDownsampledAggregationFailure({
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: {
+ '(local)': {
+ status: 'partial',
+ indices: '',
+ took: 25,
+ timed_out: false,
+ _shards: {
+ total: 4,
+ successful: 3,
+ skipped: 0,
+ failed: 1,
+ },
+ failures: [
+ {
+ shard: 0,
+ index: 'sample-01-rollup',
+ node: 'VFTFJxpHSdaoiGxJFLSExQ',
+ reason: {
+ type: 'unsupported_aggregation_on_downsampled_index',
+ reason: 'blah blah blah timeseries data',
+ },
+ },
+ ],
+ },
+ },
+ })
+ ).toBe(true);
+ });
+});
diff --git a/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.ts b/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.ts
new file mode 100644
index 0000000000000..d6dcd4e176498
--- /dev/null
+++ b/packages/kbn-search-response-warnings/src/utils/has_unsupported_downsampled_aggregation_failure.ts
@@ -0,0 +1,26 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import type {
+ SearchResponseWarning,
+ SearchResponseIncompleteWarning,
+} from '@kbn/data-plugin/public';
+
+export function hasUnsupportedDownsampledAggregationFailure(warning: SearchResponseWarning) {
+ return warning.type === 'incomplete'
+ ? Object.values((warning as SearchResponseIncompleteWarning).clusters).some(
+ (clusterDetails) => {
+ return clusterDetails.failures
+ ? clusterDetails.failures.some((shardFailure) => {
+ return shardFailure.reason?.type === 'unsupported_aggregation_on_downsampled_index';
+ })
+ : false;
+ }
+ )
+ : false;
+}
diff --git a/packages/kbn-test/src/jest/setup/polyfills.jsdom.js b/packages/kbn-test/src/jest/setup/polyfills.jsdom.js
index 1d963afdfc4da..77aa4a6e389d1 100644
--- a/packages/kbn-test/src/jest/setup/polyfills.jsdom.js
+++ b/packages/kbn-test/src/jest/setup/polyfills.jsdom.js
@@ -17,9 +17,9 @@ if (!global.URL.hasOwnProperty('createObjectURL')) {
// https://github.com/jsdom/jsdom/issues/2524
if (!global.hasOwnProperty('TextEncoder')) {
- const { TextEncoder, TextDecoder } = require('util');
- global.TextEncoder = TextEncoder;
- global.TextDecoder = TextDecoder;
+ const customTextEncoding = require('@kayahr/text-encoding');
+ global.TextEncoder = customTextEncoding.TextEncoder;
+ global.TextDecoder = customTextEncoding.TextDecoder;
}
// NOTE: We should evaluate removing this once we upgrade to Node 18 and find out if loaders.gl already fixed this usage
diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel
index 61569ac39c41d..f2ff64942a993 100644
--- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel
+++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel
@@ -62,6 +62,11 @@ RUNTIME_DEPS = [
"@npm//tslib",
"@npm//uuid",
"@npm//io-ts",
+ "@npm//@reduxjs/toolkit",
+ "@npm//redux",
+ "@npm//react-redux",
+ "@npm//immer",
+ "@npm//reselect"
]
webpack_cli(
diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js
index 21eb15d016f7b..a7beaf4462dc8 100644
--- a/packages/kbn-ui-shared-deps-npm/webpack.config.js
+++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js
@@ -84,6 +84,10 @@ module.exports = (_, argv) => {
'@emotion/cache',
'@emotion/react',
'@hello-pangea/dnd/dist/dnd.js',
+ '@reduxjs/toolkit',
+ 'redux',
+ 'react-redux',
+ 'immer',
'@tanstack/react-query',
'@tanstack/react-query-devtools',
'classnames',
@@ -103,6 +107,7 @@ module.exports = (_, argv) => {
'react-router-dom-v5-compat',
'react-router',
'react',
+ 'reselect',
'rxjs',
'rxjs/operators',
'styled-components',
diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js
index 08e5355a3f444..ae9dcd3b056f1 100644
--- a/packages/kbn-ui-shared-deps-src/src/definitions.js
+++ b/packages/kbn-ui-shared-deps-src/src/definitions.js
@@ -56,6 +56,11 @@ const externals = {
// this is how plugins/consumers from npm load monaco
'monaco-editor/esm/vs/editor/editor.api': '__kbnSharedDeps__.MonacoBarePluginApi',
'io-ts': '__kbnSharedDeps__.IoTs',
+ '@reduxjs/toolkit': '__kbnSharedDeps__.ReduxjsToolkit',
+ 'react-redux': '__kbnSharedDeps__.ReactRedux',
+ redux: '__kbnSharedDeps__.Redux',
+ immer: '__kbnSharedDeps__.Immer',
+ reselect: '__kbnSharedDeps__.Reselect',
/**
* big deps which are locked to a single version
diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js
index ac203abadb39a..2491a34193e2e 100644
--- a/packages/kbn-ui-shared-deps-src/src/entry.js
+++ b/packages/kbn-ui-shared-deps-src/src/entry.js
@@ -47,6 +47,11 @@ export const ElasticEuiLibServicesFormat = require('@elastic/eui/optimize/es/ser
export const ElasticEuiChartsTheme = require('@elastic/eui/dist/eui_charts_theme');
export const KbnDatemath = require('@kbn/datemath');
export const HelloPangeaDnd = require('@hello-pangea/dnd/dist/dnd');
+export const ReduxjsToolkit = require('@reduxjs/toolkit');
+export const ReactRedux = require('react-redux');
+export const Redux = require('redux');
+export const Immer = require('immer');
+export const Reselect = require('reselect');
export const Lodash = require('lodash');
export const LodashFp = require('lodash/fp');
diff --git a/renovate.json b/renovate.json
index 7d6ccf6a22c88..0fd6ad800c03c 100644
--- a/renovate.json
+++ b/renovate.json
@@ -286,7 +286,8 @@
"tough-cookie",
"@types/tough-cookie",
"xml-crypto",
- "@types/xml-crypto"
+ "@types/xml-crypto",
+ "@kayahr/text-encoding"
],
"reviewers": [
"team:kibana-security"
@@ -611,4 +612,4 @@
"enabled": true
}
]
-}
\ No newline at end of file
+}
diff --git a/src/core/server/integration_tests/http/router.test.ts b/src/core/server/integration_tests/http/router.test.ts
index fdfbb76effbcf..5408aea01d373 100644
--- a/src/core/server/integration_tests/http/router.test.ts
+++ b/src/core/server/integration_tests/http/router.test.ts
@@ -578,7 +578,7 @@ describe('Handler', () => {
);
const [message] = loggingSystemMock.collect(logger).error[0];
- expect(message).toEqual('500 Server Error - /');
+ expect(message).toEqual('500 Server Error');
});
it('captures the error if handler throws', async () => {
@@ -614,7 +614,7 @@ describe('Handler', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -643,7 +643,7 @@ describe('Handler', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -687,7 +687,7 @@ describe('Handler', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "400 Bad Request - /",
+ "400 Bad Request",
Object {
"http": Object {
"response": Object {
@@ -1171,7 +1171,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1584,7 +1584,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1660,7 +1660,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1807,7 +1807,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1840,7 +1840,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1872,7 +1872,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
@@ -1904,7 +1904,7 @@ describe('Response factory', () => {
expect(loggingSystemMock.collect(logger).error).toMatchInlineSnapshot(`
Array [
Array [
- "500 Server Error - /",
+ "500 Server Error",
Object {
"http": Object {
"response": Object {
diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts
index ff0296ec9777b..d7c04f430661c 100644
--- a/src/dev/license_checker/config.ts
+++ b/src/dev/license_checker/config.ts
@@ -78,7 +78,7 @@ export const DEV_ONLY_LICENSE_ALLOWED = ['MPL-2.0'];
// there are some licenses which should not be globally allowed
// but can be brought in on a per-package basis
export const PER_PACKAGE_ALLOWED_LICENSES = {
- 'openpgp@5.3.0': ['LGPL-3.0+'],
+ 'openpgp@5.10.1': ['LGPL-3.0+'],
};
// Globally overrides a license for a given package@version
export const LICENSE_OVERRIDES = {
diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts
index 74d06cd21ed70..487ed95672d83 100644
--- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts
+++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts
@@ -25,7 +25,7 @@ import * as utils from '../utils';
import { populateContext } from './engine';
import type { AutoCompleteContext, DataAutoCompleteRulesOneOf, ResultTerm } from './types';
-import { URL_PATH_END_MARKER } from './components';
+import { URL_PATH_END_MARKER, ConstantComponent } from './components';
let lastEvaluatedToken: Token | null = null;
@@ -980,10 +980,38 @@ export default function ({
context.token = ret.token;
context.otherTokenValues = ret.otherTokenValues;
context.urlTokenPath = ret.urlTokenPath;
+
const components = getTopLevelUrlCompleteComponents(context.method);
- populateContext(ret.urlTokenPath, context, editor, true, components);
+ const { tokenPath, predicate } = (() => {
+ const lastUrlTokenPath =
+ Array.isArray(context.urlTokenPath) && context.urlTokenPath.length !== 0
+ ? context.urlTokenPath[context.urlTokenPath.length - 1]
+ : null;
+ // Checking the last chunk of path like 'c,d,' of 'GET /a/b/c,d,'
+ if (
+ Array.isArray(lastUrlTokenPath) &&
+ // true if neither c nor d equals to every ConstantComponent's name (such as _search)
+ !_.find(
+ components,
+ (c) => c instanceof ConstantComponent && _.find(lastUrlTokenPath, (p) => c.name === p)
+ )
+ ) {
+ // will simulate autocomplete on 'GET /a/b/' with a filter by index
+ return {
+ tokenPath: context.urlTokenPath.slice(0, -1),
+ predicate: (term) => term.meta === 'index',
+ };
+ } else {
+ // will do nothing special
+ return { tokenPath: context.urlTokenPath, predicate: (term) => true };
+ }
+ })();
- context.autoCompleteSet = addMetaToTermsList(context.autoCompleteSet!, 'endpoint');
+ populateContext(tokenPath, context, editor, true, components);
+ context.autoCompleteSet = _.filter(
+ addMetaToTermsList(context.autoCompleteSet!, 'endpoint'),
+ predicate
+ );
}
function addUrlParamsAutoCompleteSetToContext(context: AutoCompleteContext, pos: Position) {
@@ -1112,11 +1140,11 @@ export default function ({
if (
lastEvaluatedToken.position.column + 1 === currentToken.position.column &&
lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber &&
- lastEvaluatedToken.type === 'url.slash' &&
+ (lastEvaluatedToken.type === 'url.slash' || lastEvaluatedToken.type === 'url.comma') &&
currentToken.type === 'url.part' &&
currentToken.value.length === 1
) {
- // do not suppress autocomplete for a single character immediately following a slash in URL
+ // do not suppress autocomplete for a single character immediately following a slash or comma in URL
} else if (
lastEvaluatedToken.position.column < currentToken.position.column &&
lastEvaluatedToken.position.lineNumber === currentToken.position.lineNumber &&
diff --git a/src/plugins/data/common/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts
index 4812ac6f07c5f..f0b2b2702dbf9 100644
--- a/src/plugins/data/common/search/aggs/agg_type.ts
+++ b/src/plugins/data/common/search/aggs/agg_type.ts
@@ -30,7 +30,7 @@ type PostFlightRequestFn = (
inspectorRequestAdapter?: RequestAdapter,
abortSignal?: AbortSignal,
searchSessionId?: string,
- disableShardFailureWarning?: boolean
+ disableWarningToasts?: boolean
) => Promise>;
export interface AggTypeConfig<
diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts
index 924564744962f..fb88fdbeaa4aa 100644
--- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts
+++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts
@@ -396,7 +396,7 @@ export const createOtherBucketPostFlightRequest = (
inspectorRequestAdapter,
abortSignal,
searchSessionId,
- disableShardFailureWarning
+ disableWarningToasts
) => {
if (!resp.aggregations) return resp;
const nestedSearchSource = searchSource.createChild();
@@ -410,7 +410,7 @@ export const createOtherBucketPostFlightRequest = (
nestedSearchSource.fetch$({
abortSignal,
sessionId: searchSessionId,
- disableShardFailureWarning,
+ disableWarningToasts,
inspector: {
adapter: inspectorRequestAdapter,
title: i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', {
diff --git a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts
index e0555fbd24076..4c42fdc985ff4 100644
--- a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts
+++ b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts
@@ -53,7 +53,7 @@ describe('esaggs expression function - public', () => {
query: undefined,
searchSessionId: 'abc123',
searchSourceService: searchSourceCommonMock,
- disableShardWarnings: false,
+ disableWarningToasts: false,
timeFields: ['@timestamp', 'utc_time'],
timeRange: undefined,
};
@@ -139,7 +139,7 @@ describe('esaggs expression function - public', () => {
description: 'This request queries Elasticsearch to fetch the data for the visualization.',
adapter: undefined,
},
- disableShardFailureWarning: false,
+ disableWarningToasts: false,
});
});
@@ -159,7 +159,7 @@ describe('esaggs expression function - public', () => {
description: 'MyDescription',
adapter: undefined,
},
- disableShardFailureWarning: false,
+ disableWarningToasts: false,
});
});
diff --git a/src/plugins/data/common/search/expressions/esaggs/request_handler.ts b/src/plugins/data/common/search/expressions/esaggs/request_handler.ts
index 196ebfa55810f..7f0155d74082f 100644
--- a/src/plugins/data/common/search/expressions/esaggs/request_handler.ts
+++ b/src/plugins/data/common/search/expressions/esaggs/request_handler.ts
@@ -30,7 +30,7 @@ export interface RequestHandlerParams {
searchSourceService: ISearchStartSearchSource;
timeFields?: string[];
timeRange?: TimeRange;
- disableShardWarnings?: boolean;
+ disableWarningToasts?: boolean;
getNow?: () => Date;
executionContext?: KibanaExecutionContext;
title?: string;
@@ -48,7 +48,7 @@ export const handleRequest = ({
searchSourceService,
timeFields,
timeRange,
- disableShardWarnings,
+ disableWarningToasts,
getNow,
executionContext,
title,
@@ -110,7 +110,7 @@ export const handleRequest = ({
requestSearchSource
.fetch$({
abortSignal,
- disableShardFailureWarning: disableShardWarnings,
+ disableWarningToasts,
sessionId: searchSessionId,
inspector: {
adapter: inspectorAdapters.requests,
diff --git a/src/plugins/data/common/search/expressions/kibana_context_type.ts b/src/plugins/data/common/search/expressions/kibana_context_type.ts
index cec788d27d856..d6947d2d46ce3 100644
--- a/src/plugins/data/common/search/expressions/kibana_context_type.ts
+++ b/src/plugins/data/common/search/expressions/kibana_context_type.ts
@@ -15,7 +15,7 @@ export type ExecutionContextSearch = {
filters?: Filter[];
query?: Query | Query[];
timeRange?: TimeRange;
- disableShardWarnings?: boolean;
+ disableWarningToasts?: boolean;
};
export type ExpressionValueSearchContext = ExpressionValueBoxed<
diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts
index b74b7e111b5ce..f05f198451e0a 100644
--- a/src/plugins/data/common/search/search_source/search_source.ts
+++ b/src/plugins/data/common/search/search_source/search_source.ts
@@ -520,7 +520,7 @@ export class SearchSource {
options.inspector?.adapter,
options.abortSignal,
options.sessionId,
- options.disableShardFailureWarning
+ options.disableWarningToasts
);
}
}
diff --git a/src/plugins/data/common/search/search_source/types.ts b/src/plugins/data/common/search/search_source/types.ts
index 140c2dd59a59d..60c0d3713ec64 100644
--- a/src/plugins/data/common/search/search_source/types.ts
+++ b/src/plugins/data/common/search/search_source/types.ts
@@ -249,7 +249,7 @@ export interface SearchSourceSearchOptions extends ISearchOptions {
inspector?: IInspectorInfo;
/**
- * Disable default warnings of shard failures
+ * Set to true to disable warning toasts and customize warning display
*/
- disableShardFailureWarning?: boolean;
+ disableWarningToasts?: boolean;
}
diff --git a/src/plugins/data/public/incomplete_results_modal/__snapshots__/incomplete_results_modal.test.tsx.snap b/src/plugins/data/public/incomplete_results_modal/__snapshots__/incomplete_results_modal.test.tsx.snap
new file mode 100644
index 0000000000000..666b87f998c3e
--- /dev/null
+++ b/src/plugins/data/public/incomplete_results_modal/__snapshots__/incomplete_results_modal.test.tsx.snap
@@ -0,0 +1,271 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`IncompleteResultsModal should render shard failures 1`] = `
+
+
+
+
+
+
+
+
+
+ ,
+ "data-test-subj": "showClusterDetailsButton",
+ "id": "table",
+ "name": "Cluster details",
+ }
+ }
+ tabs={
+ Array [
+ Object {
+ "content":
+
+ ,
+ "data-test-subj": "showClusterDetailsButton",
+ "id": "table",
+ "name": "Cluster details",
+ },
+ Object {
+ "content":
+ {}
+ ,
+ "data-test-subj": "showRequestButton",
+ "id": "json-request",
+ "name": "Request",
+ },
+ Object {
+ "content":
+ {
+ "_shards": {
+ "total": 4,
+ "successful": 3,
+ "skipped": 0,
+ "failed": 1,
+ "failures": [
+ {
+ "shard": 0,
+ "index": "sample-01-rollup",
+ "node": "VFTFJxpHSdaoiGxJFLSExQ",
+ "reason": {
+ "type": "illegal_argument_exception",
+ "reason": "Field [kubernetes.container.memory.available.bytes] of type [aggregate_metric_double] is not supported for aggregation [percentiles]"
+ }
+ }
+ ]
+ }
+}
+ ,
+ "data-test-subj": "showResponseButton",
+ "id": "json-response",
+ "name": "Response",
+ },
+ ]
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`IncompleteResultsModal should render time out 1`] = `
+
+
+
+
+
+
+
+
+
+
+ Request timed out
+
+
+ ,
+ "data-test-subj": "showClusterDetailsButton",
+ "id": "table",
+ "name": "Cluster details",
+ }
+ }
+ tabs={
+ Array [
+ Object {
+ "content":
+
+
+ Request timed out
+
+
+ ,
+ "data-test-subj": "showClusterDetailsButton",
+ "id": "table",
+ "name": "Cluster details",
+ },
+ Object {
+ "content":
+ {}
+ ,
+ "data-test-subj": "showRequestButton",
+ "id": "json-request",
+ "name": "Request",
+ },
+ Object {
+ "content":
+ {
+ "timed_out": true,
+ "_shards": {
+ "total": 4,
+ "successful": 4,
+ "skipped": 0,
+ "failed": 0
+ }
+}
+ ,
+ "data-test-subj": "showResponseButton",
+ "id": "json-response",
+ "name": "Response",
+ },
+ ]
+ }
+ />
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/src/plugins/data/public/shard_failure_modal/_shard_failure_modal.scss b/src/plugins/data/public/incomplete_results_modal/_incomplete_results_modal.scss
similarity index 59%
rename from src/plugins/data/public/shard_failure_modal/_shard_failure_modal.scss
rename to src/plugins/data/public/incomplete_results_modal/_incomplete_results_modal.scss
index 33c6844719ed1..e2ca0f8f9b3b6 100644
--- a/src/plugins/data/public/shard_failure_modal/_shard_failure_modal.scss
+++ b/src/plugins/data/public/incomplete_results_modal/_incomplete_results_modal.scss
@@ -1,5 +1,5 @@
// set width and height to fixed values to prevent resizing when you switch tabs
-.shardFailureModal {
+.incompleteResultsModal {
min-height: 75vh;
width: 768px;
@@ -12,10 +12,4 @@
.euiModalHeader {
padding-bottom: 0;
}
-}
-
-.shardFailureModal__desc {
- // set for IE11, since without it depending on the content the width of the list
- // could be much higher than the available screenspace
- max-width: 686px;
-}
+}
\ No newline at end of file
diff --git a/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.test.tsx b/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.test.tsx
new file mode 100644
index 0000000000000..6e90740cf9888
--- /dev/null
+++ b/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.test.tsx
@@ -0,0 +1,72 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { shallow } from 'enzyme';
+import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
+import type { SearchResponseIncompleteWarning } from '../search';
+import { IncompleteResultsModal } from './incomplete_results_modal';
+
+describe('IncompleteResultsModal', () => {
+ test('should render shard failures', () => {
+ const component = shallow(
+
+ }
+ onClose={jest.fn()}
+ />
+ );
+
+ expect(component).toMatchSnapshot();
+ });
+
+ test('should render time out', () => {
+ const component = shallow(
+
+ }
+ onClose={jest.fn()}
+ />
+ );
+
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.tsx b/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.tsx
new file mode 100644
index 0000000000000..eb07d8d60e517
--- /dev/null
+++ b/src/plugins/data/public/incomplete_results_modal/incomplete_results_modal.tsx
@@ -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 and the Server Side Public License, v 1; you may not use this file except
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
+ * Side Public License, v 1.
+ */
+
+import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
+import { i18n } from '@kbn/i18n';
+import {
+ EuiCallOut,
+ EuiCodeBlock,
+ EuiTabbedContent,
+ EuiCopy,
+ EuiButton,
+ EuiModalBody,
+ EuiModalHeader,
+ EuiModalHeaderTitle,
+ EuiModalFooter,
+ EuiButtonEmpty,
+} from '@elastic/eui';
+import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
+import type { SearchRequest } from '..';
+import type { SearchResponseIncompleteWarning } from '../search';
+import { ShardFailureTable } from '../shard_failure_modal/shard_failure_table';
+
+export interface Props {
+ onClose: () => void;
+ request: SearchRequest;
+ response: estypes.SearchResponse;
+ warning: SearchResponseIncompleteWarning;
+}
+
+export function IncompleteResultsModal({ request, response, warning, onClose }: Props) {
+ const requestJSON = JSON.stringify(request, null, 2);
+ const responseJSON = JSON.stringify(response, null, 2);
+
+ const tabs = [
+ {
+ id: 'table',
+ name: i18n.translate(
+ 'data.search.searchSource.fetch.incompleteResultsModal.tabHeaderClusterDetails',
+ {
+ defaultMessage: 'Cluster details',
+ description: 'Name of the tab displaying cluster details',
+ }
+ ),
+ content: (
+ <>
+ {response.timed_out ? (
+
+
+ {i18n.translate(
+ 'data.search.searchSource.fetch.incompleteResultsModal.requestTimedOutMessage',
+ {
+ defaultMessage: 'Request timed out',
+ }
+ )}
+
+
+ ) : null}
+
+ {response._shards.failures?.length ? (
+
+ ) : null}
+ >
+ ),
+ ['data-test-subj']: 'showClusterDetailsButton',
+ },
+ {
+ id: 'json-request',
+ name: i18n.translate(
+ 'data.search.searchSource.fetch.incompleteResultsModal.tabHeaderRequest',
+ {
+ defaultMessage: 'Request',
+ description: 'Name of the tab displaying the JSON request',
+ }
+ ),
+ content: (
+
+ {requestJSON}
+
+ ),
+ ['data-test-subj']: 'showRequestButton',
+ },
+ {
+ id: 'json-response',
+ name: i18n.translate(
+ 'data.search.searchSource.fetch.incompleteResultsModal.tabHeaderResponse',
+ {
+ defaultMessage: 'Response',
+ description: 'Name of the tab displaying the JSON response',
+ }
+ ),
+ content: (
+
+ {responseJSON}
+
+ ),
+ ['data-test-subj']: 'showResponseButton',
+ },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {(copy) => (
+
+
+
+ )}
+
+ onClose()} fill data-test-subj="closeIncompleteResultsModal">
+
+
+
+
+ );
+}
diff --git a/src/plugins/data/public/shard_failure_modal/index.tsx b/src/plugins/data/public/incomplete_results_modal/index.tsx
similarity index 54%
rename from src/plugins/data/public/shard_failure_modal/index.tsx
rename to src/plugins/data/public/incomplete_results_modal/index.tsx
index f600ca4368e48..9cb02367e67a5 100644
--- a/src/plugins/data/public/shard_failure_modal/index.tsx
+++ b/src/plugins/data/public/incomplete_results_modal/index.tsx
@@ -7,17 +7,13 @@
*/
import React from 'react';
-import type { ShardFailureOpenModalButtonProps } from './shard_failure_open_modal_button';
+import type { OpenIncompleteResultsModalButtonProps } from './open_incomplete_results_modal_button';
const Fallback = () =>
;
-const LazyShardFailureOpenModalButton = React.lazy(
- () => import('./shard_failure_open_modal_button')
-);
-export const ShardFailureOpenModalButton = (props: ShardFailureOpenModalButtonProps) => (
+const LazyOpenModalButton = React.lazy(() => import('./open_incomplete_results_modal_button'));
+export const OpenIncompleteResultsModalButton = (props: OpenIncompleteResultsModalButtonProps) => (
}>
-
+
);
-
-export type { ShardFailureRequest } from './shard_failure_types';
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx b/src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx
similarity index 68%
rename from src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx
rename to src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx
index 922aee3f49483..648eca08d525b 100644
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.tsx
+++ b/src/plugins/data/public/incomplete_results_modal/open_incomplete_results_modal_button.tsx
@@ -13,18 +13,19 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { ThemeServiceStart } from '@kbn/core/public';
import { toMountPoint } from '@kbn/kibana-react-plugin/public';
import { getOverlays } from '../services';
-import { ShardFailureModal } from './shard_failure_modal';
-import type { ShardFailureRequest } from './shard_failure_types';
-import './_shard_failure_modal.scss';
+import type { SearchRequest } from '..';
+import { IncompleteResultsModal } from './incomplete_results_modal';
+import type { SearchResponseIncompleteWarning } from '../search';
+import './_incomplete_results_modal.scss';
// @internal
-export interface ShardFailureOpenModalButtonProps {
+export interface OpenIncompleteResultsModalButtonProps {
theme: ThemeServiceStart;
- title: string;
+ warning: SearchResponseIncompleteWarning;
size?: EuiButtonProps['size'];
color?: EuiButtonProps['color'];
getRequestMeta: () => {
- request: ShardFailureRequest;
+ request: SearchRequest;
response: estypes.SearchResponse;
};
isButtonEmpty?: boolean;
@@ -32,31 +33,31 @@ export interface ShardFailureOpenModalButtonProps {
// Needed for React.lazy
// eslint-disable-next-line import/no-default-export
-export default function ShardFailureOpenModalButton({
+export default function OpenIncompleteResultsModalButton({
getRequestMeta,
theme,
- title,
+ warning,
size = 's',
color = 'warning',
isButtonEmpty = false,
-}: ShardFailureOpenModalButtonProps) {
+}: OpenIncompleteResultsModalButtonProps) {
const onClick = useCallback(() => {
const { request, response } = getRequestMeta();
const modal = getOverlays().openModal(
toMountPoint(
- modal.close()}
/>,
{ theme$: theme.theme$ }
),
{
- className: 'shardFailureModal',
+ className: 'incompleteResultsModal',
}
);
- }, [getRequestMeta, theme.theme$, title]);
+ }, [getRequestMeta, theme.theme$, warning]);
const Component = isButtonEmpty ? EuiLink : EuiButton;
@@ -65,11 +66,11 @@ export default function ShardFailureOpenModalButton({
color={color}
size={size}
onClick={onClick}
- data-test-subj="openShardFailureModalBtn"
+ data-test-subj="openIncompleteResultsModalBtn"
>
diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts
index d8aa9a35a29a7..48a2d9c10b71c 100644
--- a/src/plugins/data/public/index.ts
+++ b/src/plugins/data/public/index.ts
@@ -170,6 +170,7 @@ export type {
Reason,
WaitUntilNextSessionCompletesOptions,
SearchResponseWarning,
+ SearchResponseIncompleteWarning,
} from './search';
export {
@@ -273,8 +274,7 @@ export type {
} from './query';
// TODO: move to @kbn/search-response-warnings
-export type { ShardFailureRequest } from './shard_failure_modal';
-export { ShardFailureOpenModalButton } from './shard_failure_modal';
+export { OpenIncompleteResultsModalButton } from './incomplete_results_modal';
export type { AggsStart } from './search/aggs';
diff --git a/src/plugins/data/public/search/expressions/esaggs.test.ts b/src/plugins/data/public/search/expressions/esaggs.test.ts
index de35e0b238da9..cf3b04029a2c8 100644
--- a/src/plugins/data/public/search/expressions/esaggs.test.ts
+++ b/src/plugins/data/public/search/expressions/esaggs.test.ts
@@ -126,7 +126,7 @@ describe('esaggs expression function - public', () => {
searchSessionId: 'abc123',
searchSourceService: startDependencies.searchSource,
timeFields: args.timeFields,
- disableShardWarnings: false,
+ disableWarningToasts: false,
timeRange: undefined,
getNow: undefined,
});
diff --git a/src/plugins/data/public/search/expressions/esaggs.ts b/src/plugins/data/public/search/expressions/esaggs.ts
index eecaa5890ba35..5ae0b72e1fe58 100644
--- a/src/plugins/data/public/search/expressions/esaggs.ts
+++ b/src/plugins/data/public/search/expressions/esaggs.ts
@@ -61,7 +61,7 @@ export function getFunctionDefinition({
return { aggConfigs, indexPattern, searchSource, getNow, handleEsaggsRequest };
}).pipe(
switchMap(({ aggConfigs, indexPattern, searchSource, getNow, handleEsaggsRequest }) => {
- const { disableShardWarnings } = getSearchContext();
+ const { disableWarningToasts } = getSearchContext();
return handleEsaggsRequest({
abortSignal,
@@ -74,7 +74,7 @@ export function getFunctionDefinition({
searchSourceService: searchSource,
timeFields: args.timeFields,
timeRange: get(input, 'timeRange', undefined),
- disableShardWarnings: (disableShardWarnings || false) as boolean,
+ disableWarningToasts: (disableWarningToasts || false) as boolean,
getNow,
executionContext: getExecutionContext(),
});
diff --git a/src/plugins/data/public/search/fetch/extract_warnings.test.ts b/src/plugins/data/public/search/fetch/extract_warnings.test.ts
index 28a45ca9e6d65..fed0969c2004f 100644
--- a/src/plugins/data/public/search/fetch/extract_warnings.test.ts
+++ b/src/plugins/data/public/search/fetch/extract_warnings.test.ts
@@ -10,121 +10,280 @@ import { estypes } from '@elastic/elasticsearch';
import { extractWarnings } from './extract_warnings';
describe('extract search response warnings', () => {
- it('should extract warnings from response with shard failures', () => {
- const response = {
- took: 25,
- timed_out: false,
- _shards: {
- total: 4,
- successful: 2,
- skipped: 0,
- failed: 2,
- failures: [
- {
- shard: 0,
- index: 'sample-01-rollup',
- node: 'VFTFJxpHSdaoiGxJFLSExQ',
- reason: {
- type: 'illegal_argument_exception',
- reason:
- 'Field [kubernetes.container.memory.available.bytes] of type [aggregate_metric_double] is not supported for aggregation [percentiles]',
+ describe('single cluster', () => {
+ it('should extract incomplete warning from response with shard failures', () => {
+ const response = {
+ took: 25,
+ timed_out: false,
+ _shards: {
+ total: 4,
+ successful: 3,
+ skipped: 0,
+ failed: 1,
+ failures: [
+ {
+ shard: 0,
+ index: 'sample-01-rollup',
+ node: 'VFTFJxpHSdaoiGxJFLSExQ',
+ reason: {
+ type: 'illegal_argument_exception',
+ reason:
+ 'Field [kubernetes.container.memory.available.bytes] of type [aggregate_metric_double] is not supported for aggregation [percentiles]',
+ },
+ },
+ ],
+ },
+ hits: { total: 18239, max_score: null, hits: [] },
+ aggregations: {},
+ };
+
+ expect(extractWarnings(response)).toEqual([
+ {
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: {
+ '(local)': {
+ status: 'partial',
+ indices: '',
+ took: 25,
+ timed_out: false,
+ _shards: response._shards,
+ failures: response._shards.failures,
},
},
- ],
- },
- hits: { total: 18239, max_score: null, hits: [] },
- aggregations: {},
- };
+ },
+ ]);
+ });
- expect(extractWarnings(response)).toEqual([
- {
- type: 'shard_failure',
- message: '2 of 4 shards failed',
- reason: {
- type: 'illegal_argument_exception',
- reason:
- 'Field [kubernetes.container.memory.available.bytes] of type' +
- ' [aggregate_metric_double] is not supported for aggregation [percentiles]',
+ it('should extract incomplete warning from response with time out', () => {
+ const response = {
+ took: 999,
+ timed_out: true,
+ _shards: {} as estypes.ShardStatistics,
+ hits: { hits: [] },
+ };
+ expect(extractWarnings(response)).toEqual([
+ {
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: {
+ '(local)': {
+ status: 'partial',
+ indices: '',
+ took: 999,
+ timed_out: true,
+ _shards: response._shards,
+ failures: response._shards.failures,
+ },
+ },
},
- text: 'The data might be incomplete or wrong.',
- },
- ]);
- });
+ ]);
+ });
- it('should extract timeout warning', () => {
- const warnings = {
- took: 999,
- timed_out: true,
- _shards: {} as estypes.ShardStatistics,
- hits: { hits: [] },
- };
- expect(extractWarnings(warnings)).toEqual([
- {
- type: 'timed_out',
- message: 'Data might be incomplete because your request timed out',
- },
- ]);
- });
+ it('should not include warnings when there are none', () => {
+ const warnings = extractWarnings({
+ timed_out: false,
+ _shards: {
+ failed: 0,
+ total: 9000,
+ },
+ } as estypes.SearchResponse);
- it('should extract shards failed warnings', () => {
- const warnings = {
- _shards: {
- failed: 77,
- total: 79,
- },
- } as estypes.SearchResponse;
- expect(extractWarnings(warnings)).toEqual([
- {
- type: 'shard_failure',
- message: '77 of 79 shards failed',
- reason: { type: 'generic_shard_warning' },
- text: 'The data might be incomplete or wrong.',
- },
- ]);
+ expect(warnings).toEqual([]);
+ });
});
- it('should extract shards failed warning failure reason type', () => {
- const warnings = extractWarnings({
- _shards: {
- failed: 77,
- total: 79,
- },
- } as estypes.SearchResponse);
- expect(warnings).toEqual([
- {
- type: 'shard_failure',
- message: '77 of 79 shards failed',
- reason: { type: 'generic_shard_warning' },
- text: 'The data might be incomplete or wrong.',
- },
- ]);
- });
+ describe('remote clusters', () => {
+ it('should extract incomplete warning from response with shard failures', () => {
+ const response = {
+ took: 25,
+ timed_out: false,
+ _shards: {
+ total: 4,
+ successful: 3,
+ skipped: 0,
+ failed: 1,
+ failures: [
+ {
+ shard: 0,
+ index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001',
+ node: 'NVzFRd6SS4qT9o0k2vIzlg',
+ reason: {
+ type: 'query_shard_exception',
+ reason:
+ 'failed to create query: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123',
+ index_uuid: 'z1sPO8E4TdWcijNgsL_BxQ',
+ index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001',
+ caused_by: {
+ type: 'runtime_exception',
+ reason:
+ 'runtime_exception: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123',
+ },
+ },
+ },
+ ],
+ },
+ _clusters: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ details: {
+ '(local)': {
+ status: 'successful',
+ indices: 'kibana_sample_data_logs,kibana_sample_data_flights',
+ took: 1,
+ timed_out: false,
+ _shards: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ failed: 0,
+ },
+ },
+ remote1: {
+ status: 'partial',
+ indices: 'kibana_sample_data_logs,kibana_sample_data_flights',
+ took: 5,
+ timed_out: false,
+ _shards: {
+ total: 2,
+ successful: 1,
+ skipped: 0,
+ failed: 1,
+ },
+ failures: [
+ {
+ shard: 0,
+ index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001',
+ node: 'NVzFRd6SS4qT9o0k2vIzlg',
+ reason: {
+ type: 'query_shard_exception',
+ reason:
+ 'failed to create query: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123',
+ index_uuid: 'z1sPO8E4TdWcijNgsL_BxQ',
+ index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001',
+ caused_by: {
+ type: 'runtime_exception',
+ reason:
+ 'runtime_exception: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123',
+ },
+ },
+ },
+ ],
+ },
+ },
+ },
+ hits: { total: 18239, max_score: null, hits: [] },
+ aggregations: {},
+ };
- it('extracts multiple warnings', () => {
- const warnings = extractWarnings({
- timed_out: true,
- _shards: {
- failed: 77,
- total: 79,
- },
- } as estypes.SearchResponse);
- const [shardFailures, timedOut] = [
- warnings.filter(({ type }) => type !== 'timed_out'),
- warnings.filter(({ type }) => type === 'timed_out'),
- ];
- expect(shardFailures[0]!.message).toBeDefined();
- expect(timedOut[0]!.message).toBeDefined();
- });
+ expect(extractWarnings(response)).toEqual([
+ {
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: response._clusters.details,
+ },
+ ]);
+ });
- it('should not include shardStats or types fields if there are no warnings', () => {
- const warnings = extractWarnings({
- timed_out: false,
- _shards: {
- failed: 0,
- total: 9000,
- },
- } as estypes.SearchResponse);
+ it('should extract incomplete warning from response with time out', () => {
+ const response = {
+ took: 999,
+ timed_out: true,
+ _shards: {
+ total: 6,
+ successful: 6,
+ skipped: 0,
+ failed: 0,
+ },
+ _clusters: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ details: {
+ '(local)': {
+ status: 'successful',
+ indices:
+ 'kibana_sample_data_ecommerce,kibana_sample_data_logs,kibana_sample_data_flights',
+ took: 0,
+ timed_out: false,
+ _shards: {
+ total: 3,
+ successful: 3,
+ skipped: 0,
+ failed: 0,
+ },
+ },
+ remote1: {
+ status: 'partial',
+ indices: 'kibana_sample_data*',
+ took: 10005,
+ timed_out: true,
+ _shards: {
+ total: 3,
+ successful: 3,
+ skipped: 0,
+ failed: 0,
+ },
+ },
+ },
+ },
+ hits: { hits: [] },
+ };
+ expect(extractWarnings(response)).toEqual([
+ {
+ type: 'incomplete',
+ message: 'The data might be incomplete or wrong.',
+ clusters: response._clusters.details,
+ },
+ ]);
+ });
+
+ it('should not include warnings when there are none', () => {
+ const warnings = extractWarnings({
+ took: 10,
+ timed_out: false,
+ _shards: {
+ total: 4,
+ successful: 4,
+ skipped: 0,
+ failed: 0,
+ },
+ _clusters: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ details: {
+ '(local)': {
+ status: 'successful',
+ indices: 'kibana_sample_data_logs,kibana_sample_data_flights',
+ took: 0,
+ timed_out: false,
+ _shards: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ failed: 0,
+ },
+ },
+ remote1: {
+ status: 'successful',
+ indices: 'kibana_sample_data_logs,kibana_sample_data_flights',
+ took: 1,
+ timed_out: false,
+ _shards: {
+ total: 2,
+ successful: 2,
+ skipped: 0,
+ failed: 0,
+ },
+ },
+ },
+ },
+ hits: { hits: [] },
+ } as estypes.SearchResponse);
- expect(warnings).toEqual([]);
+ expect(warnings).toEqual([]);
+ });
});
});
diff --git a/src/plugins/data/public/search/fetch/extract_warnings.ts b/src/plugins/data/public/search/fetch/extract_warnings.ts
index 7c574acba472c..34b30d5f971bf 100644
--- a/src/plugins/data/public/search/fetch/extract_warnings.ts
+++ b/src/plugins/data/public/search/fetch/extract_warnings.ts
@@ -8,6 +8,7 @@
import { estypes } from '@elastic/elasticsearch';
import { i18n } from '@kbn/i18n';
+import type { ClusterDetails } from '@kbn/es-types';
import { SearchResponseWarning } from '../types';
/**
@@ -16,53 +17,38 @@ import { SearchResponseWarning } from '../types';
export function extractWarnings(rawResponse: estypes.SearchResponse): SearchResponseWarning[] {
const warnings: SearchResponseWarning[] = [];
- if (rawResponse.timed_out === true) {
+ const isPartial = rawResponse._clusters
+ ? Object.values(
+ (
+ rawResponse._clusters as estypes.ClusterStatistics & {
+ details: Record;
+ }
+ ).details
+ ).some((clusterDetails) => clusterDetails.status !== 'successful')
+ : rawResponse.timed_out || rawResponse._shards.failed > 0;
+ if (isPartial) {
warnings.push({
- type: 'timed_out',
- message: i18n.translate('data.search.searchSource.fetch.requestTimedOutNotificationMessage', {
- defaultMessage: 'Data might be incomplete because your request timed out',
+ type: 'incomplete',
+ message: i18n.translate('data.search.searchSource.fetch.incompleteResultsMessage', {
+ defaultMessage: 'The data might be incomplete or wrong.',
}),
- reason: undefined, // exists so that callers do not have to cast when working with shard warnings.
- });
- }
-
- if (rawResponse._shards && rawResponse._shards.failed) {
- const message = i18n.translate(
- 'data.search.searchSource.fetch.shardsFailedNotificationMessage',
- {
- defaultMessage: '{shardsFailed} of {shardsTotal} shards failed',
- values: {
- shardsFailed: rawResponse._shards.failed,
- shardsTotal: rawResponse._shards.total,
- },
- }
- );
- const text = i18n.translate(
- 'data.search.searchSource.fetch.shardsFailedNotificationDescription',
- { defaultMessage: 'The data might be incomplete or wrong.' }
- );
-
- if (rawResponse._shards.failures) {
- rawResponse._shards.failures?.forEach((f) => {
- warnings.push({
- type: 'shard_failure',
- message,
- text,
- reason: {
- type: f.reason.type,
- reason: f.reason.reason,
+ clusters: rawResponse._clusters
+ ? (
+ rawResponse._clusters as estypes.ClusterStatistics & {
+ details: Record;
+ }
+ ).details
+ : {
+ '(local)': {
+ status: 'partial',
+ indices: '',
+ took: rawResponse.took,
+ timed_out: rawResponse.timed_out,
+ _shards: rawResponse._shards,
+ failures: rawResponse._shards.failures,
+ },
},
- });
- });
- } else {
- // unknown type and reason
- warnings.push({
- type: 'shard_failure',
- message,
- text,
- reason: { type: 'generic_shard_warning' },
- });
- }
+ });
}
return warnings;
diff --git a/src/plugins/data/public/search/fetch/handle_warnings.test.ts b/src/plugins/data/public/search/fetch/handle_warnings.test.ts
deleted file mode 100644
index bc07eb3673991..0000000000000
--- a/src/plugins/data/public/search/fetch/handle_warnings.test.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { estypes } from '@elastic/elasticsearch';
-import { notificationServiceMock } from '@kbn/core-notifications-browser-mocks';
-import { themeServiceMock } from '@kbn/core/public/mocks';
-import { setNotifications } from '../../services';
-import { SearchResponseWarning } from '../types';
-import { filterWarnings, handleWarnings } from './handle_warnings';
-import * as extract from './extract_warnings';
-import { SearchRequest } from '../../../common';
-
-jest.mock('@kbn/i18n', () => {
- return {
- i18n: {
- translate: (_id: string, { defaultMessage }: { defaultMessage: string }) => defaultMessage,
- },
- };
-});
-jest.mock('./extract_warnings', () => ({
- extractWarnings: jest.fn(() => []),
-}));
-
-const theme = themeServiceMock.createStartContract();
-const warnings: SearchResponseWarning[] = [
- {
- type: 'timed_out' as const,
- message: 'Something timed out!',
- reason: undefined,
- },
- {
- type: 'shard_failure' as const,
- message: 'Some shards failed!',
- text: 'test text',
- reason: { type: 'illegal_argument_exception', reason: 'Illegal argument! Go to jail!' },
- },
- {
- type: 'shard_failure' as const,
- message: 'Some shards failed!',
- reason: { type: 'generic_shard_failure' },
- },
-];
-
-const sessionId = 'abcd';
-
-describe('Filtering and showing warnings', () => {
- const notifications = notificationServiceMock.createStartContract();
- jest.useFakeTimers();
-
- describe('handleWarnings', () => {
- const request = { body: {} };
- beforeEach(() => {
- jest.resetAllMocks();
- jest.advanceTimersByTime(30000);
- setNotifications(notifications);
- (notifications.toasts.addWarning as jest.Mock).mockReset();
- (extract.extractWarnings as jest.Mock).mockImplementation(() => warnings);
- });
-
- test('should notify if timed out', () => {
- (extract.extractWarnings as jest.Mock).mockImplementation(() => [warnings[0]]);
- const response = { rawResponse: { timed_out: true } } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme });
- // test debounce, addWarning should only be called once
- handleWarnings({ request, response, theme });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({ title: 'Something timed out!' });
-
- // test debounce, call addWarning again due to sessionId
- handleWarnings({ request, response, theme, sessionId });
- expect(notifications.toasts.addWarning).toBeCalledTimes(2);
- });
-
- test('should notify if shards failed for unknown type/reason', () => {
- (extract.extractWarnings as jest.Mock).mockImplementation(() => [warnings[2]]);
- const response = {
- rawResponse: { _shards: { failed: 1, total: 2, successful: 1, skipped: 1 } },
- } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme });
- // test debounce, addWarning should only be called once
- handleWarnings({ request, response, theme });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({ title: 'Some shards failed!' });
-
- // test debounce, call addWarning again due to sessionId
- handleWarnings({ request, response, theme, sessionId });
- expect(notifications.toasts.addWarning).toBeCalledTimes(2);
- });
-
- test('should add mount point for shard modal failure button if warning.text is provided', () => {
- (extract.extractWarnings as jest.Mock).mockImplementation(() => [warnings[1]]);
- const response = {
- rawResponse: { _shards: { failed: 1, total: 2, successful: 1, skipped: 1 } },
- } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme });
- // test debounce, addWarning should only be called once
- handleWarnings({ request, response, theme });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({
- title: 'Some shards failed!',
- text: expect.any(Function),
- });
-
- // test debounce, call addWarning again due to sessionId
- handleWarnings({ request, response, theme, sessionId });
- expect(notifications.toasts.addWarning).toBeCalledTimes(2);
- });
-
- test('should notify once if the response contains multiple failures', () => {
- (extract.extractWarnings as jest.Mock).mockImplementation(() => [warnings[1], warnings[2]]);
- const response = {
- rawResponse: { _shards: { failed: 1, total: 2, successful: 1, skipped: 1 } },
- } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({
- title: 'Some shards failed!',
- text: expect.any(Function),
- });
- });
-
- test('should notify once if the response contains some unfiltered failures', () => {
- const callback = (warning: SearchResponseWarning) =>
- warning.reason?.type !== 'generic_shard_failure';
- const response = {
- rawResponse: { _shards: { failed: 1, total: 2, successful: 1, skipped: 1 } },
- } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme, callback });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({ title: 'Some shards failed!' });
- });
-
- test('should not notify if the response contains no unfiltered failures', () => {
- const callback = () => true;
- const response = {
- rawResponse: { _shards: { failed: 1, total: 2, successful: 1, skipped: 1 } },
- } as unknown as estypes.SearchResponse;
- handleWarnings({ request, response, theme, callback });
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(0);
- });
- });
-
- describe('filterWarnings', () => {
- const callback = jest.fn();
- const request = {} as SearchRequest;
- const response = {} as estypes.SearchResponse;
-
- beforeEach(() => {
- callback.mockImplementation(() => {
- throw new Error('not initialized');
- });
- });
-
- it('filters out all', () => {
- callback.mockImplementation(() => true);
- expect(filterWarnings(warnings, callback, request, response, 'id')).toEqual([]);
- });
-
- it('filters out some', () => {
- callback.mockImplementation(
- (warning: SearchResponseWarning) => warning.reason?.type !== 'generic_shard_failure'
- );
- expect(filterWarnings(warnings, callback, request, response, 'id')).toEqual([warnings[2]]);
- });
-
- it('filters out none', () => {
- callback.mockImplementation(() => false);
- expect(filterWarnings(warnings, callback, request, response, 'id')).toEqual(warnings);
- });
- });
-});
diff --git a/src/plugins/data/public/search/fetch/handle_warnings.tsx b/src/plugins/data/public/search/fetch/handle_warnings.tsx
index 3e1353ee2f9a7..3380ffe0c8c99 100644
--- a/src/plugins/data/public/search/fetch/handle_warnings.tsx
+++ b/src/plugins/data/public/search/fetch/handle_warnings.tsx
@@ -7,49 +7,23 @@
*/
import { estypes } from '@elastic/elasticsearch';
-import { debounce } from 'lodash';
-import { EuiSpacer, EuiTextAlign } from '@elastic/eui';
+import { EuiTextAlign } from '@elastic/eui';
import { ThemeServiceStart } from '@kbn/core/public';
import { toMountPoint } from '@kbn/kibana-react-plugin/public';
import React from 'react';
-import type { MountPoint } from '@kbn/core/public';
import { SearchRequest } from '..';
import { getNotifications } from '../../services';
-import { ShardFailureOpenModalButton, ShardFailureRequest } from '../../shard_failure_modal';
+import { OpenIncompleteResultsModalButton } from '../../incomplete_results_modal';
import {
- SearchResponseShardFailureWarning,
+ SearchResponseIncompleteWarning,
SearchResponseWarning,
WarningHandlerCallback,
} from '../types';
import { extractWarnings } from './extract_warnings';
-const getDebouncedWarning = () => {
- const addWarning = () => {
- const { toasts } = getNotifications();
- return debounce(toasts.addWarning.bind(toasts), 30000, {
- leading: true,
- });
- };
- const memory: Record> = {};
-
- return (
- debounceKey: string,
- title: string,
- text?: string | MountPoint | undefined
- ) => {
- memory[debounceKey] = memory[debounceKey] || addWarning();
- return memory[debounceKey]({ title, text });
- };
-};
-
-const debouncedWarningWithoutReason = getDebouncedWarning();
-const debouncedTimeoutWarning = getDebouncedWarning();
-const debouncedWarning = getDebouncedWarning();
-
/**
* @internal
- * All warnings are expected to come from the same response. Therefore all "text" properties, which contain the
- * response, will be the same.
+ * All warnings are expected to come from the same response.
*/
export function handleWarnings({
request,
@@ -78,47 +52,29 @@ export function handleWarnings({
return;
}
- // timeout notification
- const [timeout] = internal.filter((w) => w.type === 'timed_out');
- if (timeout) {
- debouncedTimeoutWarning(sessionId + timeout.message, timeout.message);
- }
-
- // shard warning failure notification
- const shardFailures = internal.filter((w) => w.type === 'shard_failure');
- if (shardFailures.length === 0) {
+ // Incomplete data failure notification
+ const incompleteWarnings = internal.filter((w) => w.type === 'incomplete');
+ if (incompleteWarnings.length === 0) {
return;
}
- const [warning] = shardFailures as SearchResponseShardFailureWarning[];
- const title = warning.message;
-
- // if warning message contains text (warning response), show in ShardFailureOpenModalButton
- if (warning.text) {
- const text = toMountPoint(
- <>
- {warning.text}
-
-
- ({
- request: request as ShardFailureRequest,
- response,
- })}
- />
-
- >,
+ const [incompleteWarning] = incompleteWarnings as SearchResponseIncompleteWarning[];
+ getNotifications().toasts.addWarning({
+ title: incompleteWarning.message,
+ text: toMountPoint(
+
+ ({
+ request,
+ response,
+ })}
+ warning={incompleteWarning}
+ />
+ ,
{ theme$: theme.theme$ }
- );
-
- debouncedWarning(sessionId + warning.text, title, text);
- return;
- }
-
- // timeout warning, or shard warning with no failure reason
- debouncedWarningWithoutReason(sessionId + title, title);
+ ),
+ });
}
/**
diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts
index 46024da1096d0..fe193c867475f 100644
--- a/src/plugins/data/public/search/index.ts
+++ b/src/plugins/data/public/search/index.ts
@@ -10,6 +10,7 @@ export * from './expressions';
export type {
SearchResponseWarning,
+ SearchResponseIncompleteWarning,
ISearchSetup,
ISearchStart,
ISearchStartSearchSource,
diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts
index c94cde6b8f747..784a41a299503 100644
--- a/src/plugins/data/public/search/search_service.test.ts
+++ b/src/plugins/data/public/search/search_service.test.ts
@@ -142,7 +142,7 @@ describe('Search service', () => {
expect(notifications.toasts.addWarning).toBeCalledTimes(1);
expect(notifications.toasts.addWarning).toBeCalledWith({
- title: '2 of 4 shards failed',
+ title: 'The data might be incomplete or wrong.',
text: expect.any(Function),
});
});
@@ -155,90 +155,6 @@ describe('Search service', () => {
expect(notifications.toasts.addWarning).toBeCalledTimes(0);
});
-
- it('will show single notification when some warnings are filtered', () => {
- callback = (warning) => warning.reason?.type === 'illegal_argument_exception';
- shards.failures = [
- {
- reason: {
- type: 'illegal_argument_exception',
- reason: 'reason of "illegal_argument_exception"',
- },
- },
- {
- reason: {
- type: 'other_kind_of_exception',
- reason: 'reason of other_kind_of_exception',
- },
- },
- { reason: { type: 'fatal_warning', reason: 'this is a fatal warning message' } },
- ] as unknown as estypes.ShardFailure[];
-
- const responder = inspector.adapter.start('request1');
- responder.ok(getMockResponseWithShards(shards));
- data.showWarnings(inspector.adapter, callback);
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({
- title: '2 of 4 shards failed',
- text: expect.any(Function),
- });
- });
-
- it('can show a timed_out warning', () => {
- const responder = inspector.adapter.start('request1');
- shards = { total: 4, successful: 4, skipped: 0, failed: 0 };
- const response1 = getMockResponseWithShards(shards);
- response1.json.rawResponse.timed_out = true;
- responder.ok(response1);
- data.showWarnings(inspector.adapter, callback);
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(1);
- expect(notifications.toasts.addWarning).toBeCalledWith({
- title: 'Data might be incomplete because your request timed out',
- });
- });
-
- it('can show two warnings if response has shard failures and also timed_out', () => {
- const responder = inspector.adapter.start('request1');
- const response1 = getMockResponseWithShards(shards);
- response1.json.rawResponse.timed_out = true;
- responder.ok(response1);
- data.showWarnings(inspector.adapter, callback);
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(2);
- expect(notifications.toasts.addWarning).nthCalledWith(1, {
- title: 'Data might be incomplete because your request timed out',
- });
- expect(notifications.toasts.addWarning).nthCalledWith(2, {
- title: '2 of 4 shards failed',
- text: expect.any(Function),
- });
- });
-
- it('will show multiple warnings when multiple responses have shard failures', () => {
- const responder1 = inspector.adapter.start('request1');
- const responder2 = inspector.adapter.start('request2');
- responder1.ok(getMockResponseWithShards(shards));
- responder2.ok({
- json: {
- rawResponse: {
- timed_out: true,
- },
- },
- });
-
- data.showWarnings(inspector.adapter, callback);
-
- expect(notifications.toasts.addWarning).toBeCalledTimes(2);
- expect(notifications.toasts.addWarning).nthCalledWith(1, {
- title: '2 of 4 shards failed',
- text: expect.any(Function),
- });
- expect(notifications.toasts.addWarning).nthCalledWith(2, {
- title: 'Data might be incomplete because your request timed out',
- });
- });
});
});
});
diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts
index 79229eaff91bf..4631425696243 100644
--- a/src/plugins/data/public/search/search_service.ts
+++ b/src/plugins/data/public/search/search_service.ts
@@ -243,7 +243,7 @@ export class SearchService implements Plugin {
getConfig: uiSettings.get.bind(uiSettings),
search,
onResponse: (request, response, options) => {
- if (!options.disableShardFailureWarning) {
+ if (!options.disableWarningToasts) {
const { rawResponse } = response;
handleWarnings({
diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts
index d1fde7bd4d7e6..2daceefeadb77 100644
--- a/src/plugins/data/public/search/types.ts
+++ b/src/plugins/data/public/search/types.ts
@@ -7,6 +7,7 @@
*/
import { estypes } from '@elastic/elasticsearch';
+import type { ClusterDetails } from '@kbn/es-types';
import type { PackageInfo } from '@kbn/core/server';
import { DataViewsContract } from '@kbn/data-views-plugin/common';
import { RequestAdapter } from '@kbn/inspector-plugin/public';
@@ -96,63 +97,35 @@ export interface SearchServiceStartDependencies {
}
/**
- * A warning object for a search response with internal ES timeouts
+ * A warning object for a search response with incomplete ES results
+ * ES returns incomplete results when:
+ * 1) Set timeout flag on search and the timeout expires on cluster
+ * 2) Some shard failures on a cluster
+ * 3) skipped remote(s) (skip_unavailable=true)
+ * a. all shards failed
+ * b. disconnected/not-connected
* @public
*/
-export interface SearchResponseTimeoutWarning {
+export interface SearchResponseIncompleteWarning {
/**
- * type: for sorting out timeout warnings
+ * type: for sorting out incomplete warnings
*/
- type: 'timed_out';
+ type: 'incomplete';
/**
* message: human-friendly message
*/
message: string;
/**
- * reason: not given for timeout. This exists so that callers do not have to cast when working with shard failure warnings.
+ * clusters: cluster details.
*/
- reason: undefined;
-}
-
-/**
- * A warning object for a search response with internal ES shard failures
- * @public
- */
-export interface SearchResponseShardFailureWarning {
- /**
- * type: for sorting out shard failure warnings
- */
- type: 'shard_failure';
- /**
- * message: human-friendly message
- */
- message: string;
- /**
- * text: text to show in ShardFailureModal (optional)
- */
- text?: string;
- /**
- * reason: ShardFailureReason from es client
- */
- reason: {
- /**
- * type: failure code from Elasticsearch
- */
- type: 'generic_shard_warning' | estypes.ShardFailure['reason']['type'];
- /**
- * reason: failure reason from Elasticsearch
- */
- reason?: estypes.ShardFailure['reason']['reason'];
- };
+ clusters: Record;
}
/**
* A warning object for a search response with warnings
* @public
*/
-export type SearchResponseWarning =
- | SearchResponseTimeoutWarning
- | SearchResponseShardFailureWarning;
+export type SearchResponseWarning = SearchResponseIncompleteWarning;
/**
* A callback function which can intercept warnings when passed to {@link showWarnings}. Pass `true` from the
diff --git a/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_request.ts b/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_request.ts
deleted file mode 100644
index c13ca9e71f48f..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_request.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { ShardFailureRequest } from '../shard_failure_types';
-export const shardFailureRequest = {
- version: true,
- size: 500,
- sort: [],
- _source: {
- excludes: [],
- },
- stored_fields: ['*'],
- script_fields: {},
- docvalue_fields: [],
- query: {},
- highlight: {},
-} as ShardFailureRequest;
diff --git a/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_response.ts b/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_response.ts
index 50355a933ec5d..b45caefd5fe26 100644
--- a/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_response.ts
+++ b/src/plugins/data/public/shard_failure_modal/__mocks__/shard_failure_response.ts
@@ -6,7 +6,7 @@
* Side Public License, v 1.
*/
-import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
+import { estypes } from '@elastic/elasticsearch';
export const shardFailureResponse: estypes.SearchResponse = {
_shards: {
@@ -33,4 +33,4 @@ export const shardFailureResponse: estypes.SearchResponse = {
},
],
},
-} as any;
+} as unknown as estypes.SearchResponse;
diff --git a/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap b/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap
index fbad1c1f3dc80..c8635d69e1fde 100644
--- a/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap
+++ b/src/plugins/data/public/shard_failure_modal/__snapshots__/shard_failure_description.test.tsx.snap
@@ -10,7 +10,6 @@ exports[`ShardFailureDescription renders matching snapshot given valid propertie
grow={false}
>
-
-
- test
-
-
-
- ,
- "data-test-subj": "shardFailuresModalShardButton",
- "id": "table",
- "name": "Shard failures",
- }
- }
- tabs={
- Array [
- Object {
- "content": ,
- "data-test-subj": "shardFailuresModalShardButton",
- "id": "table",
- "name": "Shard failures",
- },
- Object {
- "content":
- {
- "version": true,
- "size": 500,
- "sort": [],
- "_source": {
- "excludes": []
- },
- "stored_fields": [
- "*"
- ],
- "script_fields": {},
- "docvalue_fields": [],
- "query": {},
- "highlight": {}
-}
- ,
- "data-test-subj": "shardFailuresModalRequestButton",
- "id": "json-request",
- "name": "Request",
- },
- Object {
- "content":
- {
- "_shards": {
- "total": 2,
- "successful": 1,
- "skipped": 0,
- "failed": 1,
- "failures": [
- {
- "shard": 0,
- "index": "repro2",
- "node": "itsmeyournode",
- "reason": {
- "type": "script_exception",
- "reason": "runtime error",
- "script_stack": [
- "return doc['targetfield'].value;",
- " ^---- HERE"
- ],
- "script": "return doc['targetfield'].value;",
- "lang": "painless",
- "caused_by": {
- "type": "illegal_argument_exception",
- "reason": "Gimme reason"
- }
- }
- }
- ]
- }
-}
- ,
- "data-test-subj": "shardFailuresModalResponseButton",
- "id": "json-response",
- "name": "Response",
- },
- ]
- }
- />
-
-
-
-
-
-
-
-
-
-
-`;
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_description.test.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_description.test.tsx
index 9664ca1f9f997..23a455ac04c3c 100644
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_description.test.tsx
+++ b/src/plugins/data/public/shard_failure_modal/shard_failure_description.test.tsx
@@ -14,13 +14,13 @@ import { shardFailureResponse } from './__mocks__/shard_failure_response';
describe('ShardFailureDescription', () => {
it('renders matching snapshot given valid properties', () => {
- const failure = (shardFailureResponse._shards as any).failures[0];
+ const failure = shardFailureResponse._shards.failures![0];
const component = shallowWithIntl( );
expect(component).toMatchSnapshot();
});
it('should show more details when button is pressed', async () => {
- const failure = (shardFailureResponse._shards as any).failures[0];
+ const failure = shardFailureResponse._shards.failures![0];
const component = shallowWithIntl( );
await component.find(EuiButtonEmpty).simulate('click');
expect(component).toMatchSnapshot();
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_description.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_description.tsx
index 9d78b0adf9a89..32b54a87294d3 100644
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_description.tsx
+++ b/src/plugins/data/public/shard_failure_modal/shard_failure_description.tsx
@@ -7,6 +7,7 @@
*/
import React, { useState } from 'react';
+import { estypes } from '@elastic/elasticsearch';
import { i18n } from '@kbn/i18n';
import { css } from '@emotion/react';
import { getFlattenedObject } from '@kbn/std';
@@ -17,7 +18,6 @@ import {
EuiFlexGroup,
EuiFlexItem,
} from '@elastic/eui';
-import { ShardFailure } from './shard_failure_types';
/**
* Provides pretty formatting of a given key string
@@ -47,7 +47,7 @@ export function formatValueByKey(value: unknown, key: string): string | JSX.Elem
}
}
-export function ShardFailureDescription(props: ShardFailure) {
+export function ShardFailureDescription(props: estypes.ShardFailure) {
const [showDetails, setShowDetails] = useState(false);
const flattendReason = getFlattenedObject(props.reason);
@@ -70,7 +70,7 @@ export function ShardFailureDescription(props: ShardFailure) {
title: i18n.translate('data.search.searchSource.fetch.shardsFailedModal.indexTitle', {
defaultMessage: 'Index',
}),
- description: props.index,
+ description: props.index ?? '',
},
{
title: i18n.translate('data.search.searchSource.fetch.shardsFailedModal.reasonTypeTitle', {
@@ -84,7 +84,7 @@ export function ShardFailureDescription(props: ShardFailure) {
title: i18n.translate('data.search.searchSource.fetch.shardsFailedModal.nodeTitle', {
defaultMessage: 'Node',
}),
- description: props.node,
+ description: props.node ?? '',
},
...reasonItems,
]
@@ -99,7 +99,6 @@ export function ShardFailureDescription(props: ShardFailure) {
columnWidths={[1, 6]}
listItems={items}
compressed
- className="shardFailureModal__desc"
titleProps={{ className: 'shardFailureModal__descTitle' }}
descriptionProps={{ className: 'shardFailureModal__descValue' }}
/>
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_modal.test.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_modal.test.tsx
deleted file mode 100644
index d4b30d5a1923b..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_modal.test.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import React from 'react';
-import { shallowWithIntl } from '@kbn/test-jest-helpers';
-import { ShardFailureModal } from './shard_failure_modal';
-import { shardFailureRequest } from './__mocks__/shard_failure_request';
-import { shardFailureResponse } from './__mocks__/shard_failure_response';
-
-describe('ShardFailureModal', () => {
- it('renders matching snapshot given valid properties', () => {
- const component = shallowWithIntl(
-
- );
-
- expect(component).toMatchSnapshot();
- });
-});
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_modal.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_modal.tsx
deleted file mode 100644
index 5dd7bebc2b77e..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_modal.tsx
+++ /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 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import React from 'react';
-import { FormattedMessage } from '@kbn/i18n-react';
-import { i18n } from '@kbn/i18n';
-import {
- EuiCodeBlock,
- EuiTabbedContent,
- EuiCopy,
- EuiButton,
- EuiModalBody,
- EuiModalHeader,
- EuiModalHeaderTitle,
- EuiModalFooter,
- EuiButtonEmpty,
- EuiCallOut,
-} from '@elastic/eui';
-import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-import { ShardFailureTable } from './shard_failure_table';
-import { ShardFailureRequest } from './shard_failure_types';
-
-export interface Props {
- onClose: () => void;
- request: ShardFailureRequest;
- response: estypes.SearchResponse;
- title: string;
-}
-
-export function ShardFailureModal({ request, response, title, onClose }: Props) {
- if (
- !response ||
- !response._shards ||
- !Array.isArray((response._shards as any).failures) ||
- !request
- ) {
- // this should never ever happen, but just in case
- return (
-
- The ShardFailureModal component received invalid properties
-
- );
- }
- const failures = (response._shards as any).failures;
- const requestJSON = JSON.stringify(request, null, 2);
- const responseJSON = JSON.stringify(response, null, 2);
-
- const tabs = [
- {
- id: 'table',
- name: i18n.translate(
- 'data.search.searchSource.fetch.shardsFailedModal.tabHeaderShardFailures',
- {
- defaultMessage: 'Shard failures',
- description: 'Name of the tab displaying shard failures',
- }
- ),
- content: ,
- ['data-test-subj']: 'shardFailuresModalShardButton',
- },
- {
- id: 'json-request',
- name: i18n.translate('data.search.searchSource.fetch.shardsFailedModal.tabHeaderRequest', {
- defaultMessage: 'Request',
- description: 'Name of the tab displaying the JSON request',
- }),
- content: (
-
- {requestJSON}
-
- ),
- ['data-test-subj']: 'shardFailuresModalRequestButton',
- },
- {
- id: 'json-response',
- name: i18n.translate('data.search.searchSource.fetch.shardsFailedModal.tabHeaderResponse', {
- defaultMessage: 'Response',
- description: 'Name of the tab displaying the JSON response',
- }),
- content: (
-
- {responseJSON}
-
- ),
- ['data-test-subj']: 'shardFailuresModalResponseButton',
- },
- ];
-
- return (
-
-
-
- {title}
-
-
-
-
-
-
-
- {(copy) => (
-
-
-
- )}
-
- onClose()} fill data-test-subj="closeShardFailureModal">
-
-
-
-
- );
-}
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx
deleted file mode 100644
index 948905cf1ce90..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { setOverlays } from '../services';
-import { OverlayStart } from '@kbn/core/public';
-
-export const openModal = jest.fn();
-
-setOverlays({
- openModal,
-} as unknown as OverlayStart);
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.tsx
deleted file mode 100644
index 00f0315e69275..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_open_modal_button.test.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-
-import { openModal } from './shard_failure_open_modal_button.test.mocks';
-import React from 'react';
-import { themeServiceMock } from '@kbn/core/public/mocks';
-import { mountWithIntl } from '@kbn/test-jest-helpers';
-import ShardFailureOpenModalButton from './shard_failure_open_modal_button';
-import { shardFailureRequest } from './__mocks__/shard_failure_request';
-import { shardFailureResponse } from './__mocks__/shard_failure_response';
-import { findTestSubject } from '@elastic/eui/lib/test';
-
-const theme = themeServiceMock.createStartContract();
-
-describe('ShardFailureOpenModalButton', () => {
- it('triggers the openModal function when "Show details" button is clicked', () => {
- const component = mountWithIntl(
- ({
- request: shardFailureRequest,
- response: shardFailureResponse,
- })}
- theme={theme}
- title="test"
- />
- );
- findTestSubject(component, 'openShardFailureModalBtn').simulate('click');
- expect(openModal).toHaveBeenCalled();
- });
-});
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_table.test.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_table.test.tsx
index c4a53f850ab6a..567ad8ff80ac2 100644
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_table.test.tsx
+++ b/src/plugins/data/public/shard_failure_modal/shard_failure_table.test.tsx
@@ -10,12 +10,12 @@ import React from 'react';
import { shallowWithIntl } from '@kbn/test-jest-helpers';
import { ShardFailureTable } from './shard_failure_table';
import { shardFailureResponse } from './__mocks__/shard_failure_response';
-import { ShardFailure } from './shard_failure_types';
describe('ShardFailureTable', () => {
it('renders matching snapshot given valid properties', () => {
- const failures = (shardFailureResponse._shards as any).failures as ShardFailure[];
- const component = shallowWithIntl( );
+ const component = shallowWithIntl(
+
+ );
expect(component).toMatchSnapshot();
});
});
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_table.tsx b/src/plugins/data/public/shard_failure_modal/shard_failure_table.tsx
index ab9c376157100..cb4fed32f11eb 100644
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_table.tsx
+++ b/src/plugins/data/public/shard_failure_modal/shard_failure_table.tsx
@@ -7,13 +7,13 @@
*/
import React from 'react';
+import { estypes } from '@elastic/elasticsearch';
import { i18n } from '@kbn/i18n';
import { css } from '@emotion/react';
import { EuiInMemoryTable, EuiInMemoryTableProps, euiScreenReaderOnly } from '@elastic/eui';
import { ShardFailureDescription } from './shard_failure_description';
-import { ShardFailure } from './shard_failure_types';
-export interface ListItem extends ShardFailure {
+export interface ListItem extends estypes.ShardFailure {
id: string;
}
@@ -24,7 +24,7 @@ const SORTING: EuiInMemoryTableProps['sorting'] = {
},
};
-export function ShardFailureTable({ failures }: { failures: ShardFailure[] }) {
+export function ShardFailureTable({ failures }: { failures: estypes.ShardFailure[] }) {
const itemList = failures.map((failure, idx) => ({ ...{ id: String(idx) }, ...failure }));
const columns = [
diff --git a/src/plugins/data/public/shard_failure_modal/shard_failure_types.ts b/src/plugins/data/public/shard_failure_modal/shard_failure_types.ts
deleted file mode 100644
index c6533f9f0a850..0000000000000
--- a/src/plugins/data/public/shard_failure_modal/shard_failure_types.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
- * in compliance with, at your election, the Elastic License 2.0 or the Server
- * Side Public License, v 1.
- */
-import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-export interface ShardFailureRequest {
- docvalue_fields: string[];
- _source: unknown;
- query: unknown;
- script_fields: unknown;
- sort: unknown;
- stored_fields: string[];
-}
-
-export interface ShardFailure {
- index: string;
- node: string;
- reason: {
- caused_by: {
- reason: string;
- type: string;
- };
- reason: string;
- lang?: estypes.ScriptLanguage;
- script?: string;
- script_stack?: string[];
- type: string;
- };
- shard: number;
-}
diff --git a/src/plugins/data/server/search/expressions/esaggs.test.ts b/src/plugins/data/server/search/expressions/esaggs.test.ts
index 9954fb2457968..da903f6ff7101 100644
--- a/src/plugins/data/server/search/expressions/esaggs.test.ts
+++ b/src/plugins/data/server/search/expressions/esaggs.test.ts
@@ -131,7 +131,7 @@ describe('esaggs expression function - server', () => {
query: undefined,
searchSessionId: 'abc123',
searchSourceService: startDependencies.searchSource,
- disableShardWarnings: false,
+ disableWarningToasts: false,
timeFields: args.timeFields,
timeRange: undefined,
});
diff --git a/src/plugins/data/server/search/expressions/esaggs.ts b/src/plugins/data/server/search/expressions/esaggs.ts
index eedd1db8d0308..2e1afc0350957 100644
--- a/src/plugins/data/server/search/expressions/esaggs.ts
+++ b/src/plugins/data/server/search/expressions/esaggs.ts
@@ -72,7 +72,7 @@ export function getFunctionDefinition({
query: get(input, 'query', undefined) as any,
searchSessionId: getSearchSessionId(),
searchSourceService: searchSource,
- disableShardWarnings: false,
+ disableWarningToasts: false,
timeFields: args.timeFields,
timeRange: get(input, 'timeRange', undefined),
})
diff --git a/src/plugins/data/tsconfig.json b/src/plugins/data/tsconfig.json
index 9d46f36ffd29c..81820900557d7 100644
--- a/src/plugins/data/tsconfig.json
+++ b/src/plugins/data/tsconfig.json
@@ -49,7 +49,8 @@
"@kbn/core-saved-objects-server",
"@kbn/core-saved-objects-utils-server",
"@kbn/data-service",
- "@kbn/react-kibana-context-render"
+ "@kbn/react-kibana-context-render",
+ "@kbn/es-types"
],
"exclude": [
"target/**/*",
diff --git a/src/plugins/discover/common/constants.ts b/src/plugins/discover/common/constants.ts
index e80f9d2449ebc..8ac1280592ff6 100644
--- a/src/plugins/discover/common/constants.ts
+++ b/src/plugins/discover/common/constants.ts
@@ -17,7 +17,6 @@ export enum VIEW_MODE {
AGGREGATED_LEVEL = 'aggregated',
}
-export const DISABLE_SHARD_FAILURE_WARNING = true;
export const getDefaultRowsPerPage = (uiSettings: IUiSettingsClient): number => {
return parseInt(uiSettings.get(SAMPLE_ROWS_PER_PAGE_SETTING), 10) || DEFAULT_ROWS_PER_PAGE;
};
diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx
index 355c82417f632..de1e0a23c4df2 100644
--- a/src/plugins/discover/public/application/context/context_app.tsx
+++ b/src/plugins/discover/public/application/context/context_app.tsx
@@ -18,7 +18,6 @@ import { useExecutionContext } from '@kbn/kibana-react-plugin/public';
import { generateFilters } from '@kbn/data-plugin/public';
import { i18n } from '@kbn/i18n';
import { reportPerformanceMetricEvent } from '@kbn/ebt-tools';
-import { removeInterceptedWarningDuplicates } from '@kbn/search-response-warnings';
import {
DOC_TABLE_LEGACY,
SEARCH_FIELDS_FROM_SOURCE,
@@ -177,12 +176,11 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) =>
);
const interceptedWarnings = useMemo(
- () =>
- removeInterceptedWarningDuplicates([
- ...(fetchedState.predecessorsInterceptedWarnings || []),
- ...(fetchedState.anchorInterceptedWarnings || []),
- ...(fetchedState.successorsInterceptedWarnings || []),
- ]),
+ () => [
+ ...(fetchedState.predecessorsInterceptedWarnings || []),
+ ...(fetchedState.anchorInterceptedWarnings || []),
+ ...(fetchedState.successorsInterceptedWarnings || []),
+ ],
[
fetchedState.predecessorsInterceptedWarnings,
fetchedState.anchorInterceptedWarnings,
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 9ff64165f0f24..db0243e7f4ccf 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
@@ -19,15 +19,15 @@ import {
mockSuccessorHits,
} from '../__mocks__/use_context_app_fetch';
import { dataViewWithTimefieldMock } from '../../../__mocks__/data_view_with_timefield';
-import { searchResponseWarningsMock } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
import { createContextSearchSourceStub } from '../services/_stubs';
import { DataView } from '@kbn/data-views-plugin/public';
import { themeServiceMock } from '@kbn/core/public/mocks';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
-const mockInterceptedWarnings = searchResponseWarningsMock.map((originalWarning) => ({
- originalWarning,
-}));
+const mockInterceptedWarning = {
+ originalWarning: searchResponseIncompleteWarningLocalCluster,
+};
const mockFilterManager = createFilterManagerMock();
@@ -44,9 +44,7 @@ jest.mock('../services/context', () => {
}
return {
rows: type === 'predecessors' ? mockPredecessorHits : mockSuccessorHits,
- interceptedWarnings: mockOverrideInterceptedWarnings
- ? [mockInterceptedWarnings[type === 'predecessors' ? 0 : 1]]
- : undefined,
+ interceptedWarnings: mockOverrideInterceptedWarnings ? [mockInterceptedWarning] : undefined,
};
},
};
@@ -59,9 +57,7 @@ jest.mock('../services/anchor', () => ({
}
return {
anchorRow: mockAnchorHit,
- interceptedWarnings: mockOverrideInterceptedWarnings
- ? [mockInterceptedWarnings[2]]
- : undefined,
+ interceptedWarnings: mockOverrideInterceptedWarnings ? [mockInterceptedWarning] : undefined,
};
},
}));
@@ -228,13 +224,11 @@ describe('test useContextAppFetch', () => {
expect(result.current.fetchedState.predecessors).toEqual(mockPredecessorHits);
expect(result.current.fetchedState.successors).toEqual(mockSuccessorHits);
expect(result.current.fetchedState.predecessorsInterceptedWarnings).toEqual([
- mockInterceptedWarnings[0],
+ mockInterceptedWarning,
]);
expect(result.current.fetchedState.successorsInterceptedWarnings).toEqual([
- mockInterceptedWarnings[1],
- ]);
- expect(result.current.fetchedState.anchorInterceptedWarnings).toEqual([
- mockInterceptedWarnings[2],
+ mockInterceptedWarning,
]);
+ expect(result.current.fetchedState.anchorInterceptedWarnings).toEqual([mockInterceptedWarning]);
});
});
diff --git a/src/plugins/discover/public/application/context/services/anchor.test.ts b/src/plugins/discover/public/application/context/services/anchor.test.ts
index 415b468f38afd..deb5a0ed5ca7a 100644
--- a/src/plugins/discover/public/application/context/services/anchor.test.ts
+++ b/src/plugins/discover/public/application/context/services/anchor.test.ts
@@ -10,7 +10,7 @@ import { SortDirection } from '@kbn/data-plugin/public';
import { createSearchSourceStub } from './_stubs';
import { fetchAnchor, updateSearchSource } from './anchor';
import { dataViewMock } from '@kbn/discover-utils/src/__mocks__';
-import { searchResponseTimeoutWarningMock } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
import { savedSearchMock } from '../../../__mocks__/saved_search';
import { discoverServiceMock } from '../../../__mocks__/services';
@@ -206,7 +206,7 @@ describe('context app', function () {
).then(({ anchorRow, interceptedWarnings }) => {
expect(anchorRow).toHaveProperty('raw._id', '1');
expect(anchorRow).toHaveProperty('isAnchor', true);
- expect(interceptedWarnings).toBeUndefined();
+ expect(interceptedWarnings).toEqual([]);
});
});
@@ -216,20 +216,10 @@ describe('context app', function () {
{ _id: '3', _index: 't' },
]);
- const mockWarnings = [
- {
- originalWarning: searchResponseTimeoutWarningMock,
- },
- ];
-
const services = discoverServiceMock;
services.data.search.showWarnings = jest.fn((adapter, callback) => {
// @ts-expect-error for empty meta
- callback?.(mockWarnings[0].originalWarning, {});
-
- // plus duplicates
- // @ts-expect-error for empty meta
- callback?.(mockWarnings[0].originalWarning, {});
+ callback?.(searchResponseIncompleteWarningLocalCluster, {});
});
return fetchAnchor(
@@ -242,7 +232,7 @@ describe('context app', function () {
).then(({ anchorRow, interceptedWarnings }) => {
expect(anchorRow).toHaveProperty('raw._id', '1');
expect(anchorRow).toHaveProperty('isAnchor', true);
- expect(interceptedWarnings).toEqual(mockWarnings);
+ expect(interceptedWarnings?.length).toBe(1);
});
});
});
diff --git a/src/plugins/discover/public/application/context/services/anchor.ts b/src/plugins/discover/public/application/context/services/anchor.ts
index daf99030201a4..f5d0f78a83441 100644
--- a/src/plugins/discover/public/application/context/services/anchor.ts
+++ b/src/plugins/discover/public/application/context/services/anchor.ts
@@ -17,7 +17,6 @@ import {
type SearchResponseInterceptedWarning,
} from '@kbn/search-response-warnings';
import type { DiscoverServices } from '../../../build_services';
-import { DISABLE_SHARD_FAILURE_WARNING } from '../../../../common/constants';
export async function fetchAnchor(
anchorId: string,
@@ -35,7 +34,7 @@ export async function fetchAnchor(
const adapter = new RequestAdapter();
const { rawResponse } = await lastValueFrom(
searchSource.fetch$({
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
+ disableWarningToasts: true,
inspector: {
adapter,
title: 'anchor',
@@ -56,9 +55,6 @@ export async function fetchAnchor(
interceptedWarnings: getSearchResponseInterceptedWarnings({
services,
adapter,
- options: {
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
- },
}),
};
}
diff --git a/src/plugins/discover/public/application/context/services/context.successors.test.ts b/src/plugins/discover/public/application/context/services/context.successors.test.ts
index 9c2a0120c2a72..54037a7071f06 100644
--- a/src/plugins/discover/public/application/context/services/context.successors.test.ts
+++ b/src/plugins/discover/public/application/context/services/context.successors.test.ts
@@ -16,6 +16,7 @@ import { Query } from '@kbn/es-query';
import { fetchSurroundingDocs, SurrDocType } from './context';
import { buildDataTableRecord, buildDataTableRecordList } from '@kbn/discover-utils';
import { discoverServiceMock } from '../../../__mocks__/services';
+import { searchResponseIncompleteWarningLocalCluster } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
const MS_PER_DAY = 24 * 60 * 60 * 1000;
const ANCHOR_TIMESTAMP = new Date(MS_PER_DAY).toJSON();
@@ -257,28 +258,13 @@ describe('context successors', function () {
const removeFieldsSpy = mockSearchSource.removeField.withArgs('fieldsFromSource');
expect(removeFieldsSpy.calledOnce).toBe(true);
expect(setFieldsSpy.calledOnce).toBe(true);
- expect(interceptedWarnings).toBeUndefined();
+ expect(interceptedWarnings).toEqual([]);
}
);
});
});
describe('function fetchSuccessors with shard failures', function () {
- const mockWarnings = [
- {
- originalWarning: {
- message: 'Data might be incomplete because your request timed out 1',
- type: 'timed_out',
- },
- },
- {
- originalWarning: {
- message: 'Data might be incomplete because your request timed out 2',
- type: 'timed_out',
- },
- },
- ];
-
beforeEach(() => {
mockSearchSource = createContextSearchSourceStub('@timestamp');
@@ -288,11 +274,7 @@ describe('context successors', function () {
createEmpty: jest.fn().mockImplementation(() => mockSearchSource),
},
showWarnings: jest.fn((adapter, callback) => {
- callback(mockWarnings[0].originalWarning, {});
- callback(mockWarnings[1].originalWarning, {});
- // plus duplicates
- callback(mockWarnings[0].originalWarning, {});
- callback(mockWarnings[1].originalWarning, {});
+ callback(searchResponseIncompleteWarningLocalCluster, {});
}),
},
} as unknown as DataPublicPluginStart;
@@ -345,7 +327,7 @@ describe('context successors', function () {
buildDataTableRecordList(mockSearchSource._stubHits.slice(-3), dataView)
);
expect(dataPluginMock.search.showWarnings).toHaveBeenCalledTimes(1);
- expect(interceptedWarnings).toEqual(mockWarnings);
+ expect(interceptedWarnings?.length).toBe(1);
}
);
});
diff --git a/src/plugins/discover/public/application/context/services/context.ts b/src/plugins/discover/public/application/context/services/context.ts
index df47356394821..67a477a8b9a03 100644
--- a/src/plugins/discover/public/application/context/services/context.ts
+++ b/src/plugins/discover/public/application/context/services/context.ts
@@ -9,10 +9,7 @@ import type { Filter } from '@kbn/es-query';
import { DataView } from '@kbn/data-views-plugin/public';
import { DataPublicPluginStart, ISearchSource } from '@kbn/data-plugin/public';
import type { DataTableRecord } from '@kbn/discover-utils/types';
-import {
- removeInterceptedWarningDuplicates,
- type SearchResponseInterceptedWarning,
-} from '@kbn/search-response-warnings';
+import type { SearchResponseInterceptedWarning } from '@kbn/search-response-warnings';
import { reverseSortDir, SortDirection } from '../utils/sorting';
import { convertIsoToMillis, extractNanos } from '../utils/date_conversion';
import { fetchHitsInInterval } from '../utils/fetch_hits_in_interval';
@@ -126,7 +123,7 @@ export async function fetchSurroundingDocs(
return {
rows,
- interceptedWarnings: removeInterceptedWarningDuplicates(interceptedWarnings),
+ interceptedWarnings,
};
}
diff --git a/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts b/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts
index c6fed56de4c19..d9a06e08fbada 100644
--- a/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts
+++ b/src/plugins/discover/public/application/context/utils/fetch_hits_in_interval.ts
@@ -17,7 +17,6 @@ import {
import { RequestAdapter } from '@kbn/inspector-plugin/common';
import { convertTimeValueToIso } from './date_conversion';
import { IntervalValue } from './generate_intervals';
-import { DISABLE_SHARD_FAILURE_WARNING } from '../../../../common/constants';
import type { SurrDocType } from '../services/context';
import type { DiscoverServices } from '../../../build_services';
@@ -91,7 +90,7 @@ export async function fetchHitsInInterval(
.setField('sort', sort)
.setField('version', true)
.fetch$({
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
+ disableWarningToasts: true,
inspector: {
adapter,
title: type,
@@ -107,9 +106,6 @@ export async function fetchHitsInInterval(
interceptedWarnings: getSearchResponseInterceptedWarnings({
services,
adapter,
- options: {
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
- },
}),
};
}
diff --git a/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.test.ts b/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.test.ts
index 7b96c2673f3eb..80fe8b9920227 100644
--- a/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.test.ts
+++ b/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.test.ts
@@ -26,7 +26,7 @@ import {
import { filter } from 'rxjs/operators';
import { dataViewMock, esHitsMockWithSort } from '@kbn/discover-utils/src/__mocks__';
import { buildDataTableRecord } from '@kbn/discover-utils';
-import { searchResponseWarningsMock } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
describe('test useSavedSearch message generators', () => {
test('sendCompleteMsg', (done) => {
@@ -103,15 +103,13 @@ describe('test useSavedSearch message generators', () => {
if (value.fetchStatus !== FetchStatus.LOADING_MORE) {
expect(value.fetchStatus).toBe(FetchStatus.COMPLETE);
expect(value.result).toStrictEqual([...initialRecords, ...moreRecords]);
- expect(value.interceptedWarnings).toHaveLength(searchResponseWarningsMock.length);
+ expect(value.interceptedWarnings).toHaveLength(1);
done();
}
});
sendLoadingMoreFinishedMsg(documents$, {
moreRecords,
- interceptedWarnings: searchResponseWarningsMock.map((warning) => ({
- originalWarning: warning,
- })),
+ interceptedWarnings: [{ originalWarning: searchResponseIncompleteWarningLocalCluster }],
});
});
test('sendLoadingMoreFinishedMsg after an exception', (done) => {
@@ -121,9 +119,7 @@ describe('test useSavedSearch message generators', () => {
const documents$ = new BehaviorSubject({
fetchStatus: FetchStatus.LOADING_MORE,
result: initialRecords,
- interceptedWarnings: searchResponseWarningsMock.map((warning) => ({
- originalWarning: warning,
- })),
+ interceptedWarnings: [{ originalWarning: searchResponseIncompleteWarningLocalCluster }],
});
documents$.subscribe((value) => {
if (value.fetchStatus !== FetchStatus.LOADING_MORE) {
diff --git a/src/plugins/discover/public/application/main/utils/fetch_all.test.ts b/src/plugins/discover/public/application/main/utils/fetch_all.test.ts
index ba8a09e17e3d1..6de9781b0b58b 100644
--- a/src/plugins/discover/public/application/main/utils/fetch_all.test.ts
+++ b/src/plugins/discover/public/application/main/utils/fetch_all.test.ts
@@ -25,7 +25,7 @@ import { fetchDocuments } from './fetch_documents';
import { fetchTextBased } from './fetch_text_based';
import { buildDataTableRecord } from '@kbn/discover-utils';
import { dataViewMock, esHitsMockWithSort } from '@kbn/discover-utils/src/__mocks__';
-import { searchResponseWarningsMock } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
+import { searchResponseIncompleteWarningLocalCluster } from '@kbn/search-response-warnings/src/__mocks__/search_response_warnings';
jest.mock('./fetch_documents', () => ({
fetchDocuments: jest.fn().mockResolvedValue([]),
@@ -296,9 +296,11 @@ describe('test fetchAll', () => {
const initialRecords = [records[0], records[1]];
const moreRecords = [records[2], records[3]];
- const interceptedWarnings = searchResponseWarningsMock.map((warning) => ({
- originalWarning: warning,
- }));
+ const interceptedWarnings = [
+ {
+ originalWarning: searchResponseIncompleteWarningLocalCluster,
+ },
+ ];
test('should add more records', async () => {
const collectDocuments = subjectCollector(subjects.documents$);
diff --git a/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts b/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts
index f850b283b3491..cbc62a3cd6068 100644
--- a/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts
+++ b/src/plugins/discover/public/application/main/utils/fetch_documents.test.ts
@@ -37,17 +37,20 @@ describe('test fetchDocuments', () => {
const documents = hits.map((hit) => buildDataTableRecord(hit, dataViewMock));
savedSearchMock.searchSource.fetch$ = () =>
of({ rawResponse: { hits: { hits } } } as IKibanaSearchResponse>);
- expect(fetchDocuments(savedSearchMock.searchSource, getDeps())).resolves.toEqual({
+ expect(await fetchDocuments(savedSearchMock.searchSource, getDeps())).toEqual({
+ interceptedWarnings: [],
records: documents,
});
});
- test('rejects on query failure', () => {
+ test('rejects on query failure', async () => {
savedSearchMock.searchSource.fetch$ = () => throwErrorRx(() => new Error('Oh noes!'));
- expect(fetchDocuments(savedSearchMock.searchSource, getDeps())).rejects.toEqual(
- new Error('Oh noes!')
- );
+ try {
+ await fetchDocuments(savedSearchMock.searchSource, getDeps());
+ } catch (e) {
+ expect(e).toEqual(new Error('Oh noes!'));
+ }
});
test('passes a correct session id', async () => {
@@ -66,7 +69,8 @@ describe('test fetchDocuments', () => {
jest.spyOn(searchSourceRegular, 'fetch$');
- expect(fetchDocuments(searchSourceRegular, deps)).resolves.toEqual({
+ expect(await fetchDocuments(searchSourceRegular, deps)).toEqual({
+ interceptedWarnings: [],
records: documents,
});
@@ -84,7 +88,8 @@ describe('test fetchDocuments', () => {
jest.spyOn(searchSourceForLoadMore, 'fetch$');
- expect(fetchDocuments(searchSourceForLoadMore, deps)).resolves.toEqual({
+ expect(await fetchDocuments(searchSourceForLoadMore, deps)).toEqual({
+ interceptedWarnings: [],
records: documents,
});
diff --git a/src/plugins/discover/public/application/main/utils/fetch_documents.ts b/src/plugins/discover/public/application/main/utils/fetch_documents.ts
index 892da705f4b8f..e849b347a22ff 100644
--- a/src/plugins/discover/public/application/main/utils/fetch_documents.ts
+++ b/src/plugins/discover/public/application/main/utils/fetch_documents.ts
@@ -13,7 +13,6 @@ import { SAMPLE_SIZE_SETTING, buildDataTableRecordList } from '@kbn/discover-uti
import type { EsHitRecord } from '@kbn/discover-utils/types';
import { getSearchResponseInterceptedWarnings } from '@kbn/search-response-warnings';
import type { RecordsFetchResponse } from '../../types';
-import { DISABLE_SHARD_FAILURE_WARNING } from '../../../../common/constants';
import { FetchDeps } from './fetch_all';
/**
@@ -60,7 +59,7 @@ export const fetchDocuments = (
}),
},
executionContext,
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
+ disableWarningToasts: true,
})
.pipe(
filter((res) => isCompleteResponse(res)),
@@ -75,9 +74,6 @@ export const fetchDocuments = (
? getSearchResponseInterceptedWarnings({
services,
adapter,
- options: {
- disableShardFailureWarning: DISABLE_SHARD_FAILURE_WARNING,
- },
})
: [];
diff --git a/src/plugins/discover/public/components/common/error_callout.tsx b/src/plugins/discover/public/components/common/error_callout.tsx
index d0e914a81e851..84b5b979c0249 100644
--- a/src/plugins/discover/public/components/common/error_callout.tsx
+++ b/src/plugins/discover/public/components/common/error_callout.tsx
@@ -41,7 +41,7 @@ export const ErrorCallout = ({
const { euiTheme } = useEuiTheme();
const showErrorMessage = i18n.translate('discover.errorCalloutShowErrorMessage', {
- defaultMessage: 'Show details',
+ defaultMessage: 'View details',
});
const overrideDisplay = getSearchErrorOverrideDisplay({
diff --git a/src/plugins/discover/public/components/discover_container/discover_container.tsx b/src/plugins/discover/public/components/discover_container/discover_container.tsx
index 28a596946bd18..8c879fdfef7bc 100644
--- a/src/plugins/discover/public/components/discover_container/discover_container.tsx
+++ b/src/plugins/discover/public/components/discover_container/discover_container.tsx
@@ -82,7 +82,11 @@ export const DiscoverContainerInternal = ({
css={discoverContainerWrapperCss}
data-test-subj="discover-container-internal-wrapper"
>
-
+
isCompleteResponse(res)),
diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
index 9d34d2fb26ca6..735c5e6572d43 100644
--- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
+++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx
@@ -19,6 +19,7 @@ import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public';
import { TimefilterContract } from '@kbn/data-plugin/public';
import type { DataView } from '@kbn/data-views-plugin/public';
import { Warnings } from '@kbn/charts-plugin/public';
+import { hasUnsupportedDownsampledAggregationFailure } from '@kbn/search-response-warnings';
import {
Adapters,
AttributeService,
@@ -351,11 +352,13 @@ export class VisualizeEmbeddable
this.deps
.start()
.plugins.data.search.showWarnings(this.getInspectorAdapters()!.requests!, (warning) => {
- if (
- warning.type === 'shard_failure' &&
- warning.reason.type === 'unsupported_aggregation_on_downsampled_index'
- ) {
- warnings.push(warning.reason.reason || warning.message);
+ if (hasUnsupportedDownsampledAggregationFailure(warning)) {
+ warnings.push(
+ i18n.translate('visualizations.embeddable.tsdbRollupWarning', {
+ defaultMessage:
+ 'Visualization uses a function that is unsupported by rolled up data. Select a different function or change the time range.',
+ })
+ );
return true;
}
if (this.vis.type.suppressWarnings?.()) {
@@ -582,7 +585,7 @@ export class VisualizeEmbeddable
timeRange: this.timeRange,
query: this.input.query,
filters: this.input.filters,
- disableShardWarnings: true,
+ disableWarningToasts: true,
},
variables: {
embeddableTitle: this.getTitle(),
diff --git a/src/plugins/visualizations/tsconfig.json b/src/plugins/visualizations/tsconfig.json
index e643d9fa1fd61..a835f3151c60c 100644
--- a/src/plugins/visualizations/tsconfig.json
+++ b/src/plugins/visualizations/tsconfig.json
@@ -63,7 +63,8 @@
"@kbn/content-management-table-list-view",
"@kbn/content-management-utils",
"@kbn/serverless",
- "@kbn/no-data-page-plugin"
+ "@kbn/no-data-page-plugin",
+ "@kbn/search-response-warnings"
],
"exclude": [
"target/**/*",
diff --git a/test/examples/search/warnings.ts b/test/examples/search/warnings.ts
index 5ec4f59586a13..f1856f0b0e611 100644
--- a/test/examples/search/warnings.ts
+++ b/test/examples/search/warnings.ts
@@ -26,7 +26,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const kibanaServer = getService('kibanaServer');
const esArchiver = getService('esArchiver');
- describe('handling warnings with search source fetch', function () {
+ // Failing: See https://github.com/elastic/kibana/issues/166484
+ describe.skip('handling warnings with search source fetch', function () {
const dataViewTitle = 'sample-01,sample-01-rollup';
const fromTime = 'Jun 17, 2022 @ 00:00:00.000';
const toTime = 'Jun 23, 2022 @ 00:00:00.000';
@@ -100,7 +101,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await PageObjects.common.clearAllToasts();
});
- it('shows shard failure warning notifications by default', async () => {
+ it('should show search warnings as toasts', async () => {
await testSubjects.click('searchSourceWithOther');
// wait for response - toasts appear before the response is rendered
@@ -113,30 +114,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
// toasts
const toasts = await find.allByCssSelector(toastsSelector);
expect(toasts.length).to.be(2);
- const expects = ['2 of 4 shards failed', 'Query result'];
+ const expects = ['The data might be incomplete or wrong.', 'Query result'];
await asyncForEach(toasts, async (t, index) => {
expect(await t.getVisibleText()).to.eql(expects[index]);
});
// click "see full error" button in the toast
- const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn');
+ const [openShardModalButton] = await testSubjects.findAll('openIncompleteResultsModalBtn');
await openShardModalButton.click();
- await retry.waitFor('modal title visible', async () => {
- const modalHeader = await testSubjects.find('shardFailureModalTitle');
- return (await modalHeader.getVisibleText()) === '2 of 4 shards failed';
- });
-
// request
- await testSubjects.click('shardFailuresModalRequestButton');
- const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock');
+ await testSubjects.click('showRequestButton');
+ const requestBlock = await testSubjects.find('incompleteResultsModalRequestBlock');
expect(await requestBlock.getVisibleText()).to.contain(testRollupField);
// response
- await testSubjects.click('shardFailuresModalResponseButton');
- const responseBlock = await testSubjects.find('shardsFailedModalResponseBlock');
+ await testSubjects.click('showResponseButton');
+ const responseBlock = await testSubjects.find('incompleteResultsModalResponseBlock');
expect(await responseBlock.getVisibleText()).to.contain(shardFailureReason);
- await testSubjects.click('closeShardFailureModal');
+ await testSubjects.click('closeIncompleteResultsModal');
// response tab
assert(response && response._shards.failures);
@@ -154,7 +150,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
expect(warnings).to.eql([]);
});
- it('able to handle shard failure warnings and prevent default notifications', async () => {
+ it('should show search warnings in results tab', async () => {
await testSubjects.click('searchSourceWithoutOther');
// wait for toasts - toasts appear after the response is rendered
@@ -163,53 +159,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
toasts = await find.allByCssSelector(toastsSelector);
expect(toasts.length).to.be(2);
});
- const expects = ['Query result', '2 of 4 shards failed'];
+ const expects = ['The data might be incomplete or wrong.', 'Query result'];
await asyncForEach(toasts, async (t, index) => {
expect(await t.getVisibleText()).to.eql(expects[index]);
});
- // click "see full error" button in the toast
- const [openShardModalButton] = await testSubjects.findAll('openShardFailureModalBtn');
- await openShardModalButton.click();
- await testSubjects.exists('shardFailureModalTitle');
-
- await retry.waitFor('modal title visible', async () => {
- const modalHeader = await testSubjects.find('shardFailureModalTitle');
- return (await modalHeader.getVisibleText()) === '2 of 4 shards failed';
- });
-
- // request
- await testSubjects.click('shardFailuresModalRequestButton');
- const requestBlock = await testSubjects.find('shardsFailedModalRequestBlock');
- expect(await requestBlock.getVisibleText()).to.contain(testRollupField);
- // response
- await testSubjects.click('shardFailuresModalResponseButton');
- const responseBlock = await testSubjects.find('shardsFailedModalResponseBlock');
- expect(await responseBlock.getVisibleText()).to.contain(shardFailureReason);
-
- await testSubjects.click('closeShardFailureModal');
-
- // response tab
- const response = await getTestJson('responseTab', 'responseCodeBlock');
- expect(response._shards.total).to.be(4);
- expect(response._shards.successful).to.be(2);
- expect(response._shards.skipped).to.be(0);
- expect(response._shards.failed).to.be(2);
- expect(response._shards.failures.length).to.equal(1);
- expect(response._shards.failures[0].index).to.equal(testRollupIndex);
- expect(response._shards.failures[0].reason.type).to.equal(shardFailureType);
- expect(response._shards.failures[0].reason.reason).to.equal(shardFailureReason);
-
// warnings tab
const warnings = await getTestJson('warningsTab', 'warningsCodeBlock');
- expect(warnings).to.eql([
- {
- type: 'shard_failure',
- message: '2 of 4 shards failed',
- reason: { reason: shardFailureReason, type: shardFailureType },
- text: 'The data might be incomplete or wrong.',
- },
- ]);
+ expect(warnings.length).to.be(1);
+ expect(warnings[0].type).to.be('incomplete');
});
});
}
diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts
index 1944b5ec24761..54e35bff86ee9 100644
--- a/test/functional/apps/console/_autocomplete.ts
+++ b/test/functional/apps/console/_autocomplete.ts
@@ -273,7 +273,7 @@ GET _search
for (const char of ['/', '_']) {
await PageObjects.console.sleepForDebouncePeriod();
log.debug('Key type "%s"', char);
- await PageObjects.console.enterText(char); // e.g. 'GET .kibana/' -> 'GET .kibana/_'
+ await PageObjects.console.enterText(char); // i.e. 'GET .kibana/' -> 'GET .kibana/_'
}
await retry.waitFor('autocomplete to be visible', () =>
@@ -281,6 +281,37 @@ GET _search
);
expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
});
+
+ it('should activate auto-complete for multiple indices after comma in URL', async () => {
+ await PageObjects.console.enterText('GET /_cat/indices/.kibana');
+
+ await PageObjects.console.sleepForDebouncePeriod();
+ log.debug('Key type ","');
+ await PageObjects.console.enterText(','); // i.e. 'GET /_cat/indices/.kibana,'
+
+ await PageObjects.console.sleepForDebouncePeriod();
+ log.debug('Key type Ctrl+SPACE');
+ await PageObjects.console.pressCtrlSpace();
+
+ await retry.waitFor('autocomplete to be visible', () =>
+ PageObjects.console.isAutocompleteVisible()
+ );
+ expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(true);
+ });
+
+ it('should not activate auto-complete after comma following endpoint in URL', async () => {
+ await PageObjects.console.enterText('GET _search');
+
+ await PageObjects.console.sleepForDebouncePeriod();
+ log.debug('Key type ","');
+ await PageObjects.console.enterText(','); // i.e. 'GET _search,'
+
+ await PageObjects.console.sleepForDebouncePeriod();
+ log.debug('Key type Ctrl+SPACE');
+ await PageObjects.console.pressCtrlSpace();
+
+ expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false);
+ });
});
describe('with a missing comma in query', () => {
diff --git a/test/functional/apps/discover/group2/_esql_view.ts b/test/functional/apps/discover/group2/_esql_view.ts
index d820841b16cd0..212420b56317d 100644
--- a/test/functional/apps/discover/group2/_esql_view.ts
+++ b/test/functional/apps/discover/group2/_esql_view.ts
@@ -91,6 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await monacoEditor.setCodeEditorValue(testQuery);
await testSubjects.click('querySubmitButton');
await PageObjects.header.waitUntilLoadingHasFinished();
+ await PageObjects.discover.waitUntilSearchingHasFinished();
// here Lens suggests a XY so it is rendered
expect(await testSubjects.exists('unifiedHistogramChart')).to.be(true);
expect(await testSubjects.exists('xyVisChart')).to.be(true);
@@ -104,6 +105,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await monacoEditor.setCodeEditorValue(testQuery);
await testSubjects.click('querySubmitButton');
await PageObjects.header.waitUntilLoadingHasFinished();
+ await PageObjects.discover.waitUntilSearchingHasFinished();
let cell = await dataGrid.getCellElement(0, 2);
expect(await cell.getVisibleText()).to.be('1');
await PageObjects.timePicker.setAbsoluteRange(
@@ -111,9 +113,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
'Sep 19, 2015 @ 06:31:44.000'
);
await PageObjects.header.waitUntilLoadingHasFinished();
+ await PageObjects.discover.waitUntilSearchingHasFinished();
expect(await testSubjects.exists('discoverNoResults')).to.be(true);
await PageObjects.timePicker.setDefaultAbsoluteRange();
await PageObjects.header.waitUntilLoadingHasFinished();
+ await PageObjects.discover.waitUntilSearchingHasFinished();
cell = await dataGrid.getCellElement(0, 2);
expect(await cell.getVisibleText()).to.be('1');
});
diff --git a/test/functional/page_objects/common_page.ts b/test/functional/page_objects/common_page.ts
index 1424d952653cd..4218d19712aa0 100644
--- a/test/functional/page_objects/common_page.ts
+++ b/test/functional/page_objects/common_page.ts
@@ -299,7 +299,7 @@ export class CommonPageObject extends FtrService {
const navSuccessful = currentUrl
.replace(':80/', '/')
.replace(':443/', '/')
- .startsWith(appUrl);
+ .startsWith(appUrl.replace(':80/', '/').replace(':443/', '/'));
if (!navSuccessful) {
const msg = `App failed to load: ${appName} in ${this.defaultFindTimeout}ms appUrl=${appUrl} currentUrl=${currentUrl}`;
diff --git a/test/functional/page_objects/console_page.ts b/test/functional/page_objects/console_page.ts
index 21a183c832606..a48578a60bc17 100644
--- a/test/functional/page_objects/console_page.ts
+++ b/test/functional/page_objects/console_page.ts
@@ -429,6 +429,14 @@ export class ConsolePageObject extends FtrService {
await textArea.pressKeys([Key[process.platform === 'darwin' ? 'COMMAND' : 'CONTROL'], '/']);
}
+ public async pressCtrlSpace() {
+ const textArea = await this.testSubjects.find('console-textarea');
+ await textArea.pressKeys([
+ Key[process.platform === 'darwin' ? 'COMMAND' : 'CONTROL'],
+ Key.SPACE,
+ ]);
+ }
+
public async clickContextMenu() {
const contextMenu = await this.testSubjects.find('toggleConsoleMenu');
await contextMenu.click();
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx
index ff96f8b66c92b..972d3d9099cd0 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx
@@ -23,7 +23,7 @@ describe('AssistantOverlay', () => {
it('renders when isAssistantEnabled prop is true and keyboard shortcut is pressed', () => {
const { getByTestId } = render(
-
+
);
fireEvent.keyDown(document, { key: ';', ctrlKey: true });
@@ -34,7 +34,7 @@ describe('AssistantOverlay', () => {
it('modal closes when close button is clicked', () => {
const { getByLabelText, queryByTestId } = render(
-
+
);
fireEvent.keyDown(document, { key: ';', ctrlKey: true });
@@ -47,7 +47,7 @@ describe('AssistantOverlay', () => {
it('Assistant invoked from shortcut tracking happens on modal open only (not close)', () => {
render(
-
+
);
fireEvent.keyDown(document, { key: ';', ctrlKey: true });
@@ -63,7 +63,7 @@ describe('AssistantOverlay', () => {
it('modal closes when shortcut is pressed and modal is already open', () => {
const { queryByTestId } = render(
-
+
);
fireEvent.keyDown(document, { key: ';', ctrlKey: true });
@@ -75,7 +75,7 @@ describe('AssistantOverlay', () => {
it('modal does not open when incorrect shortcut is pressed', () => {
const { queryByTestId } = render(
-
+
);
fireEvent.keyDown(document, { key: 'a', ctrlKey: true });
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx
index 43635fba95df5..ac72fc27dd891 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.tsx
@@ -22,15 +22,12 @@ const StyledEuiModal = styled(EuiModal)`
min-width: 95vw;
min-height: 25vh;
`;
-interface Props {
- isAssistantEnabled: boolean;
-}
/**
* Modal container for Elastic AI Assistant conversations, receiving the page contents as context, plus whatever
* component currently has focus and any specific context it may provide through the SAssInterface.
*/
-export const AssistantOverlay = React.memo(({ isAssistantEnabled }) => {
+export const AssistantOverlay = React.memo(() => {
const [isModalVisible, setIsModalVisible] = useState(false);
const [conversationId, setConversationId] = useState(
WELCOME_CONVERSATION_TITLE
@@ -103,11 +100,7 @@ export const AssistantOverlay = React.memo(({ isAssistantEnabled }) => {
<>
{isModalVisible && (
-
+
)}
>
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx
index fcd203ce0cd97..acb41a9575581 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx
@@ -22,7 +22,7 @@ import { WELCOME_CONVERSATION_TITLE } from './use_conversation/translations';
import { useLocalStorage } from 'react-use';
import { PromptEditor } from './prompt_editor';
import { QuickPrompts } from './quick_prompts/quick_prompts';
-import { TestProviders } from '../mock/test_providers/test_providers';
+import { mockAssistantAvailability, TestProviders } from '../mock/test_providers/test_providers';
jest.mock('../connectorland/use_load_connectors');
jest.mock('../connectorland/connector_setup');
@@ -46,10 +46,10 @@ const getInitialConversations = (): Record => ({
},
});
-const renderAssistant = (extraProps = {}) =>
+const renderAssistant = (extraProps = {}, providerProps = {}) =>
render(
-
-
+
+
);
@@ -110,9 +110,10 @@ describe('Assistant', () => {
data: connectors,
} as unknown as UseQueryResult);
- const { getByLabelText } = render(
- ({
+ const { getByLabelText } = renderAssistant(
+ {},
+ {
+ getInitialConversations: () => ({
[WELCOME_CONVERSATION_TITLE]: {
id: WELCOME_CONVERSATION_TITLE,
messages: [],
@@ -124,10 +125,8 @@ describe('Assistant', () => {
apiConfig: {},
excludeFromLastConversationStorage: true,
},
- })}
- >
-
-
+ }),
+ }
);
expect(persistToLocalStorage).toHaveBeenCalled();
@@ -176,4 +175,16 @@ describe('Assistant', () => {
expect(persistToLocalStorage).toHaveBeenLastCalledWith(WELCOME_CONVERSATION_TITLE);
});
});
+
+ describe('when not authorized', () => {
+ it('should be disabled', async () => {
+ const { queryByTestId } = renderAssistant(
+ {},
+ {
+ assistantAvailability: { ...mockAssistantAvailability, isAssistantEnabled: false },
+ }
+ );
+ expect(queryByTestId('prompt-textarea')).toHaveProperty('disabled');
+ });
+ });
});
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx
index 4ea1ed240870d..d119526a198c5 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx
@@ -51,7 +51,6 @@ import { ConnectorMissingCallout } from '../connectorland/connector_missing_call
export interface Props {
conversationId?: string;
- isAssistantEnabled: boolean;
promptContextId?: string;
shouldRefocusPrompt?: boolean;
showTitle?: boolean;
@@ -64,7 +63,6 @@ export interface Props {
*/
const AssistantComponent: React.FC = ({
conversationId,
- isAssistantEnabled,
promptContextId = '',
shouldRefocusPrompt = false,
showTitle = true,
@@ -73,6 +71,7 @@ const AssistantComponent: React.FC = ({
const {
assistantTelemetry,
augmentMessageCodeBlocks,
+ assistantAvailability: { isAssistantEnabled },
conversations,
defaultAllow,
defaultAllowReplacement,
diff --git a/x-pack/packages/kbn-elastic-assistant/impl/mock/test_providers/test_providers.tsx b/x-pack/packages/kbn-elastic-assistant/impl/mock/test_providers/test_providers.tsx
index 484dd316cc0ac..057db39f66ba2 100644
--- a/x-pack/packages/kbn-elastic-assistant/impl/mock/test_providers/test_providers.tsx
+++ b/x-pack/packages/kbn-elastic-assistant/impl/mock/test_providers/test_providers.tsx
@@ -29,7 +29,7 @@ window.HTMLElement.prototype.scrollIntoView = jest.fn();
const mockGetInitialConversations = () => ({});
-const mockAssistantAvailability: AssistantAvailability = {
+export const mockAssistantAvailability: AssistantAvailability = {
hasAssistantPrivilege: false,
hasConnectorsAllPrivilege: true,
hasConnectorsReadPrivilege: true,
diff --git a/x-pack/packages/kbn-elastic-assistant/index.ts b/x-pack/packages/kbn-elastic-assistant/index.ts
index 1353db4908006..8ec14b143ba13 100644
--- a/x-pack/packages/kbn-elastic-assistant/index.ts
+++ b/x-pack/packages/kbn-elastic-assistant/index.ts
@@ -11,7 +11,7 @@
// happens in the root of your app. Optionally provide a custom title for the assistant:
/** provides context (from the app) to the assistant, and injects Kibana services, like `http` */
-export { AssistantProvider } from './impl/assistant_context';
+export { AssistantProvider, useAssistantContext } from './impl/assistant_context';
// Step 2: Add the `AssistantOverlay` component to your app. This component displays the assistant
// overlay in a modal, bound to a shortcut key:
diff --git a/x-pack/packages/security-solution/navigation/src/links.tsx b/x-pack/packages/security-solution/navigation/src/links.tsx
index 97434162b9879..172d7361a3420 100644
--- a/x-pack/packages/security-solution/navigation/src/links.tsx
+++ b/x-pack/packages/security-solution/navigation/src/links.tsx
@@ -5,6 +5,7 @@
* 2.0.
*/
+import type { HTMLAttributeAnchorTarget } from 'react';
import React, { type MouseEventHandler, type MouseEvent, useCallback } from 'react';
import { EuiButton, EuiLink, type EuiLinkProps } from '@elastic/eui';
import { useGetAppUrl, useNavigateTo } from './navigation';
@@ -13,6 +14,7 @@ export interface BaseLinkProps {
id: string;
path?: string;
urlState?: string;
+ target?: HTMLAttributeAnchorTarget | undefined;
}
export type GetLinkUrlProps = BaseLinkProps & { absolute?: boolean };
@@ -26,7 +28,16 @@ export type WrappedLinkProps = BaseLinkProps & {
**/
onClick?: MouseEventHandler;
};
-export type GetLinkProps = (params: WrappedLinkProps) => LinkProps;
+export type GetLinkProps = (
+ params: WrappedLinkProps & {
+ /**
+ * Optional `overrideNavigation` boolean prop.
+ * It overrides the default browser navigation action with history navigation using kibana tools.
+ * It is `true` by default.
+ **/
+ overrideNavigation?: boolean;
+ }
+) => LinkProps;
export interface LinkProps {
onClick: MouseEventHandler;
@@ -60,7 +71,7 @@ export const useGetLinkProps = (): GetLinkProps => {
const { navigateTo } = useNavigateTo();
const getLinkProps = useCallback(
- ({ id, path, urlState, onClick: onClickProps }) => {
+ ({ id, path, urlState, onClick: onClickProps, overrideNavigation = true }) => {
const url = getLinkUrl({ id, path, urlState });
return {
href: url,
@@ -71,8 +82,10 @@ export const useGetLinkProps = (): GetLinkProps => {
if (onClickProps) {
onClickProps(ev);
}
- ev.preventDefault();
- navigateTo({ url });
+ if (overrideNavigation) {
+ ev.preventDefault();
+ navigateTo({ url });
+ }
},
};
},
@@ -90,7 +103,13 @@ export const withLink = >(
): React.FC & WrappedLinkProps> =>
React.memo(function WithLink({ id, path, urlState, onClick: _onClick, ...rest }) {
const getLink = useGetLinkProps();
- const { onClick, href } = getLink({ id, path, urlState, onClick: _onClick });
+ const { onClick, href } = getLink({
+ id,
+ path,
+ urlState,
+ onClick: _onClick,
+ ...(rest.target === '_blank' && { overrideNavigation: false }),
+ });
return ;
});
diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json
index 000205bddfebd..360ba08302bf6 100644
--- a/x-pack/plugins/actions/docs/openapi/bundled.json
+++ b/x-pack/plugins/actions/docs/openapi/bundled.json
@@ -123,6 +123,9 @@
}
},
"examples": {
+ "createEmailConnectorRequest": {
+ "$ref": "#/components/examples/create_email_connector_request"
+ },
"createIndexConnectorRequest": {
"$ref": "#/components/examples/create_index_connector_request"
},
@@ -145,6 +148,9 @@
"$ref": "#/components/schemas/connector_response_properties"
},
"examples": {
+ "createEmailConnectorResponse": {
+ "$ref": "#/components/examples/create_email_connector_response"
+ },
"createIndexConnectorResponse": {
"$ref": "#/components/examples/create_index_connector_response"
},
@@ -460,6 +466,9 @@
{
"$ref": "#/components/schemas/update_connector_request_d3security"
},
+ {
+ "$ref": "#/components/schemas/update_connector_request_email"
+ },
{
"$ref": "#/components/schemas/update_connector_request_index"
},
@@ -496,6 +505,9 @@
{
"$ref": "#/components/schemas/update_connector_request_teams"
},
+ {
+ "$ref": "#/components/schemas/update_connector_request_webhook"
+ },
{
"$ref": "#/components/schemas/update_connector_request_xmatters"
}
@@ -1635,14 +1647,78 @@
"config_properties_email": {
"title": "Connector request properties for an email connector",
"description": "Defines properties for connectors when type is `.email`.",
+ "required": [
+ "from"
+ ],
"type": "object",
- "additionalProperties": true
+ "properties": {
+ "clientId": {
+ "description": "The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n",
+ "type": "string",
+ "nullable": true
+ },
+ "from": {
+ "description": "The from address for all emails sent by the connector. It must be specified in `user@host-name` format.\n",
+ "type": "string"
+ },
+ "hasAuth": {
+ "description": "Specifies whether a user and password are required inside the secrets configuration.\n",
+ "default": true,
+ "type": "boolean"
+ },
+ "host": {
+ "description": "The host name of the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. \n",
+ "type": "string"
+ },
+ "oauthTokenUrl": {
+ "type": "string",
+ "nullable": true
+ },
+ "port": {
+ "description": "The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. \n",
+ "type": "integer"
+ },
+ "secure": {
+ "description": "Specifies whether the connection to the service provider will use TLS. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.\n",
+ "type": "boolean"
+ },
+ "service": {
+ "description": "The name of the email service.\n",
+ "type": "string",
+ "enum": [
+ "elastic_cloud",
+ "exchange_server",
+ "gmail",
+ "other",
+ "outlook365",
+ "ses"
+ ]
+ },
+ "tenantId": {
+ "description": "The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n",
+ "type": "string",
+ "nullable": true
+ }
+ }
},
"secrets_properties_email": {
"title": "Connector secrets properties for an email connector",
"description": "Defines secrets for connectors when type is `.email`.",
"type": "object",
- "additionalProperties": true
+ "properties": {
+ "clientSecret": {
+ "type": "string",
+ "description": "The Microsoft Exchange Client secret for OAuth 2.0 client credentials authentication. It must be URL-encoded. If `service` is `exchange_server`, this property is required.\n"
+ },
+ "password": {
+ "type": "string",
+ "description": "The password for HTTP basic authentication. If `hasAuth` is set to `true`, this property is required.\n"
+ },
+ "user": {
+ "type": "string",
+ "description": "The username for HTTP basic authentication. If `hasAuth` is set to `true`, this property is required.\n"
+ }
+ }
},
"create_connector_request_email": {
"title": "Create email connector request",
@@ -3855,6 +3931,26 @@
}
}
},
+ "update_connector_request_email": {
+ "title": "Update email connector request",
+ "type": "object",
+ "required": [
+ "config",
+ "name"
+ ],
+ "properties": {
+ "config": {
+ "$ref": "#/components/schemas/config_properties_email"
+ },
+ "name": {
+ "type": "string",
+ "description": "The display name for the connector."
+ },
+ "secrets": {
+ "$ref": "#/components/schemas/secrets_properties_email"
+ }
+ }
+ },
"update_connector_request_index": {
"title": "Update index connector request",
"type": "object",
@@ -4084,6 +4180,27 @@
}
}
},
+ "update_connector_request_webhook": {
+ "title": "Update Webhook connector request",
+ "type": "object",
+ "required": [
+ "config",
+ "name",
+ "secrets"
+ ],
+ "properties": {
+ "config": {
+ "$ref": "#/components/schemas/config_properties_webhook"
+ },
+ "name": {
+ "type": "string",
+ "description": "The display name for the connector."
+ },
+ "secrets": {
+ "$ref": "#/components/schemas/secrets_properties_webhook"
+ }
+ }
+ },
"update_connector_request_xmatters": {
"title": "Update xMatters connector request",
"type": "object",
@@ -4858,6 +4975,25 @@
}
},
"examples": {
+ "create_email_connector_request": {
+ "summary": "Create an email connector.",
+ "value": {
+ "name": "email-connector-1",
+ "connector_type_id": ".email",
+ "config": {
+ "from": "tester@example.com",
+ "hasAuth": true,
+ "host": "https://example.com",
+ "port": 1025,
+ "secure": false,
+ "service": "other"
+ },
+ "secrets": {
+ "user": "username",
+ "password": "password"
+ }
+ }
+ },
"create_index_connector_request": {
"summary": "Create an index connector.",
"value": {
@@ -4899,6 +5035,29 @@
}
}
},
+ "create_email_connector_response": {
+ "summary": "A new email connector.",
+ "value": {
+ "id": "90a82c60-478f-11ee-a343-f98a117c727f",
+ "connector_type_id": ".email",
+ "name": "email-connector-1",
+ "config": {
+ "from": "tester@example.com",
+ "service": "other",
+ "host": "https://example.com",
+ "port": 1025,
+ "secure": false,
+ "hasAuth": true,
+ "tenantId": null,
+ "clientId": null,
+ "oauthTokenUrl": null
+ },
+ "is_preconfigured": false,
+ "is_deprecated": false,
+ "is_missing_secrets": false,
+ "is_system_action": false
+ }
+ },
"create_index_connector_response": {
"summary": "A new index connector.",
"value": {
diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml
index c2baa9a365adf..bb83bdf65071c 100644
--- a/x-pack/plugins/actions/docs/openapi/bundled.yaml
+++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml
@@ -60,6 +60,8 @@ paths:
discriminator:
propertyName: connector_type_id
examples:
+ createEmailConnectorRequest:
+ $ref: '#/components/examples/create_email_connector_request'
createIndexConnectorRequest:
$ref: '#/components/examples/create_index_connector_request'
createWebhookConnectorRequest:
@@ -74,6 +76,8 @@ paths:
schema:
$ref: '#/components/schemas/connector_response_properties'
examples:
+ createEmailConnectorResponse:
+ $ref: '#/components/examples/create_email_connector_response'
createIndexConnectorResponse:
$ref: '#/components/examples/create_index_connector_response'
createWebhookConnectorResponse:
@@ -246,6 +250,7 @@ paths:
oneOf:
- $ref: '#/components/schemas/update_connector_request_cases_webhook'
- $ref: '#/components/schemas/update_connector_request_d3security'
+ - $ref: '#/components/schemas/update_connector_request_email'
- $ref: '#/components/schemas/update_connector_request_index'
- $ref: '#/components/schemas/update_connector_request_jira'
- $ref: '#/components/schemas/update_connector_request_opsgenie'
@@ -258,6 +263,7 @@ paths:
- $ref: '#/components/schemas/update_connector_request_slack_webhook'
- $ref: '#/components/schemas/update_connector_request_swimlane'
- $ref: '#/components/schemas/update_connector_request_teams'
+ - $ref: '#/components/schemas/update_connector_request_webhook'
- $ref: '#/components/schemas/update_connector_request_xmatters'
examples:
updateIndexConnectorRequest:
@@ -1000,13 +1006,72 @@ components:
config_properties_email:
title: Connector request properties for an email connector
description: Defines properties for connectors when type is `.email`.
+ required:
+ - from
type: object
- additionalProperties: true
+ properties:
+ clientId:
+ description: |
+ The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.
+ type: string
+ nullable: true
+ from:
+ description: |
+ The from address for all emails sent by the connector. It must be specified in `user@host-name` format.
+ type: string
+ hasAuth:
+ description: |
+ Specifies whether a user and password are required inside the secrets configuration.
+ default: true
+ type: boolean
+ host:
+ description: |
+ The host name of the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined.
+ type: string
+ oauthTokenUrl:
+ type: string
+ nullable: true
+ port:
+ description: |
+ The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined.
+ type: integer
+ secure:
+ description: |
+ Specifies whether the connection to the service provider will use TLS. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.
+ type: boolean
+ service:
+ description: |
+ The name of the email service.
+ type: string
+ enum:
+ - elastic_cloud
+ - exchange_server
+ - gmail
+ - other
+ - outlook365
+ - ses
+ tenantId:
+ description: |
+ The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.
+ type: string
+ nullable: true
secrets_properties_email:
title: Connector secrets properties for an email connector
description: Defines secrets for connectors when type is `.email`.
type: object
- additionalProperties: true
+ properties:
+ clientSecret:
+ type: string
+ description: |
+ The Microsoft Exchange Client secret for OAuth 2.0 client credentials authentication. It must be URL-encoded. If `service` is `exchange_server`, this property is required.
+ password:
+ type: string
+ description: |
+ The password for HTTP basic authentication. If `hasAuth` is set to `true`, this property is required.
+ user:
+ type: string
+ description: |
+ The username for HTTP basic authentication. If `hasAuth` is set to `true`, this property is required.
create_connector_request_email:
title: Create email connector request
description: |
@@ -2655,6 +2720,20 @@ components:
description: The display name for the connector.
secrets:
$ref: '#/components/schemas/secrets_properties_d3security'
+ update_connector_request_email:
+ title: Update email connector request
+ type: object
+ required:
+ - config
+ - name
+ properties:
+ config:
+ $ref: '#/components/schemas/config_properties_email'
+ name:
+ type: string
+ description: The display name for the connector.
+ secrets:
+ $ref: '#/components/schemas/secrets_properties_email'
update_connector_request_index:
title: Update index connector request
type: object
@@ -2818,6 +2897,21 @@ components:
description: The display name for the connector.
secrets:
$ref: '#/components/schemas/secrets_properties_teams'
+ update_connector_request_webhook:
+ title: Update Webhook connector request
+ type: object
+ required:
+ - config
+ - name
+ - secrets
+ properties:
+ config:
+ $ref: '#/components/schemas/config_properties_webhook'
+ name:
+ type: string
+ description: The display name for the connector.
+ secrets:
+ $ref: '#/components/schemas/secrets_properties_webhook'
update_connector_request_xmatters:
title: Update xMatters connector request
type: object
@@ -3380,6 +3474,21 @@ components:
name:
type: string
examples:
+ create_email_connector_request:
+ summary: Create an email connector.
+ value:
+ name: email-connector-1
+ connector_type_id: .email
+ config:
+ from: tester@example.com
+ hasAuth: true
+ host: https://example.com
+ port: 1025
+ secure: false
+ service: other
+ secrets:
+ user: username
+ password: password
create_index_connector_request:
summary: Create an index connector.
value:
@@ -3410,6 +3519,26 @@ components:
usesBasic: false
secrets:
secretsUrl: https://example.com?apiKey=xxxxx
+ create_email_connector_response:
+ summary: A new email connector.
+ value:
+ id: 90a82c60-478f-11ee-a343-f98a117c727f
+ connector_type_id: .email
+ name: email-connector-1
+ config:
+ from: tester@example.com
+ service: other
+ host: https://example.com
+ port: 1025
+ secure: false
+ hasAuth: true
+ tenantId: null
+ clientId: null
+ oauthTokenUrl: null
+ is_preconfigured: false
+ is_deprecated: false
+ is_missing_secrets: false
+ is_system_action: false
create_index_connector_response:
summary: A new index connector.
value:
diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_request.yaml
new file mode 100644
index 0000000000000..df37ace78fb4b
--- /dev/null
+++ b/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_request.yaml
@@ -0,0 +1,14 @@
+summary: Create an email connector.
+value:
+ name: email-connector-1
+ connector_type_id: .email
+ config:
+ from: tester@example.com
+ hasAuth: true
+ host: https://example.com
+ port: 1025
+ secure: false
+ service: other
+ secrets:
+ user: username
+ password: password
\ No newline at end of file
diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_response.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_response.yaml
new file mode 100644
index 0000000000000..b8405a1d61123
--- /dev/null
+++ b/x-pack/plugins/actions/docs/openapi/components/examples/create_email_connector_response.yaml
@@ -0,0 +1,19 @@
+summary: A new email connector.
+value:
+ id: 90a82c60-478f-11ee-a343-f98a117c727f
+ connector_type_id: .email
+ name: email-connector-1
+ config:
+ from: tester@example.com
+ service: other
+ host: https://example.com
+ port: 1025
+ secure: false
+ hasAuth: true
+ tenantId: null
+ clientId: null
+ oauthTokenUrl: null
+ is_preconfigured: false
+ is_deprecated: false
+ is_missing_secrets: false
+ is_system_action: false
\ No newline at end of file
diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml
index d87c36be08936..6d3618e2bba27 100644
--- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml
+++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml
@@ -1,5 +1,59 @@
title: Connector request properties for an email connector
description: Defines properties for connectors when type is `.email`.
+required:
+ - from
type: object
-additionalProperties: true
-# TO-DO: Add the properties for this connector.
\ No newline at end of file
+properties:
+ clientId:
+ description: >
+ The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format.
+ If `service` is `exchange_server`, this property is required.
+ type: string
+ nullable: true
+ from:
+ description: >
+ The from address for all emails sent by the connector. It must be specified in `user@host-name` format.
+ type: string
+ hasAuth:
+ description: >
+ Specifies whether a user and password are required inside the secrets configuration.
+ default: true
+ type: boolean
+ host:
+ description: >
+ The host name of the service provider.
+ If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.
+ If `service` is `other`, this property must be defined.
+ type: string
+ oauthTokenUrl:
+ # description: TBD
+ type: string
+ nullable: true
+ port:
+ description: >
+ The port to connect to on the service provider.
+ If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.
+ If `service` is `other`, this property must be defined.
+ type: integer
+ secure:
+ description: >
+ Specifies whether the connection to the service provider will use TLS.
+ If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored.
+ type: boolean
+ service:
+ description: >
+ The name of the email service.
+ type: string
+ enum:
+ - elastic_cloud
+ - exchange_server
+ - gmail
+ - other
+ - outlook365
+ - ses
+ tenantId:
+ description: >
+ The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format.
+ If `service` is `exchange_server`, this property is required.
+ type: string
+ nullable: true
\ No newline at end of file
diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_email.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_email.yaml
index 04a3526b72ce3..dbfca0230c79a 100644
--- a/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_email.yaml
+++ b/x-pack/plugins/actions/docs/openapi/components/schemas/secrets_properties_email.yaml
@@ -1,5 +1,20 @@
title: Connector secrets properties for an email connector
description: Defines secrets for connectors when type is `.email`.
type: object
-additionalProperties: true
-# TO-DO: Add the properties for this connector.
\ No newline at end of file
+properties:
+ clientSecret:
+ type: string
+ description: >
+ The Microsoft Exchange Client secret for OAuth 2.0 client credentials authentication.
+ It must be URL-encoded.
+ If `service` is `exchange_server`, this property is required.
+ password:
+ type: string
+ description: >
+ The password for HTTP basic authentication.
+ If `hasAuth` is set to `true`, this property is required.
+ user:
+ type: string
+ description: >
+ The username for HTTP basic authentication.
+ If `hasAuth` is set to `true`, this property is required.
\ No newline at end of file
diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml
index 052852471d865..f32def50706b2 100644
--- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml
+++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector.yaml
@@ -39,6 +39,8 @@ post:
discriminator:
propertyName: connector_type_id
examples:
+ createEmailConnectorRequest:
+ $ref: '../components/examples/create_email_connector_request.yaml'
createIndexConnectorRequest:
$ref: '../components/examples/create_index_connector_request.yaml'
createWebhookConnectorRequest:
@@ -53,6 +55,8 @@ post:
schema:
$ref: '../components/schemas/connector_response_properties.yaml'
examples:
+ createEmailConnectorResponse:
+ $ref: '../components/examples/create_email_connector_response.yaml'
createIndexConnectorResponse:
$ref: '../components/examples/create_index_connector_response.yaml'
createWebhookConnectorResponse:
diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml
index 96ddfa168a270..54b164cf48d14 100644
--- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml
+++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml
@@ -161,7 +161,7 @@ put:
oneOf:
- $ref: '../components/schemas/update_connector_request_cases_webhook.yaml'
- $ref: '../components/schemas/update_connector_request_d3security.yaml'
-# - $ref: '../components/schemas/update_connector_request_email.yaml'
+ - $ref: '../components/schemas/update_connector_request_email.yaml'
# - $ref: '../components/schemas/create_connector_request_genai.yaml'
- $ref: '../components/schemas/update_connector_request_index.yaml'
- $ref: '../components/schemas/update_connector_request_jira.yaml'
@@ -176,7 +176,7 @@ put:
- $ref: '../components/schemas/update_connector_request_swimlane.yaml'
- $ref: '../components/schemas/update_connector_request_teams.yaml'
# - $ref: '../components/schemas/update_connector_request_tines.yaml'
-# - $ref: '../components/schemas/update_connector_request_webhook.yaml'
+ - $ref: '../components/schemas/update_connector_request_webhook.yaml'
- $ref: '../components/schemas/update_connector_request_xmatters.yaml'
examples:
updateIndexConnectorRequest:
diff --git a/x-pack/plugins/alerting/common/index.ts b/x-pack/plugins/alerting/common/index.ts
index 05b9e84ee2b7a..e2e9e477cc4cc 100644
--- a/x-pack/plugins/alerting/common/index.ts
+++ b/x-pack/plugins/alerting/common/index.ts
@@ -34,7 +34,6 @@ export * from './parse_duration';
export * from './execution_log_types';
export * from './rule_snooze_type';
export * from './rrule_type';
-export * from './default_rule_aggregation';
export * from './rule_tags_aggregation';
export * from './iso_weekdays';
export * from './saved_objects/rules/mappings';
diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/index.ts b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/index.ts
new file mode 100644
index 0000000000000..0bbdbc0ea4069
--- /dev/null
+++ b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/index.ts
@@ -0,0 +1,21 @@
+/*
+ * 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 {
+ aggregateRulesRequestBodySchema,
+ aggregateRulesResponseBodySchema,
+} from './schemas/latest';
+export type { AggregateRulesRequestBody, AggregateRulesResponseBody } from './types/latest';
+
+export {
+ aggregateRulesRequestBodySchema as aggregateRulesRequestBodySchemaV1,
+ aggregateRulesResponseBodySchema as aggregateRulesResponseBodySchemaV1,
+} from './schemas/v1';
+export type {
+ AggregateRulesRequestBody as AggregateRulesRequestBodyV1,
+ AggregateRulesResponseBody as AggregateRulesResponseBodyV1,
+ AggregateRulesResponse as AggregateRulesResponseV1,
+} from './types/v1';
diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/latest.ts
new file mode 100644
index 0000000000000..25300c97a6d2e
--- /dev/null
+++ b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/latest.ts
@@ -0,0 +1,8 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+export * from './v1';
diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/v1.ts
new file mode 100644
index 0000000000000..d49ccb090d53d
--- /dev/null
+++ b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/schemas/v1.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 { schema } from '@kbn/config-schema';
+
+export const aggregateRulesRequestBodySchema = schema.object({
+ search: schema.maybe(schema.string()),
+ default_search_operator: schema.oneOf([schema.literal('OR'), schema.literal('AND')], {
+ defaultValue: 'OR',
+ }),
+ search_fields: schema.maybe(schema.arrayOf(schema.string())),
+ has_reference: schema.maybe(
+ // use nullable as maybe is currently broken
+ // in config-schema
+ schema.nullable(
+ schema.object({
+ type: schema.string(),
+ id: schema.string(),
+ })
+ )
+ ),
+ filter: schema.maybe(schema.string()),
+});
+
+export const aggregateRulesResponseBodySchema = schema.object({
+ rule_execution_status: schema.recordOf(schema.string(), schema.number()),
+ rule_last_run_outcome: schema.recordOf(schema.string(), schema.number()),
+ rule_enabled_status: schema.object({
+ enabled: schema.number(),
+ disabled: schema.number(),
+ }),
+ rule_muted_status: schema.object({
+ muted: schema.number(),
+ unmuted: schema.number(),
+ }),
+ rule_snoozed_status: schema.object({
+ snoozed: schema.number(),
+ }),
+ rule_tags: schema.arrayOf(schema.string()),
+});
diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/latest.ts
new file mode 100644
index 0000000000000..25300c97a6d2e
--- /dev/null
+++ b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/latest.ts
@@ -0,0 +1,8 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+export * from './v1';
diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/v1.ts
new file mode 100644
index 0000000000000..2dc21a72b3783
--- /dev/null
+++ b/x-pack/plugins/alerting/common/routes/rule/apis/aggregate/types/v1.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import type { TypeOf } from '@kbn/config-schema';
+import { aggregateRulesRequestBodySchemaV1, aggregateRulesResponseBodySchemaV1 } from '..';
+
+export type AggregateRulesRequestBody = TypeOf;
+export type AggregateRulesResponseBody = TypeOf;
+
+export interface AggregateRulesResponse {
+ body: AggregateRulesResponseBody;
+}
diff --git a/x-pack/plugins/alerting/common/rule.ts b/x-pack/plugins/alerting/common/rule.ts
index 22692a091a38c..5a8e1b275ef7e 100644
--- a/x-pack/plugins/alerting/common/rule.ts
+++ b/x-pack/plugins/alerting/common/rule.ts
@@ -10,7 +10,7 @@ import type {
SavedObjectAttributes,
SavedObjectsResolveResponse,
} from '@kbn/core/server';
-import type { Filter, KueryNode } from '@kbn/es-query';
+import type { Filter } from '@kbn/es-query';
import { IsoWeekday } from './iso_weekdays';
import { RuleNotifyWhenType } from './rule_notify_when_type';
import { RuleSnooze } from './rule_snooze_type';
@@ -118,28 +118,6 @@ export interface RuleAction {
alertsFilter?: AlertsFilter;
}
-export interface AggregateOptions {
- search?: string;
- defaultSearchOperator?: 'AND' | 'OR';
- searchFields?: string[];
- hasReference?: {
- type: string;
- id: string;
- };
- filter?: string | KueryNode;
- page?: number;
- perPage?: number;
-}
-
-export interface RuleAggregationFormattedResult {
- ruleExecutionStatus: { [status: string]: number };
- ruleLastRunOutcome: { [status: string]: number };
- ruleEnabledStatus: { enabled: number; disabled: number };
- ruleMutedStatus: { muted: number; unmuted: number };
- ruleSnoozedStatus: { snoozed: number };
- ruleTags: string[];
-}
-
export interface RuleLastRun {
outcome: RuleLastRunOutcomes;
outcomeOrder?: number;
diff --git a/x-pack/plugins/alerting/common/rule_tags_aggregation.ts b/x-pack/plugins/alerting/common/rule_tags_aggregation.ts
index d7b8fc4089c27..04cf6676059d8 100644
--- a/x-pack/plugins/alerting/common/rule_tags_aggregation.ts
+++ b/x-pack/plugins/alerting/common/rule_tags_aggregation.ts
@@ -10,7 +10,7 @@ import type {
AggregationsCompositeAggregation,
AggregationsAggregateOrder,
} from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-import type { AggregateOptions } from './rule';
+import type { AggregateOptions } from '../server/application/rule/methods/aggregate/types';
export type RuleTagsAggregationOptions = Pick & {
after?: AggregationsCompositeAggregation['after'];
diff --git a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts
similarity index 91%
rename from x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts
rename to x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts
index 64f7325092691..b8fbc0427b7f4 100644
--- a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts
@@ -5,45 +5,43 @@
* 2.0.
*/
-import { RulesClient, ConstructorOptions } from '../rules_client';
+import { RulesClient, ConstructorOptions } from '../../../../rules_client';
import {
savedObjectsClientMock,
loggingSystemMock,
savedObjectsRepositoryMock,
} from '@kbn/core/server/mocks';
import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks';
-import { ruleTypeRegistryMock } from '../../rule_type_registry.mock';
-import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock';
+import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock';
+import { alertingAuthorizationMock } from '../../../../authorization/alerting_authorization.mock';
import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks';
import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks';
-import { AlertingAuthorization } from '../../authorization/alerting_authorization';
+import { AlertingAuthorization } from '../../../../authorization/alerting_authorization';
import { ActionsAuthorization } from '@kbn/actions-plugin/server';
import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks';
-import { getBeforeSetup, setGlobalDate } from './lib';
-import {
- RecoveredActionGroup,
- getDefaultRuleAggregation,
- DefaultRuleAggregationResult,
-} from '../../../common';
-import { RegistryRuleType } from '../../rule_type_registry';
+import { getBeforeSetup, setGlobalDate } from '../../../../rules_client/tests/lib';
+
+import { RegistryRuleType } from '../../../../rule_type_registry';
import { fromKueryExpression, nodeTypes } from '@kbn/es-query';
+import { RecoveredActionGroup } from '../../../../../common';
+import { DefaultRuleAggregationResult } from '../../../../routes/rule/apis/aggregate/types';
+import { defaultRuleAggregationFactory } from '.';
const taskManager = taskManagerMock.createStart();
const ruleTypeRegistry = ruleTypeRegistryMock.create();
const unsecuredSavedObjectsClient = savedObjectsClientMock.create();
+const internalSavedObjectsRepository = savedObjectsRepositoryMock.create();
const encryptedSavedObjects = encryptedSavedObjectsMock.createClient();
const authorization = alertingAuthorizationMock.create();
const actionsAuthorization = actionsAuthorizationMock.create();
const auditLogger = auditLoggerMock.create();
-const internalSavedObjectsRepository = savedObjectsRepositoryMock.create();
const kibanaVersion = 'v7.10.0';
const rulesClientParams: jest.Mocked = {
taskManager,
ruleTypeRegistry,
unsecuredSavedObjectsClient,
- maxScheduledPerMinute: 10000,
minimumScheduleInterval: { value: '1m', enforce: false },
authorization: authorization as unknown as AlertingAuthorization,
actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization,
@@ -52,13 +50,14 @@ const rulesClientParams: jest.Mocked = {
getUserName: jest.fn(),
createAPIKey: jest.fn(),
logger: loggingSystemMock.create().get(),
- internalSavedObjectsRepository,
encryptedSavedObjectsClient: encryptedSavedObjects,
getActionsClient: jest.fn(),
getEventLogClient: jest.fn(),
kibanaVersion,
isAuthenticationTypeAPIKey: jest.fn(),
getAuthenticationAPIKey: jest.fn(),
+ maxScheduledPerMinute: 1000,
+ internalSavedObjectsRepository,
};
beforeEach(() => {
@@ -176,7 +175,7 @@ describe('aggregate()', () => {
const rulesClient = new RulesClient(rulesClientParams);
const result = await rulesClient.aggregate({
options: {},
- aggs: getDefaultRuleAggregation(),
+ aggs: defaultRuleAggregationFactory(),
});
expect(result).toMatchInlineSnapshot(`
@@ -332,7 +331,7 @@ describe('aggregate()', () => {
const rulesClient = new RulesClient(rulesClientParams);
await rulesClient.aggregate({
options: { filter: 'foo: someTerm' },
- aggs: getDefaultRuleAggregation(),
+ aggs: defaultRuleAggregationFactory(),
});
expect(unsecuredSavedObjectsClient.find).toHaveBeenCalledTimes(1);
@@ -385,7 +384,9 @@ describe('aggregate()', () => {
const rulesClient = new RulesClient({ ...rulesClientParams, auditLogger });
authorization.getFindAuthorizationFilter.mockRejectedValue(new Error('Unauthorized'));
- await expect(rulesClient.aggregate({ aggs: getDefaultRuleAggregation() })).rejects.toThrow();
+ await expect(
+ rulesClient.aggregate({ aggs: defaultRuleAggregationFactory() })
+ ).rejects.toThrow();
expect(auditLogger.log).toHaveBeenCalledWith(
expect.objectContaining({
event: expect.objectContaining({
@@ -404,7 +405,7 @@ describe('aggregate()', () => {
test('sets to default (50) if it is not provided', async () => {
const rulesClient = new RulesClient(rulesClientParams);
- await rulesClient.aggregate({ aggs: getDefaultRuleAggregation() });
+ await rulesClient.aggregate({ aggs: defaultRuleAggregationFactory() });
expect(unsecuredSavedObjectsClient.find.mock.calls[0]).toMatchObject([
{
@@ -421,7 +422,7 @@ describe('aggregate()', () => {
const rulesClient = new RulesClient(rulesClientParams);
await rulesClient.aggregate({
- aggs: getDefaultRuleAggregation({ maxTags: 1000 }),
+ aggs: defaultRuleAggregationFactory({ maxTags: 1000 }),
});
expect(unsecuredSavedObjectsClient.find.mock.calls[0]).toMatchObject([
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.ts
new file mode 100644
index 0000000000000..f992f5cead705
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.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; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { KueryNode, nodeBuilder } from '@kbn/es-query';
+import { findRulesSo } from '../../../../data/rule';
+import { AlertingAuthorizationEntity } from '../../../../authorization';
+import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events';
+import { buildKueryNodeFilter } from '../../../../rules_client/common';
+import { alertingAuthorizationFilterOpts } from '../../../../rules_client/common/constants';
+import { RulesClientContext } from '../../../../rules_client/types';
+import { aggregateOptionsSchema } from './schemas';
+import type { AggregateParams } from './types';
+import { validateRuleAggregationFields } from './validation';
+
+export async function aggregateRules>(
+ context: RulesClientContext,
+ params: AggregateParams
+): Promise {
+ const { options = {}, aggs } = params;
+ const { filter, page = 1, perPage = 0, ...restOptions } = options;
+
+ let authorizationTuple;
+ try {
+ authorizationTuple = await context.authorization.getFindAuthorizationFilter(
+ AlertingAuthorizationEntity.Rule,
+ alertingAuthorizationFilterOpts
+ );
+ validateRuleAggregationFields(aggs);
+ aggregateOptionsSchema.validate(options);
+ } catch (error) {
+ context.auditLogger?.log(
+ ruleAuditEvent({
+ action: RuleAuditAction.AGGREGATE,
+ error,
+ })
+ );
+ throw error;
+ }
+
+ const { filter: authorizationFilter } = authorizationTuple;
+ const filterKueryNode = buildKueryNodeFilter(filter);
+
+ const { aggregations } = await findRulesSo({
+ savedObjectsClient: context.unsecuredSavedObjectsClient,
+ savedObjectsFindOptions: {
+ ...restOptions,
+ filter:
+ authorizationFilter && filterKueryNode
+ ? nodeBuilder.and([filterKueryNode, authorizationFilter as KueryNode])
+ : authorizationFilter,
+ page,
+ perPage,
+ aggs,
+ },
+ });
+
+ return aggregations!;
+}
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/latest.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/latest.ts
new file mode 100644
index 0000000000000..210b2ee194850
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/latest.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 { defaultRuleAggregationFactory } from './v1';
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.test.ts
new file mode 100644
index 0000000000000..2accb33511681
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.test.ts
@@ -0,0 +1,24 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { defaultRuleAggregationFactory } from './v1';
+
+describe('getDefaultRuleAggregation', () => {
+ it('should return aggregation with default maxTags', () => {
+ const result = defaultRuleAggregationFactory();
+ expect(result.tags).toEqual({
+ terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: 50 },
+ });
+ });
+
+ it('should return aggregation with custom maxTags', () => {
+ const result = defaultRuleAggregationFactory({ maxTags: 100 });
+ expect(result.tags).toEqual({
+ terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: 100 },
+ });
+ });
+});
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.ts
new file mode 100644
index 0000000000000..371c12c1fada3
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/factories/default_rule_aggregation_factory/v1.ts
@@ -0,0 +1,46 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { AggregationsAggregationContainer } from '@elastic/elasticsearch/lib/api/types';
+import { DefaultRuleAggregationParams } from '../../types';
+
+export const defaultRuleAggregationFactory = (
+ params?: DefaultRuleAggregationParams
+): Record => {
+ const { maxTags = 50 } = params || {};
+ return {
+ status: {
+ terms: { field: 'alert.attributes.executionStatus.status' },
+ },
+ outcome: {
+ terms: { field: 'alert.attributes.lastRun.outcome' },
+ },
+ enabled: {
+ terms: { field: 'alert.attributes.enabled' },
+ },
+ muted: {
+ terms: { field: 'alert.attributes.muteAll' },
+ },
+ tags: {
+ terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: maxTags },
+ },
+ snoozed: {
+ nested: {
+ path: 'alert.attributes.snoozeSchedule',
+ },
+ aggs: {
+ count: {
+ filter: {
+ exists: {
+ field: 'alert.attributes.snoozeSchedule.duration',
+ },
+ },
+ },
+ },
+ },
+ };
+};
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/index.ts
new file mode 100644
index 0000000000000..ccb5ca61daf9a
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+export { defaultRuleAggregationFactory } from './factories/default_rule_aggregation_factory/latest';
+export { defaultRuleAggregationFactory as defaultRuleAggregationFactoryV1 } from './factories/default_rule_aggregation_factory/v1';
+// export { aggregateOptionsSchema } from './schemas';
+// export type { AggregateOptions, AggregateParams, DefaultRuleAggregationParams } from './types';
+
+export { aggregateRules } from './aggregate_rules';
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/aggregate_options_schema.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/aggregate_options_schema.ts
new file mode 100644
index 0000000000000..3ac244b808752
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/aggregate_options_schema.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 { schema } from '@kbn/config-schema';
+
+export const aggregateOptionsSchema = schema.object({
+ search: schema.maybe(schema.string()),
+ defaultSearchOperator: schema.maybe(schema.oneOf([schema.literal('AND'), schema.literal('OR')])),
+ searchFields: schema.maybe(schema.arrayOf(schema.string())),
+ hasReference: schema.maybe(
+ schema.object({
+ type: schema.string(),
+ id: schema.string(),
+ })
+ ),
+ // filter type is `string | KueryNode`, but `KueryNode` has no schema to import yet
+ filter: schema.maybe(
+ schema.oneOf([schema.string(), schema.recordOf(schema.string(), schema.any())])
+ ),
+ page: schema.maybe(schema.number()),
+ perPage: schema.maybe(schema.number()),
+});
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/index.ts
new file mode 100644
index 0000000000000..c29f688596ef4
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/schemas/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 { aggregateOptionsSchema } from './aggregate_options_schema';
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/types/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/types/index.ts
new file mode 100644
index 0000000000000..3733a49003bba
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/types/index.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 { AggregationsAggregationContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
+import { TypeOf } from '@kbn/config-schema';
+import { KueryNode } from '@kbn/es-query';
+import { aggregateOptionsSchema } from '../schemas';
+
+type AggregateOptionsSchemaTypes = TypeOf;
+export type AggregateOptions = TypeOf & {
+ search?: AggregateOptionsSchemaTypes['search'];
+ defaultSearchOperator?: AggregateOptionsSchemaTypes['defaultSearchOperator'];
+ searchFields?: AggregateOptionsSchemaTypes['searchFields'];
+ hasReference?: AggregateOptionsSchemaTypes['hasReference'];
+ // Adding filter as in schema it's defined as any instead of KueryNode
+ filter?: string | KueryNode;
+ page?: AggregateOptionsSchemaTypes['page'];
+ perPage?: AggregateOptionsSchemaTypes['perPage'];
+};
+
+export interface AggregateParams {
+ options?: AggregateOptions;
+ aggs: Record;
+}
+
+export interface DefaultRuleAggregationParams {
+ maxTags?: number;
+}
+
+export interface RuleAggregationFormattedResult {
+ ruleExecutionStatus: Record;
+ ruleLastRunOutcome: Record;
+ ruleEnabledStatus: {
+ enabled: number;
+ disabled: number;
+ };
+ ruleMutedStatus: {
+ muted: number;
+ unmuted: number;
+ };
+ ruleSnoozedStatus: {
+ snoozed: number;
+ };
+ ruleTags: string[];
+}
diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/index.ts
new file mode 100644
index 0000000000000..bce1dab4756fe
--- /dev/null
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/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 { validateRuleAggregationFields } from './validate_rule_aggregation_fields';
diff --git a/x-pack/plugins/alerting/server/rules_client/lib/validate_rule_aggregation_fields.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/validate_rule_aggregation_fields.test.ts
similarity index 97%
rename from x-pack/plugins/alerting/server/rules_client/lib/validate_rule_aggregation_fields.test.ts
rename to x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/validate_rule_aggregation_fields.test.ts
index 599938de4b1fc..8bb6e75b88f72 100644
--- a/x-pack/plugins/alerting/server/rules_client/lib/validate_rule_aggregation_fields.test.ts
+++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/validate_rule_aggregation_fields.test.ts
@@ -5,8 +5,10 @@
* 2.0.
*/
-import { getRuleTagsAggregation, getDefaultRuleAggregation } from '../../../common';
import type { AggregationsAggregateOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
+import { getRuleTagsAggregation } from '../../../../../../common';
+import { defaultRuleAggregationFactory } from '..';
+
import { validateRuleAggregationFields } from './validate_rule_aggregation_fields';
describe('validateAggregationTerms', () => {
@@ -95,7 +97,7 @@ describe('validateAggregationTerms', () => {
});
it('should allow for default and tags aggregations', () => {
- expect(() => validateRuleAggregationFields(getDefaultRuleAggregation())).not.toThrowError();
+ expect(() => validateRuleAggregationFields(defaultRuleAggregationFactory())).not.toThrowError();
expect(() => validateRuleAggregationFields(getRuleTagsAggregation())).not.toThrowError();
});
diff --git a/x-pack/plugins/alerting/server/rules_client/lib/validate_rule_aggregation_fields.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/validate_rule_aggregation_fields.ts
similarity index 100%
rename from x-pack/plugins/alerting/server/rules_client/lib/validate_rule_aggregation_fields.ts
rename to x-pack/plugins/alerting/server/application/rule/methods/aggregate/validation/validate_rule_aggregation_fields.ts
diff --git a/x-pack/plugins/alerting/server/routes/aggregate_rules.ts b/x-pack/plugins/alerting/server/routes/aggregate_rules.ts
deleted file mode 100644
index ea3bb22bd0d17..0000000000000
--- a/x-pack/plugins/alerting/server/routes/aggregate_rules.ts
+++ /dev/null
@@ -1,133 +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 { IRouter } from '@kbn/core/server';
-import { schema } from '@kbn/config-schema';
-import { UsageCounter } from '@kbn/usage-collection-plugin/server';
-import {
- AggregateOptions,
- DefaultRuleAggregationResult,
- formatDefaultAggregationResult,
- getDefaultRuleAggregation,
- RuleAggregationFormattedResult,
-} from '../../common';
-import { ILicenseState } from '../lib';
-import { RewriteResponseCase, RewriteRequestCase, verifyAccessAndContext } from './lib';
-import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../types';
-import { trackLegacyTerminology } from './lib/track_legacy_terminology';
-
-// config definition
-const querySchema = schema.object({
- search: schema.maybe(schema.string()),
- default_search_operator: schema.oneOf([schema.literal('OR'), schema.literal('AND')], {
- defaultValue: 'OR',
- }),
- search_fields: schema.maybe(schema.arrayOf(schema.string())),
- has_reference: schema.maybe(
- // use nullable as maybe is currently broken
- // in config-schema
- schema.nullable(
- schema.object({
- type: schema.string(),
- id: schema.string(),
- })
- )
- ),
- filter: schema.maybe(schema.string()),
-});
-
-const rewriteQueryReq: RewriteRequestCase = ({
- default_search_operator: defaultSearchOperator,
- has_reference: hasReference,
- search_fields: searchFields,
- ...rest
-}) => ({
- ...rest,
- defaultSearchOperator,
- ...(hasReference ? { hasReference } : {}),
- ...(searchFields ? { searchFields } : {}),
-});
-const rewriteBodyRes: RewriteResponseCase = ({
- ruleExecutionStatus,
- ruleLastRunOutcome,
- ruleEnabledStatus,
- ruleMutedStatus,
- ruleSnoozedStatus,
- ruleTags,
- ...rest
-}) => ({
- ...rest,
- rule_execution_status: ruleExecutionStatus,
- rule_last_run_outcome: ruleLastRunOutcome,
- rule_enabled_status: ruleEnabledStatus,
- rule_muted_status: ruleMutedStatus,
- rule_snoozed_status: ruleSnoozedStatus,
- rule_tags: ruleTags,
-});
-
-export const aggregateRulesRoute = (
- router: IRouter,
- licenseState: ILicenseState,
- usageCounter?: UsageCounter
-) => {
- router.get(
- {
- path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`,
- validate: {
- query: querySchema,
- },
- },
- router.handleLegacyErrors(
- verifyAccessAndContext(licenseState, async function (context, req, res) {
- const rulesClient = (await context.alerting).getRulesClient();
- const options = rewriteQueryReq({
- ...req.query,
- has_reference: req.query.has_reference || undefined,
- });
- trackLegacyTerminology(
- [req.query.search, req.query.search_fields].filter(Boolean) as string[],
- usageCounter
- );
- const aggregateResult = await rulesClient.aggregate({
- aggs: getDefaultRuleAggregation(),
- options,
- });
- return res.ok({
- body: rewriteBodyRes(formatDefaultAggregationResult(aggregateResult)),
- });
- })
- )
- );
- router.post(
- {
- path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`,
- validate: {
- body: querySchema,
- },
- },
- router.handleLegacyErrors(
- verifyAccessAndContext(licenseState, async function (context, req, res) {
- const rulesClient = (await context.alerting).getRulesClient();
- const options = rewriteQueryReq({
- ...req.body,
- has_reference: req.body.has_reference || undefined,
- });
- trackLegacyTerminology(
- [req.body.search, req.body.search_fields].filter(Boolean) as string[],
- usageCounter
- );
- const aggregateResult = await rulesClient.aggregate({
- aggs: getDefaultRuleAggregation(),
- options,
- });
- return res.ok({
- body: rewriteBodyRes(formatDefaultAggregationResult(aggregateResult)),
- });
- })
- )
- );
-};
diff --git a/x-pack/plugins/alerting/server/routes/index.ts b/x-pack/plugins/alerting/server/routes/index.ts
index bdc9dcee21895..1bffc87e7b60a 100644
--- a/x-pack/plugins/alerting/server/routes/index.ts
+++ b/x-pack/plugins/alerting/server/routes/index.ts
@@ -17,7 +17,7 @@ import { createRuleRoute } from './rule/apis/create';
import { getRuleRoute, getInternalRuleRoute } from './get_rule';
import { updateRuleRoute } from './update_rule';
import { deleteRuleRoute } from './delete_rule';
-import { aggregateRulesRoute } from './aggregate_rules';
+import { aggregateRulesRoute } from './rule/apis/aggregate/aggregate_rules_route';
import { disableRuleRoute } from './disable_rule';
import { enableRuleRoute } from './enable_rule';
import { findRulesRoute, findInternalRulesRoute } from './find_rules';
diff --git a/x-pack/plugins/alerting/server/routes/legacy/aggregate.test.ts b/x-pack/plugins/alerting/server/routes/legacy/aggregate.test.ts
deleted file mode 100644
index 9ba0bbd86da3f..0000000000000
--- a/x-pack/plugins/alerting/server/routes/legacy/aggregate.test.ts
+++ /dev/null
@@ -1,301 +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 { aggregateAlertRoute } from './aggregate';
-import { httpServiceMock } from '@kbn/core/server/mocks';
-import { licenseStateMock } from '../../lib/license_state.mock';
-import { verifyApiAccess } from '../../lib/license_api_access';
-import { mockHandlerArguments } from '../_mock_handler_arguments';
-import { rulesClientMock } from '../../rules_client.mock';
-import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage';
-import { trackLegacyTerminology } from '../lib/track_legacy_terminology';
-import { usageCountersServiceMock } from '@kbn/usage-collection-plugin/server/usage_counters/usage_counters_service.mock';
-
-const rulesClient = rulesClientMock.create();
-const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract();
-const mockUsageCounter = mockUsageCountersSetup.createUsageCounter('test');
-
-jest.mock('../../lib/track_legacy_route_usage', () => ({
- trackLegacyRouteUsage: jest.fn(),
-}));
-
-jest.mock('../../lib/license_api_access', () => ({
- verifyApiAccess: jest.fn(),
-}));
-
-jest.mock('../lib/track_legacy_terminology', () => ({
- trackLegacyTerminology: jest.fn(),
-}));
-
-jest.mock('../../../common', () => ({
- ...jest.requireActual('../../../common'),
- formatDefaultAggregationResult: jest.fn(),
-}));
-
-const { formatDefaultAggregationResult } = jest.requireMock('../../../common');
-
-beforeEach(() => {
- jest.resetAllMocks();
-});
-
-describe('aggregateAlertRoute', () => {
- it('aggregate alerts with proper parameters', async () => {
- const licenseState = licenseStateMock.create();
- const router = httpServiceMock.createRouter();
-
- aggregateAlertRoute(router, licenseState);
-
- const [config, handler] = router.get.mock.calls[0];
-
- expect(config.path).toMatchInlineSnapshot(`"/api/alerts/_aggregate"`);
-
- const aggregateResult = {
- ruleExecutionStatus: {
- ok: 15,
- error: 2,
- active: 23,
- pending: 1,
- unknown: 0,
- },
- ruleLastRunOutcome: {
- succeeded: 1,
- failed: 2,
- warning: 3,
- },
- };
- formatDefaultAggregationResult.mockReturnValueOnce(aggregateResult);
-
- const [context, req, res] = mockHandlerArguments(
- { rulesClient },
- {
- query: {
- default_search_operator: 'AND',
- },
- },
- ['ok']
- );
-
- expect(await handler(context, req, res)).toMatchInlineSnapshot(`
- Object {
- "body": Object {
- "alertExecutionStatus": Object {
- "active": 23,
- "error": 2,
- "ok": 15,
- "pending": 1,
- "unknown": 0,
- },
- "ruleLastRunOutcome": Object {
- "failed": 2,
- "succeeded": 1,
- "warning": 3,
- },
- },
- }
- `);
-
- expect(rulesClient.aggregate).toHaveBeenCalledTimes(1);
- expect(rulesClient.aggregate.mock.calls[0]).toMatchInlineSnapshot(`
- Array [
- Object {
- "aggs": Object {
- "enabled": Object {
- "terms": Object {
- "field": "alert.attributes.enabled",
- },
- },
- "muted": Object {
- "terms": Object {
- "field": "alert.attributes.muteAll",
- },
- },
- "outcome": Object {
- "terms": Object {
- "field": "alert.attributes.lastRun.outcome",
- },
- },
- "snoozed": Object {
- "aggs": Object {
- "count": Object {
- "filter": Object {
- "exists": Object {
- "field": "alert.attributes.snoozeSchedule.duration",
- },
- },
- },
- },
- "nested": Object {
- "path": "alert.attributes.snoozeSchedule",
- },
- },
- "status": Object {
- "terms": Object {
- "field": "alert.attributes.executionStatus.status",
- },
- },
- "tags": Object {
- "terms": Object {
- "field": "alert.attributes.tags",
- "order": Object {
- "_key": "asc",
- },
- "size": 50,
- },
- },
- },
- "options": Object {
- "defaultSearchOperator": "AND",
- },
- },
- ]
- `);
-
- expect(res.ok).toHaveBeenCalledWith({
- body: {
- ruleLastRunOutcome: aggregateResult.ruleLastRunOutcome,
- alertExecutionStatus: aggregateResult.ruleExecutionStatus,
- },
- });
- });
-
- it('ensures the license allows aggregating alerts', async () => {
- const licenseState = licenseStateMock.create();
- const router = httpServiceMock.createRouter();
-
- aggregateAlertRoute(router, licenseState);
-
- const [, handler] = router.get.mock.calls[0];
-
- formatDefaultAggregationResult.mockReturnValueOnce({
- ruleExecutionStatus: {
- ok: 15,
- error: 2,
- active: 23,
- pending: 1,
- unknown: 0,
- },
- ruleLastRunOutcome: {
- succeeded: 1,
- failed: 2,
- warning: 3,
- },
- });
-
- const [context, req, res] = mockHandlerArguments(
- { rulesClient },
- {
- query: {
- default_search_operator: 'OR',
- },
- }
- );
-
- await handler(context, req, res);
-
- expect(verifyApiAccess).toHaveBeenCalledWith(licenseState);
- });
-
- it('ensures the license check prevents aggregating alerts', async () => {
- const licenseState = licenseStateMock.create();
- const router = httpServiceMock.createRouter();
-
- (verifyApiAccess as jest.Mock).mockImplementation(() => {
- throw new Error('OMG');
- });
-
- aggregateAlertRoute(router, licenseState);
-
- const [, handler] = router.get.mock.calls[0];
-
- const [context, req, res] = mockHandlerArguments(
- {},
- {
- query: {},
- },
- ['ok']
- );
- expect(handler(context, req, res)).rejects.toMatchInlineSnapshot(`[Error: OMG]`);
-
- expect(verifyApiAccess).toHaveBeenCalledWith(licenseState);
- });
-
- it('should track every call', async () => {
- const licenseState = licenseStateMock.create();
- const router = httpServiceMock.createRouter();
-
- aggregateAlertRoute(router, licenseState, mockUsageCounter);
-
- formatDefaultAggregationResult.mockReturnValueOnce({
- ruleExecutionStatus: {
- ok: 15,
- error: 2,
- active: 23,
- pending: 1,
- unknown: 0,
- },
- ruleLastRunOutcome: {
- succeeded: 1,
- failed: 2,
- warning: 3,
- },
- });
-
- const [, handler] = router.get.mock.calls[0];
- const [context, req, res] = mockHandlerArguments(
- { rulesClient },
- {
- query: {
- default_search_operator: 'AND',
- },
- },
- ['ok']
- );
- await handler(context, req, res);
- expect(trackLegacyRouteUsage).toHaveBeenCalledWith('aggregate', mockUsageCounter);
- });
-
- it('should track calls with deprecated param values', async () => {
- const licenseState = licenseStateMock.create();
- const router = httpServiceMock.createRouter();
-
- aggregateAlertRoute(router, licenseState, mockUsageCounter);
-
- formatDefaultAggregationResult.mockReturnValueOnce({
- ruleExecutionStatus: {
- ok: 15,
- error: 2,
- active: 23,
- pending: 1,
- unknown: 0,
- },
- ruleLastRunOutcome: {
- succeeded: 1,
- failed: 2,
- warning: 3,
- },
- });
-
- const [, handler] = router.get.mock.calls[0];
- const [context, req, res] = mockHandlerArguments(
- { rulesClient },
- {
- params: {},
- query: {
- search_fields: ['alertTypeId:1', 'message:foo'],
- search: 'alertTypeId:2',
- },
- },
- ['ok']
- );
- await handler(context, req, res);
- expect(trackLegacyTerminology).toHaveBeenCalledTimes(1);
- expect((trackLegacyTerminology as jest.Mock).mock.calls[0][0]).toStrictEqual([
- 'alertTypeId:2',
- ['alertTypeId:1', 'message:foo'],
- ]);
- });
-});
diff --git a/x-pack/plugins/alerting/server/routes/legacy/aggregate.ts b/x-pack/plugins/alerting/server/routes/legacy/aggregate.ts
deleted file mode 100644
index 44559830a24e9..0000000000000
--- a/x-pack/plugins/alerting/server/routes/legacy/aggregate.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-import { schema } from '@kbn/config-schema';
-import { UsageCounter } from '@kbn/usage-collection-plugin/server';
-import type { AlertingRouter } from '../../types';
-import { ILicenseState } from '../../lib/license_state';
-import { verifyApiAccess } from '../../lib/license_api_access';
-import {
- LEGACY_BASE_ALERT_API_PATH,
- DefaultRuleAggregationResult,
- getDefaultRuleAggregation,
- formatDefaultAggregationResult,
-} from '../../../common';
-import { renameKeys } from '../lib/rename_keys';
-import { FindOptions } from '../../rules_client';
-import { trackLegacyRouteUsage } from '../../lib/track_legacy_route_usage';
-import { trackLegacyTerminology } from '../lib/track_legacy_terminology';
-
-// config definition
-const querySchema = schema.object({
- search: schema.maybe(schema.string()),
- default_search_operator: schema.oneOf([schema.literal('OR'), schema.literal('AND')], {
- defaultValue: 'OR',
- }),
- search_fields: schema.maybe(schema.oneOf([schema.arrayOf(schema.string()), schema.string()])),
- has_reference: schema.maybe(
- // use nullable as maybe is currently broken
- // in config-schema
- schema.nullable(
- schema.object({
- type: schema.string(),
- id: schema.string(),
- })
- )
- ),
- filter: schema.maybe(schema.string()),
-});
-
-export const aggregateAlertRoute = (
- router: AlertingRouter,
- licenseState: ILicenseState,
- usageCounter?: UsageCounter
-) => {
- router.get(
- {
- path: `${LEGACY_BASE_ALERT_API_PATH}/_aggregate`,
- validate: {
- query: querySchema,
- },
- },
- router.handleLegacyErrors(async function (context, req, res) {
- verifyApiAccess(licenseState);
- if (!context.alerting) {
- return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' });
- }
- const rulesClient = (await context.alerting).getRulesClient();
-
- trackLegacyRouteUsage('aggregate', usageCounter);
- trackLegacyTerminology(
- [req.query.search, req.query.search_fields].filter(Boolean) as string[],
- usageCounter
- );
-
- const query = req.query;
- const renameMap = {
- default_search_operator: 'defaultSearchOperator',
- has_reference: 'hasReference',
- search: 'search',
- filter: 'filter',
- };
-
- const options = renameKeys>(renameMap, query);
-
- if (query.search_fields) {
- options.searchFields = Array.isArray(query.search_fields)
- ? query.search_fields
- : [query.search_fields];
- }
-
- const aggregateResult = await rulesClient.aggregate({
- options,
- aggs: getDefaultRuleAggregation(),
- });
- const { ruleExecutionStatus, ...rest } = formatDefaultAggregationResult(aggregateResult);
- return res.ok({
- body: {
- ...rest,
- alertExecutionStatus: ruleExecutionStatus,
- },
- });
- })
- );
-};
diff --git a/x-pack/plugins/alerting/server/routes/legacy/index.ts b/x-pack/plugins/alerting/server/routes/legacy/index.ts
index a89ccf0920b29..f915cff705318 100644
--- a/x-pack/plugins/alerting/server/routes/legacy/index.ts
+++ b/x-pack/plugins/alerting/server/routes/legacy/index.ts
@@ -5,7 +5,6 @@
* 2.0.
*/
-import { aggregateAlertRoute } from './aggregate';
import { createAlertRoute } from './create';
import { deleteAlertRoute } from './delete';
import { findAlertRoute } from './find';
@@ -28,7 +27,6 @@ export function defineLegacyRoutes(opts: RouteOptions) {
const { router, licenseState, encryptedSavedObjects, usageCounter } = opts;
createAlertRoute(opts);
- aggregateAlertRoute(router, licenseState, usageCounter);
deleteAlertRoute(router, licenseState, usageCounter);
findAlertRoute(router, licenseState, usageCounter);
getAlertRoute(router, licenseState, usageCounter);
diff --git a/x-pack/plugins/alerting/server/routes/aggregate_rules.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.test.ts
similarity index 90%
rename from x-pack/plugins/alerting/server/routes/aggregate_rules.test.ts
rename to x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.test.ts
index c9bfbdca4aa0b..51a7da620dfb3 100644
--- a/x-pack/plugins/alerting/server/routes/aggregate_rules.test.ts
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.test.ts
@@ -5,24 +5,24 @@
* 2.0.
*/
-import { aggregateRulesRoute } from './aggregate_rules';
+import { aggregateRulesRoute } from './aggregate_rules_route';
import { httpServiceMock } from '@kbn/core/server/mocks';
-import { licenseStateMock } from '../lib/license_state.mock';
-import { verifyApiAccess } from '../lib/license_api_access';
-import { mockHandlerArguments } from './_mock_handler_arguments';
-import { rulesClientMock } from '../rules_client.mock';
-import { trackLegacyTerminology } from './lib/track_legacy_terminology';
+import { licenseStateMock } from '../../../../lib/license_state.mock';
+import { verifyApiAccess } from '../../../../lib/license_api_access';
+import { mockHandlerArguments } from '../../../_mock_handler_arguments';
+import { rulesClientMock } from '../../../../rules_client.mock';
+import { trackLegacyTerminology } from '../../../lib/track_legacy_terminology';
import { usageCountersServiceMock } from '@kbn/usage-collection-plugin/server/usage_counters/usage_counters_service.mock';
const rulesClient = rulesClientMock.create();
const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract();
const mockUsageCounter = mockUsageCountersSetup.createUsageCounter('test');
-jest.mock('../lib/license_api_access', () => ({
+jest.mock('../../../../lib/license_api_access', () => ({
verifyApiAccess: jest.fn(),
}));
-jest.mock('./lib/track_legacy_terminology', () => ({
+jest.mock('../../../lib/track_legacy_terminology', () => ({
trackLegacyTerminology: jest.fn(),
}));
@@ -134,7 +134,7 @@ describe('aggregateRulesRoute', () => {
aggregateRulesRoute(router, licenseState);
- const [config, handler] = router.get.mock.calls[0];
+ const [config, handler] = router.post.mock.calls[0];
expect(config.path).toMatchInlineSnapshot(`"/internal/alerting/rules/_aggregate"`);
@@ -143,7 +143,7 @@ describe('aggregateRulesRoute', () => {
const [context, req, res] = mockHandlerArguments(
{ rulesClient },
{
- query: {
+ body: {
default_search_operator: 'AND',
},
},
@@ -279,14 +279,14 @@ describe('aggregateRulesRoute', () => {
aggregateRulesRoute(router, licenseState);
- const [, handler] = router.get.mock.calls[0];
+ const [, handler] = router.post.mock.calls[0];
rulesClient.aggregate.mockResolvedValueOnce(aggregateResult);
const [context, req, res] = mockHandlerArguments(
{ rulesClient },
{
- query: {
+ body: {
default_search_operator: 'OR',
},
}
@@ -307,12 +307,12 @@ describe('aggregateRulesRoute', () => {
aggregateRulesRoute(router, licenseState);
- const [, handler] = router.get.mock.calls[0];
+ const [, handler] = router.post.mock.calls[0];
const [context, req, res] = mockHandlerArguments(
{},
{
- query: {},
+ body: {},
},
['ok']
);
@@ -326,7 +326,7 @@ describe('aggregateRulesRoute', () => {
const router = httpServiceMock.createRouter();
aggregateRulesRoute(router, licenseState, mockUsageCounter);
- const [, handler] = router.get.mock.calls[0];
+ const [, handler] = router.post.mock.calls[0];
rulesClient.aggregate.mockResolvedValueOnce(aggregateResult);
@@ -334,7 +334,7 @@ describe('aggregateRulesRoute', () => {
{ rulesClient },
{
params: {},
- query: {
+ body: {
search_fields: ['alertTypeId:1', 'message:foo'],
search: 'alertTypeId:2',
},
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.ts
new file mode 100644
index 0000000000000..a8f7a20baa4cb
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/aggregate_rules_route.ts
@@ -0,0 +1,63 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { IRouter } from '@kbn/core/server';
+import { UsageCounter } from '@kbn/usage-collection-plugin/server';
+
+import { defaultRuleAggregationFactoryV1 } from '../../../../application/rule/methods/aggregate';
+import { ILicenseState } from '../../../../lib';
+import { verifyAccessAndContext } from '../../../lib';
+import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../../../../types';
+import { trackLegacyTerminology } from '../../../lib/track_legacy_terminology';
+import {
+ aggregateRulesRequestBodySchemaV1,
+ AggregateRulesRequestBodyV1,
+ AggregateRulesResponseV1,
+} from '../../../../../common/routes/rule/apis/aggregate';
+import { formatDefaultAggregationResult } from './transforms';
+import { transformAggregateQueryRequestV1, transformAggregateBodyResponseV1 } from './transforms';
+import { DefaultRuleAggregationResult } from './types';
+
+export const aggregateRulesRoute = (
+ router: IRouter,
+ licenseState: ILicenseState,
+ usageCounter?: UsageCounter
+) => {
+ router.post(
+ {
+ path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`,
+ validate: {
+ body: aggregateRulesRequestBodySchemaV1,
+ },
+ },
+ router.handleLegacyErrors(
+ verifyAccessAndContext(licenseState, async function (context, req, res) {
+ const rulesClient = (await context.alerting).getRulesClient();
+ const body: AggregateRulesRequestBodyV1 = req.body;
+ const options = transformAggregateQueryRequestV1({
+ ...body,
+ has_reference: body.has_reference || undefined,
+ });
+ trackLegacyTerminology(
+ [body.search, body.search_fields].filter(Boolean) as string[],
+ usageCounter
+ );
+
+ const aggregateResult = await rulesClient.aggregate({
+ aggs: defaultRuleAggregationFactoryV1(),
+ options,
+ });
+
+ const responsePayload: AggregateRulesResponseV1 = {
+ body: transformAggregateBodyResponseV1(formatDefaultAggregationResult(aggregateResult)),
+ };
+
+ return res.ok(responsePayload);
+ })
+ )
+ );
+};
diff --git a/x-pack/plugins/alerting/common/default_rule_aggregation.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.test.ts
similarity index 77%
rename from x-pack/plugins/alerting/common/default_rule_aggregation.test.ts
rename to x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.test.ts
index e1c38587d2dd0..0ea0ea3c22a7d 100644
--- a/x-pack/plugins/alerting/common/default_rule_aggregation.test.ts
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.test.ts
@@ -5,26 +5,7 @@
* 2.0.
*/
-import {
- getDefaultRuleAggregation,
- formatDefaultAggregationResult,
-} from './default_rule_aggregation';
-
-describe('getDefaultRuleAggregation', () => {
- it('should return aggregation with default maxTags', () => {
- const result = getDefaultRuleAggregation();
- expect(result.tags).toEqual({
- terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: 50 },
- });
- });
-
- it('should return aggregation with custom maxTags', () => {
- const result = getDefaultRuleAggregation({ maxTags: 100 });
- expect(result.tags).toEqual({
- terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: 100 },
- });
- });
-});
+import { formatDefaultAggregationResult } from '.';
describe('formatDefaultAggregationResult', () => {
it('should format aggregation result', () => {
diff --git a/x-pack/plugins/alerting/common/default_rule_aggregation.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.ts
similarity index 57%
rename from x-pack/plugins/alerting/common/default_rule_aggregation.ts
rename to x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.ts
index 1b72657ce2dbe..d751875e104d7 100644
--- a/x-pack/plugins/alerting/common/default_rule_aggregation.ts
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/format_default_aggregation_result/index.ts
@@ -4,93 +4,10 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import type { AggregationsAggregationContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-import {
- RuleExecutionStatusValues,
- RuleLastRunOutcomeValues,
- RuleAggregationFormattedResult,
-} from './rule';
-export interface DefaultRuleAggregationResult {
- status: {
- buckets: Array<{
- key: string;
- doc_count: number;
- }>;
- };
- outcome: {
- buckets: Array<{
- key: string;
- doc_count: number;
- }>;
- };
- muted: {
- buckets: Array<{
- key: number;
- key_as_string: string;
- doc_count: number;
- }>;
- };
- enabled: {
- buckets: Array<{
- key: number;
- key_as_string: string;
- doc_count: number;
- }>;
- };
- snoozed: {
- count: {
- doc_count: number;
- };
- };
- tags: {
- buckets: Array<{
- key: string;
- doc_count: number;
- }>;
- };
-}
-
-interface GetDefaultRuleAggregationParams {
- maxTags?: number;
-}
-
-export const getDefaultRuleAggregation = (
- params?: GetDefaultRuleAggregationParams
-): Record => {
- const { maxTags = 50 } = params || {};
- return {
- status: {
- terms: { field: 'alert.attributes.executionStatus.status' },
- },
- outcome: {
- terms: { field: 'alert.attributes.lastRun.outcome' },
- },
- enabled: {
- terms: { field: 'alert.attributes.enabled' },
- },
- muted: {
- terms: { field: 'alert.attributes.muteAll' },
- },
- tags: {
- terms: { field: 'alert.attributes.tags', order: { _key: 'asc' }, size: maxTags },
- },
- snoozed: {
- nested: {
- path: 'alert.attributes.snoozeSchedule',
- },
- aggs: {
- count: {
- filter: {
- exists: {
- field: 'alert.attributes.snoozeSchedule.duration',
- },
- },
- },
- },
- },
- };
-};
+import { RuleAggregationFormattedResult } from '../../../../../../application/rule/methods/aggregate/types';
+import { RuleExecutionStatusValues, RuleLastRunOutcomeValues } from '../../../../../../../common';
+import { DefaultRuleAggregationResult } from '../../types';
export const formatDefaultAggregationResult = (
aggregations: DefaultRuleAggregationResult
@@ -166,7 +83,9 @@ export const formatDefaultAggregationResult = (
}
const tagsBuckets = aggregations.tags?.buckets || [];
- result.ruleTags = tagsBuckets.map((bucket) => bucket.key);
+ tagsBuckets.forEach((bucket) => {
+ result.ruleTags.push(bucket.key);
+ });
return result;
};
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/index.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/index.ts
new file mode 100644
index 0000000000000..bd9e8015cf8f4
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/index.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+export { formatDefaultAggregationResult } from './format_default_aggregation_result';
+export { transformAggregateQueryRequest } from './transform_aggregate_query_request/latest';
+export { transformAggregateBodyResponse } from './transform_aggregate_body_response/latest';
+
+export { transformAggregateQueryRequest as transformAggregateQueryRequestV1 } from './transform_aggregate_query_request/v1';
+export { transformAggregateBodyResponse as transformAggregateBodyResponseV1 } from './transform_aggregate_body_response/v1';
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/latest.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/latest.ts
new file mode 100644
index 0000000000000..1d31867d87b28
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/latest.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 { transformAggregateBodyResponse } from './v1';
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/v1.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/v1.ts
new file mode 100644
index 0000000000000..87bd99af3a665
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_body_response/v1.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 { RuleAggregationFormattedResult } from '../../../../../../application/rule/methods/aggregate/types';
+import { AggregateRulesResponseBodyV1 } from '../../../../../../../common/routes/rule/apis/aggregate';
+
+export const transformAggregateBodyResponse = ({
+ ruleExecutionStatus,
+ ruleEnabledStatus,
+ ruleLastRunOutcome,
+ ruleMutedStatus,
+ ruleSnoozedStatus,
+ ruleTags,
+}: RuleAggregationFormattedResult): AggregateRulesResponseBodyV1 => ({
+ rule_execution_status: ruleExecutionStatus,
+ rule_last_run_outcome: ruleLastRunOutcome,
+ rule_enabled_status: ruleEnabledStatus,
+ rule_muted_status: ruleMutedStatus,
+ rule_snoozed_status: ruleSnoozedStatus,
+ rule_tags: ruleTags,
+});
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/latest.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/latest.ts
new file mode 100644
index 0000000000000..9ecc4c35b6049
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/latest.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 { transformAggregateQueryRequest } from './v1';
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/v1.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/v1.ts
new file mode 100644
index 0000000000000..7b5879227ce97
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/transforms/transform_aggregate_query_request/v1.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 { RewriteRequestCase } from '@kbn/actions-plugin/common';
+import { AggregateOptions } from '../../../../../../application/rule/methods/aggregate/types';
+
+export const transformAggregateQueryRequest: RewriteRequestCase = ({
+ search,
+ default_search_operator: defaultSearchOperator,
+ search_fields: searchFields,
+ has_reference: hasReference,
+ filter,
+}) => ({
+ defaultSearchOperator,
+ ...(hasReference ? { hasReference } : {}),
+ ...(searchFields ? { searchFields } : {}),
+ ...(search ? { search } : {}),
+ ...(filter ? { filter } : {}),
+});
diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/types/index.ts b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/types/index.ts
new file mode 100644
index 0000000000000..a8eccab7f1e00
--- /dev/null
+++ b/x-pack/plugins/alerting/server/routes/rule/apis/aggregate/types/index.ts
@@ -0,0 +1,46 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+export interface DefaultRuleAggregationResult {
+ status: {
+ buckets: Array<{
+ key: string;
+ doc_count: number;
+ }>;
+ };
+ outcome: {
+ buckets: Array<{
+ key: string;
+ doc_count: number;
+ }>;
+ };
+ muted: {
+ buckets: Array<{
+ key: number;
+ key_as_string: string;
+ doc_count: number;
+ }>;
+ };
+ enabled: {
+ buckets: Array<{
+ key: number;
+ key_as_string: string;
+ doc_count: number;
+ }>;
+ };
+ snoozed: {
+ count: {
+ doc_count: number;
+ };
+ };
+ tags: {
+ buckets: Array<{
+ key: string;
+ doc_count: number;
+ }>;
+ };
+}
diff --git a/x-pack/plugins/alerting/server/rules_client/methods/aggregate.ts b/x-pack/plugins/alerting/server/rules_client/methods/aggregate.ts
deleted file mode 100644
index 6dd26c1a7e197..0000000000000
--- a/x-pack/plugins/alerting/server/rules_client/methods/aggregate.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; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-import { KueryNode, nodeBuilder } from '@kbn/es-query';
-import type { AggregationsAggregationContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
-import { AlertingAuthorizationEntity } from '../../authorization';
-import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events';
-import { buildKueryNodeFilter } from '../common';
-import { alertingAuthorizationFilterOpts } from '../common/constants';
-import { RulesClientContext } from '../types';
-import { RawRule, AggregateOptions } from '../../types';
-import { validateRuleAggregationFields } from '../lib/validate_rule_aggregation_fields';
-
-export interface AggregateParams {
- options?: AggregateOptions;
- aggs: Record;
-}
-
-export async function aggregate>(
- context: RulesClientContext,
- params: AggregateParams
-): Promise {
- const { options = {}, aggs } = params;
- const { filter, page = 1, perPage = 0, ...restOptions } = options;
-
- let authorizationTuple;
- try {
- authorizationTuple = await context.authorization.getFindAuthorizationFilter(
- AlertingAuthorizationEntity.Rule,
- alertingAuthorizationFilterOpts
- );
- validateRuleAggregationFields(aggs);
- } catch (error) {
- context.auditLogger?.log(
- ruleAuditEvent({
- action: RuleAuditAction.AGGREGATE,
- error,
- })
- );
- throw error;
- }
-
- const { filter: authorizationFilter } = authorizationTuple;
- const filterKueryNode = buildKueryNodeFilter(filter);
-
- const result = await context.unsecuredSavedObjectsClient.find({
- ...restOptions,
- filter:
- authorizationFilter && filterKueryNode
- ? nodeBuilder.and([filterKueryNode, authorizationFilter as KueryNode])
- : authorizationFilter,
- page,
- perPage,
- type: 'alert',
- aggs,
- });
-
- // params.
- return result.aggregations!;
-}
diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts
index b27bb9b5a6747..f2274648d3981 100644
--- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts
+++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts
@@ -33,7 +33,8 @@ import {
GetRuleExecutionKPIParams,
} from './methods/get_execution_kpi';
import { find, FindParams } from './methods/find';
-import { aggregate, AggregateParams } from './methods/aggregate';
+import { AggregateParams } from '../application/rule/methods/aggregate/types';
+import { aggregateRules } from '../application/rule/methods/aggregate';
import { deleteRule } from './methods/delete';
import { update, UpdateOptions } from './methods/update';
import { bulkDeleteRules } from './methods/bulk_delete';
@@ -108,7 +109,7 @@ export class RulesClient {
}
public aggregate = >(params: AggregateParams): Promise =>
- aggregate(this.context, params);
+ aggregateRules(this.context, params);
public clone = (...args: CloneArguments) =>
clone(this.context, ...args);
public create = (params: CreateRuleParams) =>
diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts
index 350d7a8f38dac..af1dc5e795485 100644
--- a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts
+++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_navigate_to_cis_integration_policies.ts
@@ -8,18 +8,35 @@
import { pagePathGetters, pkgKeyFromPackageInfo } from '@kbn/fleet-plugin/public';
import { useCisKubernetesIntegration } from '../api/use_cis_kubernetes_integration';
import { useKibana } from '../hooks/use_kibana';
+import { useCspBenchmarkIntegrations } from '../../pages/benchmarks/use_csp_benchmark_integrations';
+import { PostureTypes } from '../../../common/types';
export const useCISIntegrationPoliciesLink = ({
- addAgentToPolicyId = '',
- integration = '',
+ postureType,
}: {
- addAgentToPolicyId?: string;
- integration?: string;
+ postureType: PostureTypes;
}): string | undefined => {
const { http } = useKibana().services;
const cisIntegration = useCisKubernetesIntegration();
+ // using an existing hook to get agent id and package policy id
+ const cspBenchmarkIntegrations = useCspBenchmarkIntegrations({
+ name: '',
+ page: 1,
+ perPage: 100,
+ sortField: 'package_policy.name',
+ sortOrder: 'asc',
+ });
if (!cisIntegration.isSuccess) return;
+ const intergrations = cspBenchmarkIntegrations.data?.items;
+ const matchedIntegration = intergrations?.find(
+ (integration) =>
+ integration?.package_policy?.inputs?.find((input) => input?.enabled)?.policy_template ===
+ postureType
+ );
+ const addAgentToPolicyId = matchedIntegration?.agent_policy.id || '';
+ const integration = matchedIntegration?.package_policy.id || '';
+
const path = pagePathGetters
.integration_details_policies({
addAgentToPolicyId,
diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_findings_states.tsx b/x-pack/plugins/cloud_security_posture/public/components/no_findings_states.tsx
index 292831821173e..422695c7ff576 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/no_findings_states.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/no_findings_states.tsx
@@ -22,7 +22,6 @@ import { i18n } from '@kbn/i18n';
import { css } from '@emotion/react';
import { CSPM_POLICY_TEMPLATE, KSPM_POLICY_TEMPLATE } from '../../common/constants';
import { FullSizeCenteredPage } from './full_size_centered_page';
-import { useCspBenchmarkIntegrations } from '../pages/benchmarks/use_csp_benchmark_integrations';
import { useCISIntegrationPoliciesLink } from '../common/navigation/use_navigate_to_cis_integration_policies';
import {
CSPM_NOT_INSTALLED_ACTION_SUBJ,
@@ -37,21 +36,9 @@ import noDataIllustration from '../assets/illustrations/no_data_illustration.svg
import { useCspIntegrationLink } from '../common/navigation/use_csp_integration_link';
import { NO_FINDINGS_STATUS_REFRESH_INTERVAL_MS } from '../common/constants';
-const NotDeployed = () => {
- // using an existing hook to get agent id and package policy id
- const benchmarks = useCspBenchmarkIntegrations({
- name: '',
- page: 1,
- perPage: 1,
- sortField: 'package_policy.name',
- sortOrder: 'asc',
- });
-
- // the ids are not a must, but as long as we have them we can open the add agent flyout
- const firstBenchmark = benchmarks.data?.items?.[0];
+const NotDeployed = ({ postureType }: { postureType: PostureTypes }) => {
const integrationPoliciesLink = useCISIntegrationPoliciesLink({
- addAgentToPolicyId: firstBenchmark?.agent_policy.id || '',
- integration: firstBenchmark?.package_policy.id || '',
+ postureType,
});
return (
@@ -280,7 +267,7 @@ export const NoFindingsStates = ({ posturetype }: { posturetype: PostureTypes })
.map((idxDetails: IndexDetails) => idxDetails.index)
.sort((a, b) => a.localeCompare(b));
const render = () => {
- if (status === 'not-deployed') return ; // integration installed, but no agents added
+ if (status === 'not-deployed') return ; // integration installed, but no agents added
if (status === 'indexing' || status === 'waiting_for_results') return ; // agent added, index timeout hasn't passed since installation
if (status === 'index-timeout') return ; // agent added, index timeout has passed
if (status === 'unprivileged')
diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx
index bfa92c2ef6ece..7dee3e94e70a6 100644
--- a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx
+++ b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx
@@ -33,7 +33,7 @@ import {
import noDataIllustration from '../assets/illustrations/no_data_illustration.svg';
import { useCspIntegrationLink } from '../common/navigation/use_csp_integration_link';
import { useCISIntegrationPoliciesLink } from '../common/navigation/use_navigate_to_cis_integration_policies';
-import { useCspBenchmarkIntegrations } from '../pages/benchmarks/use_csp_benchmark_integrations';
+import { PostureTypes } from '../../common/types';
const REFETCH_INTERVAL_MS = 20000;
@@ -191,21 +191,9 @@ const Unprivileged = ({ unprivilegedIndices }: { unprivilegedIndices: string[] }
}
/>
);
-const AgentNotDeployedEmptyPrompt = () => {
- // using an existing hook to get agent id and package policy id
- const benchmarks = useCspBenchmarkIntegrations({
- name: '',
- page: 1,
- perPage: 1,
- sortField: 'package_policy.name',
- sortOrder: 'asc',
- });
-
- // the ids are not a must, but as long as we have them we can open the add agent flyout
- const firstBenchmark = benchmarks.data?.items?.[0];
+const AgentNotDeployedEmptyPrompt = ({ postureType }: { postureType: PostureTypes }) => {
const integrationPoliciesLink = useCISIntegrationPoliciesLink({
- addAgentToPolicyId: firstBenchmark?.agent_policy.id || '',
- integration: firstBenchmark?.package_policy.id || '',
+ postureType,
});
return (
@@ -268,7 +256,8 @@ export const NoVulnerabilitiesStates = () => {
return (
);
- if (status === 'not-deployed') return ;
+ if (status === 'not-deployed')
+ return ;
if (status === 'unprivileged')
return ; // user has no privileges for our indices
};
diff --git a/x-pack/plugins/fleet/common/services/agent_status.ts b/x-pack/plugins/fleet/common/services/agent_status.ts
index 2ea2bef9d69df..a7a5257c603b8 100644
--- a/x-pack/plugins/fleet/common/services/agent_status.ts
+++ b/x-pack/plugins/fleet/common/services/agent_status.ts
@@ -56,3 +56,15 @@ export function buildKueryForUpdatingAgents(): string {
export function buildKueryForInactiveAgents() {
return 'status:inactive';
}
+
+export const AGENT_UPDATING_TIMEOUT_HOURS = 2;
+
+export function isStuckInUpdating(agent: Agent): boolean {
+ return (
+ agent.status === 'updating' &&
+ !!agent.upgrade_started_at &&
+ !agent.upgraded_at &&
+ Date.now() - Date.parse(agent.upgrade_started_at) >
+ AGENT_UPDATING_TIMEOUT_HOURS * 60 * 60 * 1000
+ );
+}
diff --git a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts
index 07bb496434f1f..1e0e82d6c2ecd 100644
--- a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts
+++ b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts
@@ -101,6 +101,7 @@ export interface PostAgentUpgradeRequest {
body: {
source_uri?: string;
version: string;
+ force?: boolean;
};
}
@@ -111,6 +112,7 @@ export interface PostBulkAgentUpgradeRequest {
version: string;
rollout_duration_seconds?: number;
start_time?: string;
+ force?: boolean;
};
}
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/action_menu.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/action_menu.test.tsx
index b9ca2d64493e4..51c2250e0fe16 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/action_menu.test.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/action_menu.test.tsx
@@ -163,3 +163,44 @@ describe('AgentDetailsActionMenu', () => {
});
});
});
+
+describe('Restart upgrade action', () => {
+ function renderAndGetRestartUpgradeButton({
+ agent,
+ agentPolicy,
+ }: {
+ agent: Agent;
+ agentPolicy?: AgentPolicy;
+ }) {
+ const { utils } = renderActions({
+ agent,
+ agentPolicy,
+ });
+
+ return utils.queryByTestId('restartUpgradeBtn');
+ }
+
+ it('should render an active button', async () => {
+ const res = renderAndGetRestartUpgradeButton({
+ agent: {
+ status: 'updating',
+ upgrade_started_at: '2022-11-21T12:27:24Z',
+ } as any,
+ agentPolicy: {} as AgentPolicy,
+ });
+
+ expect(res).not.toBe(null);
+ expect(res).toBeEnabled();
+ });
+
+ it('should not render action if agent is not stuck in updating', async () => {
+ const res = renderAndGetRestartUpgradeButton({
+ agent: {
+ status: 'updating',
+ upgrade_started_at: new Date().toISOString(),
+ } as any,
+ agentPolicy: {} as AgentPolicy,
+ });
+ expect(res).toBe(null);
+ });
+});
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx
index 80651ad5a4ab3..251a5407de045 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx
@@ -10,6 +10,7 @@ import { EuiPortal, EuiContextMenuItem } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import { isAgentRequestDiagnosticsSupported } from '../../../../../../../common/services';
+import { isStuckInUpdating } from '../../../../../../../common/services/agent_status';
import type { Agent, AgentPolicy } from '../../../../types';
import { useAuthz, useKibanaVersion } from '../../../../hooks';
@@ -41,6 +42,7 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{
const [isRequestDiagnosticsModalOpen, setIsRequestDiagnosticsModalOpen] = useState(false);
const [isAgentDetailsJsonFlyoutOpen, setIsAgentDetailsJsonFlyoutOpen] = useState(false);
const isUnenrolling = agent.status === 'unenrolling';
+ const isAgentUpdating = isStuckInUpdating(agent);
const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);
const onContextMenuChange = useCallback(
@@ -114,6 +116,24 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{
);
}
+ if (isAgentUpdating) {
+ menuItems.push(
+ {
+ setIsUpgradeModalOpen(true);
+ }}
+ key="restartUpgradeAgent"
+ data-test-subj="restartUpgradeBtn"
+ >
+
+
+ );
+ }
+
menuItems.push(
)}
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx
index 617ee8188c025..55a73c00d0688 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx
@@ -129,7 +129,7 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{
title: i18n.translate('xpack.fleet.agentDetails.statusLabel', {
defaultMessage: 'Status',
}),
- description: ,
+ description: ,
},
{
title: i18n.translate('xpack.fleet.agentDetails.lastActivityLabel', {
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.test.tsx
index 2d07cdb98f01d..37f67dd9e6a41 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.test.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.test.tsx
@@ -80,6 +80,7 @@ describe('AgentBulkActions', () => {
expect(results.getByText('Upgrade 2 agents').closest('button')!).toBeDisabled();
expect(results.getByText('Schedule upgrade for 2 agents').closest('button')!).toBeDisabled();
expect(results.queryByText('Request diagnostics for 2 agents')).toBeNull();
+ expect(results.getByText('Restart upgrade 2 agents').closest('button')!).toBeDisabled();
});
it('should show available actions for 2 selected agents if they are active', async () => {
@@ -112,6 +113,7 @@ describe('AgentBulkActions', () => {
expect(results.getByText('Unenroll 2 agents').closest('button')!).toBeEnabled();
expect(results.getByText('Upgrade 2 agents').closest('button')!).toBeEnabled();
expect(results.getByText('Schedule upgrade for 2 agents').closest('button')!).toBeDisabled();
+ expect(results.getByText('Restart upgrade 2 agents').closest('button')!).toBeEnabled();
});
it('should add actions if mockedExperimentalFeaturesService is enabled', async () => {
@@ -202,6 +204,7 @@ describe('AgentBulkActions', () => {
expect(
results.getByText('Request diagnostics for 10 agents').closest('button')!
).toBeEnabled();
+ expect(results.getByText('Restart upgrade 10 agents').closest('button')!).toBeEnabled();
});
it('should show correct actions for the active agents and exclude the managed agents from the count', async () => {
@@ -255,6 +258,7 @@ describe('AgentBulkActions', () => {
expect(
results.getByText('Request diagnostics for 8 agents').closest('button')!
).toBeEnabled();
+ expect(results.getByText('Restart upgrade 8 agents').closest('button')!).toBeEnabled();
});
it('should show correct actions when no managed policies exist', async () => {
@@ -292,6 +296,7 @@ describe('AgentBulkActions', () => {
expect(
results.getByText('Request diagnostics for 10 agents').closest('button')!
).toBeEnabled();
+ expect(results.getByText('Restart upgrade 10 agents').closest('button')!).toBeEnabled();
});
it('should generate a correct kuery to select agents', async () => {
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx
index e5a33beba733b..03ffc5fd615ee 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx
@@ -73,7 +73,11 @@ export const AgentBulkActions: React.FunctionComponent = ({
// Actions states
const [isReassignFlyoutOpen, setIsReassignFlyoutOpen] = useState(false);
const [isUnenrollModalOpen, setIsUnenrollModalOpen] = useState(false);
- const [updateModalState, setUpgradeModalState] = useState({ isOpen: false, isScheduled: false });
+ const [updateModalState, setUpgradeModalState] = useState({
+ isOpen: false,
+ isScheduled: false,
+ isUpdating: false,
+ });
const [isTagAddVisible, setIsTagAddVisible] = useState(false);
const [isRequestDiagnosticsModalOpen, setIsRequestDiagnosticsModalOpen] =
useState(false);
@@ -219,7 +223,7 @@ export const AgentBulkActions: React.FunctionComponent = ({
disabled: !atLeastOneActiveAgentSelected,
onClick: () => {
closeMenu();
- setUpgradeModalState({ isOpen: true, isScheduled: false });
+ setUpgradeModalState({ isOpen: true, isScheduled: false, isUpdating: false });
},
},
{
@@ -237,11 +241,30 @@ export const AgentBulkActions: React.FunctionComponent = ({
disabled: !atLeastOneActiveAgentSelected || !isLicenceAllowingScheduleUpgrade,
onClick: () => {
closeMenu();
- setUpgradeModalState({ isOpen: true, isScheduled: true });
+ setUpgradeModalState({ isOpen: true, isScheduled: true, isUpdating: false });
},
},
];
+ menuItems.push({
+ name: (
+
+ ),
+ icon: ,
+ disabled: !atLeastOneActiveAgentSelected,
+ onClick: () => {
+ closeMenu();
+ setUpgradeModalState({ isOpen: true, isScheduled: false, isUpdating: true });
+ },
+ });
+
if (diagnosticFileUploadEnabled) {
menuItems.push({
name: (
@@ -306,8 +329,9 @@ export const AgentBulkActions: React.FunctionComponent = ({
agents={agents}
agentCount={agentCount}
isScheduled={updateModalState.isScheduled}
+ isUpdating={updateModalState.isUpdating}
onClose={() => {
- setUpgradeModalState({ isOpen: false, isScheduled: false });
+ setUpgradeModalState({ isOpen: false, isScheduled: false, isUpdating: false });
refreshAgents();
}}
/>
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.test.tsx
index f58ebc3977c8b..17ebb6a6631f9 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.test.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.test.tsx
@@ -132,4 +132,51 @@ describe('TableRowActions', () => {
expect(res).not.toBeEnabled();
});
});
+
+ describe('Restart upgrade action', () => {
+ function renderAndGetRestartUpgradeButton({
+ agent,
+ agentPolicy,
+ }: {
+ agent: Agent;
+ agentPolicy?: AgentPolicy;
+ }) {
+ const { utils } = renderTableRowActions({
+ agent,
+ agentPolicy,
+ });
+
+ return utils.queryByTestId('restartUpgradeBtn');
+ }
+
+ it('should render an active button', async () => {
+ const res = renderAndGetRestartUpgradeButton({
+ agent: {
+ active: true,
+ status: 'updating',
+ upgrade_started_at: '2022-11-21T12:27:24Z',
+ } as any,
+ agentPolicy: {
+ is_managed: false,
+ } as AgentPolicy,
+ });
+
+ expect(res).not.toBe(null);
+ expect(res).toBeEnabled();
+ });
+
+ it('should not render action if agent is not stuck in updating', async () => {
+ const res = renderAndGetRestartUpgradeButton({
+ agent: {
+ active: true,
+ status: 'updating',
+ upgrade_started_at: new Date().toISOString(),
+ } as any,
+ agentPolicy: {
+ is_managed: false,
+ } as AgentPolicy,
+ });
+ expect(res).toBe(null);
+ });
+ });
});
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx
index 5f82d3b556897..6b36f0a29d587 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_row_actions.tsx
@@ -11,6 +11,8 @@ import { FormattedMessage } from '@kbn/i18n-react';
import { isAgentRequestDiagnosticsSupported } from '../../../../../../../common/services';
+import { isStuckInUpdating } from '../../../../../../../common/services/agent_status';
+
import type { Agent, AgentPolicy } from '../../../../types';
import { useAuthz, useLink, useKibanaVersion } from '../../../../hooks';
import { ContextMenuActions } from '../../../../components';
@@ -117,6 +119,24 @@ export const TableRowActions: React.FunctionComponent<{
);
+ if (isStuckInUpdating(agent)) {
+ menuItems.push(
+ {
+ onUpgradeClick();
+ }}
+ data-test-subj="restartUpgradeBtn"
+ >
+
+
+ );
+ }
+
if (agentTamperProtectionEnabled && agent.policy_id) {
menuItems.push(
= () => {
setAgentToUpgrade(undefined);
refreshAgents();
}}
+ isUpdating={Boolean(agentToUpgrade.upgrade_started_at && !agentToUpgrade.upgraded_at)}
/>
)}
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx
new file mode 100644
index 0000000000000..93646a544bebb
--- /dev/null
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.test.tsx
@@ -0,0 +1,76 @@
+/*
+ * 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 { act, fireEvent } from '@testing-library/react';
+
+import { createFleetTestRendererMock } from '../../../../../mock';
+
+import type { Agent } from '../../../types';
+
+import { AgentHealth } from './agent_health';
+
+jest.mock('./agent_upgrade_modal', () => {
+ return {
+ AgentUpgradeAgentModal: () => <>Upgrade Modal>,
+ };
+});
+
+function renderAgentHealth(agent: Agent, fromDetails?: boolean) {
+ const renderer = createFleetTestRendererMock();
+
+ const utils = renderer.render( );
+
+ return { utils };
+}
+
+describe('AgentHealth', () => {
+ it('should render agent health with callout when agent stuck updating', () => {
+ const { utils } = renderAgentHealth(
+ {
+ active: true,
+ status: 'updating',
+ upgrade_started_at: '2022-11-21T12:27:24Z',
+ } as any,
+ true
+ );
+
+ act(() => {
+ fireEvent.click(utils.getByTestId('restartUpgradeBtn'));
+ });
+
+ utils.findByText('Upgrade Modal');
+ });
+
+ it('should not render agent health with callout when agent not stuck updating', () => {
+ const { utils } = renderAgentHealth(
+ {
+ active: true,
+ status: 'updating',
+ upgrade_started_at: new Date().toISOString(),
+ } as any,
+ true
+ );
+
+ expect(utils.queryByTestId('restartUpgradeBtn')).not.toBeInTheDocument();
+ });
+
+ it('should not render agent health with callout when not from details', () => {
+ const { utils } = renderAgentHealth(
+ {
+ active: true,
+ status: 'updating',
+ upgrade_started_at: '2022-11-21T12:27:24Z',
+ } as any,
+ false
+ );
+
+ expect(utils.queryByTestId('restartUpgradeBtn')).not.toBeInTheDocument();
+ expect(utils.container.querySelector('[data-euiicon-type="warning"]')).not.toBeNull();
+ });
+});
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx
index 9674480ab8bfe..9aefdff0d0578 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx
@@ -5,19 +5,35 @@
* 2.0.
*/
-import React, { useMemo } from 'react';
+import React, { useMemo, useState } from 'react';
+import styled from 'styled-components';
import { FormattedMessage, FormattedRelative } from '@kbn/i18n-react';
-import { EuiBadge, EuiToolTip } from '@elastic/eui';
+import {
+ EuiBadge,
+ EuiButton,
+ EuiCallOut,
+ EuiIcon,
+ EuiPortal,
+ EuiSpacer,
+ EuiToolTip,
+} from '@elastic/eui';
import { euiLightVars as euiVars } from '@kbn/ui-theme';
-import { getPreviousAgentStatusForOfflineAgents } from '../../../../../../common/services/agent_status';
+import {
+ getPreviousAgentStatusForOfflineAgents,
+ isStuckInUpdating,
+} from '../../../../../../common/services/agent_status';
import type { Agent } from '../../../types';
+import { useAgentRefresh } from '../agent_details_page/hooks';
+
+import { AgentUpgradeAgentModal } from './agent_upgrade_modal';
+
interface Props {
agent: Agent;
- showOfflinePreviousStatus?: boolean;
+ fromDetails?: boolean;
}
const Status = {
@@ -79,10 +95,11 @@ function getStatusComponent(status: Agent['status']): React.ReactElement {
}
}
-export const AgentHealth: React.FunctionComponent = ({
- agent,
- showOfflinePreviousStatus,
-}) => {
+const WrappedEuiCallOut = styled(EuiCallOut)`
+ white-space: wrap !important;
+`;
+
+export const AgentHealth: React.FunctionComponent = ({ agent, fromDetails }) => {
const { last_checkin: lastCheckIn, last_checkin_message: lastCheckInMessage } = agent;
const msLastCheckIn = new Date(lastCheckIn || 0).getTime();
const lastCheckInMessageText = lastCheckInMessage ? (
@@ -112,27 +129,94 @@ export const AgentHealth: React.FunctionComponent = ({
);
const previousToOfflineStatus = useMemo(() => {
- if (!showOfflinePreviousStatus || agent.status !== 'offline') {
+ if (!fromDetails || agent.status !== 'offline') {
return;
}
return getPreviousAgentStatusForOfflineAgents(agent);
- }, [showOfflinePreviousStatus, agent]);
+ }, [fromDetails, agent]);
+
+ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false);
+ const refreshAgent = useAgentRefresh();
return (
-
+
+ {lastCheckinText}
+ {lastCheckInMessageText}
+ {isStuckInUpdating(agent) ? (
+
+
+
+ ) : null}
+ >
+ }
+ >
+ <>
+ {getStatusComponent(agent.status)}
+ {previousToOfflineStatus ? getStatusComponent(previousToOfflineStatus) : null}
+ {isStuckInUpdating(agent) && !fromDetails ? (
+ <>
+
+
+ >
+ ) : null}
+ >
+
+ {fromDetails && isStuckInUpdating(agent) ? (
<>
- {lastCheckinText}
- {lastCheckInMessageText}
+
+
+ }
+ >
+
+
+
+ {
+ setIsUpgradeModalOpen(true);
+ }}
+ data-test-subj="restartUpgradeBtn"
+ >
+
+
+
>
- }
- >
- <>
- {getStatusComponent(agent.status)}
- {previousToOfflineStatus ? getStatusComponent(previousToOfflineStatus) : null}
- >
-
+ ) : null}
+ {isUpgradeModalOpen && (
+
+ {
+ setIsUpgradeModalOpen(false);
+ refreshAgent();
+ }}
+ isUpdating={true}
+ />
+
+ )}
+ >
);
};
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx
index 78619b976c49f..a3c50e0b9aee7 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.test.tsx
@@ -7,20 +7,15 @@
import React from 'react';
-import { waitFor } from '@testing-library/react';
+import { act, fireEvent, waitFor } from '@testing-library/react';
import { createFleetTestRendererMock } from '../../../../../../mock';
+import { sendPostBulkAgentUpgrade } from '../../../../hooks';
+
import { AgentUpgradeAgentModal } from '.';
import type { AgentUpgradeAgentModalProps } from '.';
-jest.mock('@elastic/eui', () => {
- return {
- ...jest.requireActual('@elastic/eui'),
- EuiConfirmModal: ({ children }: any) => <>{children}>,
- };
-});
-
jest.mock('../../../../hooks', () => {
return {
...jest.requireActual('../../../../hooks'),
@@ -29,9 +24,15 @@ jest.mock('../../../../hooks', () => {
items: ['8.7.0'],
},
}),
+ sendGetAgentStatus: jest.fn().mockResolvedValue({
+ data: { results: { updating: 2 } },
+ }),
+ sendPostBulkAgentUpgrade: jest.fn(),
};
});
+const mockSendPostBulkAgentUpgrade = sendPostBulkAgentUpgrade as jest.Mock;
+
function renderAgentUpgradeAgentModal(props: Partial) {
const renderer = createFleetTestRendererMock();
@@ -41,6 +42,7 @@ function renderAgentUpgradeAgentModal(props: Partial {
it('should set the default to Immediately if there is less than 10 agents using kuery', async () => {
const { utils } = renderAgentUpgradeAgentModal({
@@ -48,10 +50,7 @@ describe('AgentUpgradeAgentModal', () => {
agentCount: 3,
});
- const el = utils.container.querySelector(
- '[data-test-subj="agentUpgradeModal.MaintenanceCombobox"]'
- );
- expect(el).not.toBeNull();
+ const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox');
expect(el?.textContent).toBe('Immediately');
});
@@ -61,10 +60,7 @@ describe('AgentUpgradeAgentModal', () => {
agentCount: 3,
});
- const el = utils.container.querySelector(
- '[data-test-subj="agentUpgradeModal.MaintenanceCombobox"]'
- );
- expect(el).not.toBeNull();
+ const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox');
expect(el?.textContent).toBe('Immediately');
});
@@ -74,11 +70,7 @@ describe('AgentUpgradeAgentModal', () => {
agentCount: 13,
});
- const el = utils.container.querySelector(
- '[data-test-subj="agentUpgradeModal.MaintenanceCombobox"]'
- );
-
- expect(el).not.toBeNull();
+ const el = utils.getByTestId('agentUpgradeModal.MaintenanceCombobox');
expect(el?.textContent).toBe('1 hour');
});
@@ -93,4 +85,73 @@ describe('AgentUpgradeAgentModal', () => {
expect(el.classList.contains('euiComboBox-isDisabled')).toBe(false);
});
});
+
+ it('should restart uprade on updating agents if some agents in updating', async () => {
+ const { utils } = renderAgentUpgradeAgentModal({
+ agents: [
+ { status: 'updating', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' },
+ { id: 'agent2' },
+ ] as any,
+ agentCount: 2,
+ isUpdating: true,
+ });
+
+ const el = utils.getByTestId('confirmModalTitleText');
+ expect(el.textContent).toEqual('Restart upgrade on 1 out of 2 agents stuck in updating');
+
+ const btn = utils.getByTestId('confirmModalConfirmButton');
+ await waitFor(() => {
+ expect(btn).toBeEnabled();
+ });
+
+ act(() => {
+ fireEvent.click(btn);
+ });
+
+ expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual(
+ expect.objectContaining({ agents: ['agent1'], force: true })
+ );
+ });
+
+ it('should restart upgrade on updating agents if kuery', async () => {
+ const { utils } = renderAgentUpgradeAgentModal({
+ agents: '*',
+ agentCount: 3,
+ isUpdating: true,
+ });
+
+ const el = await utils.findByTestId('confirmModalTitleText');
+ expect(el.textContent).toEqual('Restart upgrade on 2 out of 3 agents stuck in updating');
+
+ const btn = utils.getByTestId('confirmModalConfirmButton');
+ await waitFor(() => {
+ expect(btn).toBeEnabled();
+ });
+
+ act(() => {
+ fireEvent.click(btn);
+ });
+
+ expect(mockSendPostBulkAgentUpgrade.mock.calls.at(-1)[0]).toEqual(
+ expect.objectContaining({
+ agents:
+ '(*) AND status:updating AND upgrade_started_at:* AND NOT upgraded_at:* AND upgrade_started_at < now-2h',
+ force: true,
+ })
+ );
+ });
+
+ it('should disable submit button if no agents stuck updating', () => {
+ const { utils } = renderAgentUpgradeAgentModal({
+ agents: [
+ { status: 'offline', upgrade_started_at: '2022-11-21T12:27:24Z', id: 'agent1' },
+ { id: 'agent2' },
+ ] as any,
+ agentCount: 2,
+ isUpdating: true,
+ });
+
+ const el = utils.getByTestId('confirmModalConfirmButton');
+ expect(el).toBeDisabled();
+ });
});
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx
index 014075b1f0241..c4342d7436e22 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_upgrade_modal/index.tsx
@@ -28,6 +28,11 @@ import semverGt from 'semver/functions/gt';
import semverLt from 'semver/functions/lt';
import { getMinVersion } from '../../../../../../../common/services/get_min_max_version';
+import {
+ AGENT_UPDATING_TIMEOUT_HOURS,
+ isStuckInUpdating,
+} from '../../../../../../../common/services/agent_status';
+
import type { Agent } from '../../../../types';
import {
sendPostAgentUpgrade,
@@ -35,6 +40,7 @@ import {
useStartServices,
useKibanaVersion,
useConfig,
+ sendGetAgentStatus,
} from '../../../../hooks';
import { sendGetAgentsAvailableVersions } from '../../../../hooks';
@@ -51,6 +57,7 @@ export interface AgentUpgradeAgentModalProps {
agents: Agent[] | string;
agentCount: number;
isScheduled?: boolean;
+ isUpdating?: boolean;
}
const getVersion = (version: Array>) => version[0]?.value as string;
@@ -68,6 +75,7 @@ export const AgentUpgradeAgentModal: React.FunctionComponent {
const { notifications } = useStartServices();
const kibanaVersion = useKibanaVersion() || '';
@@ -80,6 +88,47 @@ export const AgentUpgradeAgentModal: React.FunctionComponent(0);
+ const [updatingQuery, setUpdatingQuery] = useState('');
+
+ const QUERY_STUCK_UPDATING = `status:updating AND upgrade_started_at:* AND NOT upgraded_at:* AND upgrade_started_at < now-${AGENT_UPDATING_TIMEOUT_HOURS}h`;
+
+ useEffect(() => {
+ const getStuckUpdatingAgentCount = async (agentsOrQuery: Agent[] | string) => {
+ let newQuery;
+ // find updating agents from array
+ if (Array.isArray(agentsOrQuery) && agentsOrQuery.length > 0) {
+ if (agentsOrQuery.length === 0) {
+ return;
+ }
+ const newAgents = agentsOrQuery.filter((agent) => isStuckInUpdating(agent));
+ const updatingCount = newAgents.length;
+ setUpdatingAgents(updatingCount);
+ setUpdatingQuery(newAgents);
+ return;
+ } else if (typeof agentsOrQuery === 'string' && agentsOrQuery !== '') {
+ newQuery = [`(${agentsOrQuery})`, QUERY_STUCK_UPDATING].join(' AND ');
+ } else {
+ newQuery = QUERY_STUCK_UPDATING;
+ }
+ setUpdatingQuery(newQuery);
+
+ // if selection is a query, do an api call to get updating agents
+ try {
+ const res = await sendGetAgentStatus({
+ kuery: newQuery,
+ });
+ setUpdatingAgents(res?.data?.results?.updating ?? 0);
+ } catch (err) {
+ return;
+ }
+ };
+
+ if (!isUpdating) return;
+
+ getStuckUpdatingAgentCount(agents);
+ }, [isUpdating, setUpdatingQuery, QUERY_STUCK_UPDATING, agents]);
+
useEffect(() => {
const getVersions = async () => {
try {
@@ -166,14 +215,18 @@ export const AgentUpgradeAgentModal: React.FunctionComponent
+ Array.isArray(agentsOrQuery) ? agentsOrQuery.map((agent) => agent.id) : agentsOrQuery;
const { error } =
isSingleAgent && !isScheduled
? await sendPostAgentUpgrade((agents[0] as Agent).id, {
version,
+ force: isUpdating,
})
: await sendPostBulkAgentUpgrade({
version,
- agents: Array.isArray(agents) ? agents.map((agent) => agent.id) : agents,
+ agents: getQuery(isUpdating ? updatingQuery : agents),
+ force: isUpdating,
...rolloutOptions,
});
if (error) {
@@ -219,16 +272,29 @@ export const AgentUpgradeAgentModal: React.FunctionComponent
{isSingleAgent ? (
-
+ isUpdating ? (
+
+ ) : (
+
+ )
) : isScheduled ? (
+ ) : isUpdating ? (
+
) : (
}
- confirmButtonDisabled={isSubmitting || noVersions}
+ confirmButtonDisabled={isSubmitting || noVersions || (isUpdating && updatingAgents === 0)}
confirmButtonText={
isSingleAgent ? (
+ ) : isUpdating ? (
+
) : (
{
- const updatedPairs = [...keyValuePairs];
- updatedPairs[index][field] = value;
+ const updatedPairs = keyValuePairs.map((pair, i) => {
+ if (i === index) {
+ return {
+ ...pair,
+ [field]: value,
+ };
+ }
+ return pair;
+ });
onChange(updatedPairs);
},
[keyValuePairs, onChange]
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_kafka_topics.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_kafka_topics.tsx
index 55b76ccf84c57..9360a5c35bcd5 100644
--- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_kafka_topics.tsx
+++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_kafka_topics.tsx
@@ -94,17 +94,29 @@ export const OutputFormKafkaTopics: React.FunctionComponent<{ inputs: OutputForm
const handleTopicProcessorChange = useCallback(
(index: number, field: 'topic' | 'condition' | 'type', value: string) => {
- const updatedPairs = [...topics];
- if (field === 'topic') {
- updatedPairs[index].topic = value;
- } else {
- updatedPairs[index].when = {
- ...(updatedPairs[index].when || {}),
- ...((field === 'condition' ? { condition: value } : {}) as { condition?: string }),
- ...((field === 'type' ? { type: value } : {}) as { type?: ValueOf }),
- };
- }
- onChange(updatedPairs);
+ const updatedTopics = topics.map((topic, i) => {
+ if (i === index) {
+ if (field === 'topic') {
+ return {
+ ...topic,
+ topic: value,
+ };
+ } else {
+ return {
+ ...topic,
+ when: {
+ ...(topic.when || {}),
+ ...((field === 'condition' ? { condition: value } : {}) as { condition?: string }),
+ ...((field === 'type' ? { type: value } : {}) as {
+ type?: ValueOf;
+ }),
+ },
+ };
+ }
+ }
+ return topic;
+ });
+ onChange(updatedTopics);
},
[topics, onChange]
);
diff --git a/x-pack/plugins/fleet/server/collectors/agents_per_output.test.ts b/x-pack/plugins/fleet/server/collectors/agents_per_output.test.ts
new file mode 100644
index 0000000000000..3e91282891f2f
--- /dev/null
+++ b/x-pack/plugins/fleet/server/collectors/agents_per_output.test.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 { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server';
+
+import { getAgentsPerOutput } from './agents_per_output';
+
+jest.mock('../services', () => {
+ return {
+ agentPolicyService: {
+ list: jest.fn().mockResolvedValue({
+ items: [
+ { agents: 0, data_output_id: 'logstash1', monitoring_output_id: 'kafka1' },
+ { agents: 1 },
+ { agents: 1, data_output_id: 'logstash1' },
+ { agents: 1, monitoring_output_id: 'kafka1' },
+ { agents: 1, data_output_id: 'elasticsearch2', monitoring_output_id: 'elasticsearch2' },
+ ],
+ }),
+ },
+ };
+});
+
+describe('agents_per_output', () => {
+ const soClientMock = {
+ find: jest.fn().mockResolvedValue({
+ saved_objects: [
+ {
+ id: 'default-output',
+ attributes: { is_default: true, is_default_monitoring: true, type: 'elasticsearch' },
+ },
+ { id: 'logstash1', attributes: { type: 'logstash' } },
+ { id: 'kafka1', attributes: { type: 'kafka' } },
+ { id: 'elasticsearch2', attributes: { type: 'elasticsearch' } },
+ ],
+ }),
+ } as unknown as SavedObjectsClientContract;
+
+ it('should return agent count by output type', async () => {
+ const res = await getAgentsPerOutput(soClientMock, {} as unknown as ElasticsearchClient);
+ expect(res).toEqual([
+ { output_type: 'elasticsearch', count_as_data: 3, count_as_monitoring: 3 },
+ { output_type: 'logstash', count_as_data: 1, count_as_monitoring: 0 },
+ { output_type: 'kafka', count_as_data: 0, count_as_monitoring: 1 },
+ ]);
+ });
+});
diff --git a/x-pack/plugins/fleet/server/collectors/agents_per_output.ts b/x-pack/plugins/fleet/server/collectors/agents_per_output.ts
new file mode 100644
index 0000000000000..54733dace2057
--- /dev/null
+++ b/x-pack/plugins/fleet/server/collectors/agents_per_output.ts
@@ -0,0 +1,70 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server';
+import _ from 'lodash';
+
+import { OUTPUT_SAVED_OBJECT_TYPE, SO_SEARCH_LIMIT } from '../../common';
+import type { OutputSOAttributes } from '../types';
+import { agentPolicyService } from '../services';
+
+export interface AgentsPerOutputType {
+ output_type: string;
+ count_as_data: number;
+ count_as_monitoring: number;
+}
+
+export async function getAgentsPerOutput(
+ soClient: SavedObjectsClientContract,
+ esClient: ElasticsearchClient
+): Promise {
+ const { saved_objects: outputs } = await soClient.find({
+ type: OUTPUT_SAVED_OBJECT_TYPE,
+ page: 1,
+ perPage: SO_SEARCH_LIMIT,
+ });
+
+ const defaultOutputId = outputs.find((output) => output.attributes.is_default)?.id || '';
+ const defaultMonitoringOutputId =
+ outputs.find((output) => output.attributes.is_default_monitoring)?.id || '';
+
+ const outputsById = _.keyBy(outputs, 'id');
+ const getOutputTypeById = (outputId: string): string => outputsById[outputId]?.attributes.type;
+
+ const { items } = await agentPolicyService.list(soClient, {
+ esClient,
+ withAgentCount: true,
+ page: 1,
+ perPage: SO_SEARCH_LIMIT,
+ });
+ const outputTypes: { [key: string]: AgentsPerOutputType } = {};
+ items
+ .filter((item) => (item.agents ?? 0) > 0)
+ .forEach((item) => {
+ const dataOutputType = getOutputTypeById(item.data_output_id || defaultOutputId);
+ if (!outputTypes[dataOutputType]) {
+ outputTypes[dataOutputType] = {
+ output_type: dataOutputType,
+ count_as_data: 0,
+ count_as_monitoring: 0,
+ };
+ }
+ outputTypes[dataOutputType].count_as_data += item.agents ?? 0;
+ const monitoringOutputType = getOutputTypeById(
+ item.monitoring_output_id || defaultMonitoringOutputId
+ );
+ if (!outputTypes[monitoringOutputType]) {
+ outputTypes[monitoringOutputType] = {
+ output_type: monitoringOutputType,
+ count_as_data: 0,
+ count_as_monitoring: 0,
+ };
+ }
+ outputTypes[monitoringOutputType].count_as_monitoring += item.agents ?? 0;
+ });
+ return Object.values(outputTypes);
+}
diff --git a/x-pack/plugins/fleet/server/collectors/register.ts b/x-pack/plugins/fleet/server/collectors/register.ts
index d31548d330897..01d0a65f2cf08 100644
--- a/x-pack/plugins/fleet/server/collectors/register.ts
+++ b/x-pack/plugins/fleet/server/collectors/register.ts
@@ -22,6 +22,8 @@ import { getAgentPoliciesUsage } from './agent_policies';
import type { AgentPanicLogsData } from './agent_logs_panics';
import { getPanicLogsLastHour } from './agent_logs_panics';
import { getAgentLogsTopErrors } from './agent_logs_top_errors';
+import type { AgentsPerOutputType } from './agents_per_output';
+import { getAgentsPerOutput } from './agents_per_output';
export interface Usage {
agents_enabled: boolean;
@@ -36,6 +38,7 @@ export interface FleetUsage extends Usage, AgentData {
agent_logs_panics_last_hour: AgentPanicLogsData['agent_logs_panics_last_hour'];
agent_logs_top_errors?: string[];
fleet_server_logs_top_errors?: string[];
+ agents_per_output_type: AgentsPerOutputType[];
}
export const fetchFleetUsage = async (
@@ -57,6 +60,7 @@ export const fetchFleetUsage = async (
agent_policies: await getAgentPoliciesUsage(soClient),
...(await getPanicLogsLastHour(esClient)),
...(await getAgentLogsTopErrors(esClient)),
+ agents_per_output_type: await getAgentsPerOutput(soClient, esClient),
};
return usage;
};
diff --git a/x-pack/plugins/fleet/server/integration_tests/fleet_usage_telemetry.test.ts b/x-pack/plugins/fleet/server/integration_tests/fleet_usage_telemetry.test.ts
index 2aeb7a0e1a963..046ac5dfe9fad 100644
--- a/x-pack/plugins/fleet/server/integration_tests/fleet_usage_telemetry.test.ts
+++ b/x-pack/plugins/fleet/server/integration_tests/fleet_usage_telemetry.test.ts
@@ -207,6 +207,20 @@ describe('fleet usage telemetry', () => {
},
],
},
+ {
+ create: {
+ _id: 'agent3',
+ },
+ },
+ {
+ agent: {
+ version: '8.6.0',
+ },
+ last_checkin_status: 'online',
+ last_checkin: '2023-09-13T12:26:24Z',
+ active: true,
+ policy_id: 'policy2',
+ },
],
refresh: 'wait_for',
});
@@ -348,20 +362,24 @@ describe('fleet usage telemetry', () => {
{ id: 'output3' }
);
- await soClient.create('ingest-agent-policies', {
- namespace: 'default',
- monitoring_enabled: ['logs', 'metrics'],
- name: 'Another policy',
- description: 'Policy 2',
- inactivity_timeout: 1209600,
- status: 'active',
- is_managed: false,
- revision: 2,
- updated_by: 'system',
- schema_version: '1.0.0',
- data_output_id: 'output2',
- monitoring_output_id: 'output3',
- });
+ await soClient.create(
+ 'ingest-agent-policies',
+ {
+ namespace: 'default',
+ monitoring_enabled: ['logs', 'metrics'],
+ name: 'Another policy',
+ description: 'Policy 2',
+ inactivity_timeout: 1209600,
+ status: 'active',
+ is_managed: false,
+ revision: 2,
+ updated_by: 'system',
+ schema_version: '1.0.0',
+ data_output_id: 'output2',
+ monitoring_output_id: 'output3',
+ },
+ { id: 'policy2' }
+ );
});
afterAll(async () => {
@@ -379,13 +397,13 @@ describe('fleet usage telemetry', () => {
expect.objectContaining({
agents_enabled: true,
agents: {
- total_enrolled: 2,
+ total_enrolled: 3,
healthy: 0,
unhealthy: 0,
inactive: 0,
unenrolled: 1,
- offline: 2,
- total_all_statuses: 3,
+ offline: 3,
+ total_all_statuses: 4,
updating: 0,
},
fleet_server: {
@@ -400,28 +418,28 @@ describe('fleet usage telemetry', () => {
packages: [],
agents_per_version: [
{
- version: '8.5.1',
- count: 1,
+ version: '8.6.0',
+ count: 2,
healthy: 0,
inactive: 0,
- offline: 1,
- unenrolled: 1,
+ offline: 2,
+ unenrolled: 0,
unhealthy: 0,
updating: 0,
},
{
- version: '8.6.0',
+ version: '8.5.1',
count: 1,
healthy: 0,
inactive: 0,
offline: 1,
- unenrolled: 0,
+ unenrolled: 1,
unhealthy: 0,
updating: 0,
},
],
agent_checkin_status: { error: 1, degraded: 1 },
- agents_per_policy: [2],
+ agents_per_policy: [2, 1],
agents_per_os: [
{
name: 'Ubuntu',
@@ -434,6 +452,18 @@ describe('fleet usage telemetry', () => {
count: 1,
},
],
+ agents_per_output_type: [
+ {
+ count_as_data: 1,
+ count_as_monitoring: 0,
+ output_type: 'third_type',
+ },
+ {
+ count_as_data: 0,
+ count_as_monitoring: 1,
+ output_type: 'logstash',
+ },
+ ],
fleet_server_config: {
policies: [
{
diff --git a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
index f01f6d71df89d..385b1095cb9f4 100644
--- a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
+++ b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts
@@ -42,7 +42,7 @@ spec:
# - -c
# - >-
# mkdir -p /etc/elastic-agent/inputs.d &&
- # wget -O - https://github.com/elastic/elastic-agent/archive/main.tar.gz | tar xz -C /etc/elastic-agent/inputs.d --strip=5 "elastic-agent-main/deploy/kubernetes/elastic-agent-standalone/templates.d"
+ # wget -O - https://github.com/elastic/elastic-agent/archive/main.tar.gz | tar xz -C /etc/elastic-agent/inputs.d --strip=5 "elastic-agent-main/deploy/kubernetes/elastic-agent/templates.d"
# volumeMounts:
# - name: external-inputs
# mountPath: /etc/elastic-agent/inputs.d
@@ -68,6 +68,10 @@ spec:
fieldPath: metadata.name
- name: STATE_PATH
value: "/etc/elastic-agent"
+ # The following ELASTIC_NETINFO:false variable will disable the netinfo.enabled option of add-host-metadata processor. This will remove fields host.ip and host.mac.
+ # For more info: https://www.elastic.co/guide/en/beats/metricbeat/current/add-host-metadata.html
+ - name: ELASTIC_NETINFO
+ value: "false"
securityContext:
runAsUser: 0
# The following capabilities are needed for 'Defend for containers' integration (cloud-defend)
@@ -389,6 +393,10 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.name
+ # The following ELASTIC_NETINFO:false variable will disable the netinfo.enabled option of add-host-metadata processor. This will remove fields host.ip and host.mac.
+ # For more info: https://www.elastic.co/guide/en/beats/metricbeat/current/add-host-metadata.html
+ - name: ELASTIC_NETINFO
+ value: "false"
securityContext:
runAsUser: 0
# The following capabilities are needed for 'Defend for containers' integration (cloud-defend)
diff --git a/x-pack/plugins/fleet/server/services/telemetry/fleet_usage_sender.ts b/x-pack/plugins/fleet/server/services/telemetry/fleet_usage_sender.ts
index 102f34c280800..555223c7b5b1c 100644
--- a/x-pack/plugins/fleet/server/services/telemetry/fleet_usage_sender.ts
+++ b/x-pack/plugins/fleet/server/services/telemetry/fleet_usage_sender.ts
@@ -24,7 +24,7 @@ const FLEET_AGENTS_EVENT_TYPE = 'fleet_agents';
export class FleetUsageSender {
private taskManager?: TaskManagerStartContract;
- private taskVersion = '1.1.1';
+ private taskVersion = '1.1.2';
private taskType = 'Fleet-Usage-Sender';
private wasStarted: boolean = false;
private interval = '1h';
@@ -80,7 +80,11 @@ export class FleetUsageSender {
if (!usageData) {
return;
}
- const { agents_per_version: agentsPerVersion, ...fleetUsageData } = usageData;
+ const {
+ agents_per_version: agentsPerVersion,
+ agents_per_output_type: agentsPerOutputType,
+ ...fleetUsageData
+ } = usageData;
appContextService
.getLogger()
.debug('Fleet usage telemetry: ' + JSON.stringify(fleetUsageData));
@@ -93,6 +97,15 @@ export class FleetUsageSender {
agentsPerVersion.forEach((byVersion) => {
core.analytics.reportEvent(FLEET_AGENTS_EVENT_TYPE, { agents_per_version: byVersion });
});
+
+ appContextService
+ .getLogger()
+ .debug('Agents per output type telemetry: ' + JSON.stringify(agentsPerOutputType));
+ agentsPerOutputType.forEach((byOutputType) => {
+ core.analytics.reportEvent(FLEET_AGENTS_EVENT_TYPE, {
+ agents_per_output_type: byOutputType,
+ });
+ });
} catch (error) {
appContextService
.getLogger()
diff --git a/x-pack/plugins/fleet/server/services/telemetry/fleet_usages_schema.ts b/x-pack/plugins/fleet/server/services/telemetry/fleet_usages_schema.ts
index 616d30ad3d4b1..e59de684264bf 100644
--- a/x-pack/plugins/fleet/server/services/telemetry/fleet_usages_schema.ts
+++ b/x-pack/plugins/fleet/server/services/telemetry/fleet_usages_schema.ts
@@ -9,6 +9,10 @@ import type { RootSchema } from '@kbn/analytics-client';
export const fleetAgentsSchema: RootSchema = {
agents_per_version: {
+ _meta: {
+ description: 'Agents per version telemetry',
+ optional: true,
+ },
properties: {
version: {
type: 'keyword',
@@ -60,6 +64,32 @@ export const fleetAgentsSchema: RootSchema = {
},
},
},
+ agents_per_output_type: {
+ _meta: {
+ description: 'Agents per output type telemetry',
+ optional: true,
+ },
+ properties: {
+ output_type: {
+ type: 'keyword',
+ _meta: {
+ description: 'Output type used by agent',
+ },
+ },
+ count_as_data: {
+ type: 'long',
+ _meta: {
+ description: 'Number of agents enrolled that use this output type as data output',
+ },
+ },
+ count_as_monitoring: {
+ type: 'long',
+ _meta: {
+ description: 'Number of agents enrolled that use this output type as monitoring output',
+ },
+ },
+ },
+ },
};
export const fleetUsagesSchema: RootSchema = {
diff --git a/x-pack/plugins/graph/public/components/control_panel/selection_tool_bar.tsx b/x-pack/plugins/graph/public/components/control_panel/selection_tool_bar.tsx
index e2e9771a8e9ef..b69aedfa12699 100644
--- a/x-pack/plugins/graph/public/components/control_panel/selection_tool_bar.tsx
+++ b/x-pack/plugins/graph/public/components/control_panel/selection_tool_bar.tsx
@@ -7,7 +7,7 @@
import React from 'react';
import { i18n } from '@kbn/i18n';
-import { EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui';
+import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui';
import { ControlType, Workspace } from '../../types';
interface SelectionToolBarProps {
@@ -74,61 +74,62 @@ export const SelectionToolBar = ({ workspace, onSetControl }: SelectionToolBarPr
>
-
{i18n.translate('xpack.graph.sidebar.selections.selectAllButtonLabel', {
defaultMessage: 'all',
})}
-
+
-
{i18n.translate('xpack.graph.sidebar.selections.selectNoneButtonLabel', {
defaultMessage: 'none',
})}
-
+
-
{i18n.translate('xpack.graph.sidebar.selections.invertSelectionButtonLabel', {
defaultMessage: 'invert',
})}
-
+
-
{i18n.translate('xpack.graph.sidebar.selections.selectNeighboursButtonLabel', {
defaultMessage: 'linked',
})}
-
+
diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_render_props.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_render_props.ts
index eab5f8326f525..b8b857ae5ab94 100644
--- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_render_props.ts
+++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_render_props.ts
@@ -21,12 +21,12 @@ export function useAssetDetailsRenderProps({ props }: UseAssetDetailsRenderProps
// When the asset asset.name is known we can load the page faster
// Otherwise we need to use metadata response.
- const loading = !urlState?.name && !asset.name && !metadata?.name;
+ const loading = !asset.name && !urlState?.name && !metadata?.name;
return {
asset: {
...asset,
- name: urlState?.name || asset.name || metadata?.name || '',
+ name: asset.name || urlState?.name || metadata?.name || '',
},
assetType,
overrides,
diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts
index 525a5b635e19b..305e934c59dce 100644
--- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts
+++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_asset_details_url_state.ts
@@ -9,14 +9,13 @@ import * as rt from 'io-ts';
import { pipe } from 'fp-ts/lib/pipeable';
import { fold } from 'fp-ts/lib/Either';
import { constant, identity } from 'fp-ts/lib/function';
+import { useCallback } from 'react';
import { ContentTabIds } from '../types';
import { useUrlState } from '../../../utils/use_url_state';
import { ASSET_DETAILS_URL_STATE_KEY } from '../constants';
-import { getDefaultDateRange } from '../utils';
export const DEFAULT_STATE: AssetDetailsUrlState = {
tabId: ContentTabIds.OVERVIEW,
- dateRange: getDefaultDateRange(),
};
type SetAssetDetailsState = (newProp: Payload | null) => void;
@@ -29,18 +28,21 @@ export const useAssetDetailsUrlState = (): [AssetDetailsUrl, SetAssetDetailsStat
urlStateKey: ASSET_DETAILS_URL_STATE_KEY,
});
- const setAssetDetailsState = (newProps: Payload | null) => {
- if (!newProps) {
- setUrlState(DEFAULT_STATE);
- } else {
- const payload = Object.fromEntries(
- Object.entries(newProps).filter(([_, v]) => !!v || v === '')
- );
- setUrlState({ ...(urlState ?? DEFAULT_STATE), ...payload });
- }
- };
+ const setAssetDetailsState = useCallback(
+ (newProps: Payload | null) => {
+ if (!newProps) {
+ setUrlState(null);
+ } else {
+ const payload = Object.fromEntries(
+ Object.entries(newProps ?? {}).filter(([_, v]) => !!v || v === '')
+ );
+ setUrlState((previous) => ({ ...previous, ...payload }));
+ }
+ },
+ [setUrlState]
+ );
- return [urlState as AssetDetailsUrl, setAssetDetailsState];
+ return [urlState, setAssetDetailsState];
};
const TabIdRT = rt.union([
@@ -52,21 +54,17 @@ const TabIdRT = rt.union([
rt.literal(ContentTabIds.OSQUERY),
]);
-const AssetDetailsUrlStateRT = rt.intersection([
- rt.type({
- dateRange: rt.type({
- from: rt.string,
- to: rt.string,
- }),
+const AssetDetailsUrlStateRT = rt.partial({
+ dateRange: rt.type({
+ from: rt.string,
+ to: rt.string,
}),
- rt.partial({
- tabId: TabIdRT,
- name: rt.string,
- processSearch: rt.string,
- metadataSearch: rt.string,
- logsSearch: rt.string,
- }),
-]);
+ tabId: TabIdRT,
+ name: rt.string,
+ processSearch: rt.string,
+ metadataSearch: rt.string,
+ logsSearch: rt.string,
+});
const AssetDetailsUrlRT = rt.union([AssetDetailsUrlStateRT, rt.null]);
diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_date_range.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_date_range.ts
index 345d197f23945..3f3e89f7c9a23 100644
--- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_date_range.ts
+++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_date_range.ts
@@ -14,7 +14,7 @@ import { getDefaultDateRange, toTimestampRange } from '../utils';
import { useAssetDetailsUrlState } from './use_asset_details_url_state';
export interface UseDateRangeProviderProps {
- initialDateRange: TimeRange;
+ initialDateRange?: TimeRange;
}
export function useDateRangeProvider({
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi.tsx
new file mode 100644
index 0000000000000..54305b7212a55
--- /dev/null
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi.tsx
@@ -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; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import React, { useMemo } from 'react';
+
+import type { DataView } from '@kbn/data-views-plugin/public';
+import { TimeRange } from '@kbn/es-query';
+import { LensChart, TooltipContent } from '../../../../lens';
+import { AVERAGE_SUBTITLE, type KPIChartProps } from '../../../../../common/visualizations';
+import { buildCombinedHostsFilter } from '../../../../../utils/filters/build';
+
+import { useDateRangeProviderContext } from '../../../hooks/use_date_range';
+
+export const Kpi = ({
+ id,
+ title,
+ layers,
+ toolTip,
+ height,
+ dataView,
+ assetName,
+ dateRange,
+}: KPIChartProps & {
+ height: number;
+ dataView?: DataView;
+ assetName: string;
+ dateRange: TimeRange;
+}) => {
+ const { refreshTs } = useDateRangeProviderContext();
+ const filters = useMemo(() => {
+ return [
+ buildCombinedHostsFilter({
+ field: 'host.name',
+ values: [assetName],
+ dataView,
+ }),
+ ];
+ }, [dataView, assetName]);
+
+ const tooltipContent = useMemo(() => , [toolTip]);
+
+ return (
+
+ );
+};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx
index 011cb94c35253..034d6feaacfcd 100644
--- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx
@@ -5,57 +5,33 @@
* 2.0.
*/
-import React, { useMemo } from 'react';
+import React from 'react';
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import type { DataView } from '@kbn/data-views-plugin/public';
import type { TimeRange } from '@kbn/es-query';
-import { LensChart, TooltipContent } from '../../../../lens';
-import { buildCombinedHostsFilter } from '../../../../../utils/filters/build';
-import {
- assetDetailsDashboards,
- KPI_CHART_HEIGHT,
- AVERAGE_SUBTITLE,
-} from '../../../../../common/visualizations';
-import { useDateRangeProviderContext } from '../../../hooks/use_date_range';
+import { assetDetailsDashboards, KPI_CHART_HEIGHT } from '../../../../../common/visualizations';
+import { Kpi } from './kpi';
interface Props {
dataView?: DataView;
- nodeName: string;
- timeRange: TimeRange;
+ assetName: string;
+ dateRange: TimeRange;
}
-export const KPIGrid = React.memo(({ nodeName, dataView, timeRange }: Props) => {
- const { refreshTs } = useDateRangeProviderContext();
- const filters = useMemo(() => {
- return [
- buildCombinedHostsFilter({
- field: 'host.name',
- values: [nodeName],
- dataView,
- }),
- ];
- }, [dataView, nodeName]);
-
+export const KPIGrid = ({ assetName, dataView, dateRange }: Props) => {
return (
- {assetDetailsDashboards.host.hostKPICharts.map(({ id, layers, title, toolTip }, index) => (
+ {assetDetailsDashboards.host.hostKPICharts.map((chartProps, index) => (
- }
- visualizationType="lnsMetric"
- disableTriggers
- hidePanelTitles
/>
))}
);
-});
+};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart.tsx
new file mode 100644
index 0000000000000..b0c3edf983ee7
--- /dev/null
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart.tsx
@@ -0,0 +1,99 @@
+/*
+ * 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, { useCallback, useMemo } from 'react';
+import type { XYVisualOptions } from '@kbn/lens-embeddable-utils';
+import type { DataView } from '@kbn/data-views-plugin/public';
+import { TimeRange } from '@kbn/es-query';
+import type { XYConfig } from '../../../../../common/visualizations/lens/dashboards/asset_details/metric_charts/types';
+import { buildCombinedHostsFilter } from '../../../../../utils/filters/build';
+import { BrushEndArgs, LensChart, OnFilterEvent } from '../../../../lens';
+import { METRIC_CHART_HEIGHT } from '../../../constants';
+import { useDateRangeProviderContext } from '../../../hooks/use_date_range';
+import { extractRangeFromChartFilterEvent } from './chart_utils';
+
+export interface ChartProps extends XYConfig {
+ visualOptions?: XYVisualOptions;
+ metricsDataView?: DataView;
+ logsDataView?: DataView;
+ dateRange: TimeRange;
+ assetName: string;
+ ['data-test-subj']: string;
+}
+
+export const Chart = ({
+ id,
+ title,
+ layers,
+ metricsDataView,
+ logsDataView,
+ visualOptions,
+ dataViewOrigin,
+ overrides,
+ dateRange,
+ assetName,
+ ...props
+}: ChartProps) => {
+ const { setDateRange } = useDateRangeProviderContext();
+
+ const dataView = useMemo(() => {
+ return dataViewOrigin === 'metrics' ? metricsDataView : logsDataView;
+ }, [dataViewOrigin, logsDataView, metricsDataView]);
+
+ const filters = useMemo(() => {
+ return [
+ buildCombinedHostsFilter({
+ field: 'host.name',
+ values: [assetName],
+ dataView,
+ }),
+ ];
+ }, [assetName, dataView]);
+
+ const handleBrushEnd = useCallback(
+ ({ range, preventDefault }: BrushEndArgs) => {
+ setDateRange({
+ from: new Date(range[0]).toISOString(),
+ to: new Date(range[1]).toISOString(),
+ });
+
+ preventDefault();
+ },
+ [setDateRange]
+ );
+
+ const handleFilter = useCallback(
+ (event: OnFilterEvent) => {
+ const range = extractRangeFromChartFilterEvent(event);
+
+ if (range === null) {
+ return;
+ }
+
+ setDateRange(range);
+ event.preventDefault();
+ },
+ [setDateRange]
+ );
+
+ return (
+
+ );
+};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart_utils.ts b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart_utils.ts
index 1eba3da363559..a141c565d2642 100644
--- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart_utils.ts
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/chart_utils.ts
@@ -8,12 +8,10 @@
import { MultiValueClickContext } from '@kbn/embeddable-plugin/public';
import { TimeRange } from '@kbn/es-query';
import { DatatableColumn, DatatableRow } from '@kbn/expressions-plugin/common/expression_types';
-import { LensEmbeddableInput } from '@kbn/lens-plugin/public';
+import type { OnFilterEvent } from '../../../../lens';
type ChartClickContextData = MultiValueClickContext['data']['data'];
-export type OnFilterEvent = Parameters>[0];
-
export function isChartClickContextData(data: unknown): data is ChartClickContextData {
return Array.isArray(data) && Array.isArray(data[0]?.cells) && data[0].cells.length > 0;
}
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_charts_section.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_charts_section.tsx
deleted file mode 100644
index 0b27254fdc146..0000000000000
--- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_charts_section.tsx
+++ /dev/null
@@ -1,148 +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, { useCallback, useMemo } from 'react';
-
-import { EuiFlexGrid, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
-import type { DataView } from '@kbn/data-views-plugin/public';
-import type { TimeRange } from '@kbn/es-query';
-import { LensEmbeddableInput } from '@kbn/lens-plugin/public';
-import { XY_MISSING_VALUE_DOTTED_LINE_CONFIG } from '../../../../../common/visualizations';
-import type { XYConfig } from '../../../../../common/visualizations/lens/dashboards/asset_details/metric_charts/types';
-import { buildCombinedHostsFilter } from '../../../../../utils/filters/build';
-import { LensChart } from '../../../../lens';
-import { METRIC_CHART_HEIGHT } from '../../../constants';
-import { useDateRangeProviderContext } from '../../../hooks/use_date_range';
-import { useMetadataStateProviderContext } from '../../../hooks/use_metadata_state';
-import type { DataViewOrigin } from '../../../types';
-import type { OnFilterEvent } from './chart_utils';
-import { extractRangeFromChartFilterEvent } from './chart_utils';
-
-type BrushEndArgs = Parameters>[0];
-
-interface ChartGridProps {
- assetName: string;
- timeRange: TimeRange;
- metricsDataView?: DataView;
- logsDataView?: DataView;
- charts: Array;
- ['data-test-subj']: string;
-}
-
-export const ChartGrid = React.memo(
- ({ assetName, metricsDataView, logsDataView, timeRange, charts, ...props }: ChartGridProps) => {
- const { setDateRange } = useDateRangeProviderContext();
- const getDataView = useCallback(
- (dataViewOrigin: DataViewOrigin) => {
- return dataViewOrigin === 'metrics' ? metricsDataView : logsDataView;
- },
- [logsDataView, metricsDataView]
- );
- const { metadata } = useMetadataStateProviderContext();
-
- const getFilters = useCallback(
- (dataViewOrigin: DataViewOrigin) => {
- return [
- buildCombinedHostsFilter({
- field: 'host.name',
- values: [assetName],
- dataView: getDataView(dataViewOrigin),
- }),
- ];
- },
- [getDataView, assetName]
- );
-
- const handleBrushEnd = useCallback(
- ({ range, preventDefault }: BrushEndArgs) => {
- setDateRange({
- from: new Date(range[0]).toISOString(),
- to: new Date(range[1]).toISOString(),
- });
-
- preventDefault();
- },
- [setDateRange]
- );
-
- const handleFilter = useCallback(
- (event: OnFilterEvent) => {
- const range = extractRangeFromChartFilterEvent(event);
-
- if (range === null) {
- return;
- }
-
- setDateRange(range);
- event.preventDefault();
- },
- [setDateRange]
- );
-
- const chartsToRender = useMemo(
- () =>
- charts.filter(
- (c) =>
- !c.dependsOn ||
- c.dependsOn.every((d) => (metadata?.features ?? []).some((f) => d === f.name))
- ),
- [charts, metadata?.features]
- );
-
- return (
-
- {chartsToRender.map(({ dataViewOrigin, id, layers, title, overrides }, index) => (
-
-
-
- ))}
-
- );
- }
-);
-
-export const Section = ({
- title,
- dependsOn = [],
- children,
-}: {
- title: React.FunctionComponent;
- dependsOn?: string[];
- children: React.ReactNode;
-}) => {
- const Title = title;
- const { metadata } = useMetadataStateProviderContext();
-
- const shouldRender = useMemo(
- () =>
- dependsOn.length === 0 ||
- dependsOn.some((p) => (metadata?.features ?? []).some((f) => f.name === p)),
- [dependsOn, metadata?.features]
- );
-
- return shouldRender ? (
-
-
-
-
- {children}
-
- ) : null;
-};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_grid.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_grid.tsx
index 0ec0f51dcd18f..d7ed6509f0812 100644
--- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_grid.tsx
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_grid.tsx
@@ -4,77 +4,57 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import React from 'react';
-
-import { EuiSpacer } from '@elastic/eui';
+import React, { useMemo } from 'react';
import type { DataView } from '@kbn/data-views-plugin/public';
+import { EuiFlexItem, EuiFlexGrid } from '@elastic/eui';
import type { TimeRange } from '@kbn/es-query';
-import { assetDetailsDashboards } from '../../../../../common/visualizations';
-import { ChartGrid, Section } from './metrics_charts_section';
-import { MetricsSectionTitle, NginxMetricsSectionTitle } from '../../../components/section_titles';
+import type { XYConfig } from '../../../../../common/visualizations/lens/dashboards/asset_details/metric_charts/types';
+import { useMetadataStateProviderContext } from '../../../hooks/use_metadata_state';
+import { Chart } from './chart';
interface Props {
assetName: string;
dateRange: TimeRange;
metricsDataView?: DataView;
logsDataView?: DataView;
+ charts: Array;
+ ['data-test-subj']: string;
}
-const { host, nginx } = assetDetailsDashboards;
+export const MetricsGrid = ({
+ assetName,
+ metricsDataView,
+ logsDataView,
+ dateRange,
+ charts,
+ ...props
+}: Props) => {
+ const { metadata } = useMetadataStateProviderContext();
-export const MetricsGrid = React.memo(
- ({ assetName, metricsDataView, logsDataView, dateRange: timeRange }: Props) => {
- return (
- <>
-
-
+ charts.filter(
+ (c) =>
+ !c.dependsOn ||
+ c.dependsOn.every((d) => (metadata?.features ?? []).some((f) => d === f.name))
+ ),
+ [charts, metadata?.features]
+ );
+
+ return (
+
+ {chartsToRender.map((chartProp, index) => (
+
+
-
-
-
- ({
- ...chart,
- dependsOn: ['nginx.stubstatus'],
- })),
- ...nginx.nginxAccessCharts.map((chart) => ({
- ...chart,
- dependsOn: ['nginx.access'],
- })),
- ]}
metricsDataView={metricsDataView}
- logsDataView={logsDataView}
- data-test-subj="infraAssetDetailsNginxMetricsChart"
+ data-test-subj={props['data-test-subj']}
/>
-
- >
- );
- }
-);
-
-export const MetricsGridCompact = ({
- assetName,
- metricsDataView,
- logsDataView,
- dateRange: timeRange,
-}: Props) => (
-
-);
+
+ ))}
+
+ );
+};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx
new file mode 100644
index 0000000000000..e76397b689ca9
--- /dev/null
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/metrics/metrics_section.tsx
@@ -0,0 +1,109 @@
+/*
+ * 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 { EuiSpacer, EuiFlexItem } from '@elastic/eui';
+import type { DataView } from '@kbn/data-views-plugin/public';
+import type { TimeRange } from '@kbn/es-query';
+import { EuiFlexGroup } from '@elastic/eui';
+import { assetDetailsDashboards } from '../../../../../common/visualizations';
+import { MetricsSectionTitle, NginxMetricsSectionTitle } from '../../../components/section_titles';
+import { useMetadataStateProviderContext } from '../../../hooks/use_metadata_state';
+import { MetricsGrid } from './metrics_grid';
+
+interface Props {
+ assetName: string;
+ dateRange: TimeRange;
+ metricsDataView?: DataView;
+ logsDataView?: DataView;
+}
+
+const { host, nginx } = assetDetailsDashboards;
+
+export const MetricsSection = ({ assetName, metricsDataView, logsDataView, dateRange }: Props) => {
+ return (
+ <>
+
+
+
+ ({
+ ...chart,
+ dependsOn: ['nginx.stubstatus'],
+ })),
+ ...nginx.nginxAccessCharts.map((chart) => ({
+ ...chart,
+ dependsOn: ['nginx.access'],
+ })),
+ ]}
+ metricsDataView={metricsDataView}
+ logsDataView={logsDataView}
+ data-test-subj="infraAssetDetailsNginxMetricsChart"
+ />
+
+ >
+ );
+};
+
+export const MetricsSectionCompact = ({
+ assetName,
+ metricsDataView,
+ logsDataView,
+ dateRange,
+}: Props) => (
+
+);
+
+const Section = ({
+ title,
+ dependsOn = [],
+ children,
+}: {
+ title: React.FunctionComponent;
+ dependsOn?: string[];
+ children: React.ReactNode;
+}) => {
+ const Title = title;
+ const { metadata } = useMetadataStateProviderContext();
+
+ const shouldRender = useMemo(
+ () =>
+ dependsOn.length === 0 ||
+ dependsOn.some((p) => (metadata?.features ?? []).some((f) => f.name === p)),
+ [dependsOn, metadata?.features]
+ );
+
+ return shouldRender ? (
+
+
+
+
+ {children}
+
+ ) : null;
+};
diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/overview.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/overview.tsx
index ffc2d46179146..37478884880b8 100644
--- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/overview.tsx
+++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/overview.tsx
@@ -5,7 +5,7 @@
* 2.0.
*/
-import React from 'react';
+import React, { useMemo } from 'react';
import { i18n } from '@kbn/i18n';
import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
@@ -15,7 +15,7 @@ import {
} from './metadata_summary/metadata_summary_list';
import { AlertsSummaryContent } from './alerts';
import { KPIGrid } from './kpis/kpi_grid';
-import { MetricsGrid, MetricsGridCompact } from './metrics/metrics_grid';
+import { MetricsSection, MetricsSectionCompact } from './metrics/metrics_section';
import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props';
import { useMetadataStateProviderContext } from '../../hooks/use_metadata_state';
import { useDataViewsProviderContext } from '../../hooks/use_data_views';
@@ -32,18 +32,18 @@ export const Overview = () => {
} = useMetadataStateProviderContext();
const { logs, metrics } = useDataViewsProviderContext();
- const parsedDateRange = getParsedDateRange();
+ const parsedDateRange = useMemo(() => getParsedDateRange(), [getParsedDateRange]);
const isFullPageView = renderMode.mode !== 'flyout';
const metricsSection = isFullPageView ? (
-
) : (
- {
return (
-
+
{fetchMetadataError ? (
diff --git a/x-pack/plugins/infra/public/components/asset_details/template/flyout.tsx b/x-pack/plugins/infra/public/components/asset_details/template/flyout.tsx
index f8b4272dae0e6..d7d80c1117ca2 100644
--- a/x-pack/plugins/infra/public/components/asset_details/template/flyout.tsx
+++ b/x-pack/plugins/infra/public/components/asset_details/template/flyout.tsx
@@ -41,8 +41,8 @@ export const Flyout = ({
});
const handleOnClose = useCallback(() => {
- closeFlyout();
setUrlState(null);
+ closeFlyout();
}, [closeFlyout, setUrlState]);
return (
diff --git a/x-pack/plugins/infra/public/components/lens/lens_chart.tsx b/x-pack/plugins/infra/public/components/lens/lens_chart.tsx
index c67d659fc3e10..613cfec566572 100644
--- a/x-pack/plugins/infra/public/components/lens/lens_chart.tsx
+++ b/x-pack/plugins/infra/public/components/lens/lens_chart.tsx
@@ -4,7 +4,7 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import React, { CSSProperties, useMemo } from 'react';
+import React from 'react';
import { EuiPanel, EuiToolTip, type EuiPanelProps } from '@elastic/eui';
import { Action } from '@kbn/ui-actions-plugin/public';
import { css } from '@emotion/react';
@@ -22,88 +22,82 @@ export type LensChartProps = UseLensAttributesParams &
toolTip?: React.ReactElement;
};
-export const LensChart = ({
- id,
- borderRadius,
- dateRange,
- filters,
- hidePanelTitles,
- lastReloadRequestTime,
- query,
- onBrushEnd,
- onFilter,
- overrides,
- toolTip,
- disableTriggers = false,
- height = MIN_HEIGHT,
- loading = false,
- ...lensAttributesParams
-}: LensChartProps) => {
- const { formula, attributes, getExtraActions, error } = useLensAttributes({
- ...lensAttributesParams,
- });
+export const LensChart = React.memo(
+ ({
+ id,
+ borderRadius,
+ dateRange,
+ filters,
+ hidePanelTitles,
+ lastReloadRequestTime,
+ query,
+ onBrushEnd,
+ onFilter,
+ overrides,
+ toolTip,
+ disableTriggers = false,
+ height = MIN_HEIGHT,
+ loading = false,
+ ...lensAttributesParams
+ }: LensChartProps) => {
+ const { formula, attributes, getExtraActions, error } = useLensAttributes(lensAttributesParams);
- const isLoading = loading || !attributes;
+ const isLoading = loading || !attributes;
- const extraActions: Action[] = useMemo(
- () =>
- getExtraActions({
- timeRange: dateRange,
- query,
- filters,
- }),
- [dateRange, filters, getExtraActions, query]
- );
+ const extraActions: Action[] = getExtraActions({
+ timeRange: dateRange,
+ query,
+ filters,
+ });
- const sytle: CSSProperties = useMemo(() => ({ height }), [height]);
-
- const lens = (
-
- );
- const content = !toolTip ? (
- lens
- ) : (
-
- {/* EuiToolTip forwards some event handlers to the child component.
+ const lens = (
+
+ );
+ const content = !toolTip ? (
+ lens
+ ) : (
+
+ {/* EuiToolTip forwards some event handlers to the child component.
Wrapping Lens inside a div prevents that from causing unnecessary re-renders */}
- {lens}
-
- );
+ {lens}
+
+ );
- return (
-
- {error ? : content}
-
- );
-};
+ return (
+
+ {error ? : content}
+
+ );
+ }
+);
diff --git a/x-pack/plugins/infra/public/components/lens/types.ts b/x-pack/plugins/infra/public/components/lens/types.ts
index 399c61d87f4b9..2d3f76d38a31b 100644
--- a/x-pack/plugins/infra/public/components/lens/types.ts
+++ b/x-pack/plugins/infra/public/components/lens/types.ts
@@ -22,6 +22,7 @@ export type LensWrapperProps = Omit<
};
export type BrushEndArgs = Parameters>[0];
+export type OnFilterEvent = Parameters>[0];
export type BaseChartProps = Pick<
LensWrapperProps,
diff --git a/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts b/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts
index 9adf3e52dcdf4..e70e8977027ff 100644
--- a/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts
+++ b/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { useCallback } from 'react';
+import { useCallback, useMemo } from 'react';
import type { DataView } from '@kbn/data-views-plugin/public';
import { Filter, Query, TimeRange } from '@kbn/es-query';
import { useKibana } from '@kbn/kibana-react-plugin/public';
@@ -25,9 +25,7 @@ import {
XYDataLayer,
XYReferenceLinesLayer,
} from '@kbn/lens-embeddable-utils';
-
import { InfraClientSetupDeps } from '../types';
-import { useLazyRef } from './use_lazy_ref';
import type { MetricChartLayerParams, XYChartLayerParams } from '../common/visualizations/types';
interface UseLensAttributesBaseParams {
@@ -44,6 +42,7 @@ export interface UseLensAttributesXYChartParams extends UseLensAttributesBasePar
export interface UseLensAttributesMetricChartParams extends UseLensAttributesBaseParams {
layers: MetricChartLayerParams;
visualizationType: 'lnsMetric';
+ subtitle?: string;
}
export type UseLensAttributesParams =
@@ -58,7 +57,7 @@ export const useLensAttributes = ({ dataView, ...params }: UseLensAttributesPara
const { value, error } = useAsync(lens.stateHelperApi, [lens]);
const { formula: formulaAPI } = value ?? {};
- const attributes = useLazyRef(() => {
+ const attributes = useMemo(() => {
if (!dataView || !formulaAPI) {
return null;
}
@@ -72,19 +71,19 @@ export const useLensAttributes = ({ dataView, ...params }: UseLensAttributesPara
});
return builder.build();
- });
+ }, [dataView, formulaAPI, params]);
const injectFilters = useCallback(
({ filters, query }: { filters: Filter[]; query: Query }): LensAttributes | null => {
- if (!attributes.current) {
+ if (!attributes) {
return null;
}
return {
- ...attributes.current,
+ ...attributes,
state: {
- ...attributes.current.state,
+ ...attributes.state,
query,
- filters: [...attributes.current.state.filters, ...filters],
+ filters: [...attributes.state.filters, ...filters],
},
};
},
@@ -143,7 +142,7 @@ export const useLensAttributes = ({ dataView, ...params }: UseLensAttributesPara
return mainFormulaConfig.value;
};
- return { formula: getFormula(), attributes: attributes.current, getExtraActions, error };
+ return { formula: getFormula(), attributes, getExtraActions, error };
};
const chartFactory = ({
@@ -198,7 +197,7 @@ const chartFactory = ({
formulaAPI,
layers: new MetricLayer({
data: params.layers.data,
- options: params.layers.options,
+ options: { ...params.layers.options, subtitle: params.subtitle },
}),
title: params.title,
});
diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi.tsx
index 18fa090382dc8..24b1ba216d054 100644
--- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi.tsx
+++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi.tsx
@@ -22,11 +22,20 @@ export const Kpi = ({ id, title, layers, toolTip, height }: KPIChartProps & { he
const { data: hostCountData, isRequestRunning: hostCountLoading } = useHostCountContext();
const shouldUseSearchCriteria = hostNodes.length === 0;
-
const loading = hostsLoading || hostCountLoading;
- const getSubtitle = () => {
- return searchCriteria.limit < (hostCountData?.count.value ?? 0)
+ const filters = shouldUseSearchCriteria
+ ? searchCriteria.filters
+ : [
+ buildCombinedHostsFilter({
+ field: 'host.name',
+ values: hostNodes.map((p) => p.name),
+ dataView,
+ }),
+ ];
+
+ const subtitle =
+ searchCriteria.limit < (hostCountData?.count.value ?? 0)
? i18n.translate('xpack.infra.hostsViewPage.kpi.subtitle.average.limit', {
defaultMessage: 'Average (of {limit} hosts)',
values: {
@@ -34,42 +43,34 @@ export const Kpi = ({ id, title, layers, toolTip, height }: KPIChartProps & { he
},
})
: AVERAGE_SUBTITLE;
- };
-
- const filters = useMemo(() => {
- return shouldUseSearchCriteria
- ? searchCriteria.filters
- : [
- buildCombinedHostsFilter({
- field: 'host.name',
- values: hostNodes.map((p) => p.name),
- dataView,
- }),
- ];
- }, [dataView, hostNodes, searchCriteria.filters, shouldUseSearchCriteria]);
// prevents requestTs and searchCriteria state from reloading the chart
- // we want it to reload only once the table has finished loading
+ // we want it to reload only once the table has finished loading.
+ // attributes passed to useAfterLoadedState don't need to be memoized
const { afterLoadedState } = useAfterLoadedState(loading, {
lastReloadRequestTime: requestTs,
dateRange: parsedDateRange,
query: shouldUseSearchCriteria ? searchCriteria.query : undefined,
filters,
+ subtitle,
});
+ const tooltipComponent = useMemo(() => , [toolTip]);
+
return (
}
+ subtitle={afterLoadedState.subtitle}
+ toolTip={tooltipComponent}
visualizationType="lnsMetric"
disableTriggers
hidePanelTitles
diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx
index e8acd3a05fac3..75f0b25d2b10c 100644
--- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx
+++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx
@@ -30,6 +30,15 @@ export const Chart = ({ id, title, layers, visualOptions, overrides }: ChartProp
const shouldUseSearchCriteria = currentPage.length === 0;
+ // prevents requestTs and searchCriteria state from reloading the chart
+ // we want it to reload only once the table has finished loading.
+ // attributes passed to useAfterLoadedState don't need to be memoized
+ const { afterLoadedState } = useAfterLoadedState(loading, {
+ lastReloadRequestTime: requestTs,
+ dateRange: parsedDateRange,
+ query: shouldUseSearchCriteria ? searchCriteria.query : undefined,
+ });
+
const filters = useMemo(() => {
return shouldUseSearchCriteria
? searchCriteria.filters
@@ -42,14 +51,6 @@ export const Chart = ({ id, title, layers, visualOptions, overrides }: ChartProp
];
}, [searchCriteria.filters, currentPage, dataView, shouldUseSearchCriteria]);
- // prevents requestTs and searchCriteria state from reloading the chart
- // we want it to reload only once the table has finished loading
- const { afterLoadedState } = useAfterLoadedState(loading, {
- lastReloadRequestTime: requestTs,
- dateRange: parsedDateRange,
- query: shouldUseSearchCriteria ? searchCriteria.query : undefined,
- });
-
return (
{
+export const MetricsGrid = () => {
return (
<>
@@ -38,4 +38,4 @@ export const MetricsGrid = React.memo(() => {
>
);
-});
+};
diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_control_panels_url_state.ts b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_control_panels_url_state.ts
index 177c8d869ac6b..42d0522ffb8fa 100644
--- a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_control_panels_url_state.ts
+++ b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_control_panels_url_state.ts
@@ -11,6 +11,7 @@ import { pipe } from 'fp-ts/lib/pipeable';
import { fold } from 'fp-ts/lib/Either';
import { constant, identity } from 'fp-ts/lib/function';
import type { DataView } from '@kbn/data-views-plugin/public';
+import { useMemo } from 'react';
import { useUrlState } from '../../../../utils/use_url_state';
const HOST_FILTERS_URL_STATE_KEY = 'controlPanels';
@@ -50,7 +51,7 @@ const availableControlPanelFields = Object.values(availableControlsPanels);
export const useControlPanels = (
dataView: DataView | undefined
): [ControlPanels, (state: ControlPanels) => void] => {
- const defaultState = getVisibleControlPanelsConfig(dataView);
+ const defaultState = useMemo(() => getVisibleControlPanelsConfig(dataView), [dataView]);
const [controlPanels, setControlPanels] = useUrlState({
defaultState,
diff --git a/x-pack/plugins/infra/public/utils/use_url_state.ts b/x-pack/plugins/infra/public/utils/use_url_state.ts
index 8fc03d2d9dda2..a581e6536e487 100644
--- a/x-pack/plugins/infra/public/utils/use_url_state.ts
+++ b/x-pack/plugins/infra/public/utils/use_url_state.ts
@@ -47,13 +47,24 @@ export const useUrlState = ({
}, [defaultState, decodedState]);
const setState = useCallback(
- (newState: State | undefined) => {
+ (patch: State | undefined | ((prevState: State) => State)) => {
if (!history || !history.location) {
return;
}
const currentLocation = history.location;
+ const newState =
+ patch instanceof Function
+ ? patch(
+ decodeUrlState(
+ decodeRisonUrlState(
+ getParamFromQueryString(getQueryStringFromLocation(currentLocation), urlStateKey)
+ )
+ ) ?? defaultState
+ )
+ : patch;
+
const newLocation = replaceQueryStringInLocation(
currentLocation,
replaceStateKeyInQueryString(
@@ -66,7 +77,7 @@ export const useUrlState = ({
history.replace(newLocation);
}
},
- [encodeUrlState, history, urlStateKey]
+ [decodeUrlState, defaultState, encodeUrlState, history, urlStateKey]
);
const [shouldInitialize, setShouldInitialize] = useState(
diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx
index b0e3ec119c532..18213c0bec4c0 100644
--- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx
+++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx
@@ -9,7 +9,7 @@ import React from 'react';
import { EuiFlyout, EuiLoadingSpinner, EuiOverlayMask } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { Provider } from 'react-redux';
-import { MiddlewareAPI, Dispatch, Action } from '@reduxjs/toolkit';
+import type { MiddlewareAPI, Dispatch, Action } from '@reduxjs/toolkit';
import { css } from '@emotion/react';
import type { CoreStart } from '@kbn/core/public';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
diff --git a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx
index 51ed27f328838..88f6c67113bce 100644
--- a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx
+++ b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx
@@ -64,7 +64,7 @@ import {
import {
getFiltersInLayer,
- getShardFailuresWarningMessages,
+ getSearchWarningMessages,
getVisualDefaultsForLayer,
isColumnInvalid,
cloneLayer,
@@ -811,7 +811,7 @@ export function getFormBasedDatasource({
},
getSearchWarningMessages: (state, warning, request, response) => {
- return [...getShardFailuresWarningMessages(state, warning, request, response, core.theme)];
+ return [...getSearchWarningMessages(state, warning, request, response, core.theme)];
},
checkIntegrity: (state, indexPatterns) => {
diff --git a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx
index 33c60b89f3ce4..73caafa33fc8e 100644
--- a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx
+++ b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx
@@ -9,6 +9,7 @@ import React from 'react';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n-react';
import type { DocLinksStart, ThemeServiceStart } from '@kbn/core/public';
+import { hasUnsupportedDownsampledAggregationFailure } from '@kbn/search-response-warnings';
import type { DatatableUtilitiesService } from '@kbn/data-plugin/common';
import { TimeRange } from '@kbn/es-query';
import { EuiLink, EuiSpacer, EuiText } from '@elastic/eui';
@@ -18,11 +19,7 @@ import { groupBy, escape, uniq, uniqBy } from 'lodash';
import type { Query } from '@kbn/data-plugin/common';
import { SearchRequest } from '@kbn/data-plugin/common';
-import {
- SearchResponseWarning,
- ShardFailureOpenModalButton,
- ShardFailureRequest,
-} from '@kbn/data-plugin/public';
+import { SearchResponseWarning, OpenIncompleteResultsModalButton } from '@kbn/data-plugin/public';
import { estypes } from '@elastic/elasticsearch';
import { isQueryValid } from '@kbn/visualization-ui-components';
@@ -260,7 +257,7 @@ const accuracyModeEnabledWarning = (
),
});
-export function getShardFailuresWarningMessages(
+export function getSearchWarningMessages(
state: FormBasedPersistedState,
warning: SearchResponseWarning,
request: SearchRequest,
@@ -268,10 +265,9 @@ export function getShardFailuresWarningMessages(
theme: ThemeServiceStart
): UserMessage[] {
if (state) {
- if (warning.type === 'shard_failure') {
- switch (warning.reason.type) {
- case 'unsupported_aggregation_on_downsampled_index':
- return Object.values(state.layers).flatMap((layer) =>
+ if (warning.type === 'incomplete') {
+ return hasUnsupportedDownsampledAggregationFailure(warning)
+ ? Object.values(state.layers).flatMap((layer) =>
uniq(
Object.values(layer.columns)
.filter((col) =>
@@ -302,40 +298,33 @@ export function getShardFailuresWarningMessages(
}),
} as UserMessage)
)
- );
- default:
- return [
+ )
+ : [
{
- uniqueId: `shard_failure`,
+ uniqueId: `incomplete`,
severity: 'warning',
fixableInEditor: true,
displayLocations: [{ id: 'toolbar' }, { id: 'embeddableBadge' }],
shortMessage: '',
longMessage: (
<>
-
- {warning.message}
- {warning.text}
-
+ {warning.message}
- {warning.text ? (
- ({
- request: request as ShardFailureRequest,
- response,
- })}
- color="primary"
- isButtonEmpty={true}
- />
- ) : null}
+ ({
+ request,
+ response,
+ })}
+ color="primary"
+ isButtonEmpty={true}
+ />
>
),
} as UserMessage,
];
- }
}
}
return [];
diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx
index 4e66763b54a94..6af4fe67c0622 100644
--- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx
+++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel.tsx
@@ -729,7 +729,7 @@ export const VisualizationWrapper = ({
to: context.dateRange.toDate,
},
filters: context.filters,
- disableShardWarnings: true,
+ disableWarningToasts: true,
}),
[context]
);
diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx
index 67dea2f98231c..67764b46f6609 100644
--- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx
+++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx
@@ -1196,7 +1196,7 @@ export class Embeddable
this.savedVis.state.filters,
this.savedVis.references
),
- disableShardWarnings: true,
+ disableWarningToasts: true,
};
if (input.query) {
diff --git a/x-pack/plugins/lens/public/state_management/fullscreen_middleware.ts b/x-pack/plugins/lens/public/state_management/fullscreen_middleware.ts
index 5bbcdbf5b15d9..e800d4fed2d1b 100644
--- a/x-pack/plugins/lens/public/state_management/fullscreen_middleware.ts
+++ b/x-pack/plugins/lens/public/state_management/fullscreen_middleware.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Dispatch, MiddlewareAPI, Action } from '@reduxjs/toolkit';
+import type { Dispatch, MiddlewareAPI, Action } from '@reduxjs/toolkit';
import { LensGetState, LensStoreDeps } from '.';
import { setToggleFullscreen } from './lens_slice';
diff --git a/x-pack/plugins/lens/public/state_management/index.ts b/x-pack/plugins/lens/public/state_management/index.ts
index b426183eebaf2..f2770f2fd2caf 100644
--- a/x-pack/plugins/lens/public/state_management/index.ts
+++ b/x-pack/plugins/lens/public/state_management/index.ts
@@ -8,10 +8,10 @@
import {
configureStore,
getDefaultMiddleware,
- PreloadedState,
- Action,
- Dispatch,
- MiddlewareAPI,
+ type PreloadedState,
+ type Action,
+ type Dispatch,
+ type MiddlewareAPI,
} from '@reduxjs/toolkit';
import { createLogger } from 'redux-logger';
import { useDispatch, useSelector, TypedUseSelectorHook } from 'react-redux';
diff --git a/x-pack/plugins/lens/public/state_management/selectors.ts b/x-pack/plugins/lens/public/state_management/selectors.ts
index 407aacba9e4a2..6bf40638554f9 100644
--- a/x-pack/plugins/lens/public/state_management/selectors.ts
+++ b/x-pack/plugins/lens/public/state_management/selectors.ts
@@ -62,7 +62,7 @@ export const selectExecutionContextSearch = createSelector(selectExecutionContex
to: res.dateRange.toDate,
},
filters: res.filters,
- disableShardWarnings: true,
+ disableWarningToasts: true,
}));
const selectInjectedDependencies = (_state: LensState, dependencies: unknown) => dependencies;
diff --git a/x-pack/plugins/lens/public/utils.ts b/x-pack/plugins/lens/public/utils.ts
index b1deface2cd77..90011c6bad735 100644
--- a/x-pack/plugins/lens/public/utils.ts
+++ b/x-pack/plugins/lens/public/utils.ts
@@ -349,29 +349,26 @@ export const getSearchWarningMessages = (
searchService: ISearchStart;
}
): UserMessage[] => {
- const warningsMap: Map = new Map();
+ const userMessages: UserMessage[] = [];
deps.searchService.showWarnings(adapter, (warning, meta) => {
- const { request, response, requestId } = meta;
+ const { request, response } = meta;
- const warningMessages = datasource.getSearchWarningMessages?.(
+ const userMessagesFromWarning = datasource.getSearchWarningMessages?.(
state,
warning,
request,
response
);
- if (warningMessages?.length) {
- const key = (requestId ?? '') + warning.type + warning.reason?.type ?? '';
- if (!warningsMap.has(key)) {
- warningsMap.set(key, warningMessages);
- }
+ if (userMessagesFromWarning?.length) {
+ userMessages.push(...userMessagesFromWarning);
return true;
}
return false;
});
- return [...warningsMap.values()].flat();
+ return userMessages;
};
function getSafeLabel(label: string) {
diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json
index 484734f1ae38f..ca536dc187c3f 100644
--- a/x-pack/plugins/lens/tsconfig.json
+++ b/x-pack/plugins/lens/tsconfig.json
@@ -86,6 +86,7 @@
"@kbn/content-management-utils",
"@kbn/serverless",
"@kbn/ebt-tools",
+ "@kbn/search-response-warnings",
],
"exclude": [
"target/**/*",
diff --git a/x-pack/plugins/observability/common/constants.ts b/x-pack/plugins/observability/common/constants.ts
index 3ba31bb1ee1eb..97f4341168fd9 100644
--- a/x-pack/plugins/observability/common/constants.ts
+++ b/x-pack/plugins/observability/common/constants.ts
@@ -10,7 +10,7 @@ import { AlertConsumers } from '@kbn/rule-data-utils';
import type { ValidFeatureId } from '@kbn/rule-data-utils';
export const SLO_BURN_RATE_RULE_TYPE_ID = 'slo.rules.burnRate';
-export const OBSERVABILITY_THRESHOLD_RULE_TYPE_ID = 'observability.rules.threshold';
+export const OBSERVABILITY_THRESHOLD_RULE_TYPE_ID = 'observability.rules.custom_threshold';
export const INVALID_EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g;
export const ALERT_STATUS_ALL = 'all';
diff --git a/x-pack/plugins/observability/common/threshold_rule/color_palette.ts b/x-pack/plugins/observability/common/custom_threshold_rule/color_palette.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/color_palette.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/color_palette.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/constants.ts b/x-pack/plugins/observability/common/custom_threshold_rule/constants.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/constants.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/constants.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/bytes.test.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/bytes.test.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/bytes.test.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/bytes.test.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/bytes.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/bytes.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/bytes.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/bytes.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/datetime.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/datetime.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/datetime.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/datetime.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/high_precision.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/high_precision.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/high_precision.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/high_precision.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/index.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/index.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/index.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/index.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/number.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/number.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/number.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/number.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/percent.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/percent.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/percent.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/percent.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/snapshot_metric_formats.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/snapshot_metric_formats.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/snapshot_metric_formats.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/snapshot_metric_formats.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/formatters/types.ts b/x-pack/plugins/observability/common/custom_threshold_rule/formatters/types.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/formatters/types.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/formatters/types.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/metric_value_formatter.test.ts b/x-pack/plugins/observability/common/custom_threshold_rule/metric_value_formatter.test.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/metric_value_formatter.test.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/metric_value_formatter.test.ts
diff --git a/x-pack/plugins/observability/common/threshold_rule/metric_value_formatter.ts b/x-pack/plugins/observability/common/custom_threshold_rule/metric_value_formatter.ts
similarity index 89%
rename from x-pack/plugins/observability/common/threshold_rule/metric_value_formatter.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/metric_value_formatter.ts
index 1ba0879fcf465..114f30fd85307 100644
--- a/x-pack/plugins/observability/common/threshold_rule/metric_value_formatter.ts
+++ b/x-pack/plugins/observability/common/custom_threshold_rule/metric_value_formatter.ts
@@ -10,7 +10,7 @@ import { createFormatter } from './formatters';
export const metricValueFormatter = (value: number | null, metric: string = '') => {
const noDataValue = i18n.translate(
- 'xpack.observability.threshold.rule.alerting.noDataFormattedValue',
+ 'xpack.observability.customThreshold.rule.alerting.noDataFormattedValue',
{
defaultMessage: '[NO DATA]',
}
diff --git a/x-pack/plugins/observability/common/threshold_rule/metrics_explorer.ts b/x-pack/plugins/observability/common/custom_threshold_rule/metrics_explorer.ts
similarity index 96%
rename from x-pack/plugins/observability/common/threshold_rule/metrics_explorer.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/metrics_explorer.ts
index d735e398e6661..66913385123c4 100644
--- a/x-pack/plugins/observability/common/threshold_rule/metrics_explorer.ts
+++ b/x-pack/plugins/observability/common/custom_threshold_rule/metrics_explorer.ts
@@ -7,19 +7,7 @@
import * as rt from 'io-ts';
import { xor } from 'lodash';
-
-export const METRIC_EXPLORER_AGGREGATIONS = [
- 'avg',
- 'max',
- 'min',
- 'cardinality',
- 'rate',
- 'count',
- 'sum',
- 'p95',
- 'p99',
- 'custom',
-] as const;
+import { METRIC_EXPLORER_AGGREGATIONS } from './constants';
export const OMITTED_AGGREGATIONS_FOR_CUSTOM_METRICS = ['custom', 'rate', 'p95', 'p99'];
diff --git a/x-pack/plugins/observability/common/threshold_rule/types.ts b/x-pack/plugins/observability/common/custom_threshold_rule/types.ts
similarity index 100%
rename from x-pack/plugins/observability/common/threshold_rule/types.ts
rename to x-pack/plugins/observability/common/custom_threshold_rule/types.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap b/x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap
rename to x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap
diff --git a/x-pack/plugins/observability/public/components/threshold/components/alert_details_app_section.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.test.tsx
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/components/alert_details_app_section.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.test.tsx
diff --git a/x-pack/plugins/observability/public/components/threshold/components/alert_details_app_section.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx
similarity index 95%
rename from x-pack/plugins/observability/public/components/threshold/components/alert_details_app_section.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx
index 95367577ccb22..ecb31f4a49b4b 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/alert_details_app_section.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx
@@ -32,13 +32,13 @@ import {
import { DataView } from '@kbn/data-views-plugin/common';
import type { TimeRange } from '@kbn/es-query';
import { useKibana } from '../../../utils/kibana_react';
-import { metricValueFormatter } from '../../../../common/threshold_rule/metric_value_formatter';
+import { metricValueFormatter } from '../../../../common/custom_threshold_rule/metric_value_formatter';
import { AlertSummaryField, TopAlert } from '../../..';
import { generateUniqueKey } from '../lib/generate_unique_key';
import { ExpressionChart } from './expression_chart';
import { TIME_LABELS } from './criterion_preview_chart/criterion_preview_chart';
-import { Threshold } from './threshold';
+import { Threshold } from './custom_threshold';
import { MetricsExplorerChartType } from '../hooks/use_metrics_explorer_options';
import { AlertParams, MetricExpression, MetricThresholdRuleTypeParams } from '../types';
@@ -98,7 +98,7 @@ export default function AlertDetailsAppSection({
setAlertSummaryFields([
{
label: i18n.translate(
- 'xpack.observability.threshold.rule.alertDetailsAppSection.summaryField.rule',
+ 'xpack.observability.customThreshold.rule.alertDetailsAppSection.summaryField.rule',
{
defaultMessage: 'Rule',
}
@@ -160,7 +160,7 @@ export default function AlertDetailsAppSection({
@@ -132,7 +132,7 @@ export function ErrorState() {
diff --git a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.test.tsx
similarity index 96%
rename from x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.test.tsx
index c07e053374644..a8e64ac343a0f 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.test.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.test.tsx
@@ -4,8 +4,8 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import { Color } from '../../../../../common/threshold_rule/color_palette';
-import { Comparator } from '../../../../../common/threshold_rule/types';
+import { Color } from '../../../../../common/custom_threshold_rule/color_palette';
+import { Comparator } from '../../../../../common/custom_threshold_rule/types';
import { shallow } from 'enzyme';
import React from 'react';
diff --git a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.tsx
similarity index 95%
rename from x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.tsx
index 09bd7e21fdc10..e911eba6ad6c8 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/threshold_annotations.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/threshold_annotations.tsx
@@ -7,8 +7,8 @@
import { AnnotationDomainType, LineAnnotation, RectAnnotation } from '@elastic/charts';
import { first, last } from 'lodash';
import React from 'react';
-import { Color, colorTransformer } from '../../../../../common/threshold_rule/color_palette';
-import { Comparator } from '../../../../../common/threshold_rule/types';
+import { Color, colorTransformer } from '../../../../../common/custom_threshold_rule/color_palette';
+import { Comparator } from '../../../../../common/custom_threshold_rule/types';
interface ThresholdAnnotationsProps {
threshold: number[];
diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.stories.tsx
similarity index 98%
rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.stories.tsx
index f7480aa1de513..f58894e7918d9 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.stories.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.stories.tsx
@@ -13,7 +13,7 @@ import {
Aggregators,
Comparator,
MetricExpressionParams,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
import { TimeUnitChar } from '../../../../../common';
import { CustomEquationEditor, CustomEquationEditorProps } from './custom_equation_editor';
diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx
similarity index 92%
rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx
index ed3dc975b2d07..d41f5d5b0b85b 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/custom_equation_editor.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx
@@ -21,12 +21,12 @@ import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public';
import { FormattedMessage } from '@kbn/i18n-react';
import { DataViewBase } from '@kbn/es-query';
import { i18n } from '@kbn/i18n';
-import { OMITTED_AGGREGATIONS_FOR_CUSTOM_METRICS } from '../../../../../common/threshold_rule/metrics_explorer';
+import { OMITTED_AGGREGATIONS_FOR_CUSTOM_METRICS } from '../../../../../common/custom_threshold_rule/metrics_explorer';
import {
Aggregators,
CustomMetricAggTypes,
CustomThresholdExpressionMetric,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
import { MetricExpression } from '../../types';
import { CustomMetrics, AggregationTypes, NormalizedFields } from './types';
@@ -148,7 +148,7 @@ export function CustomEquationEditor({
isDisabled={disableAdd}
>
@@ -160,7 +160,7 @@ export function CustomEquationEditor({
setCustomEqPopoverOpen(false)}>
setAggTypePopoverOpen(false)}>
@@ -154,7 +157,7 @@ export function MetricRowWithAgg({
@@ -195,7 +198,7 @@ export function MetricRowWithAgg({
) : (
{
const renderComponent = (props: Partial = {}) => {
diff --git a/x-pack/plugins/observability/public/components/threshold/components/threshold.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx
similarity index 81%
rename from x-pack/plugins/observability/public/components/threshold/components/threshold.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx
index 28ae78cdccf27..0dd80826899b0 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/threshold.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.tsx
@@ -10,7 +10,7 @@ import { Chart, Metric, Settings } from '@elastic/charts';
import { EuiIcon, EuiPanel, useEuiBackgroundColor } from '@elastic/eui';
import type { PartialTheme, Theme } from '@elastic/charts';
import { i18n } from '@kbn/i18n';
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
export interface ChartProps {
theme: PartialTheme;
@@ -60,10 +60,13 @@ export function Threshold({
title,
extra: (
- {i18n.translate('xpack.observability.threshold.rule.thresholdExtraTitle', {
- values: { comparator, threshold: valueFormatter(threshold) },
- defaultMessage: `Alert when {comparator} {threshold}`,
- })}
+ {i18n.translate(
+ 'xpack.observability.customThreshold.rule.thresholdExtraTitle',
+ {
+ values: { comparator, threshold: valueFormatter(threshold) },
+ defaultMessage: `Alert when {comparator} {threshold}`,
+ }
+ )}
),
color,
diff --git a/x-pack/plugins/observability/public/components/threshold/components/expression_chart.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx
similarity index 96%
rename from x-pack/plugins/observability/public/components/threshold/components/expression_chart.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx
index 83c05b5694030..e9d6d2c726665 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/expression_chart.test.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx
@@ -14,7 +14,7 @@ import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
import { coreMock as mockCoreMock } from '@kbn/core/public/mocks';
import { MetricExpression } from '../types';
import { ExpressionChart } from './expression_chart';
-import { Aggregators, Comparator } from '../../../../common/threshold_rule/types';
+import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types';
const mockStartServices = mockCoreMock.createStart();
diff --git a/x-pack/plugins/observability/public/components/threshold/components/expression_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx
similarity index 94%
rename from x-pack/plugins/observability/public/components/threshold/components/expression_chart.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx
index 4172175a3b573..8dcb31dd96be5 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/expression_chart.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.tsx
@@ -27,12 +27,12 @@ import { useKibana } from '../../../utils/kibana_react';
import {
MetricsExplorerAggregation,
MetricsExplorerRow,
-} from '../../../../common/threshold_rule/metrics_explorer';
-import { Color } from '../../../../common/threshold_rule/color_palette';
+} from '../../../../common/custom_threshold_rule/metrics_explorer';
+import { Color } from '../../../../common/custom_threshold_rule/color_palette';
import {
MetricsExplorerChartType,
MetricsExplorerOptionsMetric,
-} from '../../../../common/threshold_rule/types';
+} from '../../../../common/custom_threshold_rule/types';
import { MetricExpression, TimeRange } from '../types';
import { createFormatterForMetric } from '../helpers/create_formatter_for_metric';
import { useMetricsExplorerChartData } from '../hooks/use_metrics_explorer_chart_data';
@@ -213,7 +213,7 @@ export function ExpressionChart({
{series.id !== 'ALL' ? (
@@ -221,7 +221,7 @@ export function ExpressionChart({
) : (
diff --git a/x-pack/plugins/observability/public/components/threshold/components/expression_row.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx
similarity index 97%
rename from x-pack/plugins/observability/public/components/threshold/components/expression_row.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx
index 7a7536849c187..ed0c4c52f772c 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/expression_row.test.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
import React from 'react';
import { act } from 'react-dom/test-utils';
diff --git a/x-pack/plugins/observability/public/components/threshold/components/expression_row.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx
similarity index 82%
rename from x-pack/plugins/observability/public/components/threshold/components/expression_row.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx
index df8c7916ecba7..e508977658c0c 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/expression_row.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx
@@ -24,7 +24,7 @@ import {
} from '@kbn/triggers-actions-ui-plugin/public';
import { DataViewBase } from '@kbn/es-query';
import { debounce } from 'lodash';
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
import { AGGREGATION_TYPES, DerivedIndexPattern, MetricExpression } from '../types';
import { CustomEquationEditor } from './custom_equation';
import { CUSTOM_EQUATION, LABEL_HELP_MESSAGE, LABEL_LABEL } from '../i18n_strings';
@@ -33,7 +33,7 @@ import { decimalToPct, pctToDecimal } from '../helpers/corrected_percent_convert
const customComparators = {
...builtInComparators,
[Comparator.OUTSIDE_RANGE]: {
- text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.outsideRangeLabel', {
+ text: i18n.translate('xpack.observability.customThreshold.rule.alertFlyout.outsideRangeLabel', {
defaultMessage: 'Is not between',
}),
value: Comparator.OUTSIDE_RANGE,
@@ -175,7 +175,7 @@ export const ExpressionRow: React.FC = (props) => {
({
id: 1,
- title: i18n.translate('xpack.observability.threshold.rule.infrastructureDropdownTitle', {
- defaultMessage: 'Infrastructure rules',
- }),
+ title: i18n.translate(
+ 'xpack.observability.customThreshold.rule.infrastructureDropdownTitle',
+ {
+ defaultMessage: 'Infrastructure rules',
+ }
+ ),
items: [
{
'data-test-subj': 'inventory-alerts-create-rule',
- name: i18n.translate('xpack.observability.threshold.rule.createInventoryRuleButton', {
- defaultMessage: 'Create inventory rule',
- }),
+ name: i18n.translate(
+ 'xpack.observability.customThreshold.rule.createInventoryRuleButton',
+ {
+ defaultMessage: 'Create inventory rule',
+ }
+ ),
onClick: () => {
closePopover();
setVisibleFlyoutType('inventory');
@@ -66,15 +72,18 @@ export function MetricsAlertDropdown() {
const metricsAlertsPanel = useMemo(
() => ({
id: 2,
- title: i18n.translate('xpack.observability.threshold.rule.metricsDropdownTitle', {
+ title: i18n.translate('xpack.observability.customThreshold.rule.metricsDropdownTitle', {
defaultMessage: 'Metrics rules',
}),
items: [
{
'data-test-subj': 'metrics-threshold-alerts-create-rule',
- name: i18n.translate('xpack.observability.threshold.rule.createThresholdRuleButton', {
- defaultMessage: 'Create threshold rule',
- }),
+ name: i18n.translate(
+ 'xpack.observability.customThreshold.rule.createThresholdRuleButton',
+ {
+ defaultMessage: 'Create threshold rule',
+ }
+ ),
onClick: () => {
closePopover();
setVisibleFlyoutType('threshold');
@@ -89,7 +98,7 @@ export function MetricsAlertDropdown() {
const manageAlertsMenuItem = useMemo(
() => ({
- name: i18n.translate('xpack.observability.threshold.rule.manageRules', {
+ name: i18n.translate('xpack.observability.customThreshold.rule.manageRules', {
defaultMessage: 'Manage rules',
}),
icon: 'tableOfContents',
@@ -105,7 +114,7 @@ export function MetricsAlertDropdown() {
{
'data-test-subj': 'inventory-alerts-menu-option',
name: i18n.translate(
- 'xpack.observability.threshold.rule.infrastructureDropdownMenu',
+ 'xpack.observability.customThreshold.rule.infrastructureDropdownMenu',
{
defaultMessage: 'Infrastructure',
}
@@ -114,7 +123,7 @@ export function MetricsAlertDropdown() {
},
{
'data-test-subj': 'metrics-threshold-alerts-menu-option',
- name: i18n.translate('xpack.observability.threshold.rule.metricsDropdownMenu', {
+ name: i18n.translate('xpack.observability.customThreshold.rule.metricsDropdownMenu', {
defaultMessage: 'Metrics',
}),
panel: 2,
@@ -130,7 +139,7 @@ export function MetricsAlertDropdown() {
[
{
id: 0,
- title: i18n.translate('xpack.observability.threshold.rule.alertDropdownTitle', {
+ title: i18n.translate('xpack.observability.customThreshold.rule.alertDropdownTitle', {
defaultMessage: 'Alerts and rules',
}),
items: firstPanelMenuItems,
@@ -152,7 +161,7 @@ export function MetricsAlertDropdown() {
data-test-subj="thresholdRuleStructure-alerts-and-rules"
>
diff --git a/x-pack/plugins/observability/public/components/threshold/components/series_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/series_chart.tsx
similarity index 93%
rename from x-pack/plugins/observability/public/components/threshold/components/series_chart.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/series_chart.tsx
index c7716c474b22c..c0e35c85580bc 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/series_chart.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/series_chart.tsx
@@ -14,12 +14,12 @@ import {
AreaSeriesStyle,
BarSeriesStyle,
} from '@elastic/charts';
-import { MetricsExplorerSeries } from '../../../../common/threshold_rule/metrics_explorer';
-import { Color, colorTransformer } from '../../../../common/threshold_rule/color_palette';
+import { MetricsExplorerSeries } from '../../../../common/custom_threshold_rule/metrics_explorer';
+import { Color, colorTransformer } from '../../../../common/custom_threshold_rule/color_palette';
import {
MetricsExplorerChartType,
MetricsExplorerOptionsMetric,
-} from '../../../../common/threshold_rule/types';
+} from '../../../../common/custom_threshold_rule/types';
import { getMetricId } from '../helpers/get_metric_id';
import { useKibanaTimeZoneSetting } from '../hooks/use_kibana_time_zone_setting';
diff --git a/x-pack/plugins/observability/public/components/threshold/components/triggers_actions_context.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/triggers_actions_context.tsx
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/components/triggers_actions_context.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/triggers_actions_context.tsx
diff --git a/x-pack/plugins/observability/public/components/threshold/components/validation.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/components/validation.test.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/components/validation.test.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/components/validation.test.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/components/validation.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx
similarity index 76%
rename from x-pack/plugins/observability/public/components/threshold/components/validation.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx
index 4f5c818d7943d..d40a1f2852bcc 100644
--- a/x-pack/plugins/observability/public/components/threshold/components/validation.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx
@@ -15,7 +15,7 @@ import {
Comparator,
CustomMetricExpressionParams,
MetricExpressionParams,
-} from '../../../../common/threshold_rule/types';
+} from '../../../../common/custom_threshold_rule/types';
export const EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g;
@@ -57,7 +57,7 @@ export function validateMetricThreshold({
if (!searchConfiguration || !searchConfiguration.index) {
errors.searchConfiguration = [
i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.invalidSearchConfiguration',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.invalidSearchConfiguration',
{
defaultMessage: 'Data view is required.',
}
@@ -74,9 +74,12 @@ export function validateMetricThreshold({
);
} catch (e) {
errors.filterQuery = [
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery', {
- defaultMessage: 'Filter query is invalid.',
- }),
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.invalidFilterQuery',
+ {
+ defaultMessage: 'Filter query is invalid.',
+ }
+ ),
];
}
}
@@ -106,25 +109,34 @@ export function validateMetricThreshold({
};
if (!c.aggType) {
errors[id].aggField.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired', {
- defaultMessage: 'Aggregation is required.',
- })
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.aggregationRequired',
+ {
+ defaultMessage: 'Aggregation is required.',
+ }
+ )
);
}
if (!c.threshold || !c.threshold.length) {
errors[id].critical.threshold0.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired', {
- defaultMessage: 'Threshold is required.',
- })
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdRequired',
+ {
+ defaultMessage: 'Threshold is required.',
+ }
+ )
);
}
if (c.warningThreshold && !c.warningThreshold.length) {
errors[id].warning.threshold0.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired', {
- defaultMessage: 'Threshold is required.',
- })
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdRequired',
+ {
+ defaultMessage: 'Threshold is required.',
+ }
+ )
);
}
@@ -145,7 +157,7 @@ export function validateMetricThreshold({
const key = i === 0 ? 'threshold0' : 'threshold1';
errors[id][type][key].push(
i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.thresholdTypeRequired',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdTypeRequired',
{
defaultMessage: 'Thresholds must contain a valid number.',
}
@@ -157,16 +169,19 @@ export function validateMetricThreshold({
if (comparator === Comparator.BETWEEN && (!threshold || threshold.length < 2)) {
errors[id][type].threshold1.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired', {
- defaultMessage: 'Threshold is required.',
- })
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdRequired',
+ {
+ defaultMessage: 'Threshold is required.',
+ }
+ )
);
}
}
if (!c.timeSize) {
errors[id].timeWindowSize.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.timeRequred', {
+ i18n.translate('xpack.observability.customThreshold.rule.alertFlyout.error.timeRequred', {
defaultMessage: 'Time size is Required.',
})
);
@@ -174,16 +189,19 @@ export function validateMetricThreshold({
if (c.aggType !== 'count' && c.aggType !== 'custom' && !c.metric) {
errors[id].metric.push(
- i18n.translate('xpack.observability.threshold.rule.alertFlyout.error.metricRequired', {
- defaultMessage: 'Metric is required.',
- })
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.metricRequired',
+ {
+ defaultMessage: 'Metric is required.',
+ }
+ )
);
}
if (isCustomMetricExpressionParams(c)) {
if (!c.metrics || (c.metrics && c.metrics.length < 1)) {
errors[id].metricsError = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.metricsError',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.metricsError',
{
defaultMessage: 'You must define at least 1 custom metric',
}
@@ -193,7 +211,7 @@ export function validateMetricThreshold({
const customMetricErrors: { aggType?: string; field?: string; filter?: string } = {};
if (!metric.aggType) {
customMetricErrors.aggType = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.metrics.aggTypeRequired',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.metrics.aggTypeRequired',
{
defaultMessage: 'Aggregation is required',
}
@@ -201,7 +219,7 @@ export function validateMetricThreshold({
}
if (metric.aggType !== 'count' && !metric.field) {
customMetricErrors.field = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.metrics.fieldRequired',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.metrics.fieldRequired',
{
defaultMessage: 'Field is required',
}
@@ -222,7 +240,7 @@ export function validateMetricThreshold({
if (c.equation && c.equation.match(EQUATION_REGEX)) {
errors[id].equation = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters',
+ 'xpack.observability.customThreshold.rule.alertFlyout.error.equation.invalidCharacters',
{
defaultMessage:
'The equation field only supports the following characters: A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =',
diff --git a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx
similarity index 96%
rename from x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx
index e81e695f8cef9..accd48ca969a0 100644
--- a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.test.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx
@@ -12,11 +12,11 @@ import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks';
import { queryClient } from '@kbn/osquery-plugin/public/query_client';
import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers';
-import { Comparator } from '../../../common/threshold_rule/types';
-import { MetricsExplorerMetric } from '../../../common/threshold_rule/metrics_explorer';
+import { Comparator } from '../../../common/custom_threshold_rule/types';
+import { MetricsExplorerMetric } from '../../../common/custom_threshold_rule/metrics_explorer';
import { useKibana } from '../../utils/kibana_react';
import { kibanaStartMock } from '../../utils/kibana_react.mock';
-import Expressions from './threshold_rule_expression';
+import Expressions from './custom_threshold_rule_expression';
jest.mock('../../utils/kibana_react');
diff --git a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx
similarity index 92%
rename from x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx
index 1e25865147290..761cff54bc961 100644
--- a/x-pack/plugins/observability/public/components/threshold/threshold_rule_expression.tsx
+++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx
@@ -36,7 +36,7 @@ import {
} from '@kbn/triggers-actions-ui-plugin/public';
import { useKibana } from '../../utils/kibana_react';
-import { Aggregators, Comparator } from '../../../common/threshold_rule/types';
+import { Aggregators, Comparator } from '../../../common/custom_threshold_rule/types';
import { TimeUnitChar } from '../../../common/utils/formatters/duration';
import { AlertContextMeta, AlertParams, MetricExpression } from './types';
import { ExpressionChart } from './components/expression_chart';
@@ -119,7 +119,7 @@ export default function Expressions(props: Props) {
if (!timeFieldName) {
setDataViewTimeFieldError(
i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.dataViewError.noTimestamp',
+ 'xpack.observability.customThreshold.rule.alertFlyout.dataViewError.noTimestamp',
{
defaultMessage:
'The selected data view does not have a timestamp field, please select another data view.',
@@ -382,7 +382,7 @@ export default function Expressions(props: Props) {
}
const placeHolder = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.searchBar.placeholder',
+ 'xpack.observability.customThreshold.rule.alertFlyout.searchBar.placeholder',
{
defaultMessage: 'Search for observability data… (e.g. host.name:host-1)',
}
@@ -393,7 +393,7 @@ export default function Expressions(props: Props) {
@@ -417,7 +417,7 @@ export default function Expressions(props: Props) {
@@ -448,7 +448,7 @@ export default function Expressions(props: Props) {
@@ -462,7 +462,7 @@ export default function Expressions(props: Props) {
@@ -514,18 +514,21 @@ export default function Expressions(props: Props) {
onClick={addExpression}
>
{redundantFilterGroupBy.join(', ')},
@@ -560,7 +563,7 @@ export default function Expressions(props: Props) {
href={`${docLinks.links.observability.metricsThreshold}#filtering-and-grouping`}
>
{i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError.docsLink',
+ 'xpack.observability.customThreshold.rule.alertFlyout.alertPerRedundantFilterError.docsLink',
{ defaultMessage: 'the docs' }
)}
@@ -576,7 +579,7 @@ export default function Expressions(props: Props) {
label={
<>
{i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.alertOnGroupDisappear',
+ 'xpack.observability.customThreshold.rule.alertFlyout.alertOnGroupDisappear',
{
defaultMessage: 'Alert me if a group stops reporting data',
}
@@ -585,7 +588,7 @@ export default function Expressions(props: Props) {
content={
(disableNoData ? `${docCountNoDataDisabledHelpText} ` : '') +
i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.groupDisappearHelpText',
+ 'xpack.observability.customThreshold.rule.alertFlyout.groupDisappearHelpText',
{
defaultMessage:
'Enable this to trigger the action if a previously detected group begins to report no results. This is not recommended for dynamically scaling infrastructures that may rapidly start and stop nodes automatically.',
@@ -607,7 +610,7 @@ export default function Expressions(props: Props) {
}
const docCountNoDataDisabledHelpText = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText',
+ 'xpack.observability.customThreshold.rule.alertFlyout.docCountNoDataDisabledHelpText',
{
defaultMessage: '[This setting is not applicable to the Document Count aggregator.]',
}
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/calculate_domain.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/calculate_domain.ts
similarity index 92%
rename from x-pack/plugins/observability/public/components/threshold/helpers/calculate_domain.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/calculate_domain.ts
index 17a3b3eee7726..16d0d54d825c1 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/calculate_domain.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/calculate_domain.ts
@@ -6,8 +6,8 @@
*/
import { min, max, sum, isNumber } from 'lodash';
-import { MetricsExplorerSeries } from '../../../../common/threshold_rule/metrics_explorer';
-import { MetricsExplorerOptionsMetric } from '../../../../common/threshold_rule/types';
+import { MetricsExplorerSeries } from '../../../../common/custom_threshold_rule/metrics_explorer';
+import { MetricsExplorerOptionsMetric } from '../../../../common/custom_threshold_rule/types';
import { getMetricId } from './get_metric_id';
const getMin = (values: Array) => {
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/corrected_percent_convert.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/corrected_percent_convert.test.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/corrected_percent_convert.test.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/corrected_percent_convert.test.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/corrected_percent_convert.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/corrected_percent_convert.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/corrected_percent_convert.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/corrected_percent_convert.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metric.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metric.ts
similarity index 76%
rename from x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metric.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metric.ts
index 7cb96af683573..1423413e98388 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metric.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metric.ts
@@ -6,9 +6,9 @@
*/
import numeral from '@elastic/numeral';
-import { InfraFormatterType } from '../../../../common/threshold_rule/types';
-import { createFormatter } from '../../../../common/threshold_rule/formatters';
-import { MetricsExplorerMetric } from '../../../../common/threshold_rule/metrics_explorer';
+import { InfraFormatterType } from '../../../../common/custom_threshold_rule/types';
+import { createFormatter } from '../../../../common/custom_threshold_rule/formatters';
+import { MetricsExplorerMetric } from '../../../../common/custom_threshold_rule/metrics_explorer';
import { metricToFormat } from './metric_to_format';
export const createFormatterForMetric = (metric?: MetricsExplorerMetric) => {
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metrics.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metrics.test.ts
similarity index 94%
rename from x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metrics.test.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metrics.test.ts
index 07ed09095a6aa..0da0e765d724a 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/create_formatter_for_metrics.test.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_formatter_for_metrics.test.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { MetricsExplorerMetric } from '../../../../common/threshold_rule/metrics_explorer';
+import { MetricsExplorerMetric } from '../../../../common/custom_threshold_rule/metrics_explorer';
import { createFormatterForMetric } from './create_formatter_for_metric';
describe('createFormatterForMetric()', () => {
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/create_metric_label.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_metric_label.test.ts
similarity index 88%
rename from x-pack/plugins/observability/public/components/threshold/helpers/create_metric_label.test.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/create_metric_label.test.ts
index f1fe34c377f13..70c4959aafc19 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/create_metric_label.test.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_metric_label.test.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { MetricsExplorerMetric } from '../../../../common/threshold_rule/metrics_explorer';
+import { MetricsExplorerMetric } from '../../../../common/custom_threshold_rule/metrics_explorer';
import { createMetricLabel } from './create_metric_label';
describe('createMetricLabel()', () => {
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/create_metric_label.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/create_metric_label.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/create_metric_label.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/create_metric_label.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/get_metric_id.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/get_metric_id.ts
similarity index 93%
rename from x-pack/plugins/observability/public/components/threshold/helpers/get_metric_id.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/get_metric_id.ts
index 969ade79e4dda..a60af79ac6e2d 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/get_metric_id.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/get_metric_id.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { MetricsExplorerOptionsMetric } from '../../../../common/threshold_rule/types';
+import { MetricsExplorerOptionsMetric } from '../../../../common/custom_threshold_rule/types';
export const getMetricId = (metric: MetricsExplorerOptionsMetric, index: string | number) => {
return `metric_${index}`;
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/kuery.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/kuery.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/kuery.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/kuery.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/metric_to_format.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/metric_to_format.ts
similarity index 80%
rename from x-pack/plugins/observability/public/components/threshold/helpers/metric_to_format.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/metric_to_format.ts
index 0ed004793b296..2a7d28b72b7c7 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/metric_to_format.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/metric_to_format.ts
@@ -6,8 +6,8 @@
*/
import { last } from 'lodash';
-import { InfraFormatterType } from '../../../../common/threshold_rule/types';
-import { MetricsExplorerMetric } from '../../../../common/threshold_rule/metrics_explorer';
+import { InfraFormatterType } from '../../../../common/custom_threshold_rule/types';
+import { MetricsExplorerMetric } from '../../../../common/custom_threshold_rule/metrics_explorer';
export const metricToFormat = (metric?: MetricsExplorerMetric) => {
if (metric && metric.field) {
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/notifications.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/notifications.ts
similarity index 69%
rename from x-pack/plugins/observability/public/components/threshold/helpers/notifications.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/notifications.ts
index 914333439f426..bc840a206ac64 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/notifications.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/notifications.ts
@@ -15,16 +15,19 @@ export const useSourceNotifier = () => {
notifications.toasts.danger({
toastLifeTimeMs: 3000,
title: i18n.translate(
- 'xpack.observability.threshold.rule.sourceConfiguration.updateFailureTitle',
+ 'xpack.observability.customThreshold.rule.sourceConfiguration.updateFailureTitle',
{
defaultMessage: 'Configuration update failed',
}
),
body: [
- i18n.translate('xpack.observability.threshold.rule.sourceConfiguration.updateFailureBody', {
- defaultMessage:
- "We couldn't apply the changes to the Metrics configuration. Try again later.",
- }),
+ i18n.translate(
+ 'xpack.observability.customThreshold.rule.sourceConfiguration.updateFailureBody',
+ {
+ defaultMessage:
+ "We couldn't apply the changes to the Metrics configuration. Try again later.",
+ }
+ ),
message,
]
.filter(Boolean)
@@ -36,7 +39,7 @@ export const useSourceNotifier = () => {
notifications.toasts.success({
toastLifeTimeMs: 3000,
title: i18n.translate(
- 'xpack.observability.threshold.rule.sourceConfiguration.updateSuccessTitle',
+ 'xpack.observability.customThreshold.rule.sourceConfiguration.updateSuccessTitle',
{
defaultMessage: 'Metrics settings successfully updated',
}
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/runtime_types.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/runtime_types.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/runtime_types.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/runtime_types.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/source_errors.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/source_errors.ts
similarity index 89%
rename from x-pack/plugins/observability/public/components/threshold/helpers/source_errors.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/source_errors.ts
index 45cbbad7d3e3a..3ab64f1aac0bb 100644
--- a/x-pack/plugins/observability/public/components/threshold/helpers/source_errors.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/source_errors.ts
@@ -8,7 +8,7 @@
import { i18n } from '@kbn/i18n';
const missingHttpMessage = i18n.translate(
- 'xpack.observability.threshold.rule.sourceConfiguration.missingHttp',
+ 'xpack.observability.customThreshold.rule.sourceConfiguration.missingHttp',
{
defaultMessage: 'Failed to load source: No HTTP client available.',
}
diff --git a/x-pack/plugins/observability/public/components/threshold/helpers/use_alert_prefill.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/use_alert_prefill.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/helpers/use_alert_prefill.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/helpers/use_alert_prefill.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_kibana_time_zone_setting.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_kibana_time_zone_setting.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_kibana_time_zone_setting.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_kibana_time_zone_setting.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_kibana_timefilter_time.tsx b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_kibana_timefilter_time.tsx
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_kibana_timefilter_time.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_kibana_timefilter_time.tsx
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metric_threshold_alert_prefill.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metric_threshold_alert_prefill.ts
similarity index 91%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metric_threshold_alert_prefill.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metric_threshold_alert_prefill.ts
index 86262d0f272c2..6314ddb20a115 100644
--- a/x-pack/plugins/observability/public/components/threshold/hooks/use_metric_threshold_alert_prefill.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metric_threshold_alert_prefill.ts
@@ -7,7 +7,7 @@
import { isEqual } from 'lodash';
import { useState } from 'react';
-import { MetricsExplorerMetric } from '../../../../common/threshold_rule/metrics_explorer';
+import { MetricsExplorerMetric } from '../../../../common/custom_threshold_rule/metrics_explorer';
export interface MetricThresholdPrefillOptions {
groupBy: string | string[] | undefined;
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_chart_data.ts
similarity index 97%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_chart_data.ts
index 26924ff0d3d8e..ef810bc8857d9 100644
--- a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_chart_data.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_chart_data.ts
@@ -8,8 +8,8 @@
import DateMath from '@kbn/datemath';
import { DataViewBase } from '@kbn/es-query';
import { useMemo } from 'react';
-import { MetricExplorerCustomMetricAggregations } from '../../../../common/threshold_rule/metrics_explorer';
-import { CustomThresholdExpressionMetric } from '../../../../common/threshold_rule/types';
+import { MetricExplorerCustomMetricAggregations } from '../../../../common/custom_threshold_rule/metrics_explorer';
+import { CustomThresholdExpressionMetric } from '../../../../common/custom_threshold_rule/types';
import { MetricExpression, TimeRange } from '../types';
import { useMetricsExplorerData } from './use_metrics_explorer_data';
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_data.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.test.tsx
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_data.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.test.tsx
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_data.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts
similarity index 97%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_data.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts
index 2e01d72572fb8..59857990b906e 100644
--- a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_data.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts
@@ -12,7 +12,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public';
import {
MetricsExplorerResponse,
metricsExplorerResponseRT,
-} from '../../../../common/threshold_rule/metrics_explorer';
+} from '../../../../common/custom_threshold_rule/metrics_explorer';
import {
MetricsExplorerOptions,
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_options.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_options.test.tsx
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_options.test.tsx
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_options.test.tsx
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_options.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_options.ts
similarity index 97%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_options.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_options.ts
index a23bed69d9f43..7d734a961b04e 100644
--- a/x-pack/plugins/observability/public/components/threshold/hooks/use_metrics_explorer_options.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_options.ts
@@ -12,8 +12,8 @@ import createContainer from 'constate';
import type { TimeRange } from '@kbn/es-query';
import { useState, useEffect, useMemo, Dispatch, SetStateAction } from 'react';
-import { metricsExplorerMetricRT } from '../../../../common/threshold_rule/metrics_explorer';
-import { Color } from '../../../../common/threshold_rule/color_palette';
+import { metricsExplorerMetricRT } from '../../../../common/custom_threshold_rule/metrics_explorer';
+import { Color } from '../../../../common/custom_threshold_rule/color_palette';
import { useAlertPrefillContext } from '../helpers/use_alert_prefill';
import { useKibanaTimefilterTime, useSyncKibanaTimeFilterTime } from './use_kibana_timefilter_time';
diff --git a/x-pack/plugins/observability/public/components/threshold/hooks/use_tracked_promise.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_tracked_promise.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/hooks/use_tracked_promise.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/hooks/use_tracked_promise.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/i18n_strings.ts b/x-pack/plugins/observability/public/components/custom_threshold/i18n_strings.ts
similarity index 65%
rename from x-pack/plugins/observability/public/components/threshold/i18n_strings.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/i18n_strings.ts
index 0c480fbb9fb28..cca654da08a09 100644
--- a/x-pack/plugins/observability/public/components/threshold/i18n_strings.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/i18n_strings.ts
@@ -8,7 +8,7 @@
import { i18n } from '@kbn/i18n';
export const EQUATION_HELP_MESSAGE = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationHelpMessage',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.equationHelpMessage',
{
defaultMessage:
'Supports basic math equations, valid charaters are: A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =',
@@ -16,32 +16,32 @@ export const EQUATION_HELP_MESSAGE = i18n.translate(
);
export const LABEL_LABEL = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.labelLabel',
{ defaultMessage: 'Label (optional)' }
);
export const LABEL_HELP_MESSAGE = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelHelpMessage',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.labelHelpMessage',
{
defaultMessage: 'Custom label will show on the alert chart and in reason',
}
);
export const CUSTOM_EQUATION = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquation',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquation',
{
defaultMessage: 'Custom equation',
}
);
export const DELETE_LABEL = i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.deleteRowButton',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.deleteRowButton',
{ defaultMessage: 'Delete' }
);
export const AGGREGATION_LABEL = (name: string) =>
i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel',
+ 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.aggregationLabel',
{
defaultMessage: 'Aggregation {name}',
values: { name },
diff --git a/x-pack/plugins/observability/public/components/threshold/lib/generate_unique_key.test.ts b/x-pack/plugins/observability/public/components/custom_threshold/lib/generate_unique_key.test.ts
similarity index 93%
rename from x-pack/plugins/observability/public/components/threshold/lib/generate_unique_key.test.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/lib/generate_unique_key.test.ts
index bafdf5f235467..f6b20963ccb00 100644
--- a/x-pack/plugins/observability/public/components/threshold/lib/generate_unique_key.test.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/lib/generate_unique_key.test.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Aggregators, Comparator } from '../../../../common/threshold_rule/types';
+import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types';
import { MetricExpression } from '../types';
import { generateUniqueKey } from './generate_unique_key';
diff --git a/x-pack/plugins/observability/public/components/threshold/lib/generate_unique_key.ts b/x-pack/plugins/observability/public/components/custom_threshold/lib/generate_unique_key.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/lib/generate_unique_key.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/lib/generate_unique_key.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/lib/transform_metrics_explorer_data.ts b/x-pack/plugins/observability/public/components/custom_threshold/lib/transform_metrics_explorer_data.ts
similarity index 91%
rename from x-pack/plugins/observability/public/components/threshold/lib/transform_metrics_explorer_data.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/lib/transform_metrics_explorer_data.ts
index 5fc221afca80f..2a30136924420 100644
--- a/x-pack/plugins/observability/public/components/threshold/lib/transform_metrics_explorer_data.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/lib/transform_metrics_explorer_data.ts
@@ -6,7 +6,7 @@
*/
import { first } from 'lodash';
-import { MetricsExplorerResponse } from '../../../../common/threshold_rule/metrics_explorer';
+import { MetricsExplorerResponse } from '../../../../common/custom_threshold_rule/metrics_explorer';
import { MetricThresholdAlertParams, ExpressionChartSeries } from '../types';
export const transformMetricsExplorerData = (
diff --git a/x-pack/plugins/observability/public/components/threshold/mocks/metric_threshold_rule.ts b/x-pack/plugins/observability/public/components/custom_threshold/mocks/metric_threshold_rule.ts
similarity index 93%
rename from x-pack/plugins/observability/public/components/threshold/mocks/metric_threshold_rule.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/mocks/metric_threshold_rule.ts
index 478d27484df0d..810ff3c1f5983 100644
--- a/x-pack/plugins/observability/public/components/threshold/mocks/metric_threshold_rule.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/mocks/metric_threshold_rule.ts
@@ -6,7 +6,7 @@
*/
import { v4 as uuidv4 } from 'uuid';
-import { Aggregators, Comparator } from '../../../../common/threshold_rule/types';
+import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types';
import { MetricThresholdAlert, MetricThresholdRule } from '../components/alert_details_app_section';
@@ -159,18 +159,18 @@ export const buildMetricThresholdAlert = (
alertOnGroupDisappear: true,
},
'kibana.alert.evaluation.values': [2500, 5],
- 'kibana.alert.rule.category': 'Metric threshold',
+ 'kibana.alert.rule.category': 'Custom threshold (BETA)',
'kibana.alert.rule.consumer': 'alerts',
'kibana.alert.rule.execution.uuid': '62dd07ef-ead9-4b1f-a415-7c83d03925f7',
'kibana.alert.rule.name': 'One condition',
- 'kibana.alert.rule.producer': 'infrastructure',
- 'kibana.alert.rule.rule_type_id': 'metrics.alert.threshold',
+ 'kibana.alert.rule.producer': 'observability',
+ 'kibana.alert.rule.rule_type_id': 'observability.rules.custom_threshold',
'kibana.alert.rule.uuid': '3a1ed8c0-c1a8-11ed-9249-ed6d75986bdc',
'kibana.space_ids': ['default'],
'kibana.alert.rule.tags': [],
'@timestamp': '2023-03-28T14:40:00.000Z',
'kibana.alert.reason': 'system.cpu.user.pct reported no data in the last 1m for ',
- 'kibana.alert.action_group': 'metrics.threshold.nodata',
+ 'kibana.alert.action_group': 'custom_threshold.nodata',
tags: [],
'kibana.alert.duration.us': 248391946000,
'kibana.alert.time_range': {
diff --git a/x-pack/plugins/observability/public/components/threshold/rule_data_formatters.ts b/x-pack/plugins/observability/public/components/custom_threshold/rule_data_formatters.ts
similarity index 100%
rename from x-pack/plugins/observability/public/components/threshold/rule_data_formatters.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/rule_data_formatters.ts
diff --git a/x-pack/plugins/observability/public/components/threshold/types.ts b/x-pack/plugins/observability/public/components/custom_threshold/types.ts
similarity index 97%
rename from x-pack/plugins/observability/public/components/threshold/types.ts
rename to x-pack/plugins/observability/public/components/custom_threshold/types.ts
index 6336c3f292677..d0b173b4d7c34 100644
--- a/x-pack/plugins/observability/public/components/threshold/types.ts
+++ b/x-pack/plugins/observability/public/components/custom_threshold/types.ts
@@ -25,7 +25,7 @@ import { UiActionsStart } from '@kbn/ui-actions-plugin/public';
import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public';
import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public';
import { TimeUnitChar } from '../../../common/utils/formatters';
-import { MetricsExplorerSeries } from '../../../common/threshold_rule/metrics_explorer';
+import { MetricsExplorerSeries } from '../../../common/custom_threshold_rule/metrics_explorer';
import {
Comparator,
CustomMetricExpressionParams,
@@ -33,7 +33,7 @@ import {
MetricsSourceStatus,
NonCountMetricExpressionParams,
SnapshotCustomMetricInput,
-} from '../../../common/threshold_rule/types';
+} from '../../../common/custom_threshold_rule/types';
import { ObservabilityPublicStart } from '../../plugin';
import { MetricsExplorerOptions } from './hooks/use_metrics_explorer_options';
diff --git a/x-pack/plugins/observability/public/components/rule_kql_filter/with_kuery_autocompletion.tsx b/x-pack/plugins/observability/public/components/rule_kql_filter/with_kuery_autocompletion.tsx
index 86a9300e98aa0..2325434a08234 100644
--- a/x-pack/plugins/observability/public/components/rule_kql_filter/with_kuery_autocompletion.tsx
+++ b/x-pack/plugins/observability/public/components/rule_kql_filter/with_kuery_autocompletion.tsx
@@ -14,7 +14,7 @@ import {
} from '@kbn/kibana-react-plugin/public';
import type { DataView } from '@kbn/data-views-plugin/public';
import { QuerySuggestion } from '@kbn/unified-search-plugin/public';
-import { InfraClientStartDeps, RendererFunction } from '../threshold/types';
+import { InfraClientStartDeps, RendererFunction } from '../custom_threshold/types';
interface WithKueryAutocompletionLifecycleProps {
kibana: KibanaReactContextValue;
diff --git a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx
index 1a665924b5227..455d6d9d24ed3 100644
--- a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx
+++ b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx
@@ -25,10 +25,10 @@ export function SloGroupByBadge({ slo }: Props) {
{
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toMatchObject({
hasDataMap: {},
- hasAnyData: undefined,
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -78,6 +78,7 @@ describe('HasDataContextProvider', () => {
infra_metrics: { hasData: undefined, status: 'success' },
ux: { hasData: undefined, status: 'success' },
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: false,
isAllRequestsComplete: true,
@@ -114,8 +115,10 @@ describe('HasDataContextProvider', () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: {
+ universal_profiling: { hasData: false, status: 'success' },
+ },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -139,6 +142,7 @@ describe('HasDataContextProvider', () => {
status: 'success',
},
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: false,
isAllRequestsComplete: true,
@@ -176,8 +180,8 @@ describe('HasDataContextProvider', () => {
it('hasAnyData returns true apm returns true and all other apps return false', async () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -203,6 +207,7 @@ describe('HasDataContextProvider', () => {
status: 'success',
},
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: true,
isAllRequestsComplete: true,
@@ -240,8 +245,8 @@ describe('HasDataContextProvider', () => {
it('hasAnyData returns true and all apps return true', async () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -271,6 +276,7 @@ describe('HasDataContextProvider', () => {
status: 'success',
},
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: true,
isAllRequestsComplete: true,
@@ -295,8 +301,8 @@ describe('HasDataContextProvider', () => {
wrapper,
});
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -314,6 +320,7 @@ describe('HasDataContextProvider', () => {
infra_metrics: { hasData: undefined, status: 'success' },
ux: { hasData: undefined, status: 'success' },
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: true,
isAllRequestsComplete: true,
@@ -340,8 +347,8 @@ describe('HasDataContextProvider', () => {
wrapper,
});
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -363,6 +370,7 @@ describe('HasDataContextProvider', () => {
infra_metrics: { hasData: undefined, status: 'success' },
ux: { hasData: undefined, status: 'success' },
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: false,
isAllRequestsComplete: true,
@@ -406,8 +414,8 @@ describe('HasDataContextProvider', () => {
it('hasAnyData returns true, apm is undefined and all other apps return true', async () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -434,6 +442,7 @@ describe('HasDataContextProvider', () => {
status: 'success',
},
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: true,
isAllRequestsComplete: true,
@@ -484,8 +493,8 @@ describe('HasDataContextProvider', () => {
it('hasAnyData returns false and all apps return undefined', async () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -503,6 +512,7 @@ describe('HasDataContextProvider', () => {
infra_metrics: { hasData: undefined, status: 'failure' },
ux: { hasData: undefined, status: 'failure' },
alert: { hasData: false, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: false,
isAllRequestsComplete: true,
@@ -530,8 +540,8 @@ describe('HasDataContextProvider', () => {
it('returns if alerts are available', async () => {
const { result, waitForNextUpdate } = renderHook(() => useHasData(), { wrapper });
expect(result.current).toEqual({
- hasDataMap: {},
- hasAnyData: undefined,
+ hasDataMap: { universal_profiling: { hasData: false, status: 'success' } },
+ hasAnyData: false,
isAllRequestsComplete: false,
forceUpdate: expect.any(String),
onRefreshTimeRange: expect.any(Function),
@@ -548,10 +558,8 @@ describe('HasDataContextProvider', () => {
infra_logs: { hasData: undefined, status: 'success' },
infra_metrics: { hasData: undefined, status: 'success' },
ux: { hasData: undefined, status: 'success' },
- alert: {
- hasData: true,
- status: 'success',
- },
+ alert: { hasData: true, status: 'success' },
+ universal_profiling: { hasData: false, status: 'success' },
},
hasAnyData: true,
isAllRequestsComplete: true,
diff --git a/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx
index d6e70b74f446a..40c54e7d0b2ec 100644
--- a/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx
+++ b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx
@@ -16,6 +16,7 @@ import {
APM_APP,
INFRA_LOGS_APP,
INFRA_METRICS_APP,
+ UNIVERSAL_PROFILING_APP,
UPTIME_APP,
UX_APP,
} from '../constants';
@@ -54,6 +55,7 @@ const apps: DataContextApps[] = [
INFRA_METRICS_APP,
UX_APP,
ALERT_APP,
+ UNIVERSAL_PROFILING_APP,
];
export function HasDataContextProvider({ children }: { children: React.ReactNode }) {
@@ -123,6 +125,10 @@ export function HasDataContextProvider({ children }: { children: React.ReactNode
indices: resultInfraMetrics?.indices,
});
break;
+ case UNIVERSAL_PROFILING_APP:
+ // Profiling only shows the empty section for now
+ updateState({ hasData: false });
+ break;
}
} catch (e) {
setHasDataMap((prevState) => ({
diff --git a/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx
index 9dc940008a96e..886f9ae4d42ed 100644
--- a/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx
+++ b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx
@@ -147,5 +147,23 @@ const getEmptySections = ({ http }: { http: HttpSetup }): Section[] => {
}),
href: http.basePath.prepend(paths.observability.rules),
},
+ {
+ id: 'universal_profiling',
+ title: i18n.translate('xpack.observability.emptySection.apps.universalProfiling.title', {
+ defaultMessage: 'Universal Profiling',
+ }),
+ icon: 'logoObservability',
+ description: i18n.translate(
+ 'xpack.observability.emptySection.apps.universalProfiling.description',
+ {
+ defaultMessage:
+ 'Understand what lines of code are consuming compute resources across your entire infrastructure, with minimal overhead and zero instrumentation',
+ }
+ ),
+ linkTitle: i18n.translate('xpack.observability.emptySection.apps.universalProfiling.link', {
+ defaultMessage: 'Install Profiling Host Agent',
+ }),
+ href: http.basePath.prepend('/app/profiling/add-data-instructions'),
+ },
];
};
diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.test.tsx
new file mode 100644
index 0000000000000..5185fa73758d1
--- /dev/null
+++ b/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.test.tsx
@@ -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 { screen } from '@testing-library/react';
+import React from 'react';
+
+import { buildSlo } from '../../../data/slo/slo';
+import { render } from '../../../utils/test_helper';
+import { BurnRate } from './burn_rate';
+
+describe('BurnRate', () => {
+ it("displays '--' when burn rate is 'undefined'", async () => {
+ const slo = buildSlo();
+ render( );
+
+ expect(screen.queryByTestId('sloDetailsBurnRateStat')).toHaveTextContent('--');
+ });
+
+ it("displays the burn rate value when not 'undefined'", async () => {
+ const slo = buildSlo();
+ render( );
+
+ expect(screen.queryByTestId('sloDetailsBurnRateStat')).toHaveTextContent('3.4x');
+ });
+
+ it("displays the burn rate value when '0'", async () => {
+ const slo = buildSlo();
+ render( );
+
+ expect(screen.queryByTestId('sloDetailsBurnRateStat')).toHaveTextContent('0x');
+ });
+});
diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.tsx
index 1fd2014dee4c7..46c35436359cf 100644
--- a/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.tsx
+++ b/x-pack/plugins/observability/public/pages/slo_details/components/burn_rate.tsx
@@ -64,7 +64,8 @@ function getSubtitleFromStatus(
}
export function BurnRate({ threshold, burnRate, slo, isLoading }: BurnRateParams) {
- const status: Status = !burnRate ? 'NO_DATA' : burnRate > threshold ? 'BREACHED' : 'OK';
+ const status: Status =
+ burnRate === undefined ? 'NO_DATA' : burnRate > threshold ? 'BREACHED' : 'OK';
const color = status === 'NO_DATA' ? 'subdued' : status === 'BREACHED' ? 'danger' : 'success';
return (
@@ -86,11 +87,12 @@ export function BurnRate({ threshold, burnRate, slo, isLoading }: BurnRateParams
diff --git a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts
index c06bd84e02c77..e7195dfad76ac 100644
--- a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts
+++ b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts
@@ -17,8 +17,8 @@ import {
SLO_BURN_RATE_RULE_TYPE_ID,
} from '../../common/constants';
import { validateBurnRateRule } from '../components/burn_rate_rule_editor/validation';
-import { validateMetricThreshold } from '../components/threshold/components/validation';
-import { formatReason } from '../components/threshold/rule_data_formatters';
+import { validateMetricThreshold } from '../components/custom_threshold/components/validation';
+import { formatReason } from '../components/custom_threshold/rule_data_formatters';
const sloBurnRateDefaultActionMessage = i18n.translate(
'xpack.observability.slo.rules.burnRate.defaultActionMessage',
@@ -54,7 +54,7 @@ const sloBurnRateDefaultRecoveryMessage = i18n.translate(
);
const thresholdDefaultActionMessage = i18n.translate(
- 'xpack.observability.threshold.rule.alerting.threshold.defaultActionMessage',
+ 'xpack.observability.customThreshold.rule.alerting.threshold.defaultActionMessage',
{
defaultMessage: `\\{\\{context.reason\\}\\}
@@ -65,7 +65,7 @@ const thresholdDefaultActionMessage = i18n.translate(
}
);
const thresholdDefaultRecoveryMessage = i18n.translate(
- 'xpack.observability.threshold.rule.alerting.threshold.defaultRecoveryMessage',
+ 'xpack.observability.customThreshold.rule.alerting.threshold.defaultRecoveryMessage',
{
defaultMessage: `\\{\\{rule.name\\}\\} has recovered.
@@ -106,7 +106,7 @@ export const registerObservabilityRuleTypes = (
observabilityRuleTypeRegistry.register({
id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID,
description: i18n.translate(
- 'xpack.observability.threshold.rule.alertFlyout.alertDescription',
+ 'xpack.observability.customThreshold.rule.alertFlyout.alertDescription',
{
defaultMessage:
'Alert when any Observability data type reaches or exceeds a given value.',
@@ -116,14 +116,16 @@ export const registerObservabilityRuleTypes = (
documentationUrl(docLinks) {
return `${docLinks.links.observability.threshold}`;
},
- ruleParamsExpression: lazy(() => import('../components/threshold/threshold_rule_expression')),
+ ruleParamsExpression: lazy(
+ () => import('../components/custom_threshold/custom_threshold_rule_expression')
+ ),
validate: validateMetricThreshold,
defaultActionMessage: thresholdDefaultActionMessage,
defaultRecoveryMessage: thresholdDefaultRecoveryMessage,
requiresAppContext: false,
format: formatReason,
alertDetailsAppSection: lazy(
- () => import('../components/threshold/components/alert_details_app_section')
+ () => import('../components/custom_threshold/components/alert_details_app_section')
),
});
}
diff --git a/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts b/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts
index 14305e4f7ab91..120de8934fcff 100644
--- a/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts
+++ b/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts
@@ -66,6 +66,10 @@ export interface InfraLogsHasDataResponse {
indices: string;
}
+interface UniversalProfilingHasDataResponse {
+ hasData: boolean;
+}
+
export type FetchData = (
fetchDataParams: FetchDataParams
) => Promise;
@@ -150,12 +154,15 @@ export interface UxFetchDataResponse extends FetchDataResponse {
coreWebVitals: UXMetrics;
}
+export type UniversalProfilingDataResponse = FetchDataResponse;
+
export interface ObservabilityFetchDataResponse {
apm: ApmFetchDataResponse;
infra_metrics: MetricsFetchDataResponse;
infra_logs: LogsFetchDataResponse;
uptime: UptimeFetchDataResponse;
ux: UxFetchDataResponse;
+ universal_profiling: UniversalProfilingDataResponse;
}
export interface ObservabilityHasDataResponse {
@@ -164,4 +171,5 @@ export interface ObservabilityHasDataResponse {
infra_logs: InfraLogsHasDataResponse;
uptime: SyntheticsHasDataResponse;
ux: UXHasDataResponse;
+ universal_profiling: UniversalProfilingHasDataResponse;
}
diff --git a/x-pack/plugins/observability/public/utils/metrics_explorer.ts b/x-pack/plugins/observability/public/utils/metrics_explorer.ts
index 3994a1c4ee69b..136df77131811 100644
--- a/x-pack/plugins/observability/public/utils/metrics_explorer.ts
+++ b/x-pack/plugins/observability/public/utils/metrics_explorer.ts
@@ -8,7 +8,7 @@
import {
MetricsExplorerResponse,
MetricsExplorerSeries,
-} from '../../common/threshold_rule/metrics_explorer';
+} from '../../common/custom_threshold_rule/metrics_explorer';
import {
MetricsExplorerChartOptions,
MetricsExplorerChartType,
@@ -16,7 +16,7 @@ import {
MetricsExplorerTimeOptions,
MetricsExplorerTimestampsRT,
MetricsExplorerYAxisMode,
-} from '../components/threshold/hooks/use_metrics_explorer_options';
+} from '../components/custom_threshold/hooks/use_metrics_explorer_options';
export const options: MetricsExplorerOptions = {
limit: 3,
diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts
index d5d5604001aa9..e0444fe34f861 100644
--- a/x-pack/plugins/observability/server/index.ts
+++ b/x-pack/plugins/observability/server/index.ts
@@ -50,7 +50,7 @@ const configSchema = schema.object({
enabled: schema.boolean({ defaultValue: false }),
}),
}),
- thresholdRule: schema.object({
+ customThresholdRule: schema.object({
groupByPageSize: schema.number({ defaultValue: 10_000 }),
}),
enabled: schema.boolean({ defaultValue: true }),
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts
similarity index 99%
rename from x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.test.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts
index 1cf093ab91eee..4a4640e6e1f2f 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.test.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts
@@ -18,7 +18,7 @@ import {
FIRED_ACTIONS,
MetricThresholdAlertContext,
NO_DATA_ACTIONS,
-} from './threshold_executor';
+} from './custom_threshold_executor';
import { Evaluation } from './lib/evaluate_rule';
import type { LogMeta, Logger } from '@kbn/logging';
import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common';
@@ -27,7 +27,7 @@ import {
Comparator,
CountMetricExpressionParams,
NonCountMetricExpressionParams,
-} from '../../../../common/threshold_rule/types';
+} from '../../../../common/custom_threshold_rule/types';
jest.mock('./lib/evaluate_rule', () => ({ evaluateRule: jest.fn() }));
@@ -1888,7 +1888,7 @@ const mockLibs: any = {
},
logger,
config: {
- thresholdRule: {
+ customThresholdRule: {
groupByPageSize: 10_000,
},
},
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts
similarity index 94%
rename from x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts
index 5ce2e40a1d023..bff471aaea2ec 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/threshold_executor.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.ts
@@ -19,8 +19,8 @@ import { Alert, RuleTypeState } from '@kbn/alerting-plugin/server';
import { IBasePath, Logger } from '@kbn/core/server';
import { LifecycleRuleExecutor } from '@kbn/rule-registry-plugin/server';
import { AlertsLocatorParams, getAlertUrl, TimeUnitChar } from '../../../../common';
-import { createFormatter } from '../../../../common/threshold_rule/formatters';
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { createFormatter } from '../../../../common/custom_threshold_rule/formatters';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
import { ObservabilityConfig } from '../../..';
import { AlertStates, searchConfigurationSchema } from './types';
@@ -62,8 +62,8 @@ export interface MetricThresholdAlertContext extends Record {
value?: Array | null;
}
-export const FIRED_ACTIONS_ID = 'threshold.fired';
-export const NO_DATA_ACTIONS_ID = 'threshold.nodata';
+export const FIRED_ACTIONS_ID = 'custom_threshold.fired';
+export const NO_DATA_ACTIONS_ID = 'custom_threshold.nodata';
type MetricThresholdActionGroup =
| typeof FIRED_ACTIONS_ID
@@ -158,7 +158,7 @@ export const createMetricThresholdExecutor = ({
// For backwards-compatibility, interpret undefined alertOnGroupDisappear as true
const alertOnGroupDisappear = _alertOnGroupDisappear !== false;
- const compositeSize = config.thresholdRule.groupByPageSize;
+ const compositeSize = config.customThresholdRule.groupByPageSize;
const queryIsSame = isEqual(
state.searchConfiguration?.query.query,
params.searchConfiguration.query.query
@@ -368,17 +368,20 @@ export const createMetricThresholdExecutor = ({
};
export const FIRED_ACTIONS = {
- id: 'threshold.fired',
- name: i18n.translate('xpack.observability.threshold.rule.alerting.threshold.fired', {
+ id: 'custom_threshold.fired',
+ name: i18n.translate('xpack.observability.customThreshold.rule.alerting.custom_threshold.fired', {
defaultMessage: 'Alert',
}),
};
export const NO_DATA_ACTIONS = {
- id: 'threshold.nodata',
- name: i18n.translate('xpack.observability.threshold.rule.alerting.threshold.nodata', {
- defaultMessage: 'No Data',
- }),
+ id: 'custom_threshold.nodata',
+ name: i18n.translate(
+ 'xpack.observability.customThreshold.rule.alerting.custom_threshold.nodata',
+ {
+ defaultMessage: 'No Data',
+ }
+ ),
};
const formatAlertResult = (
@@ -393,7 +396,7 @@ const formatAlertResult = (
) => {
const { metric, currentValue, threshold, comparator } = alertResult;
const noDataValue = i18n.translate(
- 'xpack.observability.threshold.rule.alerting.threshold.noDataFormattedValue',
+ 'xpack.observability.customThreshold.rule.alerting.threshold.noDataFormattedValue',
{ defaultMessage: '[NO DATA]' }
);
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/check_missing_group.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/check_missing_group.ts
similarity index 96%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/check_missing_group.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/check_missing_group.ts
index 4b8c47a1af866..7651130601b6c 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/check_missing_group.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/check_missing_group.ts
@@ -8,7 +8,7 @@
import { ElasticsearchClient } from '@kbn/core/server';
import type { Logger } from '@kbn/logging';
import { isString, get, identity } from 'lodash';
-import { MetricExpressionParams } from '../../../../../common/threshold_rule/types';
+import { MetricExpressionParams } from '../../../../../common/custom_threshold_rule/types';
import type { BucketKey } from './get_data';
import { calculateCurrentTimeframe, createBaseFilters } from './metric_query';
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/convert_strings_to_missing_groups_record.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/convert_strings_to_missing_groups_record.ts
similarity index 100%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/convert_strings_to_missing_groups_record.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/convert_strings_to_missing_groups_record.ts
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_bucket_selector.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_bucket_selector.ts
similarity index 98%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_bucket_selector.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_bucket_selector.ts
index 0af245df1a102..6300bfac703f3 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_bucket_selector.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_bucket_selector.ts
@@ -9,7 +9,7 @@ import {
Aggregators,
Comparator,
MetricExpressionParams,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
import { createConditionScript } from './create_condition_script';
import { createLastPeriod } from './wrap_in_period';
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_condition_script.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_condition_script.ts
similarity index 92%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_condition_script.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_condition_script.ts
index 2355b2d301065..ad4aaa980aa63 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_condition_script.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_condition_script.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Comparator } from '../../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../../common/custom_threshold_rule/types';
export const createConditionScript = (threshold: number[], comparator: Comparator) => {
if (comparator === Comparator.BETWEEN && threshold.length === 2) {
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_custom_metrics_aggregations.ts
similarity index 98%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_custom_metrics_aggregations.ts
index a52ad0247475c..93eecd37c1c5d 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_custom_metrics_aggregations.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_custom_metrics_aggregations.ts
@@ -7,7 +7,7 @@
import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import { isEmpty } from 'lodash';
-import { CustomThresholdExpressionMetric } from '../../../../../common/threshold_rule/types';
+import { CustomThresholdExpressionMetric } from '../../../../../common/custom_threshold_rule/types';
import { MetricsExplorerCustomMetric } from './metrics_explorer';
const isMetricExpressionCustomMetric = (
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_percentile_aggregation.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_percentile_aggregation.ts
similarity index 87%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_percentile_aggregation.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_percentile_aggregation.ts
index d96dbe49f5a88..73db4a3e747ee 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_percentile_aggregation.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_percentile_aggregation.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Aggregators } from '../../../../../common/threshold_rule/types';
+import { Aggregators } from '../../../../../common/custom_threshold_rule/types';
export const createPercentileAggregation = (
type: Aggregators.P95 | Aggregators.P99,
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_rate_aggregation.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_rate_aggregation.ts
similarity index 100%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_rate_aggregation.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_rate_aggregation.ts
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.test.ts
similarity index 98%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.test.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.test.ts
index 06b1554706a93..c48ce1d9ab50d 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.test.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.test.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
-import { Aggregators } from '../../../../../common/threshold_rule/types';
+import { Aggregators } from '../../../../../common/custom_threshold_rule/types';
import moment from 'moment';
import { createTimerange } from './create_timerange';
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.ts
similarity index 92%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.ts
index 446299c4ba92b..75f4dda7ff8d6 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/create_timerange.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/create_timerange.ts
@@ -6,7 +6,7 @@
*/
import moment from 'moment';
-import { Aggregators } from '../../../../../common/threshold_rule/types';
+import { Aggregators } from '../../../../../common/custom_threshold_rule/types';
export const createTimerange = (
interval: number,
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/evaluate_rule.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/evaluate_rule.ts
similarity index 96%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/evaluate_rule.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/evaluate_rule.ts
index 31b86eb73beea..66007de19b622 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/evaluate_rule.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/evaluate_rule.ts
@@ -8,10 +8,10 @@
import moment from 'moment';
import { ElasticsearchClient } from '@kbn/core/server';
import type { Logger } from '@kbn/logging';
-import { MetricExpressionParams } from '../../../../../common/threshold_rule/types';
+import { MetricExpressionParams } from '../../../../../common/custom_threshold_rule/types';
import { isCustom } from './metric_expression_params';
import { AdditionalContext, getIntervalInSeconds } from '../utils';
-import { SearchConfigurationType } from '../threshold_executor';
+import { SearchConfigurationType } from '../custom_threshold_executor';
import { CUSTOM_EQUATION_I18N, DOCUMENT_COUNT_I18N } from '../messages';
import { createTimerange } from './create_timerange';
import { getData } from './get_data';
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/get_data.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/get_data.ts
similarity index 99%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/get_data.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/get_data.ts
index 9d5db3a14727b..d5a09dbf567a3 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/get_data.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/get_data.ts
@@ -13,7 +13,7 @@ import {
Aggregators,
Comparator,
MetricExpressionParams,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
import {
CONTAINER_ID,
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_expression_params.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_expression_params.ts
similarity index 93%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_expression_params.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_expression_params.ts
index c81b43c9baeb6..278f33dadafe9 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_expression_params.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_expression_params.ts
@@ -9,7 +9,7 @@ import {
CustomMetricExpressionParams,
MetricExpressionParams,
NonCountMetricExpressionParams,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
export const isNotCountOrCustom = (
metricExpressionParams: MetricExpressionParams
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts
similarity index 98%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.test.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts
index 2aed703e9c3a1..cdfe0c66c0ab9 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.test.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts
@@ -9,7 +9,7 @@ import {
Comparator,
Aggregators,
MetricExpressionParams,
-} from '../../../../../common/threshold_rule/types';
+} from '../../../../../common/custom_threshold_rule/types';
import moment from 'moment';
import { getElasticsearchMetricQuery } from './metric_query';
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.ts
similarity index 98%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.ts
index 3eac288648093..66868ad97dfc9 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metric_query.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.ts
@@ -6,7 +6,10 @@
*/
import moment from 'moment';
-import { Aggregators, MetricExpressionParams } from '../../../../../common/threshold_rule/types';
+import {
+ Aggregators,
+ MetricExpressionParams,
+} from '../../../../../common/custom_threshold_rule/types';
import { isCustom, isNotCountOrCustom } from './metric_expression_params';
import { createCustomMetricsAggregations } from './create_custom_metrics_aggregations';
import {
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metrics_explorer.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metrics_explorer.ts
similarity index 94%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/metrics_explorer.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metrics_explorer.ts
index 2de1a21c3cd48..e72974828b027 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/metrics_explorer.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metrics_explorer.ts
@@ -6,20 +6,8 @@
*/
import * as rt from 'io-ts';
-import { metricsExplorerCustomMetricAggregationRT } from '../../../../../common/threshold_rule/metrics_explorer';
-
-export const METRIC_EXPLORER_AGGREGATIONS = [
- 'avg',
- 'max',
- 'min',
- 'cardinality',
- 'rate',
- 'count',
- 'sum',
- 'p95',
- 'p99',
- 'custom',
-] as const;
+import { METRIC_EXPLORER_AGGREGATIONS } from '../../../../../common/custom_threshold_rule/constants';
+import { metricsExplorerCustomMetricAggregationRT } from '../../../../../common/custom_threshold_rule/metrics_explorer';
type MetricExplorerAggregations = typeof METRIC_EXPLORER_AGGREGATIONS[number];
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/lib/wrap_in_period.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/wrap_in_period.ts
similarity index 93%
rename from x-pack/plugins/observability/server/lib/rules/threshold/lib/wrap_in_period.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/wrap_in_period.ts
index d313e5efd9fcd..a76c45e4e4583 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/lib/wrap_in_period.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/wrap_in_period.ts
@@ -6,7 +6,7 @@
*/
import moment from 'moment';
-import { MetricExpressionParams } from '../../../../../common/threshold_rule/types';
+import { MetricExpressionParams } from '../../../../../common/custom_threshold_rule/types';
export const createLastPeriod = (
lastPeriodEnd: number,
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/messages.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/messages.ts
similarity index 73%
rename from x-pack/plugins/observability/server/lib/rules/threshold/messages.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/messages.ts
index ac0f1ef8b98c4..80ca06c24e59f 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/messages.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/messages.ts
@@ -6,19 +6,19 @@
*/
import { i18n } from '@kbn/i18n';
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
import { formatDurationFromTimeUnitChar, TimeUnitChar } from '../../../../common';
import { UNGROUPED_FACTORY_KEY } from './utils';
export const DOCUMENT_COUNT_I18N = i18n.translate(
- 'xpack.observability.threshold.rule.threshold.documentCount',
+ 'xpack.observability.customThreshold.rule.threshold.documentCount',
{
defaultMessage: 'Document count',
}
);
export const CUSTOM_EQUATION_I18N = i18n.translate(
- 'xpack.observability.threshold.rule.threshold.customEquation',
+ 'xpack.observability.customThreshold.rule.threshold.customEquation',
{
defaultMessage: 'Custom equation',
}
@@ -32,17 +32,23 @@ const recoveredComparatorToI18n = (
threshold: number[],
currentValue: number
) => {
- const belowText = i18n.translate('xpack.observability.threshold.rule.threshold.belowRecovery', {
- defaultMessage: 'below',
- });
- const aboveText = i18n.translate('xpack.observability.threshold.rule.threshold.aboveRecovery', {
- defaultMessage: 'above',
- });
+ const belowText = i18n.translate(
+ 'xpack.observability.customThreshold.rule.threshold.belowRecovery',
+ {
+ defaultMessage: 'below',
+ }
+ );
+ const aboveText = i18n.translate(
+ 'xpack.observability.customThreshold.rule.threshold.aboveRecovery',
+ {
+ defaultMessage: 'above',
+ }
+ );
switch (comparator) {
case Comparator.BETWEEN:
return currentValue < threshold[0] ? belowText : aboveText;
case Comparator.OUTSIDE_RANGE:
- return i18n.translate('xpack.observability.threshold.rule.threshold.betweenRecovery', {
+ return i18n.translate('xpack.observability.customThreshold.rule.threshold.betweenRecovery', {
defaultMessage: 'between',
});
case Comparator.GT:
@@ -56,7 +62,7 @@ const recoveredComparatorToI18n = (
const thresholdToI18n = ([a, b]: Array) => {
if (typeof b === 'undefined') return a;
- return i18n.translate('xpack.observability.threshold.rule.threshold.thresholdRange', {
+ return i18n.translate('xpack.observability.customThreshold.rule.threshold.thresholdRange', {
defaultMessage: '{a} and {b}',
values: { a, b },
});
@@ -73,7 +79,7 @@ export const buildFiredAlertReason: (alertResult: {
timeSize: number;
timeUnit: TimeUnitChar;
}) => string = ({ group, metric, comparator, threshold, currentValue, timeSize, timeUnit }) =>
- i18n.translate('xpack.observability.threshold.rule.threshold.firedAlertReason', {
+ i18n.translate('xpack.observability.customThreshold.rule.threshold.firedAlertReason', {
defaultMessage:
'{metric} is {currentValue} in the last {duration}{group}. Alert when {comparator} {threshold}.',
values: {
@@ -94,7 +100,7 @@ export const buildRecoveredAlertReason: (alertResult: {
threshold: Array;
currentValue: number | string;
}) => string = ({ group, metric, comparator, threshold, currentValue }) =>
- i18n.translate('xpack.observability.threshold.rule.threshold.recoveredAlertReason', {
+ i18n.translate('xpack.observability.customThreshold.rule.threshold.recoveredAlertReason', {
defaultMessage:
'{metric} is now {comparator} a threshold of {threshold} (current value is {currentValue}) for {group}',
values: {
@@ -116,7 +122,7 @@ export const buildNoDataAlertReason: (alertResult: {
timeSize: number;
timeUnit: string;
}) => string = ({ group, metric, timeSize, timeUnit }) =>
- i18n.translate('xpack.observability.threshold.rule.threshold.noDataAlertReason', {
+ i18n.translate('xpack.observability.customThreshold.rule.threshold.noDataAlertReason', {
defaultMessage: '{metric} reported no data in the last {interval}{group}',
values: {
metric,
@@ -126,7 +132,7 @@ export const buildNoDataAlertReason: (alertResult: {
});
export const buildErrorAlertReason = (metric: string) =>
- i18n.translate('xpack.observability.threshold.rule.threshold.errorAlertReason', {
+ i18n.translate('xpack.observability.customThreshold.rule.threshold.errorAlertReason', {
defaultMessage: 'Elasticsearch failed when attempting to query data for {metric}',
values: {
metric,
@@ -134,14 +140,14 @@ export const buildErrorAlertReason = (metric: string) =>
});
export const groupByKeysActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.groupByKeysActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.groupByKeysActionVariableDescription',
{
defaultMessage: 'The object containing groups that are reporting data',
}
);
export const alertDetailUrlActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.alertDetailUrlActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.alertDetailUrlActionVariableDescription',
{
defaultMessage:
'Link to the alert troubleshooting view for further context and details. This will be an empty string if the server.publicBaseUrl is not configured.',
@@ -149,70 +155,70 @@ export const alertDetailUrlActionVariableDescription = i18n.translate(
);
export const reasonActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.reasonActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.reasonActionVariableDescription',
{
defaultMessage: 'A concise description of the reason for the alert',
}
);
export const timestampActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.timestampDescription',
+ 'xpack.observability.customThreshold.rule.timestampDescription',
{
defaultMessage: 'A timestamp of when the alert was detected.',
}
);
export const valueActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.valueActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.valueActionVariableDescription',
{
defaultMessage: 'List of the condition values.',
}
);
export const viewInAppUrlActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.viewInAppUrlActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.viewInAppUrlActionVariableDescription',
{
defaultMessage: 'Link to the alert source',
}
);
export const cloudActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.cloudActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.cloudActionVariableDescription',
{
defaultMessage: 'The cloud object defined by ECS if available in the source.',
}
);
export const hostActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.hostActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.hostActionVariableDescription',
{
defaultMessage: 'The host object defined by ECS if available in the source.',
}
);
export const containerActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.containerActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.containerActionVariableDescription',
{
defaultMessage: 'The container object defined by ECS if available in the source.',
}
);
export const orchestratorActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.orchestratorActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.orchestratorActionVariableDescription',
{
defaultMessage: 'The orchestrator object defined by ECS if available in the source.',
}
);
export const labelsActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.labelsActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.labelsActionVariableDescription',
{
defaultMessage: 'List of labels associated with the entity where this alert triggered.',
}
);
export const tagsActionVariableDescription = i18n.translate(
- 'xpack.observability.threshold.rule.tagsActionVariableDescription',
+ 'xpack.observability.customThreshold.rule.tagsActionVariableDescription',
{
defaultMessage: 'List of tags associated with the entity where this alert triggered.',
}
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts
similarity index 97%
rename from x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts
index 791b6ff680992..3b1b01e4d2268 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/register_threshold_rule_type.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts
@@ -21,7 +21,7 @@ import {
observabilityFeatureId,
observabilityPaths,
} from '../../../../common';
-import { Comparator } from '../../../../common/threshold_rule/types';
+import { Comparator } from '../../../../common/custom_threshold_rule/types';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '../../../../common/constants';
import { THRESHOLD_RULE_REGISTRATION_CONTEXT } from '../../../common/constants';
@@ -43,9 +43,9 @@ import {
createMetricThresholdExecutor,
FIRED_ACTIONS,
NO_DATA_ACTIONS,
-} from './threshold_executor';
+} from './custom_threshold_executor';
import { ObservabilityConfig } from '../../..';
-import { METRIC_EXPLORER_AGGREGATIONS } from '../../../../common/threshold_rule/constants';
+import { METRIC_EXPLORER_AGGREGATIONS } from '../../../../common/custom_threshold_rule/constants';
export const MetricsRulesTypeAlertDefinition: IRuleTypeAlerts = {
context: THRESHOLD_RULE_REGISTRATION_CONTEXT,
@@ -121,7 +121,7 @@ export function thresholdRuleType(
return {
id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID,
name: i18n.translate('xpack.observability.threshold.ruleName', {
- defaultMessage: 'Threshold (Technical Preview)',
+ defaultMessage: 'Custom threshold (BETA)',
}),
validate: {
params: schema.object(
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/types.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/types.ts
similarity index 96%
rename from x-pack/plugins/observability/server/lib/rules/threshold/types.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/types.ts
index 40115fdeb9c80..e66042bcb648d 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/types.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/types.ts
@@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema';
import * as rt from 'io-ts';
import { ML_ANOMALY_THRESHOLD } from '@kbn/ml-anomaly-utils/anomaly_threshold';
import { validateKQLStringFilter } from './utils';
-import { Aggregators, Comparator } from '../../../../common/threshold_rule/types';
+import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types';
import { TimeUnitChar } from '../../../../common';
export enum InfraRuleType {
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/utils.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/utils.test.ts
similarity index 100%
rename from x-pack/plugins/observability/server/lib/rules/threshold/utils.test.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/utils.test.ts
diff --git a/x-pack/plugins/observability/server/lib/rules/threshold/utils.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/utils.ts
similarity index 99%
rename from x-pack/plugins/observability/server/lib/rules/threshold/utils.ts
rename to x-pack/plugins/observability/server/lib/rules/custom_threshold/utils.ts
index 7c85c7ab98630..854b7cc497502 100644
--- a/x-pack/plugins/observability/server/lib/rules/threshold/utils.ts
+++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/utils.ts
@@ -52,7 +52,7 @@ export const validateKQLStringFilter = (value: string) => {
try {
kbnBuildEsQuery(undefined, [{ query: value, language: 'kuery' }], []);
} catch (e) {
- return i18n.translate('xpack.observability.threshold.rule.schema.invalidFilterQuery', {
+ return i18n.translate('xpack.observability.customThreshold.rule.schema.invalidFilterQuery', {
defaultMessage: 'filterQuery must be a valid KQL filter',
});
}
diff --git a/x-pack/plugins/observability/server/lib/rules/register_rule_types.ts b/x-pack/plugins/observability/server/lib/rules/register_rule_types.ts
index 388ede407819f..0e1abfc1037d7 100644
--- a/x-pack/plugins/observability/server/lib/rules/register_rule_types.ts
+++ b/x-pack/plugins/observability/server/lib/rules/register_rule_types.ts
@@ -22,7 +22,7 @@ import {
THRESHOLD_RULE_REGISTRATION_CONTEXT,
} from '../../common/constants';
import { sloBurnRateRuleType } from './slo_burn_rate';
-import { thresholdRuleType } from './threshold/register_threshold_rule_type';
+import { thresholdRuleType } from './custom_threshold/register_custom_threshold_rule_type';
import { sloRuleFieldMap } from './slo_burn_rate/field_map';
export function registerRuleTypes(
diff --git a/x-pack/plugins/observability/server/services/slo/slo_installer.ts b/x-pack/plugins/observability/server/services/slo/slo_installer.ts
index d6e8b8295348f..44c2a7752e315 100644
--- a/x-pack/plugins/observability/server/services/slo/slo_installer.ts
+++ b/x-pack/plugins/observability/server/services/slo/slo_installer.ts
@@ -34,9 +34,7 @@ export class DefaultSLOInstaller implements SLOInstaller {
await this.sloResourceInstaller.ensureCommonResourcesInstalled();
await this.sloSummaryInstaller.installAndStart();
} catch (error) {
- this.logger.error('Failed to install SLO common resources and summary transforms', {
- error,
- });
+ this.logger.error('Failed to install SLO common resources and summary transforms');
} finally {
this.isInstalling = false;
clearTimeout(installTimeout);
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap
index 97850346b4d60..ee4001303fec5 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/histogram.test.ts.snap
@@ -47,11 +47,24 @@ Object {
exports[`Histogram Transform Generator filters the source using the kql query 1`] = `
Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-4",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-4",
+ },
+ },
+ ],
},
},
],
@@ -215,11 +228,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
@@ -458,11 +484,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap
index 20c3a00ea9b28..126437173f84a 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/kql_custom.test.ts.snap
@@ -88,11 +88,24 @@ Object {
exports[`KQL Custom Transform Generator filters the source using the kql query 1`] = `
Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-4",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-4",
+ },
+ },
+ ],
},
},
],
@@ -230,11 +243,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
+ Object {
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
@@ -447,11 +473,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap
index fdd731df983cb..ced0801d859d4 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/__snapshots__/metric_custom.test.ts.snap
@@ -59,11 +59,24 @@ Object {
exports[`Metric Custom Transform Generator filters the source using the kql query 1`] = `
Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-4",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-4",
+ },
+ },
+ ],
},
},
],
@@ -239,11 +252,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
+ Object {
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
@@ -494,11 +520,24 @@ Object {
],
"query": Object {
"bool": Object {
- "minimum_should_match": 1,
- "should": Array [
+ "filter": Array [
+ Object {
+ "range": Object {
+ "log_timestamp": Object {
+ "gte": "now-7d",
+ },
+ },
+ },
Object {
- "match": Object {
- "labels.groupId": "group-3",
+ "bool": Object {
+ "minimum_should_match": 1,
+ "should": Array [
+ Object {
+ "match": Object {
+ "labels.groupId": "group-3",
+ },
+ },
+ ],
},
},
],
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/histogram.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/histogram.ts
index aef873ed7e973..654f8d67a3673 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/histogram.ts
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/histogram.ts
@@ -45,11 +45,23 @@ export class HistogramTransformGenerator extends TransformGenerator {
}
private buildSource(slo: SLO, indicator: HistogramIndicator) {
- const filter = getElastichsearchQueryOrThrow(indicator.params.filter);
return {
index: parseIndex(indicator.params.index),
runtime_mappings: this.buildCommonRuntimeMappings(slo),
- query: filter,
+ query: {
+ bool: {
+ filter: [
+ {
+ range: {
+ [indicator.params.timestampField]: {
+ gte: `now-${slo.timeWindow.duration.format()}`,
+ },
+ },
+ },
+ getElastichsearchQueryOrThrow(indicator.params.filter),
+ ],
+ },
+ },
};
}
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts
index 1dd162d688eb4..8321a0cb7172e 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts
@@ -40,11 +40,23 @@ export class KQLCustomTransformGenerator extends TransformGenerator {
}
private buildSource(slo: SLO, indicator: KQLCustomIndicator) {
- const filter = getElastichsearchQueryOrThrow(indicator.params.filter);
return {
index: parseIndex(indicator.params.index),
runtime_mappings: this.buildCommonRuntimeMappings(slo),
- query: filter,
+ query: {
+ bool: {
+ filter: [
+ {
+ range: {
+ [indicator.params.timestampField]: {
+ gte: `now-${slo.timeWindow.duration.format()}`,
+ },
+ },
+ },
+ getElastichsearchQueryOrThrow(indicator.params.filter),
+ ],
+ },
+ },
};
}
diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.ts
index 024f4403d9479..52209533f828c 100644
--- a/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.ts
+++ b/x-pack/plugins/observability/server/services/slo/transform_generators/metric_custom.ts
@@ -43,11 +43,23 @@ export class MetricCustomTransformGenerator extends TransformGenerator {
}
private buildSource(slo: SLO, indicator: MetricCustomIndicator) {
- const filter = getElastichsearchQueryOrThrow(indicator.params.filter);
return {
index: parseIndex(indicator.params.index),
runtime_mappings: this.buildCommonRuntimeMappings(slo),
- query: filter,
+ query: {
+ bool: {
+ filter: [
+ {
+ range: {
+ [indicator.params.timestampField]: {
+ gte: `now-${slo.timeWindow.duration.format()}`,
+ },
+ },
+ },
+ getElastichsearchQueryOrThrow(indicator.params.filter),
+ ],
+ },
+ },
};
}
diff --git a/x-pack/plugins/observability/typings/common.ts b/x-pack/plugins/observability/typings/common.ts
index df51061b56a5c..06e78c4ec6e64 100644
--- a/x-pack/plugins/observability/typings/common.ts
+++ b/x-pack/plugins/observability/typings/common.ts
@@ -17,7 +17,8 @@ export type ObservabilityApp =
| 'observability-overview'
| 'stack_monitoring'
| 'ux'
- | 'fleet';
+ | 'fleet'
+ | 'universal_profiling';
export type { Coordinates } from '../public/typings/fetch_overview_data';
diff --git a/x-pack/plugins/observability_log_explorer/common/translations.ts b/x-pack/plugins/observability_log_explorer/common/translations.ts
index 2abf660538260..8974c8a3f449e 100644
--- a/x-pack/plugins/observability_log_explorer/common/translations.ts
+++ b/x-pack/plugins/observability_log_explorer/common/translations.ts
@@ -28,3 +28,10 @@ export const discoverLinkTitle = i18n.translate(
defaultMessage: 'Discover',
}
);
+
+export const onboardingLinkTitle = i18n.translate(
+ 'xpack.observabilityLogExplorer.onboardingLinkTitle',
+ {
+ defaultMessage: 'Add data',
+ }
+);
diff --git a/x-pack/plugins/observability_log_explorer/kibana.jsonc b/x-pack/plugins/observability_log_explorer/kibana.jsonc
index 529f879a56386..15beb1ed3c8d2 100644
--- a/x-pack/plugins/observability_log_explorer/kibana.jsonc
+++ b/x-pack/plugins/observability_log_explorer/kibana.jsonc
@@ -15,11 +15,12 @@
"data",
"discover",
"logExplorer",
- "observabilityShared"
+ "observabilityShared",
+ "share"
],
"optionalPlugins": [
"serverless"
],
- "requiredBundles": ["kibanaReact"]
+ "requiredBundles": ["kibanaReact", "observabilityOnboarding"]
}
}
diff --git a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx
index 999ebdd3095bf..562ff3ba9d109 100644
--- a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx
+++ b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx
@@ -52,7 +52,6 @@ export const ObservabilityLogExplorerApp = ({
plugins,
pluginStart,
}: ObservabilityLogExplorerAppProps) => {
- const { logExplorer, observabilityShared, serverless } = plugins;
const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider(
core,
plugins,
@@ -67,15 +66,7 @@ export const ObservabilityLogExplorerApp = ({
(
-
- )}
+ render={() => }
/>
diff --git a/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx
index 0e8ec200da871..dab2ddb772010 100644
--- a/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx
+++ b/x-pack/plugins/observability_log_explorer/public/components/log_explorer_top_nav_menu.tsx
@@ -5,7 +5,7 @@
* 2.0.
*/
-import React from 'react';
+import React, { useEffect } from 'react';
import deepEqual from 'fast-deep-equal';
import useObservable from 'react-use/lib/useObservable';
import { type BehaviorSubject, distinctUntilChanged } from 'rxjs';
@@ -13,59 +13,148 @@ import { HeaderMenuPortal } from '@kbn/observability-shared-plugin/public';
import { AppMountParameters } from '@kbn/core-application-browser';
import {
EuiBetaBadge,
+ EuiButton,
+ EuiHeader,
EuiHeaderLink,
EuiHeaderLinks,
EuiHeaderSection,
EuiHeaderSectionItem,
useEuiTheme,
} from '@elastic/eui';
-import { css } from '@emotion/react';
import { LogExplorerStateContainer } from '@kbn/log-explorer-plugin/public';
-import { useKibanaContextForPlugin } from '../utils/use_kibana';
-import { betaBadgeDescription, betaBadgeTitle, discoverLinkTitle } from '../../common/translations';
+import {
+ OBSERVABILITY_ONBOARDING_LOCATOR,
+ ObservabilityOnboardingLocatorParams,
+} from '@kbn/observability-onboarding-plugin/public';
+import { KibanaReactContextValue } from '@kbn/kibana-react-plugin/public';
+import { toMountPoint } from '@kbn/react-kibana-mount';
+import { css } from '@emotion/react';
+import { PluginKibanaContextValue } from '../utils/use_kibana';
+import {
+ betaBadgeDescription,
+ betaBadgeTitle,
+ discoverLinkTitle,
+ onboardingLinkTitle,
+} from '../../common/translations';
+import { getRouterLinkProps } from '../utils/get_router_link_props';
interface LogExplorerTopNavMenuProps {
setHeaderActionMenu: AppMountParameters['setHeaderActionMenu'];
+ services: KibanaReactContextValue['services'];
state$: BehaviorSubject;
theme$: AppMountParameters['theme$'];
}
export const LogExplorerTopNavMenu = ({
setHeaderActionMenu,
+ services,
state$,
theme$,
}: LogExplorerTopNavMenuProps) => {
+ const { serverless } = services;
+
+ return Boolean(serverless) ? (
+
+ ) : (
+
+ );
+};
+
+const ServerlessTopNav = ({
+ services,
+ state$,
+}: Pick) => {
const { euiTheme } = useEuiTheme();
return (
-
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+ );
+};
+
+const StatefulTopNav = ({
+ setHeaderActionMenu,
+ services,
+ state$,
+ theme$,
+}: LogExplorerTopNavMenuProps) => {
+ const { euiTheme } = useEuiTheme();
+
+ useEffect(() => {
+ const { chrome, i18n, theme } = services;
+
+ if (chrome) {
+ chrome.setBreadcrumbsAppendExtension({
+ content: toMountPoint(
+
+
+
+
+ ,
+ { theme, i18n }
+ ),
+ });
+ }
+ }, [euiTheme, services]);
+
+ return (
+
+
+
+
+
+
+
+
);
};
const DiscoverLink = React.memo(
- ({ state$ }: { state$: BehaviorSubject }) => {
- const {
- services: { discover },
- } = useKibanaContextForPlugin();
-
+ ({ services, state$ }: Pick) => {
const { appState, logExplorerState } = useObservable(
state$.pipe(
distinctUntilChanged((prev, curr) => {
@@ -91,9 +180,20 @@ const DiscoverLink = React.memo(
dataViewSpec: logExplorerState?.datasetSelection?.selection.dataset.toDataviewSpec(),
};
+ const discoverUrl = services.discover.locator?.getRedirectUrl(discoverLinkParams);
+
+ const navigateToDiscover = () => {
+ services.discover.locator?.navigate(discoverLinkParams);
+ };
+
+ const discoverLinkProps = getRouterLinkProps({
+ href: discoverUrl,
+ onClick: navigateToDiscover,
+ });
+
return (
discover.locator?.navigate(discoverLinkParams)}
+ {...discoverLinkProps}
color="primary"
iconType="discoverApp"
data-test-subj="logExplorerDiscoverFallbackLink"
@@ -103,3 +203,32 @@ const DiscoverLink = React.memo(
);
}
);
+
+const OnboardingLink = React.memo(({ services }: Pick) => {
+ const locator = services.share.url.locators.get(
+ OBSERVABILITY_ONBOARDING_LOCATOR
+ );
+
+ const onboardingUrl = locator?.useUrl({});
+
+ const navigateToOnboarding = () => {
+ locator?.navigate({});
+ };
+
+ const onboardingLinkProps = getRouterLinkProps({
+ href: onboardingUrl,
+ onClick: navigateToOnboarding,
+ });
+
+ return (
+
+ {onboardingLinkTitle}
+
+ );
+});
diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx
index 7b224da830433..b4eb120ba3cae 100644
--- a/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx
+++ b/x-pack/plugins/observability_log_explorer/public/routes/main/main_route.tsx
@@ -6,38 +6,35 @@
*/
import { AppMountParameters, CoreStart } from '@kbn/core/public';
-import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public';
-import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public';
-import { ServerlessPluginStart } from '@kbn/serverless/public';
import React, { useState } from 'react';
import { BehaviorSubject } from 'rxjs';
import { LogExplorerTopNavMenu } from '../../components/log_explorer_top_nav_menu';
import { ObservabilityLogExplorerPageTemplate } from '../../components/page_template';
import { noBreadcrumbs, useBreadcrumbs } from '../../utils/breadcrumbs';
+import { useKibanaContextForPlugin } from '../../utils/use_kibana';
export interface ObservablityLogExplorerMainRouteProps {
appParams: AppMountParameters;
core: CoreStart;
- logExplorer: LogExplorerPluginStart;
- observabilityShared: ObservabilitySharedPluginStart;
- serverless?: ServerlessPluginStart;
}
export const ObservablityLogExplorerMainRoute = ({
- appParams: { history, setHeaderActionMenu, theme$ },
+ appParams,
core,
- logExplorer,
- observabilityShared,
- serverless,
}: ObservablityLogExplorerMainRouteProps) => {
+ const { services } = useKibanaContextForPlugin();
+ const { logExplorer, observabilityShared, serverless } = services;
useBreadcrumbs(noBreadcrumbs, core.chrome, serverless);
+ const { history, setHeaderActionMenu, theme$ } = appParams;
+
const [state$] = useState(() => new BehaviorSubject({}));
return (
<>
diff --git a/x-pack/plugins/observability_log_explorer/public/types.ts b/x-pack/plugins/observability_log_explorer/public/types.ts
index e52ece9ca1624..48b2ad624796a 100644
--- a/x-pack/plugins/observability_log_explorer/public/types.ts
+++ b/x-pack/plugins/observability_log_explorer/public/types.ts
@@ -10,6 +10,7 @@ import { DiscoverStart } from '@kbn/discover-plugin/public';
import { LogExplorerPluginStart } from '@kbn/log-explorer-plugin/public';
import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public';
import { ServerlessPluginStart } from '@kbn/serverless/public';
+import { SharePluginStart } from '@kbn/share-plugin/public';
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ObservabilityLogExplorerPluginSetup {}
@@ -27,4 +28,5 @@ export interface ObservabilityLogExplorerStartDeps {
logExplorer: LogExplorerPluginStart;
observabilityShared: ObservabilitySharedPluginStart;
serverless?: ServerlessPluginStart;
+ share: SharePluginStart;
}
diff --git a/x-pack/plugins/observability_log_explorer/public/utils/get_router_link_props.ts b/x-pack/plugins/observability_log_explorer/public/utils/get_router_link_props.ts
new file mode 100644
index 0000000000000..a325df1a7e86f
--- /dev/null
+++ b/x-pack/plugins/observability_log_explorer/public/utils/get_router_link_props.ts
@@ -0,0 +1,35 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+interface GetRouterLinkPropsDeps {
+ href?: string;
+ onClick(): void;
+}
+
+const isModifiedEvent = (event: React.MouseEvent) =>
+ !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
+
+const isLeftClickEvent = (event: React.MouseEvent) => event.button === 0;
+
+export const getRouterLinkProps = ({ href, onClick }: GetRouterLinkPropsDeps) => {
+ const guardedClickHandler = (event: React.MouseEvent) => {
+ if (event.defaultPrevented) {
+ return;
+ }
+
+ if (isModifiedEvent(event) || !isLeftClickEvent(event)) {
+ return;
+ }
+
+ // Prevent regular link behavior, which causes a browser refresh.
+ event.preventDefault();
+
+ onClick();
+ };
+
+ return { href, onClick: guardedClickHandler };
+};
diff --git a/x-pack/plugins/observability_log_explorer/tsconfig.json b/x-pack/plugins/observability_log_explorer/tsconfig.json
index ae9660b421359..0100aa5abb37a 100644
--- a/x-pack/plugins/observability_log_explorer/tsconfig.json
+++ b/x-pack/plugins/observability_log_explorer/tsconfig.json
@@ -24,6 +24,9 @@
"@kbn/config-schema",
"@kbn/core-application-browser",
"@kbn/discover-plugin",
+ "@kbn/observability-onboarding-plugin",
+ "@kbn/react-kibana-mount",
+ "@kbn/share-plugin",
],
"exclude": [
"target/**/*"
diff --git a/x-pack/plugins/observability_onboarding/public/icons/universal_profiling.svg b/x-pack/plugins/observability_onboarding/public/icons/universal_profiling.svg
new file mode 100644
index 0000000000000..819ab070e7396
--- /dev/null
+++ b/x-pack/plugins/observability_onboarding/public/icons/universal_profiling.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/x-pack/plugins/observability_onboarding/public/index.ts b/x-pack/plugins/observability_onboarding/public/index.ts
index d4a667b9e7269..b83c5b6d5cad0 100644
--- a/x-pack/plugins/observability_onboarding/public/index.ts
+++ b/x-pack/plugins/observability_onboarding/public/index.ts
@@ -18,6 +18,7 @@ import {
} from './plugin';
export { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition';
+export type { ObservabilityOnboardingLocatorParams } from './locators/onboarding_locator/types';
export interface ConfigSchema {
ui: {
diff --git a/x-pack/plugins/osquery/public/shared_components/lazy_osquery_action_params_form.tsx b/x-pack/plugins/osquery/public/shared_components/lazy_osquery_action_params_form.tsx
index af7ad511b061b..e14b73242d6d5 100644
--- a/x-pack/plugins/osquery/public/shared_components/lazy_osquery_action_params_form.tsx
+++ b/x-pack/plugins/osquery/public/shared_components/lazy_osquery_action_params_form.tsx
@@ -5,6 +5,7 @@
* 2.0.
*/
+import { EuiLoadingSpinner } from '@elastic/eui';
import React, { lazy, Suspense } from 'react';
import type { OsqueryResponseActionsParamsFormProps } from './osquery_response_action_type';
@@ -16,7 +17,7 @@ export const getLazyOsqueryResponseActionTypeForm =
const { onError, defaultValues, onChange } = props;
return (
-
+ }>
{
}
/>
-
+ {config.statefulSettings.enabled ? : null}
{this.renderTable()}
diff --git a/x-pack/plugins/reporting/public/plugin.ts b/x-pack/plugins/reporting/public/plugin.ts
index 912f519d60002..46e425b54239d 100644
--- a/x-pack/plugins/reporting/public/plugin.ts
+++ b/x-pack/plugins/reporting/public/plugin.ts
@@ -47,6 +47,7 @@ export interface ClientConfigType {
poll: { jobsRefresh: { interval: number; intervalErrorMultiplier: number } };
roles: { enabled: boolean };
export_types: { pdf: { enabled: boolean }; png: { enabled: boolean }; csv: { enabled: boolean } };
+ statefulSettings: { enabled: boolean };
}
function getStored(): JobId[] {
diff --git a/x-pack/plugins/reporting/server/config/__snapshots__/schema.test.ts.snap b/x-pack/plugins/reporting/server/config/__snapshots__/schema.test.ts.snap
index 48f834d238795..1c9a695f4a78e 100644
--- a/x-pack/plugins/reporting/server/config/__snapshots__/schema.test.ts.snap
+++ b/x-pack/plugins/reporting/server/config/__snapshots__/schema.test.ts.snap
@@ -55,6 +55,9 @@ Object {
],
"enabled": true,
},
+ "statefulSettings": Object {
+ "enabled": true,
+ },
}
`;
@@ -112,5 +115,8 @@ Object {
],
"enabled": true,
},
+ "statefulSettings": Object {
+ "enabled": true,
+ },
}
`;
diff --git a/x-pack/plugins/reporting/server/config/create_config.test.ts b/x-pack/plugins/reporting/server/config/create_config.test.ts
index 0a10b859bb18f..dbb16d050297f 100644
--- a/x-pack/plugins/reporting/server/config/create_config.test.ts
+++ b/x-pack/plugins/reporting/server/config/create_config.test.ts
@@ -51,6 +51,9 @@ describe('Reporting server createConfig', () => {
port: 5677,
protocol: 'httpsa',
},
+ statefulSettings: {
+ enabled: true,
+ },
});
const result = createConfig(mockCoreSetup, mockConfig, mockLogger);
@@ -92,6 +95,9 @@ describe('Reporting server createConfig', () => {
"roles": Object {
"enabled": false,
},
+ "statefulSettings": Object {
+ "enabled": true,
+ },
}
`);
expect(mockLogger.warn).not.toHaveBeenCalled();
diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts
index 5786498035721..3bb4b79dd6fc8 100644
--- a/x-pack/plugins/reporting/server/config/index.ts
+++ b/x-pack/plugins/reporting/server/config/index.ts
@@ -11,7 +11,7 @@ import { get } from 'lodash';
import { ConfigSchema, ReportingConfigType } from './schema';
export const config: PluginConfigDescriptor = {
- exposeToBrowser: { poll: true, roles: true, export_types: true },
+ exposeToBrowser: { poll: true, roles: true, export_types: true, statefulSettings: true },
schema: ConfigSchema,
deprecations: ({ unused }) => [
unused('capture.browser.chromium.maxScreenshotDimension', { level: 'warning' }), // unused since 7.8
diff --git a/x-pack/plugins/reporting/server/config/schema.test.ts b/x-pack/plugins/reporting/server/config/schema.test.ts
index 14ed1886e9136..f30be71db09ea 100644
--- a/x-pack/plugins/reporting/server/config/schema.test.ts
+++ b/x-pack/plugins/reporting/server/config/schema.test.ts
@@ -85,6 +85,14 @@ describe('Reporting Config Schema', () => {
`);
});
+ it('disables ilm settings in serverless', () => {
+ expect(ConfigSchema.validate({}, { serverless: true }).statefulSettings).toMatchInlineSnapshot(`
+ Object {
+ "enabled": false,
+ }
+ `);
+ });
+
it('disables screenshot type exports in serverless', () => {
expect(ConfigSchema.validate({}, { serverless: true }).export_types).toMatchInlineSnapshot(`
Object {
diff --git a/x-pack/plugins/reporting/server/config/schema.ts b/x-pack/plugins/reporting/server/config/schema.ts
index 966f4f20ff313..ff0cda89a693b 100644
--- a/x-pack/plugins/reporting/server/config/schema.ts
+++ b/x-pack/plugins/reporting/server/config/schema.ts
@@ -128,6 +128,13 @@ const ExportTypeSchema = schema.object({
}),
});
+const SettingsSchema = schema.object({
+ enabled: offeringBasedSchema({
+ serverless: schema.boolean({ defaultValue: false }),
+ traditional: schema.boolean({ defaultValue: true }),
+ }),
+});
+
export const ConfigSchema = schema.object({
enabled: schema.boolean({ defaultValue: true }),
kibanaServer: KibanaServerSchema,
@@ -138,6 +145,7 @@ export const ConfigSchema = schema.object({
roles: RolesSchema,
poll: PollSchema,
export_types: ExportTypeSchema,
+ statefulSettings: SettingsSchema,
});
export type ReportingConfigType = TypeOf;
diff --git a/x-pack/plugins/reporting/server/lib/store/store.test.ts b/x-pack/plugins/reporting/server/lib/store/store.test.ts
index f1400ab357ee9..64556ef1a2c22 100644
--- a/x-pack/plugins/reporting/server/lib/store/store.test.ts
+++ b/x-pack/plugins/reporting/server/lib/store/store.test.ts
@@ -19,6 +19,7 @@ describe('ReportingStore', () => {
const reportingConfig = {
index: '.reporting-test',
queue: { indexInterval: 'week' },
+ statefulSettings: { enabled: true },
};
mockCore = await createMockReportingCore(createMockConfigSchema(reportingConfig));
mockEsClient = (await mockCore.getEsClient()).asInternalUser as typeof mockEsClient;
@@ -60,6 +61,7 @@ describe('ReportingStore', () => {
const reportingConfig = {
index: '.reporting-test',
queue: { indexInterval: 'centurially' },
+ statefulSettings: { enabled: true },
};
mockCore = await createMockReportingCore(createMockConfigSchema(reportingConfig));
diff --git a/x-pack/plugins/reporting/server/lib/store/store.ts b/x-pack/plugins/reporting/server/lib/store/store.ts
index 96a3ffacee51c..1a0dcbf16a893 100644
--- a/x-pack/plugins/reporting/server/lib/store/store.ts
+++ b/x-pack/plugins/reporting/server/lib/store/store.ts
@@ -87,12 +87,13 @@ export class ReportingStore {
private readonly indexInterval: string; // config setting of index prefix: how often to poll for pending work
private client?: ElasticsearchClient;
private ilmPolicyManager?: IlmPolicyManager;
+ config: ReportingCore['config'];
constructor(private reportingCore: ReportingCore, private logger: Logger) {
- const config = reportingCore.getConfig();
+ this.config = reportingCore.getConfig();
this.indexPrefix = REPORTING_SYSTEM_INDEX;
- this.indexInterval = config.queue.indexInterval;
+ this.indexInterval = this.config.queue.indexInterval;
this.logger = logger.get('store');
}
@@ -105,12 +106,8 @@ export class ReportingStore {
}
private async getIlmPolicyManager() {
- if (!this.ilmPolicyManager) {
- const client = await this.getClient();
- this.ilmPolicyManager = IlmPolicyManager.create({ client });
- }
-
- return this.ilmPolicyManager;
+ const client = await this.getClient();
+ return (this.ilmPolicyManager = IlmPolicyManager.create({ client }));
}
private async createIndex(indexName: string) {
@@ -121,10 +118,8 @@ export class ReportingStore {
return exists;
}
- try {
- await client.indices.create({
- index: indexName,
- body: {
+ const indexSettings = this.config.statefulSettings.enabled
+ ? {
settings: {
number_of_shards: 1,
auto_expand_replicas: '0-1',
@@ -132,6 +127,14 @@ export class ReportingStore {
name: ILM_POLICY_NAME,
},
},
+ }
+ : {};
+
+ try {
+ await client.indices.create({
+ index: indexName,
+ body: {
+ ...indexSettings,
mappings: {
properties: mapping,
},
@@ -185,6 +188,9 @@ export class ReportingStore {
* configured for storage of reports.
*/
public async start() {
+ if (!this.config.statefulSettings.enabled) {
+ return;
+ }
const ilmPolicyManager = await this.getIlmPolicyManager();
try {
if (await ilmPolicyManager.doesIlmPolicyExist()) {
diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts
index 38a7bb8399abb..d96a66bc9b9fd 100644
--- a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts
+++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts
@@ -117,6 +117,7 @@ export const createMockConfigSchema = (
csv: { enabled: true },
...overrides.export_types,
},
+ statefulSettings: { enabled: true },
} as ReportingConfigType;
};
diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts
index f6a394e8c46c9..656deff84ec6d 100644
--- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_endpoint_rule_alerts.ts
@@ -5488,10 +5488,6 @@ const getAlertsIndexMappings = (): IndexMappings => {
index: {
auto_expand_replicas: '0-1',
hidden: 'true',
- lifecycle: {
- name: '.alerts-ilm-policy',
- rollover_alias: '.alerts-security.alerts-default',
- },
mapping: {
total_fields: {
limit: 1900,
diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts
index 6c84cd6e5738f..234be86e4aa02 100644
--- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/setup_fleet_for_endpoint.ts
@@ -21,7 +21,12 @@ import {
} from '@kbn/fleet-plugin/common';
import { ToolingLog } from '@kbn/tooling-log';
import { UsageTracker } from './usage_tracker';
-import { EndpointDataLoadingError, retryOnError, wrapErrorAndRejectPromise } from './utils';
+import {
+ EndpointDataLoadingError,
+ RETRYABLE_TRANSIENT_ERRORS,
+ retryOnError,
+ wrapErrorAndRejectPromise,
+} from './utils';
const usageTracker = new UsageTracker({ dumpOnProcessExit: true });
@@ -165,13 +170,7 @@ export const installOrUpgradeEndpointFleetPackage = async (
return bulkResp[0] as BulkInstallPackageInfo;
};
- return retryOnError(
- updatePackages,
- ['no_shard_available_action_exception', 'illegal_index_shard_state_exception'],
- logger,
- 5,
- 10000
- )
+ return retryOnError(updatePackages, RETRYABLE_TRANSIENT_ERRORS, logger, 5, 10000)
.then((result) => {
usageRecord.set('success');
diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts
index 0db9fb6f82561..b7f7385a5f119 100644
--- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts
@@ -8,6 +8,11 @@
import { mergeWith } from 'lodash';
import { ToolingLog } from '@kbn/tooling-log';
+export const RETRYABLE_TRANSIENT_ERRORS: Readonly> = [
+ 'no_shard_available_action_exception',
+ 'illegal_index_shard_state_exception',
+];
+
export class EndpointDataLoadingError extends Error {
constructor(message: string, public meta?: unknown) {
super(message);
@@ -43,7 +48,7 @@ export const mergeAndAppendArrays = (destinationObj: T, srcObj: S): T => {
*/
export const retryOnError = async (
callback: () => Promise,
- errors: Array,
+ errors: Array | Readonly>,
logger?: ToolingLog,
tryCount: number = 5,
interval: number = 10000
@@ -60,6 +65,8 @@ export const retryOnError = async (
});
};
+ log.indent(4);
+
let attempt = 1;
let responsePromise: Promise;
@@ -71,13 +78,20 @@ export const retryOnError = async (
try {
responsePromise = callback(); // store promise so that if it fails and no more attempts, we return the last failure
- return await responsePromise;
+ const result = await responsePromise;
+
+ log.info(msg(`attempt ${thisAttempt} was successful. Exiting retry`));
+ log.indent(-4);
+
+ return result;
} catch (err) {
log.info(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err);
// If not an error that is retryable, then end loop here and return that error;
if (!isRetryableError(err)) {
log.error(err);
+ log.error(msg('non-retryable error encountered'));
+ log.indent(-4);
return Promise.reject(err);
}
}
@@ -85,6 +99,10 @@ export const retryOnError = async (
await new Promise((resolve) => setTimeout(resolve, interval));
}
+ log.error(msg(`max retry attempts reached. returning last failure`));
+ log.indent(-4);
+
+ // Last resort: return the last rejected Promise.
// @ts-expect-error TS2454: Variable 'responsePromise' is used before being assigned.
return responsePromise;
};
diff --git a/x-pack/plugins/security_solution/public/app/app.tsx b/x-pack/plugins/security_solution/public/app/app.tsx
index 8bbf2c3a425ec..88ced06445c07 100644
--- a/x-pack/plugins/security_solution/public/app/app.tsx
+++ b/x-pack/plugins/security_solution/public/app/app.tsx
@@ -5,10 +5,9 @@
* 2.0.
*/
-import { AssistantProvider } from '@kbn/elastic-assistant';
import type { History } from 'history';
import type { FC } from 'react';
-import React, { memo, useCallback } from 'react';
+import React, { memo } from 'react';
import type { Store, Action } from 'redux';
import { Provider as ReduxStoreProvider } from 'react-redux';
@@ -21,28 +20,18 @@ import { CellActionsProvider } from '@kbn/cell-actions';
import { NavigationProvider } from '@kbn/security-solution-navigation';
import { UpsellingProvider } from '../common/components/upselling_provider';
-import { useAssistantTelemetry } from '../assistant/use_assistant_telemetry';
-import { getComments } from '../assistant/get_comments';
-import { augmentMessageCodeBlocks, LOCAL_STORAGE_KEY } from '../assistant/helpers';
-import { useConversationStore } from '../assistant/use_conversation_store';
import { ManageUserInfo } from '../detections/components/user_info';
-import { DEFAULT_DARK_MODE, APP_NAME, APP_ID } from '../../common/constants';
+import { DEFAULT_DARK_MODE, APP_NAME } from '../../common/constants';
import { ErrorToastDispatcher } from '../common/components/error_toast_dispatcher';
import { MlCapabilitiesProvider } from '../common/components/ml/permissions/ml_capabilities_provider';
import { GlobalToaster, ManageGlobalToaster } from '../common/components/toasters';
import { KibanaContextProvider, useKibana, useUiSetting$ } from '../common/lib/kibana';
import type { State } from '../common/store';
-import { ASSISTANT_TITLE } from './translations';
import type { StartServices } from '../types';
import { PageRouter } from './routes';
import { UserPrivilegesProvider } from '../common/components/user_privileges/user_privileges_context';
import { ReactQueryClientProvider } from '../common/containers/query_client/query_client_provider';
-import { DEFAULT_ALLOW, DEFAULT_ALLOW_REPLACEMENT } from '../assistant/content/anonymization';
-import { PROMPT_CONTEXTS } from '../assistant/content/prompt_contexts';
-import { BASE_SECURITY_QUICK_PROMPTS } from '../assistant/content/quick_prompts';
-import { BASE_SECURITY_SYSTEM_PROMPTS } from '../assistant/content/prompts/system';
-import { useAnonymizationStore } from '../assistant/use_anonymization_store';
-import { useAssistantAvailability } from '../assistant/use_assistant_availability';
+import { AssistantProvider } from '../assistant/provider';
interface StartAppComponent {
children: React.ReactNode;
@@ -65,29 +54,12 @@ const StartAppComponent: FC = ({
const {
i18n,
application: { capabilities },
- http,
- triggersActionsUi: { actionTypeRegistry },
uiActions,
upselling,
} = services;
- const assistantAvailability = useAssistantAvailability();
- const { conversations, setConversations } = useConversationStore();
- const { defaultAllow, defaultAllowReplacement, setDefaultAllow, setDefaultAllowReplacement } =
- useAnonymizationStore();
-
- const getInitialConversation = useCallback(() => {
- return conversations;
- }, [conversations]);
-
- const nameSpace = `${APP_ID}.${LOCAL_STORAGE_KEY}`;
-
const [darkMode] = useUiSetting$(DEFAULT_DARK_MODE);
- const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = useKibana().services.docLinks;
-
- const assistantTelemetry = useAssistantTelemetry();
-
return (
@@ -95,29 +67,7 @@ const StartAppComponent: FC = ({
-
+
diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx
index 7dc0b338193a9..fe0b5bd500dc8 100644
--- a/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.test.tsx
@@ -26,7 +26,6 @@ import { TimelineId } from '../../../../common/types/timeline';
import { createStore } from '../../../common/store';
import { kibanaObservable } from '@kbn/timelines-plugin/public/mock';
import { sourcererPaths } from '../../../common/containers/sourcerer';
-import { useAssistantAvailability } from '../../../assistant/use_assistant_availability';
jest.mock('react-router-dom', () => {
const actual = jest.requireActual('react-router-dom');
@@ -49,15 +48,6 @@ jest.mock('react-reverse-portal', () => ({
createHtmlPortalNode: () => ({ unmount: jest.fn() }),
}));
-jest.mock('../../../assistant/use_assistant_availability');
-
-jest.mocked(useAssistantAvailability).mockReturnValue({
- hasAssistantPrivilege: false,
- hasConnectorsAllPrivilege: true,
- hasConnectorsReadPrivilege: true,
- isAssistantEnabled: true,
-});
-
describe('global header', () => {
const mockSetHeaderActionMenu = jest.fn();
const state = {
@@ -183,18 +173,11 @@ describe('global header', () => {
expect(queryByTestId('sourcerer-trigger')).not.toBeInTheDocument();
});
- it('shows AI Assistant header link if user has necessary privileges', () => {
+ it('shows AI Assistant header link', () => {
(useLocation as jest.Mock).mockReturnValue([
{ pageName: SecurityPageName.overview, detailName: undefined },
]);
- jest.mocked(useAssistantAvailability).mockReturnValue({
- hasAssistantPrivilege: true,
- hasConnectorsAllPrivilege: true,
- hasConnectorsReadPrivilege: true,
- isAssistantEnabled: true,
- });
-
const { findByTestId } = render(
@@ -203,25 +186,4 @@ describe('global header', () => {
waitFor(() => expect(findByTestId('assistantHeaderLink')).toBeInTheDocument());
});
-
- it('does not show AI Assistant header link if user does not have necessary privileges', () => {
- (useLocation as jest.Mock).mockReturnValue([
- { pageName: SecurityPageName.overview, detailName: undefined },
- ]);
-
- jest.mocked(useAssistantAvailability).mockReturnValue({
- hasAssistantPrivilege: false,
- hasConnectorsAllPrivilege: true,
- hasConnectorsReadPrivilege: true,
- isAssistantEnabled: true,
- });
-
- const { findByTestId } = render(
-
-
-
- );
-
- waitFor(() => expect(findByTestId('assistantHeaderLink')).not.toBeInTheDocument());
- });
});
diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx
index 615d4e8161786..bde0b71a43270 100644
--- a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx
+++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx
@@ -27,8 +27,7 @@ import { timelineSelectors } from '../../../timelines/store/timeline';
import { useShallowEqualSelector } from '../../../common/hooks/use_selector';
import { getScopeFromPath, showSourcererByPath } from '../../../common/containers/sourcerer';
import { useAddIntegrationsUrl } from '../../../common/hooks/use_add_integrations_url';
-import { AssistantHeaderLink } from './assistant_header_link';
-import { useAssistantAvailability } from '../../../assistant/use_assistant_availability';
+import { AssistantHeaderLink } from '../../../assistant/header_link';
const BUTTON_ADD_DATA = i18n.translate('xpack.securitySolution.globalHeader.buttonAddData', {
defaultMessage: 'Add integrations',
@@ -54,8 +53,6 @@ export const GlobalHeader = React.memo(
const { href, onClick } = useAddIntegrationsUrl();
- const { hasAssistantPrivilege } = useAssistantAvailability();
-
useEffect(() => {
setHeaderActionMenu((element) => {
const mount = toMountPoint( , { theme$: theme.theme$ });
@@ -91,7 +88,7 @@ export const GlobalHeader = React.memo(
{showSourcerer && !showTimeline && (
)}
- {hasAssistantPrivilege && }
+
diff --git a/x-pack/plugins/security_solution/public/app/home/index.tsx b/x-pack/plugins/security_solution/public/app/home/index.tsx
index 1e98b1c438957..b951501b16cb7 100644
--- a/x-pack/plugins/security_solution/public/app/home/index.tsx
+++ b/x-pack/plugins/security_solution/public/app/home/index.tsx
@@ -29,6 +29,7 @@ import { useUpdateExecutionContext } from '../../common/hooks/use_update_executi
import { useUpgradeSecurityPackages } from '../../detection_engine/rule_management/logic/use_upgrade_security_packages';
import { useSetupDetectionEngineHealthApi } from '../../detection_engine/rule_monitoring';
import { TopValuesPopover } from '../components/top_values_popover/top_values_popover';
+import { AssistantOverlay } from '../../assistant/overlay';
interface HomePageProps {
children: React.ReactNode;
@@ -63,6 +64,7 @@ const HomePageComponent: React.FC = ({ children, setHeaderActionM
+
>
diff --git a/x-pack/plugins/security_solution/public/app/translations.ts b/x-pack/plugins/security_solution/public/app/translations.ts
index fcee866a2da3a..516239d164632 100644
--- a/x-pack/plugins/security_solution/public/app/translations.ts
+++ b/x-pack/plugins/security_solution/public/app/translations.ts
@@ -7,10 +7,6 @@
import { i18n } from '@kbn/i18n';
-export const ASSISTANT_TITLE = i18n.translate('xpack.securitySolution.assistant.title', {
- defaultMessage: 'Elastic AI Assistant',
-});
-
export const OVERVIEW = i18n.translate('xpack.securitySolution.navigation.overview', {
defaultMessage: 'Overview',
});
diff --git a/x-pack/plugins/security_solution/public/assistant/header_link.test.tsx b/x-pack/plugins/security_solution/public/assistant/header_link.test.tsx
new file mode 100644
index 0000000000000..e6b8cfea388a1
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/assistant/header_link.test.tsx
@@ -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 React from 'react';
+import { render } from '@testing-library/react';
+import { AssistantHeaderLink } from './header_link';
+
+const mockShowAssistantOverlay = jest.fn();
+const mockAssistantAvailability = jest.fn(() => ({
+ hasAssistantPrivilege: true,
+}));
+jest.mock('@kbn/elastic-assistant/impl/assistant_context', () => ({
+ useAssistantContext: () => ({
+ assistantAvailability: mockAssistantAvailability(),
+ showAssistantOverlay: mockShowAssistantOverlay,
+ }),
+}));
+
+describe('AssistantHeaderLink', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should render the header link text', () => {
+ const { queryByText, queryByTestId } = render( );
+ expect(queryByTestId('assistantHeaderLink')).toBeInTheDocument();
+ expect(queryByText('AI Assistant')).toBeInTheDocument();
+ });
+
+ it('should not render the header link if not authorized', () => {
+ mockAssistantAvailability.mockReturnValueOnce({ hasAssistantPrivilege: false });
+
+ const { queryByText, queryByTestId } = render( );
+ expect(queryByTestId('assistantHeaderLink')).not.toBeInTheDocument();
+ expect(queryByText('AI Assistant')).not.toBeInTheDocument();
+ });
+
+ it('should call the assistant overlay to show on click', () => {
+ const { queryByTestId } = render( );
+ queryByTestId('assistantHeaderLink')?.click();
+ expect(mockShowAssistantOverlay).toHaveBeenCalledTimes(1);
+ expect(mockShowAssistantOverlay).toHaveBeenCalledWith({ showOverlay: true });
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/assistant_header_link.tsx b/x-pack/plugins/security_solution/public/assistant/header_link.tsx
similarity index 61%
rename from x-pack/plugins/security_solution/public/app/home/global_header/assistant_header_link.tsx
rename to x-pack/plugins/security_solution/public/assistant/header_link.tsx
index 00e1acf7e45d5..342a95454cdb4 100644
--- a/x-pack/plugins/security_solution/public/app/home/global_header/assistant_header_link.tsx
+++ b/x-pack/plugins/security_solution/public/assistant/header_link.tsx
@@ -14,43 +14,42 @@ import { AssistantAvatar } from '@kbn/elastic-assistant';
const isMac = navigator.platform.toLowerCase().indexOf('mac') >= 0;
+const TOOLTIP_CONTENT = i18n.translate(
+ 'xpack.securitySolution.globalHeader.assistantHeaderLinkShortcutTooltip',
+ {
+ values: { keyboardShortcut: isMac ? '⌘ ;' : 'Ctrl ;' },
+ defaultMessage: 'Keyboard shortcut {keyboardShortcut}',
+ }
+);
+const LINK_LABEL = i18n.translate('xpack.securitySolution.globalHeader.assistantHeaderLink', {
+ defaultMessage: 'AI Assistant',
+});
+
/**
* Elastic AI Assistant header link
*/
-export const AssistantHeaderLink = React.memo(() => {
- const { showAssistantOverlay } = useAssistantContext();
-
- const keyboardShortcut = isMac ? '⌘ ;' : 'Ctrl ;';
-
- const tooltipContent = i18n.translate(
- 'xpack.securitySolution.globalHeader.assistantHeaderLinkShortcutTooltip',
- {
- values: { keyboardShortcut },
- defaultMessage: 'Keyboard shortcut {keyboardShortcut}',
- }
- );
+export const AssistantHeaderLink = () => {
+ const { showAssistantOverlay, assistantAvailability } = useAssistantContext();
const showOverlay = useCallback(
() => showAssistantOverlay({ showOverlay: true }),
[showAssistantOverlay]
);
+ if (!assistantAvailability.hasAssistantPrivilege) {
+ return null;
+ }
+
return (
-
+
-
- {i18n.translate('xpack.securitySolution.globalHeader.assistantHeaderLink', {
- defaultMessage: 'AI Assistant',
- })}
-
+ {LINK_LABEL}
);
-});
-
-AssistantHeaderLink.displayName = 'AssistantHeaderLink';
+};
diff --git a/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx b/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx
new file mode 100644
index 0000000000000..fb082a4677595
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/assistant/overlay.test.tsx
@@ -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 React from 'react';
+import { render } from '@testing-library/react';
+import { AssistantOverlay } from './overlay';
+
+const mockAssistantAvailability = jest.fn(() => ({
+ hasAssistantPrivilege: true,
+}));
+jest.mock('@kbn/elastic-assistant', () => ({
+ AssistantOverlay: () =>
,
+ useAssistantContext: () => ({
+ assistantAvailability: mockAssistantAvailability(),
+ }),
+}));
+
+describe('AssistantOverlay', () => {
+ beforeEach(() => {
+ jest.clearAllMocks();
+ });
+
+ it('should render the header link text', () => {
+ const { queryByTestId } = render( );
+ expect(queryByTestId('assistantOverlay')).toBeInTheDocument();
+ });
+
+ it('should not render the header link if not authorized', () => {
+ mockAssistantAvailability.mockReturnValueOnce({ hasAssistantPrivilege: false });
+
+ const { queryByTestId } = render( );
+ expect(queryByTestId('assistantOverlay')).not.toBeInTheDocument();
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/assistant/overlay.tsx b/x-pack/plugins/security_solution/public/assistant/overlay.tsx
new file mode 100644
index 0000000000000..3ffaddaf2e8f5
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/assistant/overlay.tsx
@@ -0,0 +1,19 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import React from 'react';
+import {
+ AssistantOverlay as ElasticAssistantOverlay,
+ useAssistantContext,
+} from '@kbn/elastic-assistant';
+
+export const AssistantOverlay: React.FC = () => {
+ const { assistantAvailability } = useAssistantContext();
+ if (!assistantAvailability.hasAssistantPrivilege) {
+ return null;
+ }
+ return ;
+};
diff --git a/x-pack/plugins/security_solution/public/assistant/provider.tsx b/x-pack/plugins/security_solution/public/assistant/provider.tsx
new file mode 100644
index 0000000000000..cde9d5b58524d
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/assistant/provider.tsx
@@ -0,0 +1,77 @@
+/*
+ * 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, { useCallback } from 'react';
+import { i18n } from '@kbn/i18n';
+import { AssistantProvider as ElasticAssistantProvider } from '@kbn/elastic-assistant';
+import { useKibana } from '../common/lib/kibana';
+import { useAssistantTelemetry } from './use_assistant_telemetry';
+import { getComments } from './get_comments';
+import { augmentMessageCodeBlocks, LOCAL_STORAGE_KEY } from './helpers';
+import { useConversationStore } from './use_conversation_store';
+import { DEFAULT_ALLOW, DEFAULT_ALLOW_REPLACEMENT } from './content/anonymization';
+import { PROMPT_CONTEXTS } from './content/prompt_contexts';
+import { BASE_SECURITY_QUICK_PROMPTS } from './content/quick_prompts';
+import { BASE_SECURITY_SYSTEM_PROMPTS } from './content/prompts/system';
+import { useAnonymizationStore } from './use_anonymization_store';
+import { useAssistantAvailability } from './use_assistant_availability';
+import { APP_ID } from '../../common/constants';
+
+const ASSISTANT_TITLE = i18n.translate('xpack.securitySolution.assistant.title', {
+ defaultMessage: 'Elastic AI Assistant',
+});
+
+/**
+ * This component configures the Elastic AI Assistant context provider for the Security Solution app.
+ */
+export const AssistantProvider: React.FC = ({ children }) => {
+ const {
+ http,
+ triggersActionsUi: { actionTypeRegistry },
+ docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION },
+ } = useKibana().services;
+
+ const { conversations, setConversations } = useConversationStore();
+ const getInitialConversation = useCallback(() => {
+ return conversations;
+ }, [conversations]);
+
+ const assistantAvailability = useAssistantAvailability();
+ const assistantTelemetry = useAssistantTelemetry();
+
+ const { defaultAllow, defaultAllowReplacement, setDefaultAllow, setDefaultAllowReplacement } =
+ useAnonymizationStore();
+
+ const nameSpace = `${APP_ID}.${LOCAL_STORAGE_KEY}`;
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/x-pack/plugins/security_solution/public/common/components/page_wrapper/index.tsx b/x-pack/plugins/security_solution/public/common/components/page_wrapper/index.tsx
index d893674d49af5..acedbe669f36a 100644
--- a/x-pack/plugins/security_solution/public/common/components/page_wrapper/index.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/page_wrapper/index.tsx
@@ -5,13 +5,11 @@
* 2.0.
*/
-import { AssistantOverlay } from '@kbn/elastic-assistant';
import classNames from 'classnames';
import React, { useEffect } from 'react';
import styled from 'styled-components';
import type { CommonProps } from '@elastic/eui';
-import { useAssistantAvailability } from '../../../assistant/use_assistant_availability';
import { useGlobalFullScreen } from '../../containers/use_full_screen';
import { AppGlobalStyle } from '../page';
@@ -42,7 +40,6 @@ interface SecuritySolutionPageWrapperProps {
const SecuritySolutionPageWrapperComponent: React.FC<
SecuritySolutionPageWrapperProps & CommonProps
> = ({ children, className, style, noPadding, noTimeline, ...otherProps }) => {
- const { isAssistantEnabled, hasAssistantPrivilege } = useAssistantAvailability();
const { globalFullScreen, setGlobalFullScreen } = useGlobalFullScreen();
useEffect(() => {
setGlobalFullScreen(false); // exit full screen mode on page load
@@ -59,7 +56,6 @@ const SecuritySolutionPageWrapperComponent: React.FC<
{children}
- {hasAssistantPrivilege && }
);
};
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/exception_item_card/meta.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/exception_item_card/meta.tsx
index a324c19ff994d..6053b56bf5d5a 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/exception_item_card/meta.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/exception_item_card/meta.tsx
@@ -22,13 +22,10 @@ import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-t
import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types';
import styled from 'styled-components';
+import { LinkToRuleDetails, LinkToListDetails } from '../../../../exceptions/components';
import * as i18n from './translations';
import { FormattedDate } from '../../../../common/components/formatted_date';
-import { SecurityPageName } from '../../../../../common/constants';
import type { ExceptionListRuleReferencesSchema } from '../../../../../common/api/detection_engine/rule_exceptions';
-import { SecuritySolutionLinkAnchor } from '../../../../common/components/links';
-import { RuleDetailTabs } from '../../../rule_details_ui/pages/rule_details/use_rule_details_tabs';
-import { getRuleDetailsTabUrl } from '../../../../common/components/link_to/redirect_to_detection_engine';
const StyledFlexItem = styled(EuiFlexItem)`
border-right: 1px solid #d3dae6;
@@ -66,14 +63,7 @@ export const ExceptionItemCardMetaInfo = memo(
key={reference.id}
>
-
- {reference.name}
-
+
));
@@ -136,15 +126,12 @@ export const ExceptionItemCardMetaInfo = memo(
key={listAndReferences.id}
>
-
- {listAndReferences.name}
-
+ />
,
]}
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/linked_to_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/linked_to_rule/index.test.tsx
index 1b6f7bcb069b1..e963c8d7707f9 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/linked_to_rule/index.test.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/linked_to_rule/index.test.tsx
@@ -24,8 +24,7 @@ describe('ExceptionsLinkedToRule', () => {
/>
);
-
expect(wrapper.find('[data-test-subj="ruleNameCell"]').at(0).text()).toEqual('NameMy rule');
- expect(wrapper.find('[data-test-subj="ruleAction-viewDetails"]').exists()).toBeTruthy();
+ expect(wrapper.find('[data-test-subj="linkToRuleSecuritySolutionLink"]').exists()).toBeTruthy();
});
});
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/utils.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/utils.tsx
index 712da253477ab..0a92a46592dfd 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/utils.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/flyout_components/utils.tsx
@@ -20,8 +20,6 @@ import {
generateLinkedRulesMenuItems,
} from '@kbn/securitysolution-exception-list-components';
import { PopoverItems } from '../../../../common/components/popover_items';
-import { SecurityPageName } from '../../../../../common/constants';
-import { ListDetailsLinkAnchor } from '../../../../exceptions/components';
import {
enrichExceptionItemsWithOS,
enrichNewExceptionItemsWithComments,
@@ -31,14 +29,12 @@ import {
enrichSharedExceptions,
lowercaseHashValues,
} from '../../utils/helpers';
-import { SecuritySolutionLinkAnchor } from '../../../../common/components/links';
-import { getRuleDetailsTabUrl } from '../../../../common/components/link_to/redirect_to_detection_engine';
-import { RuleDetailTabs } from '../../../rule_details_ui/pages/rule_details/use_rule_details_tabs';
import type {
ExceptionListRuleReferencesInfoSchema,
ExceptionListRuleReferencesSchema,
} from '../../../../../common/api/detection_engine/rule_exceptions';
import type { Rule } from '../../../rule_management/logic/types';
+import { LinkToRuleDetails, LinkToListDetails } from '../../../../exceptions/components';
import * as i18n from './translations';
/**
@@ -222,7 +218,7 @@ export const getSharedListsTableColumns = () => [
actions={generateLinkedRulesMenuItems({
dataTestSubj: 'addToSharedListsLinkedRulesMenu',
linkedRules: references,
- securityLinkAnchorComponent: ListDetailsLinkAnchor,
+ securityLinkAnchorComponent: LinkToRuleDetails,
})}
panelPaddingSize="none"
disableActions={false}
@@ -237,14 +233,12 @@ export const getSharedListsTableColumns = () => [
'data-test-subj': 'exceptionListRulesActionCell',
render: (list: ExceptionListRuleReferencesSchema) => {
return (
-
- {i18n.VIEW_LIST_DETAIL_ACTION}
-
+ />
);
},
},
@@ -294,14 +288,11 @@ export const getRulesTableColumn = () => [
'data-test-subj': 'ruleAction-view',
render: (rule: Rule) => {
return (
-
- {i18n.VIEW_RULE_DETAIL_ACTION}
-
+ referenceId={rule.id}
+ referenceName={i18n.VIEW_RULE_DETAIL_ACTION}
+ />
);
},
},
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table/rules_table_context.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table/rules_table_context.tsx
index 791a4b9872fb5..1bf260aff69ed 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table/rules_table_context.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table/rules_table_context.tsx
@@ -295,6 +295,9 @@ export const RulesTableContextProvider = ({ children }: RulesTableContextProvide
pagination,
},
{
+ // We don't need refreshes on windows focus and reconnects if auto-refresh if off
+ refetchOnWindowFocus: isRefreshOn && !isActionInProgress,
+ refetchOnReconnect: isRefreshOn && !isActionInProgress,
refetchInterval: isRefreshOn && !isActionInProgress && autoRefreshSettings.value,
keepPreviousData: true, // Use this option so that the state doesn't jump between "success" and "loading" on page change
}
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/osquery/osquery_response_action.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/osquery/osquery_response_action.tsx
index 9f9ad505ff332..69564861c748a 100644
--- a/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/osquery/osquery_response_action.tsx
+++ b/x-pack/plugins/security_solution/public/detection_engine/rule_response_actions/osquery/osquery_response_action.tsx
@@ -5,7 +5,7 @@
* 2.0.
*/
-import React, { useMemo } from 'react';
+import React from 'react';
import { EuiCode, EuiEmptyPrompt } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import { useIsMounted } from '@kbn/securitysolution-hook-utils';
@@ -25,10 +25,6 @@ const GhostFormField = () => <>>;
export const OsqueryResponseAction = React.memo((props: OsqueryResponseActionProps) => {
const { osquery, application } = useKibana().services;
- const OsqueryForm = useMemo(
- () => osquery?.OsqueryResponseActionTypeForm,
- [osquery?.OsqueryResponseActionTypeForm]
- );
const isMounted = useIsMounted();
// serverless component that is returned when users do not have Endpoint.Complete tier
@@ -85,8 +81,7 @@ export const OsqueryResponseAction = React.memo((props: OsqueryResponseActionPro
);
}
- // @ts-expect-error ts upgrade v4.7.4
- if (isMounted() && OsqueryForm) {
+ if (isMounted()) {
return (
= ({
+ linkTitle,
+ listId,
+ external,
+ dataTestSubj,
+}) => {
+ return (
+
+ {linkTitle}
+
+ );
+};
+
+LinkToListDetailsComponent.displayName = 'LinkToListDetailsComponent';
+
+export const LinkToListDetails = React.memo(LinkToListDetailsComponent);
+
+LinkToListDetails.displayName = 'LinkToListDetails';
diff --git a/x-pack/plugins/security_solution/public/exceptions/components/list_details_link_anchor/index.tsx b/x-pack/plugins/security_solution/public/exceptions/components/link_to_rule_details/index.tsx
similarity index 68%
rename from x-pack/plugins/security_solution/public/exceptions/components/list_details_link_anchor/index.tsx
rename to x-pack/plugins/security_solution/public/exceptions/components/link_to_rule_details/index.tsx
index 4b54600fc454d..d2526f6fdef03 100644
--- a/x-pack/plugins/security_solution/public/exceptions/components/list_details_link_anchor/index.tsx
+++ b/x-pack/plugins/security_solution/public/exceptions/components/link_to_rule_details/index.tsx
@@ -7,34 +7,41 @@
import React from 'react';
import type { FC } from 'react';
+
+import { SecuritySolutionLinkAnchor } from '../../../common/components/links';
import { RuleDetailTabs } from '../../../detection_engine/rule_details_ui/pages/rule_details/use_rule_details_tabs';
import { SecurityPageName } from '../../../../common/constants';
import { getRuleDetailsTabUrl } from '../../../common/components/link_to/redirect_to_detection_engine';
-import { SecuritySolutionLinkAnchor } from '../../../common/components/links';
-interface LinkAnchorProps {
+interface LinkToRuleDetailsProps {
referenceName: string;
referenceId: string;
external?: boolean;
+ dataTestSubj?: string;
}
// This component should be removed and moved to @kbn/securitysolution-exception-list-components
// once all the building components get moved
-const LinkAnchor: FC = ({ referenceName, referenceId, external }) => {
+const LinkToRuleDetailsComponent: FC = ({
+ referenceName,
+ referenceId,
+ external,
+ dataTestSubj,
+}) => {
return (
{referenceName}
);
};
-LinkAnchor.displayName = 'LinkAnchor';
+LinkToRuleDetailsComponent.displayName = 'LinkToRuleDetailsComponent';
-export const ListDetailsLinkAnchor = React.memo(LinkAnchor);
+export const LinkToRuleDetails = React.memo(LinkToRuleDetailsComponent);
-ListDetailsLinkAnchor.displayName = 'ListDetailsLinkAnchor';
+LinkToRuleDetails.displayName = 'LinkToRuleDetails';
diff --git a/x-pack/plugins/security_solution/public/exceptions/components/list_exception_items/index.tsx b/x-pack/plugins/security_solution/public/exceptions/components/list_exception_items/index.tsx
index ee45e7414184f..1b1b6ad36d1ea 100644
--- a/x-pack/plugins/security_solution/public/exceptions/components/list_exception_items/index.tsx
+++ b/x-pack/plugins/security_solution/public/exceptions/components/list_exception_items/index.tsx
@@ -19,7 +19,7 @@ import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-t
import type { Pagination } from '@elastic/eui';
import { FormattedDate } from '../../../common/components/formatted_date';
import { getFormattedComments } from '../../utils/ui.helpers';
-import { ListDetailsLinkAnchor } from '../list_details_link_anchor';
+import { LinkToRuleDetails } from '../link_to_rule_details';
import { ExceptionsUtility } from '../exceptions_utility';
import * as i18n from '../../translations/list_exception_items';
@@ -89,7 +89,7 @@ const ListExceptionItemsComponent: FC = ({
onEditExceptionItem={onEditExceptionItem}
onDeleteException={onDeleteException}
getFormattedComments={getFormattedComments}
- securityLinkAnchorComponent={ListDetailsLinkAnchor}
+ securityLinkAnchorComponent={LinkToRuleDetails}
formattedDateComponent={FormattedDate}
onCreateExceptionListItem={onCreateExceptionListItem}
exceptionsUtilityComponent={() =>
diff --git a/x-pack/plugins/security_solution/public/exceptions/pages/list_detail_view/index.tsx b/x-pack/plugins/security_solution/public/exceptions/pages/list_detail_view/index.tsx
index 4272632d28a10..c153f1e983b0a 100644
--- a/x-pack/plugins/security_solution/public/exceptions/pages/list_detail_view/index.tsx
+++ b/x-pack/plugins/security_solution/public/exceptions/pages/list_detail_view/index.tsx
@@ -22,7 +22,7 @@ import type { Rule } from '../../../detection_engine/rule_management/logic/types
import { MissingPrivilegesCallOut } from '../../../detections/components/callouts/missing_privileges_callout';
import { NotFoundPage } from '../../../app/404';
import { AutoDownload } from '../../../common/components/auto_download/auto_download';
-import { ListWithSearch, ManageRules, ListDetailsLinkAnchor } from '../../components';
+import { ListWithSearch, ManageRules, LinkToRuleDetails } from '../../components';
import { useListDetailsView } from '../../hooks';
import * as i18n from '../../translations';
import type { CheckExceptionTtlActionTypes } from '../../components/expired_exceptions_list_items_modal';
@@ -109,7 +109,7 @@ export const ListsDetailViewComponent: FC = () => {
isReadonly={isReadOnly}
canUserEditList={canUserEditList}
backOptions={headerBackOptions}
- securityLinkAnchorComponent={ListDetailsLinkAnchor}
+ securityLinkAnchorComponent={LinkToRuleDetails}
onEditListDetails={onEditListDetails}
onExportList={handleExportList}
onDeleteList={handleDelete}
diff --git a/x-pack/plugins/security_solution/public/flyout/isolate_host/header.test.tsx b/x-pack/plugins/security_solution/public/flyout/isolate_host/header.test.tsx
new file mode 100644
index 0000000000000..fa4b57a4313fa
--- /dev/null
+++ b/x-pack/plugins/security_solution/public/flyout/isolate_host/header.test.tsx
@@ -0,0 +1,42 @@
+/*
+ * 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 { render } from '@testing-library/react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
+import { useIsolateHostPanelContext } from './context';
+import { PanelHeader } from './header';
+import { FLYOUT_HEADER_TITLE_TEST_ID } from './test_ids';
+
+jest.mock('./context');
+
+const renderPanelHeader = () =>
+ render(
+
+
+
+ );
+
+describe(' ', () => {
+ (useIsolateHostPanelContext as jest.Mock).mockReturnValue({ isolateAction: 'isolateHost' });
+
+ it('should display isolate host message', () => {
+ const { getByTestId } = renderPanelHeader();
+
+ expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent('Isolate host');
+ });
+
+ it('should display release host message', () => {
+ (useIsolateHostPanelContext as jest.Mock).mockReturnValue({ isolateAction: 'unisolateHost' });
+
+ const { getByTestId } = renderPanelHeader();
+
+ expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent('Release host');
+ });
+});
diff --git a/x-pack/plugins/security_solution/public/flyout/isolate_host/header.tsx b/x-pack/plugins/security_solution/public/flyout/isolate_host/header.tsx
index 168175878d802..0e5ef2e309b69 100644
--- a/x-pack/plugins/security_solution/public/flyout/isolate_host/header.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/isolate_host/header.tsx
@@ -8,9 +8,9 @@
import { EuiFlyoutHeader, EuiTitle } from '@elastic/eui';
import type { FC } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useIsolateHostPanelContext } from './context';
import { FLYOUT_HEADER_TITLE_TEST_ID } from './test_ids';
-import { PANEL_HEADER_ISOLATE_TITLE, PANEL_HEADER_RELEASE_TITLE } from './translations';
/**
* Document details expandable right section header for the isolate host panel
@@ -19,7 +19,17 @@ export const PanelHeader: FC = () => {
const { isolateAction } = useIsolateHostPanelContext();
const title =
- isolateAction === 'isolateHost' ? PANEL_HEADER_ISOLATE_TITLE : PANEL_HEADER_RELEASE_TITLE;
+ isolateAction === 'isolateHost' ? (
+
+ ) : (
+
+ );
return (
diff --git a/x-pack/plugins/security_solution/public/flyout/isolate_host/translations.ts b/x-pack/plugins/security_solution/public/flyout/isolate_host/translations.ts
deleted file mode 100644
index 84ec8d62c09de..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/isolate_host/translations.ts
+++ /dev/null
@@ -1,22 +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 { i18n } from '@kbn/i18n';
-
-export const PANEL_HEADER_ISOLATE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.isolateHostPanelHeaderIsolateTitle',
- {
- defaultMessage: `Isolate host`,
- }
-);
-
-export const PANEL_HEADER_RELEASE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.isolateHostPanelHeaderReleaseTitle',
- {
- defaultMessage: `Release host`,
- }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.test.tsx
index dcd8c5884c6fb..2bbfa8f4ab7c5 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.test.tsx
@@ -20,8 +20,8 @@ import {
CORRELATIONS_DETAILS_BY_SESSION_SECTION_TABLE_TEST_ID,
CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TABLE_TEST_ID,
CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID,
+ CORRELATIONS_DETAILS_NO_DATA_TEST_ID,
CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID,
- CORRELATIONS_DETAILS_TEST_ID,
} from './test_ids';
import { useFetchRelatedAlertsBySession } from '../../shared/hooks/use_fetch_related_alerts_by_session';
import { useFetchRelatedAlertsByAncestry } from '../../shared/hooks/use_fetch_related_alerts_by_ancestry';
@@ -102,13 +102,14 @@ describe('CorrelationsDetails', () => {
dataCount: 1,
});
- const { getByTestId } = renderCorrelationDetails();
+ const { getByTestId, queryByTestId } = renderCorrelationDetails();
expect(getByTestId(CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TABLE_TEST_ID)).toBeInTheDocument();
expect(getByTestId(CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TABLE_TEST_ID)).toBeInTheDocument();
expect(getByTestId(CORRELATIONS_DETAILS_BY_SESSION_SECTION_TABLE_TEST_ID)).toBeInTheDocument();
expect(getByTestId(CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID)).toBeInTheDocument();
expect(getByTestId(CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_TITLE_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(CORRELATIONS_DETAILS_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no section and show error message if show values are false', () => {
@@ -139,7 +140,10 @@ describe('CorrelationsDetails', () => {
expect(
queryByTestId(CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_TITLE_TEST_ID)
).not.toBeInTheDocument();
- expect(getByTestId(`${CORRELATIONS_DETAILS_TEST_ID}Error`)).toBeInTheDocument();
+ expect(getByTestId(CORRELATIONS_DETAILS_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(CORRELATIONS_DETAILS_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'No correlations data available.'
+ );
});
it('should render no section if values are null', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.tsx
index 0e6e927779710..f7def1d23ac98 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details.tsx
@@ -7,8 +7,8 @@
import React from 'react';
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
-import { CORRELATIONS_ERROR_MESSAGE } from './translations';
-import { CORRELATIONS_DETAILS_TEST_ID } from './test_ids';
+import { FormattedMessage } from '@kbn/i18n-react';
+import { CORRELATIONS_DETAILS_NO_DATA_TEST_ID } from './test_ids';
import { RelatedAlertsBySession } from './related_alerts_by_session';
import { RelatedAlertsBySameSourceEvent } from './related_alerts_by_same_source_event';
import { RelatedCases } from './related_cases';
@@ -98,9 +98,12 @@ export const CorrelationsDetails: React.FC = () => {
)}
) : (
-
- {CORRELATIONS_ERROR_MESSAGE}
-
+
+
+
)}
>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.test.tsx
index 3d36a54e728e2..250889402e455 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.test.tsx
@@ -67,7 +67,7 @@ describe('CorrelationsDetailsAlertsTable', () => {
const { getByTestId } = render(
{'title'}
}
loading={false}
alertIds={alertIds}
scopeId={scopeId}
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.tsx
index 4099db06d6c5a..0f113efe317aa 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/correlations_details_alerts_table.tsx
@@ -5,17 +5,18 @@
* 2.0.
*/
-import type { ReactNode } from 'react';
+import type { ReactElement, ReactNode } from 'react';
import React, { type FC, useMemo, useCallback } from 'react';
import { type Criteria, EuiBasicTable, formatDate } from '@elastic/eui';
import { Severity } from '@kbn/securitysolution-io-ts-alerting-types';
import type { Filter } from '@kbn/es-query';
import { isRight } from 'fp-ts/lib/Either';
import { ALERT_REASON, ALERT_RULE_NAME } from '@kbn/rule-data-utils';
+import { FormattedMessage } from '@kbn/i18n-react';
+import { i18n } from '@kbn/i18n';
import type { DataProvider } from '../../../../common/types';
import { SeverityBadge } from '../../../detections/components/rules/severity_badge';
import { usePaginatedAlerts } from '../hooks/use_paginated_alerts';
-import * as i18n from './translations';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import { InvestigateInTimelineButton } from '../../../common/components/event_details/table/investigate_in_timeline_button';
import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../detections/components/alerts_table/translations';
@@ -27,24 +28,44 @@ const dataProviderLimit = 5;
export const columns = [
{
field: '@timestamp',
- name: i18n.CORRELATIONS_TIMESTAMP_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
dataType: 'date' as const,
render: (value: string) => formatDate(value, TIMESTAMP_DATE_FORMAT),
},
{
field: ALERT_RULE_NAME,
- name: i18n.CORRELATIONS_RULE_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
},
{
field: ALERT_REASON,
- name: i18n.CORRELATIONS_REASON_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
},
{
field: 'kibana.alert.severity',
- name: i18n.CORRELATIONS_SEVERITY_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
render: (value: string) => {
const decodedSeverity = Severity.decode(value);
@@ -57,7 +78,7 @@ export interface CorrelationsDetailsAlertsTableProps {
/**
* Text to display in the ExpandablePanel title section
*/
- title: string;
+ title: ReactElement;
/**
* Whether the table is loading
*/
@@ -188,7 +209,12 @@ const getFilters = (alertIds?: string[]) => {
return [
{
meta: {
- alias: i18n.CORRELATIONS_DETAILS_TABLE_FILTER,
+ alias: i18n.translate(
+ 'xpack.securitySolution.flyout.left.insights.correlations.tableFilterLabel',
+ {
+ defaultMessage: 'Correlations Details Table Alert IDs.',
+ }
+ ),
type: 'phrases',
key: '_id',
params: [...alertIds],
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.test.tsx
index eb56069bb7646..a4a1e9de5f62e 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.test.tsx
@@ -42,7 +42,7 @@ const HOST_TEST_ID = EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID);
describe(' ', () => {
it('renders entities details correctly', () => {
- const { getByTestId } = render(
+ const { getByTestId, queryByTestId } = render(
@@ -52,6 +52,7 @@ describe(' ', () => {
expect(getByTestId(ENTITIES_DETAILS_TEST_ID)).toBeInTheDocument();
expect(getByTestId(USER_TEST_ID)).toBeInTheDocument();
expect(getByTestId(HOST_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(ENTITIES_DETAILS_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no data message if user name and host name are not available', () => {
@@ -69,6 +70,9 @@ describe(' ', () => {
);
expect(getByTestId(ENTITIES_DETAILS_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(ENTITIES_DETAILS_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'Host and user information are unavailable for this alert.'
+ );
expect(queryByTestId(USER_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(HOST_TEST_ID)).not.toBeInTheDocument();
});
@@ -96,6 +100,9 @@ describe(' ', () => {
);
expect(getByTestId(ENTITIES_DETAILS_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(ENTITIES_DETAILS_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'Host and user information are unavailable for this alert.'
+ );
expect(queryByTestId(USER_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(HOST_TEST_ID)).not.toBeInTheDocument();
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.tsx
index ff3678a06e428..78ee648581162 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/entities_details.tsx
@@ -7,7 +7,7 @@
import React from 'react';
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
-import { ENTITIES_NO_DATA_MESSAGE } from './translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useLeftPanelContext } from '../context';
import { getField } from '../../shared/utils';
import { UserDetails } from './user_details';
@@ -45,7 +45,12 @@ export const EntitiesDetails: React.FC = () => {
)}
) : (
- {ENTITIES_NO_DATA_MESSAGE}
+
+
+
)}
>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx
index 5941c39cb8c8d..2bccfbc8ac34b 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx
@@ -20,6 +20,7 @@ import {
EuiPanel,
} from '@elastic/eui';
import type { EuiBasicTableColumn } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { getSourcererScopeId } from '../../../helpers';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import type { RelatedUser } from '../../../../common/search_strategy/security_solution/related_entities/related_users';
@@ -50,7 +51,6 @@ import { getEmptyTagValue } from '../../../common/components/empty_value';
import { HOST_DETAILS_TEST_ID, HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID } from './test_ids';
import { ENTITY_RISK_CLASSIFICATION } from '../../../explore/components/risk_score/translations';
import { USER_RISK_TOOLTIP } from '../../../explore/users/components/all_users/translations';
-import * as i18n from './translations';
import { useHasSecurityCapability } from '../../../helper_hooks';
const HOST_DETAILS_ID = 'entities-hosts-details';
@@ -128,7 +128,12 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s
() => [
{
field: 'user',
- name: i18n.RELATED_ENTITIES_NAME_COLUMN_TITLE,
+ name: (
+
+ ),
render: (user: string) => (
= ({ hostName, timestamp, s
},
{
field: 'ip',
- name: i18n.RELATED_ENTITIES_IP_COLUMN_TITLE,
+ name: (
+
+ ),
render: (ips: string[]) => {
return (
= ({ hostName, timestamp, s
- {`${i18n.RELATED_USERS_TITLE}: ${totalCount}`}
+
+
+
@@ -215,7 +231,12 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s
return (
<>
- {i18n.HOST_TITLE}
+
+
+
= ({ hostName, timestamp, s
data-test-subj={HOST_DETAILS_TEST_ID}
>
- {i18n.HOSTS_INFO_TITLE}
+
+
+
= ({ hostName, timestamp, s
- {i18n.RELATED_USERS_TITLE}
+
+
+
-
+
+ }
+ >
@@ -287,11 +326,21 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s
loading={isRelatedUsersLoading}
data-test-subj={HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID}
pagination={pagination}
- message={i18n.RELATED_USERS_TABLE_NO_DATA}
+ message={
+
+ }
/>
+ }
inspectIndex={0}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.test.tsx
index b5a7f229b9979..37d91600bbe5e 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.test.tsx
@@ -55,6 +55,9 @@ describe(' ', () => {
});
const { getByTestId } = render(renderInvestigationGuide());
expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toHaveTextContent(
+ `There’s no investigation guide for this rule. Edit the rule's settingsExternal link(opens in a new tab or window) to add one.`
+ );
});
it('should render no data message when there is no rule note', () => {
@@ -64,6 +67,9 @@ describe(' ', () => {
});
const { getByTestId } = render(renderInvestigationGuide());
expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toHaveTextContent(
+ `There’s no investigation guide for this rule. Edit the rule's settingsExternal link(opens in a new tab or window) to add one.`
+ );
});
it('should render no data message when useInvestigationGuide errors out', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.tsx
index 8cf39210bbac7..1152e11df6ba6 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/investigation_guide.tsx
@@ -49,9 +49,9 @@ export const InvestigationGuide: React.FC = () => {
showFullView={true}
/>
) : (
-
+
{
target="_blank"
>
),
}}
/>
-
+
)}
>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.test.tsx
index 233eb7c22371e..45cde1423ba4f 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.test.tsx
@@ -17,6 +17,7 @@ import {
PREVALENCE_DETAILS_TABLE_HOST_PREVALENCE_CELL_TEST_ID,
PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID,
PREVALENCE_DETAILS_TABLE_TEST_ID,
+ PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID,
PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID,
PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID,
} from './test_ids';
@@ -53,6 +54,15 @@ const panelContextValue = {
dataFormattedForFieldBrowser: [],
} as unknown as LeftPanelContext;
+const renderPrevalenceDetails = () =>
+ render(
+
+
+
+
+
+ );
+
describe('PrevalenceDetails', () => {
const licenseServiceMock = licenseService as jest.Mocked;
@@ -86,13 +96,7 @@ describe('PrevalenceDetails', () => {
],
});
- const { getByTestId, getAllByTestId, queryByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId, getAllByTestId, queryByTestId } = renderPrevalenceDetails();
expect(getByTestId(PREVALENCE_DETAILS_TABLE_TEST_ID)).toBeInTheDocument();
expect(getAllByTestId(PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID).length).toBeGreaterThan(1);
@@ -109,7 +113,8 @@ describe('PrevalenceDetails', () => {
expect(
getAllByTestId(PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID).length
).toBeGreaterThan(1);
- expect(queryByTestId(`${PREVALENCE_DETAILS_TABLE_TEST_ID}UpSell`)).not.toBeInTheDocument();
+ expect(queryByTestId(PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render formatted numbers for the alert and document count columns', () => {
@@ -176,13 +181,7 @@ describe('PrevalenceDetails', () => {
});
licenseServiceMock.isPlatinumPlus.mockReturnValue(false);
- const { getByTestId, getAllByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId, getAllByTestId } = renderPrevalenceDetails();
expect(getByTestId(PREVALENCE_DETAILS_TABLE_TEST_ID)).toBeInTheDocument();
expect(getAllByTestId(PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID).length).toBeGreaterThan(1);
@@ -199,7 +198,7 @@ describe('PrevalenceDetails', () => {
expect(
getAllByTestId(PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID).length
).toBeGreaterThan(1);
- expect(getByTestId(`${PREVALENCE_DETAILS_TABLE_TEST_ID}UpSell`)).toBeInTheDocument();
+ expect(getByTestId(PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID)).toBeInTheDocument();
});
it('should render loading', () => {
@@ -209,13 +208,11 @@ describe('PrevalenceDetails', () => {
data: [],
});
- const { getByTestId } = render(
-
-
-
- );
+ const { getByTestId, queryByTestId } = renderPrevalenceDetails();
expect(getByTestId(PREVALENCE_DETAILS_LOADING_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no data message if call errors out', () => {
@@ -225,12 +222,28 @@ describe('PrevalenceDetails', () => {
data: [],
});
- const { getByTestId } = render(
-
-
-
+ const { getByTestId, queryByTestId } = renderPrevalenceDetails();
+
+ expect(getByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'No prevalence data available.'
);
+ expect(queryByTestId(PREVALENCE_DETAILS_LOADING_TEST_ID)).not.toBeInTheDocument();
+ });
- expect(getByTestId(`${PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID}Error`)).toBeInTheDocument();
+ it('should render no data message if no data', () => {
+ (usePrevalence as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ });
+
+ const { getByTestId, queryByTestId } = renderPrevalenceDetails();
+
+ expect(getByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'No prevalence data available.'
+ );
+ expect(queryByTestId(PREVALENCE_DETAILS_LOADING_TEST_ID)).not.toBeInTheDocument();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.tsx
index cd4283613a453..4c1865738ce0c 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/prevalence_details.tsx
@@ -27,21 +27,6 @@ import { useLicense } from '../../../common/hooks/use_license';
import { InvestigateInTimelineButton } from '../../../common/components/event_details/table/investigate_in_timeline_button';
import type { PrevalenceData } from '../../shared/hooks/use_prevalence';
import { usePrevalence } from '../../shared/hooks/use_prevalence';
-import {
- HOST_TITLE,
- PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE,
- PREVALENCE_TABLE_COUNT_COLUMN_TITLE,
- PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE,
- PREVALENCE_TABLE_VALUE_COLUMN_TITLE,
- PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE,
- PREVALENCE_TABLE_FIELD_COLUMN_TITLE,
- USER_TITLE,
- PREVALENCE_NO_DATA_MESSAGE,
- PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE_TOOLTIP,
- PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE_TOOLTIP,
- HOST_PREVALENCE_COLUMN_TITLE_TOOLTIP,
- USER_PREVALENCE_COLUMN_TITLE_TOOLTIP,
-} from './translations';
import {
PREVALENCE_DETAILS_LOADING_TEST_ID,
PREVALENCE_DETAILS_TABLE_ALERT_COUNT_CELL_TEST_ID,
@@ -53,6 +38,7 @@ import {
PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID,
PREVALENCE_DETAILS_DATE_PICKER_TEST_ID,
PREVALENCE_DETAILS_TABLE_TEST_ID,
+ PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID,
} from './test_ids';
import { useLeftPanelContext } from '../context';
import {
@@ -80,24 +66,51 @@ interface PrevalenceDetailsRow extends PrevalenceData {
const columns: Array> = [
{
field: 'field',
- name: PREVALENCE_TABLE_FIELD_COLUMN_TITLE,
+ name: (
+
+ ),
'data-test-subj': PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID,
render: (field: string) => {field} ,
width: '20%',
},
{
field: 'value',
- name: PREVALENCE_TABLE_VALUE_COLUMN_TITLE,
+ name: (
+
+ ),
'data-test-subj': PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID,
render: (value: string) => {value} ,
width: '20%',
},
{
name: (
-
+
+ }
+ >
- {PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE}
- {PREVALENCE_TABLE_COUNT_COLUMN_TITLE}
+
+
+
+
+
+
),
@@ -123,10 +136,27 @@ const columns: Array> = [
},
{
name: (
-
+
+ }
+ >
- {PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE}
- {PREVALENCE_TABLE_COUNT_COLUMN_TITLE}
+
+
+
+
+
+
),
@@ -169,10 +199,27 @@ const columns: Array> = [
{
field: 'hostPrevalence',
name: (
-
+
+ }
+ >
- {HOST_TITLE}
- {PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE}
+
+
+
+
+
+
),
@@ -185,10 +232,27 @@ const columns: Array> = [
{
field: 'userPrevalence',
name: (
-
+
+ }
+ >
- {USER_TITLE}
- {PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE}
+
+
+
+
+
+
),
@@ -270,15 +334,15 @@ export const PrevalenceDetails: React.FC = () => {
const upsell = (
<>
-
+
@@ -308,9 +372,12 @@ export const PrevalenceDetails: React.FC = () => {
data-test-subj={PREVALENCE_DETAILS_TABLE_TEST_ID}
/>
) : (
-
- {PREVALENCE_NO_DATA_MESSAGE}
-
+
+
+
)}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.test.tsx
index c54b76468841b..7a1cb79b90364 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.test.tsx
@@ -111,4 +111,30 @@ describe(' ', () => {
);
expect(container).toBeEmptyDOMElement();
});
+
+ it('should render no data message', () => {
+ (useFetchRelatedAlertsByAncestry as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ dataCount: 0,
+ });
+ (usePaginatedAlerts as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ });
+
+ const { getByText } = render(
+
+
+
+ );
+ expect(getByText('No alerts related by ancestry.')).toBeInTheDocument();
+ });
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.tsx
index ac0ac0a351e9a..050d2b4ae1966 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_ancestry.tsx
@@ -6,9 +6,8 @@
*/
import React from 'react';
-import { RELATED_ALERTS_BY_ANCESTRY_NO_DATA } from './translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { CorrelationsDetailsAlertsTable } from './correlations_details_alerts_table';
-import { CORRELATIONS_ANCESTRY_ALERTS } from '../../shared/translations';
import { useFetchRelatedAlertsByAncestry } from '../../shared/hooks/use_fetch_related_alerts_by_ancestry';
import { CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID } from './test_ids';
@@ -45,7 +44,6 @@ export const RelatedAlertsByAncestry: React.VFC =
indices,
scopeId,
});
- const title = `${dataCount} ${CORRELATIONS_ANCESTRY_ALERTS(dataCount)}`;
if (error) {
return null;
@@ -53,12 +51,23 @@ export const RelatedAlertsByAncestry: React.VFC =
return (
+ }
loading={loading}
alertIds={data}
scopeId={scopeId}
eventId={eventId}
- noItemsMessage={RELATED_ALERTS_BY_ANCESTRY_NO_DATA}
+ noItemsMessage={
+
+ }
data-test-subj={CORRELATIONS_DETAILS_BY_ANCESTRY_SECTION_TEST_ID}
/>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.test.tsx
index 77dbe5ef21a2c..55d2323dc413a 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.test.tsx
@@ -108,4 +108,29 @@ describe(' ', () => {
);
expect(container).toBeEmptyDOMElement();
});
+
+ it('should render no data message', () => {
+ (useFetchRelatedAlertsBySameSourceEvent as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ dataCount: 0,
+ });
+ (usePaginatedAlerts as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ });
+
+ const { getByText } = render(
+
+
+
+ );
+ expect(getByText('No related source events.')).toBeInTheDocument();
+ });
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.tsx
index 0a0cdeb8fd29c..e3bbf48c5fe15 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_same_source_event.tsx
@@ -6,8 +6,7 @@
*/
import React from 'react';
-import { RELATED_ALERTS_BY_SOURCE_EVENT_NO_DATA } from './translations';
-import { CORRELATIONS_SAME_SOURCE_ALERTS } from '../../shared/translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useFetchRelatedAlertsBySameSourceEvent } from '../../shared/hooks/use_fetch_related_alerts_by_same_source_event';
import { CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID } from './test_ids';
import { CorrelationsDetailsAlertsTable } from './correlations_details_alerts_table';
@@ -39,7 +38,6 @@ export const RelatedAlertsBySameSourceEvent: React.VFC
+ }
loading={loading}
alertIds={data}
scopeId={scopeId}
eventId={eventId}
- noItemsMessage={RELATED_ALERTS_BY_SOURCE_EVENT_NO_DATA}
+ noItemsMessage={
+
+ }
data-test-subj={CORRELATIONS_DETAILS_BY_SOURCE_SECTION_TEST_ID}
/>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.test.tsx
index de1725eef64c9..2f2f4468440e1 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.test.tsx
@@ -100,4 +100,25 @@ describe(' ', () => {
);
expect(container).toBeEmptyDOMElement();
});
+
+ it('should render no data message', () => {
+ (useFetchRelatedAlertsBySession as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ dataCount: 0,
+ });
+ (usePaginatedAlerts as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ });
+
+ const { getByText } = render(
+
+
+
+ );
+ expect(getByText('No alerts related by session.')).toBeInTheDocument();
+ });
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.tsx
index 8a55aa3651708..1aa5a2b9dd619 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_alerts_by_session.tsx
@@ -6,8 +6,7 @@
*/
import React from 'react';
-import { RELATED_ALERTS_BY_SESSION_NO_DATA } from './translations';
-import { CORRELATIONS_SESSION_ALERTS } from '../../shared/translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { CorrelationsDetailsAlertsTable } from './correlations_details_alerts_table';
import { useFetchRelatedAlertsBySession } from '../../shared/hooks/use_fetch_related_alerts_by_session';
import { CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID } from './test_ids';
@@ -39,7 +38,6 @@ export const RelatedAlertsBySession: React.VFC = ({
entityId,
scopeId,
});
- const title = `${dataCount} ${CORRELATIONS_SESSION_ALERTS(dataCount)}`;
if (error) {
return null;
@@ -47,12 +45,23 @@ export const RelatedAlertsBySession: React.VFC = ({
return (
+ }
loading={loading}
alertIds={data}
scopeId={scopeId}
eventId={eventId}
- noItemsMessage={RELATED_ALERTS_BY_SESSION_NO_DATA}
+ noItemsMessage={
+
+ }
data-test-subj={CORRELATIONS_DETAILS_BY_SESSION_SECTION_TEST_ID}
/>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.test.tsx
index ce11b234e8359..264794666234a 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import {
CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID,
@@ -38,6 +39,13 @@ const TITLE_TEXT = EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(
CORRELATIONS_DETAILS_CASES_SECTION_TEST_ID
);
+const renderRelatedCases = () =>
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render many related cases correctly', () => {
(useFetchRelatedCases as jest.Mock).mockReturnValue({
@@ -54,7 +62,7 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render( );
+ const { getByTestId } = renderRelatedCases();
expect(getByTestId(TOGGLE_ICON)).toBeInTheDocument();
expect(getByTestId(TITLE_ICON)).toBeInTheDocument();
expect(getByTestId(TITLE_TEXT)).toHaveTextContent('1 related case');
@@ -67,7 +75,19 @@ describe(' ', () => {
error: true,
});
- const { container } = render( );
+ const { container } = renderRelatedCases();
expect(container).toBeEmptyDOMElement();
});
+
+ it('should render no data message', () => {
+ (useFetchRelatedCases as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ data: [],
+ dataCount: 0,
+ });
+
+ const { getByText } = renderRelatedCases();
+ expect(getByText('No related cases.')).toBeInTheDocument();
+ });
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx
index 707087d6360e8..5818b9314390c 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx
@@ -9,26 +9,26 @@ import React from 'react';
import type { EuiBasicTableColumn } from '@elastic/eui';
import { EuiInMemoryTable, EuiSkeletonText } from '@elastic/eui';
import type { RelatedCase } from '@kbn/cases-plugin/common';
+import { FormattedMessage } from '@kbn/i18n-react';
import { CaseDetailsLink } from '../../../common/components/links';
-import { CORRELATIONS_RELATED_CASES } from '../../shared/translations';
import {
CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID,
CORRELATIONS_DETAILS_CASES_SECTION_TEST_ID,
} from './test_ids';
import { useFetchRelatedCases } from '../../shared/hooks/use_fetch_related_cases';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
-import {
- CORRELATIONS_CASE_NAME_COLUMN_TITLE,
- CORRELATIONS_CASE_STATUS_COLUMN_TITLE,
- RELATED_CASES_NO_DATA,
-} from './translations';
const ICON = 'warning';
const columns: Array> = [
{
field: 'title',
- name: CORRELATIONS_CASE_NAME_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
render: (value: string, caseData: RelatedCase) => (
@@ -38,7 +38,12 @@ const columns: Array> = [
},
{
field: 'status',
- name: CORRELATIONS_CASE_STATUS_COLUMN_TITLE,
+ name: (
+
+ ),
truncateText: true,
},
];
@@ -55,7 +60,6 @@ export interface RelatedCasesProps {
*/
export const RelatedCases: React.VFC = ({ eventId }) => {
const { loading, error, data, dataCount } = useFetchRelatedCases({ eventId });
- const title = `${dataCount} ${CORRELATIONS_RELATED_CASES(dataCount)}`;
if (loading) {
return ;
@@ -68,7 +72,13 @@ export const RelatedCases: React.VFC = ({ eventId }) => {
return (
+ ),
iconType: ICON,
}}
content={{ error }}
@@ -83,7 +93,12 @@ export const RelatedCases: React.VFC = ({ eventId }) => {
items={data}
columns={columns}
pagination={true}
- message={RELATED_CASES_NO_DATA}
+ message={
+
+ }
data-test-subj={CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/response_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/response_details.test.tsx
index 435df5fb3dcd1..b4720c433ea02 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/response_details.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/response_details.test.tsx
@@ -125,5 +125,8 @@ describe(' ', () => {
expect(wrapper.queryByTestId('osqueryViewWrapper')).not.toBeInTheDocument();
expect(wrapper.getByTestId(RESPONSE_EMPTY_TEST_ID)).toBeInTheDocument();
+ expect(wrapper.getByTestId(RESPONSE_EMPTY_TEST_ID)).toHaveTextContent(
+ 'There are no response actions defined for this event. To add some, edit the rule’s settings and set up response actionsExternal link(opens in a new tab or window).'
+ );
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/response_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/response_details.tsx
index 03e16c0118cfa..37b1b6b83b203 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/response_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/response_details.tsx
@@ -19,7 +19,6 @@ import { useLeftPanelContext } from '../context';
import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features';
import { useOsqueryTab } from '../../../common/components/event_details/osquery_tab';
import { useResponseActionsView } from '../../../common/components/event_details/response_actions_view';
-import * as i18n from './translations';
const ExtendedFlyoutWrapper = styled.div`
figure {
@@ -58,13 +57,18 @@ export const ResponseDetails: React.FC = () => {
return (
- {i18n.RESPONSE_TITLE}
+
+
+
{!responseActions ? (
{
target="_blank"
>
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/session_view.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/session_view.tsx
index 48f1164f75168..4fd548e60a21a 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/session_view.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/session_view.tsx
@@ -8,14 +8,13 @@
import type { FC } from 'react';
import React from 'react';
import { EuiEmptyPrompt } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import {
ANCESTOR_INDEX,
ENTRY_LEADER_ENTITY_ID,
ENTRY_LEADER_START,
} from '../../shared/constants/field_names';
import { getField } from '../../shared/utils';
-import { ERROR_MESSAGE, ERROR_TITLE } from '../../shared/translations';
-import { SESSION_VIEW_ERROR_MESSAGE } from './translations';
import { SESSION_VIEW_ERROR_TEST_ID, SESSION_VIEW_TEST_ID } from './test_ids';
import { useKibana } from '../../../common/lib/kibana';
import { useLeftPanelContext } from '../context';
@@ -39,8 +38,24 @@ export const SessionView: FC = () => {
{ERROR_TITLE(SESSION_VIEW_ERROR_MESSAGE)}}
- body={{ERROR_MESSAGE(SESSION_VIEW_ERROR_MESSAGE)}
}
+ title={
+
+
+
+ }
+ body={
+
+
+
+ }
data-test-subj={SESSION_VIEW_ERROR_TEST_ID}
/>
);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.test.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.test.tsx
index 646cbb2fc9bd5..4bc1a8f5fb0d0 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.test.tsx
@@ -36,15 +36,21 @@ const TITLE_TEXT = EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(
);
const INVESTIGATE_IN_TIMELINE_BUTTON_TEST_ID = `${CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID}InvestigateInTimeline`;
+const renderSuppressedAlerts = (alertSuppressionCount: number) =>
+ render(
+
+
+
+
+
+ );
+
describe(' ', () => {
it('should render zero component correctly', () => {
- const { getByTestId, queryByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId, queryByTestId } = renderSuppressedAlerts(0);
expect(getByTestId(TITLE_ICON)).toBeInTheDocument();
expect(getByTestId(TITLE_TEXT)).toHaveTextContent('0 suppressed alert');
@@ -54,13 +60,7 @@ describe(' ', () => {
});
it('should render single component correctly', () => {
- const { getByTestId, queryByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId, queryByTestId } = renderSuppressedAlerts(1);
expect(getByTestId(TITLE_ICON)).toBeInTheDocument();
expect(getByTestId(TITLE_TEXT)).toHaveTextContent('1 suppressed alert');
@@ -70,13 +70,7 @@ describe(' ', () => {
});
it('should render multiple component correctly', () => {
- const { getByTestId, queryByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId, queryByTestId } = renderSuppressedAlerts(2);
expect(getByTestId(TITLE_ICON)).toBeInTheDocument();
expect(getByTestId(TITLE_TEXT)).toHaveTextContent('2 suppressed alerts');
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.tsx
index 2fc96ab4d47fd..c2123ced63feb 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/suppressed_alerts.tsx
@@ -8,7 +8,7 @@
import React from 'react';
import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs';
import { EuiBetaBadge, EuiFlexItem, EuiFlexGroup } from '@elastic/eui';
-import { CORRELATIONS_SUPPRESSED_ALERTS } from '../../shared/translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import {
CORRELATIONS_DETAILS_SUPPRESSED_ALERTS_SECTION_TEST_ID,
@@ -38,7 +38,11 @@ export const SuppressedAlerts: React.VFC = ({
const title = (
- {`${alertSuppressionCount} ${CORRELATIONS_SUPPRESSED_ALERTS(alertSuppressionCount)}`}
+
- i18n.translate('xpack.securitySolution.flyout.entities.relatedHostsToolTip', {
- defaultMessage:
- 'After this alert was generated, {userName} logged into these hosts. Check if this activity is normal.',
- values: { userName },
- });
-
-export const RELATED_ENTITIES_NAME_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.entities.relatedEntitiesNameColumn',
- {
- defaultMessage: 'Name',
- }
-);
-
-export const RELATED_ENTITIES_IP_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.entities.relatedEntitiesIpColumn',
- {
- defaultMessage: 'Ip addresses',
- }
-);
-
-export const HOST_TITLE = i18n.translate('xpack.securitySolution.flyout.entities.hostTitle', {
- defaultMessage: 'Host',
-});
-
-export const HOST_PREVALENCE_COLUMN_TITLE_TOOLTIP = i18n.translate(
- 'xpack.securitySolution.flyout.entities.hostPrevalenceColumTitleTooltip',
- {
- defaultMessage: 'Percentage of unique hosts with identical field value pairs',
- }
-);
-
-export const HOSTS_INFO_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.entities.hostsInfoTitle',
- {
- defaultMessage: 'Host information',
- }
-);
-
-export const RELATED_USERS_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.entities.relatedUsersTitle',
- {
- defaultMessage: 'Related users',
- }
-);
-
-export const RELATED_USERS_TABLE_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.entities.relatedUsersTableNoData',
- {
- defaultMessage: 'No users identified',
- }
-);
-
-export const RELATED_USERS_TOOL_TIP = (hostName: string) =>
- i18n.translate('xpack.securitySolution.flyout.entities.relatedUsersToolTip', {
- defaultMessage:
- 'After this alert was generated, these users logged into {hostName}. Check if this activity is normal.',
- values: { hostName },
- });
-
-export const PREVALENCE_NO_DATA_MESSAGE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceNoDataMessage',
- {
- defaultMessage: 'No prevalence data available',
- }
-);
-
-export const PREVALENCE_TABLE_FIELD_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableFieldColumnTitle',
- {
- defaultMessage: 'Field',
- }
-);
-
-export const PREVALENCE_TABLE_VALUE_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableValueColumnTitle',
- {
- defaultMessage: 'Value',
- }
-);
-
-export const PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableAlertCountColumnTitle',
- {
- defaultMessage: 'Alert',
- }
-);
-
-export const PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE_TOOLTIP = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableAlertCountColumnTitleTooltip',
- {
- defaultMessage: 'Total number of alerts with identical field value pairs',
- }
-);
-
-export const PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableDocCountColumnTitle',
- {
- defaultMessage: 'Document',
- }
-);
-
-export const PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE_TOOLTIP = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableDocCountColumnTitleTooltip',
- {
- defaultMessage: 'Total number of event documents with identical field value pairs',
- }
-);
-
-export const PREVALENCE_TABLE_COUNT_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTableCountColumnTitle',
- {
- defaultMessage: 'count',
- }
-);
-
-export const PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.prevalenceTablePrevalenceColumnTitle',
- {
- defaultMessage: 'prevalence',
- }
-);
-
-export const RESPONSE_TITLE = i18n.translate('xpack.securitySolution.flyout.response.title', {
- defaultMessage: 'Responses',
-});
-
-export const CORRELATIONS_TIMESTAMP_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.timestampColumnTitle',
- {
- defaultMessage: 'Timestamp',
- }
-);
-
-export const CORRELATIONS_RULE_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.ruleColumnTitle',
- {
- defaultMessage: 'Rule',
- }
-);
-
-export const CORRELATIONS_REASON_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.reasonColumnTitle',
- {
- defaultMessage: 'Reason',
- }
-);
-
-export const CORRELATIONS_SEVERITY_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.severityColumnTitle',
- {
- defaultMessage: 'Severity',
- }
-);
-
-export const CORRELATIONS_CASE_STATUS_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.statusColumnTitle',
- {
- defaultMessage: 'Status',
- }
-);
-
-export const CORRELATIONS_CASE_NAME_COLUMN_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.caseNameColumnTitle',
- {
- defaultMessage: 'Name',
- }
-);
-
-export const CORRELATIONS_DETAILS_TABLE_FILTER = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.correlationsDetailsTableFilter',
- {
- defaultMessage: 'Correlations Details Table Alert IDs',
- }
-);
-
-export const RELATED_ALERTS_BY_ANCESTRY_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.relatedAlertsByAncestryNoData',
- {
- defaultMessage: 'No alerts related by ancestry',
- }
-);
-
-export const RELATED_ALERTS_BY_SOURCE_EVENT_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.relatedAlertsBySourceEventNoData',
- {
- defaultMessage: 'No related source events',
- }
-);
-
-export const RELATED_ALERTS_BY_SESSION_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.relatedAlertsBySessionNoData',
- {
- defaultMessage: 'No alerts related by session',
- }
-);
-
-export const RELATED_CASES_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.correlations.relatedCasesNoData',
- {
- defaultMessage: 'No related cases',
- }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx
index c5a135eb621bb..12ad057284cd6 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx
@@ -20,6 +20,7 @@ import {
EuiPanel,
} from '@elastic/eui';
import type { EuiBasicTableColumn } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { getSourcererScopeId } from '../../../helpers';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import type { RelatedHost } from '../../../../common/search_strategy/security_solution/related_entities/related_hosts';
@@ -50,7 +51,6 @@ import { getEmptyTagValue } from '../../../common/components/empty_value';
import { USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID, USER_DETAILS_TEST_ID } from './test_ids';
import { ENTITY_RISK_CLASSIFICATION } from '../../../explore/components/risk_score/translations';
import { HOST_RISK_TOOLTIP } from '../../../explore/hosts/components/hosts_table/translations';
-import * as i18n from './translations';
import { useHasSecurityCapability } from '../../../helper_hooks';
const USER_DETAILS_ID = 'entities-users-details';
@@ -129,7 +129,12 @@ export const UserDetails: React.FC = ({ userName, timestamp, s
() => [
{
field: 'host',
- name: i18n.RELATED_ENTITIES_NAME_COLUMN_TITLE,
+ name: (
+
+ ),
render: (host: string) => (
= ({ userName, timestamp, s
},
{
field: 'ip',
- name: i18n.RELATED_ENTITIES_IP_COLUMN_TITLE,
+ name: (
+
+ ),
render: (ips: string[]) => {
return (
= ({ userName, timestamp, s
- {`${i18n.RELATED_HOSTS_TITLE}: ${totalCount}`}
+
+
+
@@ -216,7 +232,12 @@ export const UserDetails: React.FC = ({ userName, timestamp, s
return (
<>
- {i18n.USER_TITLE}
+
+
+
= ({ userName, timestamp, s
data-test-subj={USER_DETAILS_TEST_ID}
>
- {i18n.USERS_INFO_TITLE}
+
+
+
= ({ userName, timestamp, s
- {i18n.RELATED_HOSTS_TITLE}
+
+
+
-
+
+ }
+ >
@@ -290,11 +329,21 @@ export const UserDetails: React.FC = ({ userName, timestamp, s
loading={isRelatedHostLoading}
data-test-subj={USER_DETAILS_RELATED_HOSTS_TABLE_TEST_ID}
pagination={pagination}
- message={i18n.RELATED_HOSTS_TABLE_NO_DATA}
+ message={
+
+ }
/>
+ }
inspectIndex={0}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs.tsx b/x-pack/plugins/security_solution/public/flyout/left/tabs.tsx
index 9ac70d515cc45..c2fc6e5fe20db 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/tabs.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/tabs.tsx
@@ -5,10 +5,11 @@
* 2.0.
*/
+import type { ReactElement } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { VisualizeTab } from './tabs/visualize_tab';
import { InvestigationTab } from './tabs/investigation_tab';
-import { INSIGHTS_TAB, INVESTIGATIONS_TAB, RESPONSE_TAB, VISUALIZE_TAB } from './translations';
import { InsightsTab } from './tabs/insights_tab';
import type { LeftPanelPaths } from '.';
import {
@@ -22,7 +23,7 @@ import { ResponseTab } from './tabs/response_tab';
export type LeftPanelTabsType = Array<{
id: LeftPanelPaths;
'data-test-subj': string;
- name: string;
+ name: ReactElement;
content: React.ReactElement;
visible: boolean;
}>;
@@ -31,28 +32,48 @@ export const tabs: LeftPanelTabsType = [
{
id: 'visualize',
'data-test-subj': VISUALIZE_TAB_TEST_ID,
- name: VISUALIZE_TAB,
+ name: (
+
+ ),
content: ,
visible: false,
},
{
id: 'insights',
'data-test-subj': INSIGHTS_TAB_TEST_ID,
- name: INSIGHTS_TAB,
+ name: (
+
+ ),
content: ,
visible: true,
},
{
id: 'investigation',
'data-test-subj': INVESTIGATION_TAB_TEST_ID,
- name: INVESTIGATIONS_TAB,
+ name: (
+
+ ),
content: ,
visible: true,
},
{
id: 'response',
'data-test-subj': RESPONSE_TAB_TEST_ID,
- name: RESPONSE_TAB,
+ name: (
+
+ ),
content: ,
visible: true,
},
diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx b/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx
index a041a980752be..6f35b6b26f3c8 100644
--- a/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx
@@ -10,6 +10,8 @@ import React, { memo, useCallback, useState, useEffect } from 'react';
import { EuiButtonGroup, EuiSpacer } from '@elastic/eui';
import type { EuiButtonGroupOptionProps } from '@elastic/eui/src/components/button/button_group/button_group';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { i18n } from '@kbn/i18n';
+import { FormattedMessage } from '@kbn/i18n-react';
import {
INSIGHTS_TAB_BUTTON_GROUP_TEST_ID,
INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID,
@@ -19,13 +21,6 @@ import {
} from './test_ids';
import { useLeftPanelContext } from '../context';
import { LeftPanelKey, LeftPanelInsightsTab } from '..';
-import {
- INSIGHTS_BUTTONGROUP_OPTIONS,
- ENTITIES_BUTTON,
- THREAT_INTELLIGENCE_BUTTON,
- PREVALENCE_BUTTON,
- CORRELATIONS_BUTTON,
-} from './translations';
import { ENTITIES_TAB_ID, EntitiesDetails } from '../components/entities_details';
import {
THREAT_INTELLIGENCE_TAB_ID,
@@ -37,22 +32,42 @@ import { CORRELATIONS_TAB_ID, CorrelationsDetails } from '../components/correlat
const insightsButtons: EuiButtonGroupOptionProps[] = [
{
id: ENTITIES_TAB_ID,
- label: ENTITIES_BUTTON,
+ label: (
+
+ ),
'data-test-subj': INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID,
},
{
id: THREAT_INTELLIGENCE_TAB_ID,
- label: THREAT_INTELLIGENCE_BUTTON,
+ label: (
+
+ ),
'data-test-subj': INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON_TEST_ID,
},
{
id: PREVALENCE_TAB_ID,
- label: PREVALENCE_BUTTON,
+ label: (
+
+ ),
'data-test-subj': INSIGHTS_TAB_PREVALENCE_BUTTON_TEST_ID,
},
{
id: CORRELATIONS_TAB_ID,
- label: CORRELATIONS_BUTTON,
+ label: (
+
+ ),
'data-test-subj': INSIGHTS_TAB_CORRELATIONS_BUTTON_TEST_ID,
},
];
@@ -97,7 +112,12 @@ export const InsightsTab: React.FC = memo(() => {
+ ),
'data-test-subj': VISUALIZE_TAB_SESSION_VIEW_BUTTON_TEST_ID,
},
{
id: ANALYZE_GRAPH_ID,
- label: ANALYZER_GRAPH_BUTTON,
+ label: (
+
+ ),
'data-test-subj': VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID,
},
];
@@ -83,7 +90,12 @@ export const VisualizeTab: FC = memo(() => {
onChangeCompressed(id)}
diff --git a/x-pack/plugins/security_solution/public/flyout/left/translations.ts b/x-pack/plugins/security_solution/public/flyout/left/translations.ts
deleted file mode 100644
index c2dc888ab9aef..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/left/translations.ts
+++ /dev/null
@@ -1,36 +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 { i18n } from '@kbn/i18n';
-
-export const VISUALIZE_TAB = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.visualizeTab',
- {
- defaultMessage: 'Visualize',
- }
-);
-
-export const INSIGHTS_TAB = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.insightsTab',
- {
- defaultMessage: 'Insights',
- }
-);
-
-export const INVESTIGATIONS_TAB = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.investigationsTab',
- {
- defaultMessage: 'Investigation',
- }
-);
-
-export const RESPONSE_TAB = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.responseTab',
- {
- defaultMessage: 'Response',
- }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.test.tsx
index f84983e5ce13b..99540e38da725 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { PreviewPanelContext } from '../context';
import { mockContextValue } from '../mocks/mock_preview_panel_context';
@@ -23,12 +24,15 @@ const panelContextValue = {
describe(' ', () => {
it('should render alert reason preview', () => {
const { getByTestId } = render(
-
-
-
-
-
+
+
+
+
+
+
+
);
expect(getByTestId(ALERT_REASON_PREVIEW_BODY_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(ALERT_REASON_PREVIEW_BODY_TEST_ID)).toHaveTextContent('Alert reason');
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.tsx
index e7460c1042788..476a1f3551948 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/alert_reason_preview.tsx
@@ -9,7 +9,7 @@ import React, { useMemo } from 'react';
import { EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui';
import styled from '@emotion/styled';
import { euiThemeVars } from '@kbn/ui-theme';
-import { ALERT_REASON_TITLE } from './translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ALERT_REASON_PREVIEW_BODY_TEST_ID } from './test_ids';
import { usePreviewPanelContext } from '../context';
import { getRowRenderer } from '../../../timelines/components/timeline/body/renderers/get_row_renderer';
@@ -53,7 +53,12 @@ export const AlertReasonPreview: React.FC = () => {
return (
- {ALERT_REASON_TITLE}
+
+
+
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.test.tsx
index 13be8994a7d14..68ada8b17cce8 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.test.tsx
@@ -88,12 +88,16 @@ describe(' ', () => {
expect(getByTestId(RULE_PREVIEW_BODY_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RULE_PREVIEW_ABOUT_HEADER_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RULE_PREVIEW_ABOUT_HEADER_TEST_ID)).toHaveTextContent('About');
expect(getByTestId(RULE_PREVIEW_ABOUT_CONTENT_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RULE_PREVIEW_DEFINITION_HEADER_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RULE_PREVIEW_DEFINITION_HEADER_TEST_ID)).toHaveTextContent('Definition');
expect(getByTestId(RULE_PREVIEW_DEFINITION_CONTENT_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID)).toHaveTextContent('Schedule');
expect(getByTestId(RULE_PREVIEW_SCHEDULE_CONTENT_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RULE_PREVIEW_ACTIONS_HEADER_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RULE_PREVIEW_ACTIONS_HEADER_TEST_ID)).toHaveTextContent('Actions');
expect(getByTestId(RULE_PREVIEW_ACTIONS_CONTENT_TEST_ID)).toBeInTheDocument();
});
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.tsx
index d1595f7419aa0..db87a9a681902 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview.tsx
@@ -6,6 +6,7 @@
*/
import React, { memo, useState, useEffect } from 'react';
import { EuiText, EuiHorizontalRule, EuiSpacer, EuiPanel, EuiLoadingSpinner } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useKibana } from '../../../common/lib/kibana';
import { useGetSavedQuery } from '../../../detections/pages/detection_engine/rules/use_get_saved_query';
import type { Rule } from '../../../detection_engine/rule_management/logic';
@@ -26,7 +27,6 @@ import {
RULE_PREVIEW_ACTIONS_TEST_ID,
RULE_PREVIEW_LOADING_TEST_ID,
} from './test_ids';
-import * as i18n from './translations';
/**
* Rule summary on a preview panel on top of the right section of expandable flyout
@@ -84,7 +84,12 @@ export const RulePreview: React.FC = memo(() => {
+ }
expanded
data-test-subj={RULE_PREVIEW_ABOUT_TEST_ID}
>
@@ -103,7 +108,12 @@ export const RulePreview: React.FC = memo(() => {
{defineRuleData && !isSavedQueryLoading && (
<>
+ }
expanded={false}
data-test-subj={RULE_PREVIEW_DEFINITION_TEST_ID}
>
@@ -125,7 +135,12 @@ export const RulePreview: React.FC = memo(() => {
{scheduleRuleData && (
<>
+ }
expanded={false}
data-test-subj={RULE_PREVIEW_SCHEDULE_TEST_ID}
>
@@ -141,7 +156,12 @@ export const RulePreview: React.FC = memo(() => {
)}
{hasActions && (
+ }
expanded={false}
data-test-subj={RULE_PREVIEW_ACTIONS_TEST_ID}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.test.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.test.tsx
index 6a300c42976c9..383a034e55af1 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.test.tsx
@@ -30,6 +30,9 @@ describe(' ', () => {
expect(getByTestId(RULE_PREVIEW_FOOTER_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID)).toHaveTextContent(
+ 'Show rule details'
+ );
});
it('should not render rule details link when ruleId is not available', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.tsx b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.tsx
index 161a28c53137d..e645a08f18197 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/components/rule_preview_footer.tsx
@@ -7,9 +7,9 @@
import React, { memo } from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiFlyoutFooter } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
import { usePreviewPanelContext } from '../context';
import { RenderRuleName } from '../../../timelines/components/timeline/body/renderers/formatted_field_helpers';
-import { SHOW_RULE_DETAILS } from './translations';
import { SIGNAL_RULE_NAME_FIELD_NAME } from '../../../timelines/components/timeline/body/renderers/constants';
import { RULE_PREVIEW_FOOTER_TEST_ID } from './test_ids';
@@ -31,7 +31,9 @@ export const RulePreviewFooter: React.FC = memo(() => {
isAggregatable={false}
isDraggable={false}
linkValue={ruleId}
- value={SHOW_RULE_DETAILS}
+ value={i18n.translate('xpack.securitySolution.flyout.preview.rule.viewDetailsLabel', {
+ defaultMessage: 'Show rule details',
+ })}
openInNewTab
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/components/translations.ts b/x-pack/plugins/security_solution/public/flyout/preview/components/translations.ts
deleted file mode 100644
index 36bfdd33ea2ca..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/preview/components/translations.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-import { i18n } from '@kbn/i18n';
-
-export const SHOW_RULE_DETAILS = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.viewRuleDetailsText',
- { defaultMessage: 'Show rule details' }
-);
-
-export const RULE_PREVIEW_ABOUT_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.rulePreviewAboutSectionText',
- { defaultMessage: 'About' }
-);
-
-export const RULE_PREVIEW_DEFINITION_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.rulePreviewDefinitionSectionText',
- { defaultMessage: 'Definition' }
-);
-
-export const RULE_PREVIEW_SCHEDULE_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.rulePreviewScheduleSectionText',
- { defaultMessage: 'Schedule' }
-);
-
-export const RULE_PREVIEW_ACTIONS_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.rulePreviewActionsSectionText',
- { defaultMessage: 'Actions' }
-);
-
-export const ALERT_REASON_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.alertReasonTitle',
- { defaultMessage: 'Alert reason' }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/panels.tsx b/x-pack/plugins/security_solution/public/flyout/preview/panels.tsx
index e585c58945d9c..b5e42754a46d3 100644
--- a/x-pack/plugins/security_solution/public/flyout/preview/panels.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/preview/panels.tsx
@@ -8,7 +8,6 @@
import React from 'react';
import { AlertReasonPreview } from './components/alert_reason_preview';
import type { PreviewPanelPaths } from '.';
-import { ALERT_REASON_PREVIEW, RULE_PREVIEW } from './translations';
import { RulePreview } from './components/rule_preview';
import { RulePreviewFooter } from './components/rule_preview_footer';
@@ -17,10 +16,6 @@ export type PreviewPanelType = Array<{
* Id of the preview panel
*/
id: PreviewPanelPaths;
- /**
- * Panel name
- */
- name: string;
/**
* Main body component to be rendered in the panel
*/
@@ -37,13 +32,11 @@ export type PreviewPanelType = Array<{
export const panels: PreviewPanelType = [
{
id: 'rule-preview',
- name: RULE_PREVIEW,
content: ,
footer: ,
},
{
id: 'alert-reason-preview',
- name: ALERT_REASON_PREVIEW,
content: ,
},
];
diff --git a/x-pack/plugins/security_solution/public/flyout/preview/translations.ts b/x-pack/plugins/security_solution/public/flyout/preview/translations.ts
deleted file mode 100644
index cf359e7900cea..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/preview/translations.ts
+++ /dev/null
@@ -1,18 +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 { i18n } from '@kbn/i18n';
-
-export const RULE_PREVIEW = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.rulePreviewPanel',
- { defaultMessage: 'Rule preview' }
-);
-
-export const ALERT_REASON_PREVIEW = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.alertReasonPreviewPanel',
- { defaultMessage: 'Alert reason preview' }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/about_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/about_section.tsx
index d1cc1ca3f0a65..0d28b1c13f641 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/about_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/about_section.tsx
@@ -8,9 +8,9 @@
import { EuiSpacer } from '@elastic/eui';
import type { VFC } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandableSection } from './expandable_section';
import { ABOUT_SECTION_TEST_ID } from './test_ids';
-import { ABOUT_TITLE } from './translations';
import { Description } from './description';
import { Reason } from './reason';
import { MitreAttack } from './mitre_attack';
@@ -29,7 +29,12 @@ export const AboutSection: VFC = ({ expanded = true }) => {
return (
+ }
data-test-subj={ABOUT_SECTION_TEST_ID}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview.tsx
index 3d872640a5a22..42749285de612 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview.tsx
@@ -7,9 +7,9 @@
import React, { useEffect, useMemo, useState } from 'react';
import { find } from 'lodash/fp';
import { EuiTreeView } from '@elastic/eui';
+import { i18n } from '@kbn/i18n';
import { ANALYZER_PREVIEW_TEST_ID } from './test_ids';
import { getTreeNodes } from '../utils/analyzer_helpers';
-import { ANALYZER_PREVIEW_TITLE } from './translations';
import { ANCESTOR_ID, RULE_INDICES } from '../../shared/constants/field_names';
import { useRightPanelContext } from '../context';
import { useAlertPrevalenceFromProcessTree } from '../../../common/containers/alerts/use_alert_prevalence_from_process_tree';
@@ -67,7 +67,12 @@ export const AnalyzerPreview: React.FC = () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.test.tsx
index cecddeec1b987..4e764483680b5 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.test.tsx
@@ -11,7 +11,7 @@ import React from 'react';
import { RightPanelContext } from '../context';
import { AnalyzerPreviewContainer } from './analyzer_preview_container';
import { isInvestigateInResolverActionEnabled } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver';
-import { ANALYZER_PREVIEW_TEST_ID } from './test_ids';
+import { ANALYZER_PREVIEW_NO_DATA_TEST_ID, ANALYZER_PREVIEW_TEST_ID } from './test_ids';
import { useAlertPrevalenceFromProcessTree } from '../../../common/containers/alerts/use_alert_prevalence_from_process_tree';
import * as mock from '../mocks/mock_analyzer_data';
import {
@@ -38,9 +38,6 @@ const panelContextValue = {
dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser,
} as unknown as RightPanelContext;
-const TEST_ID = ANALYZER_PREVIEW_TEST_ID;
-const ERROR_TEST_ID = `${ANALYZER_PREVIEW_TEST_ID}Error`;
-
const renderAnalyzerPreview = () =>
render(
@@ -69,8 +66,8 @@ describe('AnalyzerPreviewContainer', () => {
const { getByTestId, queryByTestId } = renderAnalyzerPreview();
- expect(getByTestId(TEST_ID)).toBeInTheDocument();
- expect(queryByTestId(ERROR_TEST_ID)).not.toBeInTheDocument();
+ expect(getByTestId(ANALYZER_PREVIEW_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(ANALYZER_PREVIEW_NO_DATA_TEST_ID)).not.toBeInTheDocument();
expect(
getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID))
).toBeInTheDocument();
@@ -96,8 +93,11 @@ describe('AnalyzerPreviewContainer', () => {
const { getByTestId, queryByTestId } = renderAnalyzerPreview();
- expect(queryByTestId(TEST_ID)).not.toBeInTheDocument();
- expect(getByTestId(ERROR_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(ANALYZER_PREVIEW_TEST_ID)).not.toBeInTheDocument();
+ expect(getByTestId(ANALYZER_PREVIEW_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(ANALYZER_PREVIEW_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'You can only visualize events triggered by hosts configured with the Elastic Defend integration or any sysmon data from winlogbeat. Refer to Visual event analyzerExternal link(opens in a new tab or window) for more information.'
+ );
expect(
getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(ANALYZER_PREVIEW_TEST_ID))
).toBeInTheDocument();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.tsx
index ede2169fce268..fd582b37d6fcb 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/analyzer_preview_container.tsx
@@ -18,8 +18,7 @@ import { setActiveTabTimeline } from '../../../timelines/store/timeline/actions'
import { useRightPanelContext } from '../context';
import { isInvestigateInResolverActionEnabled } from '../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver';
import { AnalyzerPreview } from './analyzer_preview';
-import { ANALYZER_PREVIEW_TEST_ID } from './test_ids';
-import { ANALYZER_PREVIEW_TITLE } from './translations';
+import { ANALYZER_PREVIEW_NO_DATA_TEST_ID, ANALYZER_PREVIEW_TEST_ID } from './test_ids';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
const timelineId = 'timeline-1';
@@ -58,7 +57,12 @@ export const AnalyzerPreviewContainer: React.FC = () => {
return (
+ ),
iconType: 'timeline',
...(isEnabled && { callback: goToAnalyzerTab }),
}}
@@ -67,9 +71,9 @@ export const AnalyzerPreviewContainer: React.FC = () => {
{isEnabled ? (
) : (
-
+
{'sysmon'},
@@ -80,14 +84,14 @@ export const AnalyzerPreviewContainer: React.FC = () => {
target="_blank"
>
),
}}
/>
-
+
)}
);
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.test.tsx
index 664b90a54b767..a579c124539d1 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.test.tsx
@@ -14,6 +14,7 @@ import { CorrelationsOverview } from './correlations_overview';
import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details';
import { LeftPanelInsightsTab, LeftPanelKey } from '../../left';
import {
+ INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID,
INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID,
INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID,
INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID,
@@ -74,7 +75,6 @@ const RELATED_ALERTS_BY_SESSION_TEST_ID = SUMMARY_ROW_VALUE_TEST_ID(
const RELATED_CASES_TEST_ID = SUMMARY_ROW_VALUE_TEST_ID(
INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID
);
-const CORRELATIONS_ERROR_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}Error`;
const panelContextValue = {
eventId: 'event id',
@@ -141,12 +141,13 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render(renderCorrelationsOverview(panelContextValue));
+ const { getByTestId, queryByTestId } = render(renderCorrelationsOverview(panelContextValue));
expect(getByTestId(RELATED_ALERTS_BY_ANCESTRY_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RELATED_ALERTS_BY_SESSION_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RELATED_CASES_TEST_ID)).toBeInTheDocument();
expect(getByTestId(SUPPRESSED_ALERTS_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should hide rows and show error message if show values are false', () => {
@@ -168,7 +169,10 @@ describe(' ', () => {
expect(queryByTestId(RELATED_ALERTS_BY_SESSION_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(RELATED_CASES_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(SUPPRESSED_ALERTS_TEST_ID)).not.toBeInTheDocument();
- expect(getByTestId(CORRELATIONS_ERROR_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'No correlations data available.'
+ );
});
it('should hide rows if values are null', () => {
@@ -184,6 +188,7 @@ describe(' ', () => {
expect(queryByTestId(RELATED_ALERTS_BY_SESSION_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(RELATED_CASES_TEST_ID)).not.toBeInTheDocument();
expect(queryByTestId(SUPPRESSED_ALERTS_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should navigate to the left section Insights tab when clicking on button', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.tsx
index 750d260bbf21f..675e520c4bfb2 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/correlations_overview.tsx
@@ -8,6 +8,7 @@
import React, { useCallback } from 'react';
import { EuiFlexGroup } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import { useShowRelatedAlertsBySession } from '../../shared/hooks/use_show_related_alerts_by_session';
import { RelatedAlertsBySession } from './related_alerts_by_session';
@@ -19,9 +20,8 @@ import { SuppressedAlerts } from './suppressed_alerts';
import { useShowSuppressedAlerts } from '../../shared/hooks/use_show_suppressed_alerts';
import { RelatedCases } from './related_cases';
import { useShowRelatedCases } from '../../shared/hooks/use_show_related_cases';
-import { INSIGHTS_CORRELATIONS_TEST_ID } from './test_ids';
+import { INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID, INSIGHTS_CORRELATIONS_TEST_ID } from './test_ids';
import { useRightPanelContext } from '../context';
-import { CORRELATIONS_ERROR, CORRELATIONS_TITLE } from './translations';
import { LeftPanelKey, LeftPanelInsightsTab } from '../../left';
import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details';
@@ -84,7 +84,12 @@ export const CorrelationsOverview: React.FC = () => {
return (
+ ),
callback: goToCorrelationsTab,
iconType: 'arrowStart',
}}
@@ -107,7 +112,12 @@ export const CorrelationsOverview: React.FC = () => {
)}
) : (
- {CORRELATIONS_ERROR}
+
+
+
)}
);
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/description.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/description.test.tsx
index 48b12f31599cf..5b94bff38c3d9 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/description.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/description.test.tsx
@@ -6,13 +6,9 @@
*/
import React from 'react';
+import { FormattedMessage, __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { DESCRIPTION_TITLE_TEST_ID, RULE_SUMMARY_BUTTON_TEST_ID } from './test_ids';
-import {
- DOCUMENT_DESCRIPTION_TITLE,
- PREVIEW_RULE_DETAILS,
- RULE_DESCRIPTION_TITLE,
-} from './translations';
import { Description } from './description';
import { RightPanelContext } from '../context';
import { mockGetFieldsData } from '../mocks/mock_context';
@@ -59,11 +55,13 @@ const panelContextValue = (dataFormattedForFieldBrowser: TimelineEventsDetailsIt
const renderDescription = (panelContext: RightPanelContext) =>
render(
-
-
-
-
-
+
+
+
+
+
+
+
);
describe(' ', () => {
@@ -73,7 +71,7 @@ describe(' ', () => {
);
expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent(RULE_DESCRIPTION_TITLE);
+ expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent('Rule description');
expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toBeInTheDocument();
});
@@ -83,7 +81,7 @@ describe(' ', () => {
);
expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent(RULE_DESCRIPTION_TITLE);
+ expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent('Rule description');
expect(queryByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).not.toBeInTheDocument();
});
@@ -91,7 +89,7 @@ describe(' ', () => {
const { getByTestId } = renderDescription(panelContextValue([ruleDescription]));
expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent(DOCUMENT_DESCRIPTION_TITLE);
+ expect(getByTestId(DESCRIPTION_TITLE_TEST_ID)).toHaveTextContent('Document description');
});
it('should open preview panel when clicking on button', () => {
@@ -109,7 +107,12 @@ describe(' ', () => {
indexName: panelContext.indexName,
scopeId: panelContext.scopeId,
banner: {
- title: PREVIEW_RULE_DETAILS,
+ title: (
+
+ ),
backgroundColor: 'warning',
textColor: 'warning',
},
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx
index 521609a4c267c..ac8ec64a0ee34 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx
@@ -10,6 +10,7 @@ import type { FC } from 'react';
import React, { useMemo, useCallback } from 'react';
import { isEmpty } from 'lodash';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useRightPanelContext } from '../context';
import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers';
import {
@@ -17,12 +18,6 @@ import {
DESCRIPTION_TITLE_TEST_ID,
RULE_SUMMARY_BUTTON_TEST_ID,
} from './test_ids';
-import {
- DOCUMENT_DESCRIPTION_TITLE,
- RULE_DESCRIPTION_TITLE,
- RULE_SUMMARY_TEXT,
- PREVIEW_RULE_DETAILS,
-} from './translations';
import { PreviewPanelKey, type PreviewPanelProps, RulePreviewPanel } from '../../preview';
/**
@@ -45,7 +40,12 @@ export const Description: FC = () => {
indexName,
scopeId,
banner: {
- title: PREVIEW_RULE_DETAILS,
+ title: (
+
+ ),
backgroundColor: 'warning',
textColor: 'warning',
},
@@ -66,7 +66,10 @@ export const Description: FC = () => {
iconSide="right"
data-test-subj={RULE_SUMMARY_BUTTON_TEST_ID}
>
- {RULE_SUMMARY_TEXT}
+
),
@@ -82,12 +85,22 @@ export const Description: FC = () => {
{isAlert ? (
- {RULE_DESCRIPTION_TITLE}
+
+
+
{viewRule}
) : (
- {DOCUMENT_DESCRIPTION_TITLE}
+
+
+
)}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.test.tsx
index 9c79f100bf9e2..67ccba02712ed 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.test.tsx
@@ -54,7 +54,7 @@ describe(' ', () => {
});
it('should render user and host', () => {
- const { getByTestId } = render(
+ const { getByTestId, queryByTestId } = render(
@@ -63,6 +63,7 @@ describe(' ', () => {
);
expect(getByTestId(ENTITIES_USER_OVERVIEW_TEST_ID)).toBeInTheDocument();
expect(getByTestId(ENTITIES_HOST_OVERVIEW_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_ENTITIES_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should only render user when host name is null', () => {
@@ -81,6 +82,7 @@ describe(' ', () => {
expect(getByTestId(ENTITIES_USER_OVERVIEW_TEST_ID)).toBeInTheDocument();
expect(queryByTestId(ENTITIES_HOST_OVERVIEW_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_ENTITIES_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should only render host when user name is null', () => {
@@ -99,6 +101,7 @@ describe(' ', () => {
expect(getByTestId(ENTITIES_HOST_OVERVIEW_TEST_ID)).toBeInTheDocument();
expect(queryByTestId(ENTITIES_USER_OVERVIEW_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_ENTITIES_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no data message if both host name and user name are null/blank', () => {
@@ -116,5 +119,8 @@ describe(' ', () => {
);
expect(queryByTestId(INSIGHTS_ENTITIES_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_ENTITIES_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'Host and user information are unavailable for this alert.'
+ );
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.tsx
index 920b54be950c1..ff2c314ec76f4 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/entities_overview.tsx
@@ -8,10 +8,10 @@
import React, { useCallback } from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { INSIGHTS_ENTITIES_NO_DATA_TEST_ID, INSIGHTS_ENTITIES_TEST_ID } from './test_ids';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import { useRightPanelContext } from '../context';
-import { ENTITIES_NO_DATA_MESSAGE, ENTITIES_TITLE } from './translations';
import { getField } from '../../shared/utils';
import { HostEntityOverview } from './host_entity_overview';
import { UserEntityOverview } from './user_entity_overview';
@@ -46,7 +46,12 @@ export const EntitiesOverview: React.FC = () => {
<>
+ ),
callback: goToEntitiesTab,
iconType: 'arrowStart',
}}
@@ -67,7 +72,12 @@ export const EntitiesOverview: React.FC = () => {
)}
) : (
- {ENTITIES_NO_DATA_MESSAGE}
+
+
+
)}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx
index b1d893b19a153..55a371e4a640c 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { RightPanelContext } from '../context';
import { ExpandDetailButton } from './expand_detail_button';
@@ -13,6 +14,20 @@ import { COLLAPSE_DETAILS_BUTTON_TEST_ID, EXPAND_DETAILS_BUTTON_TEST_ID } from '
import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context';
import { LeftPanelKey } from '../../left';
+const renderExpandDetailButton = (
+ flyoutContextValue: ExpandableFlyoutContext,
+ panelContextValue: RightPanelContext
+) =>
+ render(
+
+
+
+
+
+
+
+ );
+
describe(' ', () => {
it('should render expand button', () => {
const flyoutContextValue = {
@@ -25,15 +40,14 @@ describe(' ', () => {
scopeId: 'scopeId',
} as unknown as RightPanelContext;
- const { getByTestId } = render(
-
-
-
-
-
+ const { getByTestId, queryByTestId } = renderExpandDetailButton(
+ flyoutContextValue,
+ panelContextValue
);
expect(getByTestId(EXPAND_DETAILS_BUTTON_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(EXPAND_DETAILS_BUTTON_TEST_ID)).toHaveTextContent('Expand details');
+ expect(queryByTestId(COLLAPSE_DETAILS_BUTTON_TEST_ID)).not.toBeInTheDocument();
getByTestId(EXPAND_DETAILS_BUTTON_TEST_ID).click();
expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({
@@ -55,15 +69,14 @@ describe(' ', () => {
} as unknown as ExpandableFlyoutContext;
const panelContextValue = {} as unknown as RightPanelContext;
- const { getByTestId } = render(
-
-
-
-
-
+ const { getByTestId, queryByTestId } = renderExpandDetailButton(
+ flyoutContextValue,
+ panelContextValue
);
expect(getByTestId(COLLAPSE_DETAILS_BUTTON_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(COLLAPSE_DETAILS_BUTTON_TEST_ID)).toHaveTextContent('Collapse details');
+ expect(queryByTestId(EXPAND_DETAILS_BUTTON_TEST_ID)).not.toBeInTheDocument();
getByTestId(COLLAPSE_DETAILS_BUTTON_TEST_ID).click();
expect(flyoutContextValue.closeLeftPanel).toHaveBeenCalled();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.tsx
index 4e02f423d1720..f066e1d411ddf 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/expand_detail_button.tsx
@@ -9,10 +9,10 @@ import { EuiButtonEmpty } from '@elastic/eui';
import type { FC } from 'react';
import React, { memo, useCallback } from 'react';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { COLLAPSE_DETAILS_BUTTON_TEST_ID, EXPAND_DETAILS_BUTTON_TEST_ID } from './test_ids';
import { LeftPanelKey } from '../../left';
import { useRightPanelContext } from '../context';
-import { COLLAPSE_DETAILS_BUTTON, EXPAND_DETAILS_BUTTON } from './translations';
/**
* Button displayed in the top left corner of the panel, to expand the left section of the document details expandable flyout
@@ -43,7 +43,10 @@ export const ExpandDetailButton: FC = memo(() => {
iconType="arrowEnd"
data-test-subj={COLLAPSE_DETAILS_BUTTON_TEST_ID}
>
- {COLLAPSE_DETAILS_BUTTON}
+
) : (
{
iconType="arrowStart"
data-test-subj={EXPAND_DETAILS_BUTTON_TEST_ID}
>
- {EXPAND_DETAILS_BUTTON}
+
);
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.stories.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.stories.tsx
index 64411fbe69513..bb315fe04ac2e 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.stories.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.stories.tsx
@@ -9,7 +9,7 @@ import React from 'react';
import type { Story } from '@storybook/react';
import { ExpandableSection } from './expandable_section';
-const title = 'title';
+const title = {'title'}
;
const children = {'content'}
;
export default {
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.test.tsx
index e0d08e260f944..cad0c5563f629 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.test.tsx
@@ -9,7 +9,7 @@ import React from 'react';
import { render } from '@testing-library/react';
import { CONTENT_TEST_ID, ExpandableSection, HEADER_TEST_ID } from './expandable_section';
-const title = 'title';
+const title = {'title'}
;
const children = {'content'}
;
const testId = 'test';
const headerTestId = testId + HEADER_TEST_ID;
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.tsx
index 0e59643ae3d27..d3c95661f7fe5 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/expandable_section.tsx
@@ -6,6 +6,7 @@
*/
import { EuiAccordion, EuiFlexGroup, EuiSpacer, EuiTitle, useGeneratedHtmlId } from '@elastic/eui';
+import type { ReactElement } from 'react';
import React, { type VFC } from 'react';
import { useAccordionState } from '../hooks/use_accordion_state';
@@ -20,7 +21,7 @@ export interface DescriptionSectionProps {
/**
* Title value to render in the header of the accordion
*/
- title: string;
+ title: ReactElement;
/**
* React component to render in the expandable section of the accordion
*/
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/header_title.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/header_title.test.tsx
index 3256d3c3895cd..0495198cd152d 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/header_title.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/header_title.test.tsx
@@ -17,7 +17,6 @@ import {
FLYOUT_HEADER_TITLE_TEST_ID,
} from './test_ids';
import { HeaderTitle } from './header_title';
-import { EVENT_DETAILS } from './translations';
import moment from 'moment-timezone';
import { useDateFormat, useTimeZone } from '../../../common/lib/kibana';
import { mockDataFormattedForFieldBrowser, mockGetFieldsData } from '../mocks/mock_context';
@@ -118,6 +117,6 @@ describe(' ', () => {
const { getByTestId } = renderHeader(contextValue);
- expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent(EVENT_DETAILS);
+ expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent('Event details');
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/header_title.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/header_title.tsx
index 716db70b60947..d3badd25eaa24 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/header_title.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/header_title.tsx
@@ -11,6 +11,7 @@ import { NewChatById } from '@kbn/elastic-assistant';
import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui';
import { isEmpty } from 'lodash';
import { css } from '@emotion/react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useGetAlertDetailsFlyoutLink } from '../../../timelines/components/side_panel/event_details/use_get_alert_details_flyout_link';
import { DocumentStatus } from './status';
import { useAssistant } from '../hooks/use_assistant';
@@ -20,7 +21,6 @@ import {
} from '../../../common/components/event_details/translations';
import { DocumentSeverity } from './severity';
import { RiskScore } from './risk_score';
-import { EVENT_DETAILS } from './translations';
import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers';
import { useRightPanelContext } from '../context';
import { PreferenceFormattedDate } from '../../../common/components/formatted_date';
@@ -87,7 +87,14 @@ export const HeaderTitle: VFC = memo(({ flyoutIsExpandable })
- {isAlert && !isEmpty(ruleName) ? ruleName : EVENT_DETAILS}
+ {isAlert && !isEmpty(ruleName) ? (
+ ruleName
+ ) : (
+
+ )}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/highlighted_fields.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/highlighted_fields.tsx
index f6944df60396a..d47ab0c4b3c02 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/highlighted_fields.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/highlighted_fields.tsx
@@ -9,6 +9,7 @@ import type { FC } from 'react';
import React, { useMemo } from 'react';
import type { EuiBasicTableColumn } from '@elastic/eui';
import { EuiFlexGroup, EuiFlexItem, EuiInMemoryTable, EuiPanel, EuiTitle } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { getSourcererScopeId } from '../../../helpers';
import { convertHighlightedFieldsToTableRow } from '../../shared/utils/highlighted_fields_helpers';
import { useRuleWithFallback } from '../../../detection_engine/rule_management/logic/use_rule_with_fallback';
@@ -20,11 +21,6 @@ import {
SecurityCellActionsTrigger,
} from '../../../common/components/cell_actions';
import { HIGHLIGHTED_FIELDS_DETAILS_TEST_ID, HIGHLIGHTED_FIELDS_TITLE_TEST_ID } from './test_ids';
-import {
- HIGHLIGHTED_FIELDS_FIELD_COLUMN,
- HIGHLIGHTED_FIELDS_TITLE,
- HIGHLIGHTED_FIELDS_VALUE_COLUMN,
-} from './translations';
import { useRightPanelContext } from '../context';
import { useHighlightedFields } from '../../shared/hooks/use_highlighted_fields';
@@ -52,13 +48,23 @@ export interface HighlightedFieldsTableRow {
const columns: Array> = [
{
field: 'field',
- name: HIGHLIGHTED_FIELDS_FIELD_COLUMN,
+ name: (
+
+ ),
'data-test-subj': 'fieldCell',
width: '50%',
},
{
field: 'description',
- name: HIGHLIGHTED_FIELDS_VALUE_COLUMN,
+ name: (
+
+ ),
'data-test-subj': 'valueCell',
width: '50%',
render: (description: {
@@ -108,7 +114,12 @@ export const HighlightedFields: FC = () => {
- {HIGHLIGHTED_FIELDS_TITLE}
+
+
+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/host_entity_overview.tsx
index 88804ffb97d12..60d045006ac49 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/host_entity_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/host_entity_overview.tsx
@@ -18,6 +18,7 @@ import {
import { css } from '@emotion/css';
import { getOr } from 'lodash/fp';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useRightPanelContext } from '../context';
import type { DescriptionList } from '../../../../common/utility_types';
import {
@@ -44,7 +45,6 @@ import {
ENTITIES_HOST_OVERVIEW_LINK_TEST_ID,
TECHNICAL_PREVIEW_ICON_TEST_ID,
} from './test_ids';
-import { TECHNICAL_PREVIEW_TITLE, TECHNICAL_PREVIEW_MESSAGE } from './translations';
import { LeftPanelInsightsTab, LeftPanelKey } from '../../left';
const HOST_ICON = 'storage';
@@ -150,10 +150,20 @@ export const HostEntityOverview: React.FC = ({ hostName
<>
{i18n.HOST_RISK_CLASSIFICATION}
+ }
size="m"
type="iInCircle"
- content={TECHNICAL_PREVIEW_MESSAGE}
+ content={
+
+ }
position="bottom"
iconProps={{
className: 'eui-alignTop',
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/insights_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/insights_section.tsx
index 86d0447a5a590..a51d5c8fec3fb 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/insights_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/insights_section.tsx
@@ -7,11 +7,11 @@
import React from 'react';
import { EuiSpacer } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { CorrelationsOverview } from './correlations_overview';
import { PrevalenceOverview } from './prevalence_overview';
import { ThreatIntelligenceOverview } from './threat_intelligence_overview';
import { INSIGHTS_TEST_ID } from './test_ids';
-import { INSIGHTS_TITLE } from './translations';
import { EntitiesOverview } from './entities_overview';
import { ExpandableSection } from './expandable_section';
@@ -27,7 +27,16 @@ export interface InsightsSectionProps {
*/
export const InsightsSection: React.FC = ({ expanded = false }) => {
return (
-
+
+ }
+ expanded={expanded}
+ data-test-subj={INSIGHTS_TEST_ID}
+ >
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx
index f3d8e6d25d9d5..8a981d037667f 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx
@@ -5,7 +5,7 @@
* 2.0.
*/
-import type { VFC } from 'react';
+import type { ReactElement, VFC } from 'react';
import React from 'react';
import { css } from '@emotion/react';
import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiHealth, EuiSkeletonText } from '@elastic/eui';
@@ -31,7 +31,7 @@ export interface InsightsSummaryRowProps {
/**
* Text corresponding of the number of results/entries
*/
- text: string;
+ text: string | ReactElement;
/**
* Optional parameter for now, will be used to display a dot on the right side
* (corresponding to some sort of severity?)
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.test.tsx
index a3d6c932b6f14..22f7f4502858a 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { InvestigationGuide } from './investigation_guide';
import { RightPanelContext } from '../context';
@@ -13,20 +14,24 @@ import {
INVESTIGATION_GUIDE_BUTTON_TEST_ID,
INVESTIGATION_GUIDE_LOADING_TEST_ID,
INVESTIGATION_GUIDE_NO_DATA_TEST_ID,
+ INVESTIGATION_GUIDE_TEST_ID,
} from './test_ids';
import { mockContextValue } from '../mocks/mock_right_panel_context';
import { mockFlyoutContextValue } from '../../shared/mocks/mock_flyout_context';
import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context';
import { useInvestigationGuide } from '../../shared/hooks/use_investigation_guide';
+import { LeftPanelInvestigationTab, LeftPanelKey } from '../../left';
jest.mock('../../shared/hooks/use_investigation_guide');
-const renderInvestigationGuide = (context: RightPanelContext = mockContextValue) => (
-
-
-
-
-
+const renderInvestigationGuide = () => (
+
+
+
+
+
+
+
);
describe(' ', () => {
@@ -37,16 +42,26 @@ describe(' ', () => {
basicAlertData: { ruleId: 'ruleId' },
ruleNote: 'test note',
});
- const { getByTestId } = render(renderInvestigationGuide());
+ const { getByTestId, queryByTestId } = render(renderInvestigationGuide());
+ expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toHaveTextContent('Investigation guide');
expect(getByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).toHaveTextContent(
+ 'Show investigation guide'
+ );
+ expect(queryByTestId(INVESTIGATION_GUIDE_LOADING_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render loading', () => {
(useInvestigationGuide as jest.Mock).mockReturnValue({
loading: true,
});
- const { getByTestId } = render(renderInvestigationGuide());
+ const { getByTestId, queryByTestId } = render(renderInvestigationGuide());
expect(getByTestId(INVESTIGATION_GUIDE_LOADING_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(INVESTIGATION_GUIDE_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no data message when there is no ruleId', () => {
@@ -54,8 +69,12 @@ describe(' ', () => {
basicAlertData: {},
ruleNote: 'test note',
});
- const { getByTestId } = render(renderInvestigationGuide());
+ const { getByTestId, queryByTestId } = render(renderInvestigationGuide());
+ expect(queryByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).not.toBeInTheDocument();
expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'There’s no investigation guide for this rule.'
+ );
});
it('should render no data message when there is no rule note', () => {
@@ -63,18 +82,45 @@ describe(' ', () => {
basicAlertData: { ruleId: 'ruleId' },
ruleNote: undefined,
});
- const { getByTestId } = render(renderInvestigationGuide());
+ const { getByTestId, queryByTestId } = render(renderInvestigationGuide());
+ expect(queryByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).not.toBeInTheDocument();
expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'There’s no investigation guide for this rule.'
+ );
});
it('should render no data message when useInvestigationGuide errors out', () => {
(useInvestigationGuide as jest.Mock).mockReturnValue({
loading: false,
error: true,
- show: false,
});
const { getByTestId } = render(renderInvestigationGuide());
expect(getByTestId(INVESTIGATION_GUIDE_NO_DATA_TEST_ID)).toBeInTheDocument();
});
+
+ it('should navigate to investigation guide when clicking on button', () => {
+ (useInvestigationGuide as jest.Mock).mockReturnValue({
+ loading: false,
+ error: false,
+ basicAlertData: { ruleId: 'ruleId' },
+ ruleNote: 'test note',
+ });
+
+ const { getByTestId } = render(renderInvestigationGuide());
+ getByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID).click();
+
+ expect(mockFlyoutContextValue.openLeftPanel).toHaveBeenCalledWith({
+ id: LeftPanelKey,
+ path: {
+ tab: LeftPanelInvestigationTab,
+ },
+ params: {
+ id: mockContextValue.eventId,
+ indexName: mockContextValue.indexName,
+ scopeId: mockContextValue.scopeId,
+ },
+ });
+ });
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.tsx
index 2175e67bbef53..a033ee74ddabf 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_guide.tsx
@@ -7,6 +7,7 @@
import React, { useCallback } from 'react';
import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiTitle } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useInvestigationGuide } from '../../shared/hooks/use_investigation_guide';
import { useRightPanelContext } from '../context';
import { LeftPanelKey, LeftPanelInvestigationTab } from '../../left';
@@ -16,11 +17,6 @@ import {
INVESTIGATION_GUIDE_NO_DATA_TEST_ID,
INVESTIGATION_GUIDE_TEST_ID,
} from './test_ids';
-import {
- INVESTIGATION_GUIDE_BUTTON,
- INVESTIGATION_GUIDE_NO_DATA,
- INVESTIGATION_GUIDE_TITLE,
-} from './translations';
/**
* Render either the investigation guide button that opens Investigation section in the left panel,
@@ -65,7 +61,12 @@ export const InvestigationGuide: React.FC = () => {
- {INVESTIGATION_GUIDE_TITLE}
+
+
+
@@ -75,12 +76,18 @@ export const InvestigationGuide: React.FC = () => {
iconType="documentation"
data-test-subj={INVESTIGATION_GUIDE_BUTTON_TEST_ID}
>
- {INVESTIGATION_GUIDE_BUTTON}
+
) : (
-
- {INVESTIGATION_GUIDE_NO_DATA}
-
+
+
+
)}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.test.tsx
index 2d4141c4207a8..d7dea0bf1c92d 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import {
INVESTIGATION_SECTION_CONTENT_TEST_ID,
@@ -25,44 +26,37 @@ const panelContextValue = {
dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser,
} as unknown as RightPanelContext;
+const renderInvestigationSection = (expanded: boolean = false) =>
+ render(
+
+
+
+
+
+
+
+ );
+
describe(' ', () => {
beforeEach(() => {
jest.clearAllMocks();
mockUseRuleWithFallback.mockReturnValue({ rule: { note: 'test note' } });
});
it('should render the component collapsed', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId } = renderInvestigationSection();
expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toBeInTheDocument();
});
it('should render the component expanded', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId } = renderInvestigationSection(true);
expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toBeInTheDocument();
expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeInTheDocument();
});
it('should expand the component when clicking on the arrow on header', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId } = renderInvestigationSection();
getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID).click();
expect(getByTestId(INVESTIGATION_SECTION_CONTENT_TEST_ID)).toBeInTheDocument();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.tsx
index 655aa13ea177b..2cf91392ff154 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/investigation_section.tsx
@@ -8,10 +8,10 @@
import type { VFC } from 'react';
import React from 'react';
import { EuiSpacer } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandableSection } from './expandable_section';
import { HighlightedFields } from './highlighted_fields';
import { INVESTIGATION_SECTION_TEST_ID } from './test_ids';
-import { INVESTIGATION_TITLE } from './translations';
import { InvestigationGuide } from './investigation_guide';
export interface DescriptionSectionProps {
/**
@@ -27,7 +27,12 @@ export const InvestigationSection: VFC = ({ expanded =
return (
+ }
data-test-subj={INVESTIGATION_SECTION_TEST_ID}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.test.tsx
index affaaca1e27bf..1c348f90b8627 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.test.tsx
@@ -9,7 +9,7 @@ import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context';
import { render } from '@testing-library/react';
import { TestProviders } from '../../../common/mock';
import { RightPanelContext } from '../context';
-import { INSIGHTS_PREVALENCE_TEST_ID } from './test_ids';
+import { INSIGHTS_PREVALENCE_NO_DATA_TEST_ID, INSIGHTS_PREVALENCE_TEST_ID } from './test_ids';
import { LeftPanelInsightsTab, LeftPanelKey } from '../../left';
import React from 'react';
import { PrevalenceOverview } from './prevalence_overview';
@@ -68,11 +68,12 @@ describe(' ', () => {
data: [],
});
- const { getByTestId } = render(renderPrevalenceOverview());
+ const { getByTestId, queryByTestId } = render(renderPrevalenceOverview());
expect(
getByTestId(EXPANDABLE_PANEL_LOADING_TEST_ID(INSIGHTS_PREVALENCE_TEST_ID))
).toBeInTheDocument();
+ expect(queryByTestId(INSIGHTS_PREVALENCE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should render no-data message', () => {
@@ -84,7 +85,10 @@ describe(' ', () => {
const { getByTestId } = render(renderPrevalenceOverview());
- expect(getByTestId(`${INSIGHTS_PREVALENCE_TEST_ID}Error`)).toBeInTheDocument();
+ expect(getByTestId(INSIGHTS_PREVALENCE_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(INSIGHTS_PREVALENCE_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'No prevalence data available.'
+ );
});
it('should render only data with prevalence less than 10%', () => {
@@ -127,6 +131,8 @@ describe(' ', () => {
const valueDataTestSubj2 = `${INSIGHTS_PREVALENCE_TEST_ID}${field2}Value`;
expect(queryByTestId(iconDataTestSubj2)).not.toBeInTheDocument();
expect(queryByTestId(valueDataTestSubj2)).not.toBeInTheDocument();
+
+ expect(queryByTestId(INSIGHTS_PREVALENCE_NO_DATA_TEST_ID)).not.toBeInTheDocument();
});
it('should navigate to left section Insights tab when clicking on button', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.tsx
index 53e2d636d4bb6..e82219504dba1 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/prevalence_overview.tsx
@@ -9,11 +9,11 @@ import type { FC } from 'react';
import React, { useCallback, useMemo } from 'react';
import { EuiFlexGroup } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import { usePrevalence } from '../../shared/hooks/use_prevalence';
-import { INSIGHTS_PREVALENCE_TEST_ID } from './test_ids';
+import { INSIGHTS_PREVALENCE_NO_DATA_TEST_ID, INSIGHTS_PREVALENCE_TEST_ID } from './test_ids';
import { useRightPanelContext } from '../context';
-import { PREVALENCE_NO_DATA, PREVALENCE_ROW_UNCOMMON, PREVALENCE_TITLE } from './translations';
import { LeftPanelKey, LeftPanelInsightsTab } from '../../left';
import { PREVALENCE_TAB_ID } from '../../left/components/prevalence_details';
import { InsightsSummaryRow } from './insights_summary_row';
@@ -70,7 +70,12 @@ export const PrevalenceOverview: FC = () => {
return (
+ ),
callback: goToCorrelationsTab,
iconType: 'arrowStart',
}}
@@ -82,12 +87,23 @@ export const PrevalenceOverview: FC = () => {
uncommonData.map((d) => (
+ }
data-test-subj={`${INSIGHTS_PREVALENCE_TEST_ID}${d.field}`}
/>
))
) : (
- {PREVALENCE_NO_DATA}
+
+
+
)}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/reason.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/reason.test.tsx
index 069dd973718a1..2edba002600e9 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/reason.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/reason.test.tsx
@@ -7,6 +7,7 @@
import React from 'react';
import { render } from '@testing-library/react';
+import { FormattedMessage, __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import {
REASON_DETAILS_PREVIEW_BUTTON_TEST_ID,
REASON_DETAILS_TEST_ID,
@@ -17,7 +18,6 @@ import { RightPanelContext } from '../context';
import { mockDataFormattedForFieldBrowser, mockGetFieldsData } from '../mocks/mock_context';
import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context';
import { PreviewPanelKey } from '../../preview';
-import { PREVIEW_ALERT_REASON_DETAILS } from './translations';
const flyoutContextValue = {
openPreviewPanel: jest.fn(),
@@ -33,17 +33,36 @@ const panelContextValue = {
const renderReason = (panelContext: RightPanelContext = panelContextValue) =>
render(
-
-
-
-
-
+
+
+
+
+
+
+
);
describe(' ', () => {
- it('should render the component', () => {
+ it('should render the component for alert', () => {
const { getByTestId } = renderReason();
expect(getByTestId(REASON_TITLE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(REASON_TITLE_TEST_ID)).toHaveTextContent('Alert reason');
+ expect(getByTestId(REASON_DETAILS_PREVIEW_BUTTON_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(REASON_DETAILS_PREVIEW_BUTTON_TEST_ID)).toHaveTextContent(
+ 'Show full reason'
+ );
+ });
+
+ it('should render the component for document', () => {
+ const dataFormattedForFieldBrowser = [...mockDataFormattedForFieldBrowser];
+ dataFormattedForFieldBrowser.shift();
+ const panelContext = {
+ ...panelContextValue,
+ dataFormattedForFieldBrowser,
+ };
+ const { getByTestId } = renderReason(panelContext);
+ expect(getByTestId(REASON_TITLE_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(REASON_TITLE_TEST_ID)).toHaveTextContent('Document reason');
});
it('should render no reason if the field is null', () => {
@@ -70,7 +89,12 @@ describe(' ', () => {
indexName: panelContextValue.indexName,
scopeId: panelContextValue.scopeId,
banner: {
- title: PREVIEW_ALERT_REASON_DETAILS,
+ title: (
+
+ ),
backgroundColor: 'warning',
textColor: 'warning',
},
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/reason.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/reason.tsx
index e7cd3c7fddf11..a245b0dbfa6e2 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/reason.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/reason.tsx
@@ -10,6 +10,7 @@ import React, { useCallback, useMemo } from 'react';
import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
import { ALERT_REASON } from '@kbn/rule-data-utils';
+import { FormattedMessage } from '@kbn/i18n-react';
import { getField } from '../../shared/utils';
import { AlertReasonPreviewPanel, PreviewPanelKey } from '../../preview';
import {
@@ -17,12 +18,6 @@ import {
REASON_DETAILS_TEST_ID,
REASON_TITLE_TEST_ID,
} from './test_ids';
-import {
- ALERT_REASON_DETAILS_TEXT,
- ALERT_REASON_TITLE,
- DOCUMENT_REASON_TITLE,
- PREVIEW_ALERT_REASON_DETAILS,
-} from './translations';
import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers';
import { useRightPanelContext } from '../context';
@@ -45,7 +40,12 @@ export const Reason: FC = () => {
indexName,
scopeId,
banner: {
- title: PREVIEW_ALERT_REASON_DETAILS,
+ title: (
+
+ ),
backgroundColor: 'warning',
textColor: 'warning',
},
@@ -63,7 +63,10 @@ export const Reason: FC = () => {
iconSide="right"
data-test-subj={REASON_DETAILS_PREVIEW_BUTTON_TEST_ID}
>
- {ALERT_REASON_DETAILS_TEXT}
+
),
@@ -78,12 +81,22 @@ export const Reason: FC = () => {
{isAlert ? (
- {ALERT_REASON_TITLE}
+
+
+
{viewPreview}
) : (
- DOCUMENT_REASON_TITLE
+
+
+
)}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.test.tsx
index 9f6a4ec83a2c2..b27f108d8723f 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import {
SUMMARY_ROW_ICON_TEST_ID,
@@ -32,6 +33,13 @@ const LOADING_TEST_ID = SUMMARY_ROW_LOADING_TEST_ID(
INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID
);
+const renderRelatedAlertsByAncestry = () =>
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render many related alerts correctly', () => {
(useFetchRelatedAlertsByAncestry as jest.Mock).mockReturnValue({
@@ -40,9 +48,7 @@ describe(' ', () => {
dataCount: 2,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsByAncestry();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -57,9 +63,7 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsByAncestry();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -72,9 +76,7 @@ describe(' ', () => {
loading: true,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsByAncestry();
expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument();
});
@@ -84,9 +86,7 @@ describe(' ', () => {
error: true,
});
- const { container } = render(
-
- );
+ const { container } = renderRelatedAlertsByAncestry();
expect(container).toBeEmptyDOMElement();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.tsx
index 0a48443de7320..db1bc2e42bb2b 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_ancestry.tsx
@@ -6,8 +6,8 @@
*/
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useFetchRelatedAlertsByAncestry } from '../../shared/hooks/use_fetch_related_alerts_by_ancestry';
-import { CORRELATIONS_ANCESTRY_ALERTS } from '../../shared/translations';
import { InsightsSummaryRow } from './insights_summary_row';
import { INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID } from './test_ids';
@@ -41,7 +41,13 @@ export const RelatedAlertsByAncestry: React.VFC =
indices,
scopeId,
});
- const text = CORRELATIONS_ANCESTRY_ALERTS(dataCount);
+ const text = (
+
+ );
return (
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render many related alerts correctly', () => {
(useFetchRelatedAlertsBySameSourceEvent as jest.Mock).mockReturnValue({
@@ -39,9 +47,7 @@ describe(' ', () => {
dataCount: 2,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySameSourceEvent();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -56,9 +62,7 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySameSourceEvent();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -71,9 +75,7 @@ describe(' ', () => {
loading: true,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySameSourceEvent();
expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument();
});
@@ -83,9 +85,7 @@ describe(' ', () => {
error: true,
});
- const { container } = render(
-
- );
+ const { container } = renderRelatedAlertsBySameSourceEvent();
expect(container).toBeEmptyDOMElement();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.tsx
index 1d5df7a326c44..17743ed068a5e 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.tsx
@@ -6,8 +6,8 @@
*/
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useFetchRelatedAlertsBySameSourceEvent } from '../../shared/hooks/use_fetch_related_alerts_by_same_source_event';
-import { CORRELATIONS_SAME_SOURCE_ALERTS } from '../../shared/translations';
import { InsightsSummaryRow } from './insights_summary_row';
import { INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID } from './test_ids';
@@ -35,7 +35,13 @@ export const RelatedAlertsBySameSourceEvent: React.VFC
+ );
return (
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render many related alerts correctly', () => {
(useFetchRelatedAlertsBySession as jest.Mock).mockReturnValue({
@@ -39,9 +47,7 @@ describe(' ', () => {
dataCount: 2,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySession();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -56,9 +62,7 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySession();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -71,9 +75,7 @@ describe(' ', () => {
loading: true,
});
- const { getByTestId } = render(
-
- );
+ const { getByTestId } = renderRelatedAlertsBySession();
expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument();
});
@@ -83,7 +85,7 @@ describe(' ', () => {
error: true,
});
- const { container } = render( );
+ const { container } = renderRelatedAlertsBySession();
expect(container).toBeEmptyDOMElement();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.tsx
index 2a015c0c880d9..982f34ec1720a 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.tsx
@@ -6,8 +6,8 @@
*/
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useFetchRelatedAlertsBySession } from '../../shared/hooks/use_fetch_related_alerts_by_session';
-import { CORRELATIONS_SESSION_ALERTS } from '../../shared/translations';
import { InsightsSummaryRow } from './insights_summary_row';
import { INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID } from './test_ids';
@@ -35,7 +35,13 @@ export const RelatedAlertsBySession: React.VFC = ({
entityId,
scopeId,
});
- const text = CORRELATIONS_SESSION_ALERTS(dataCount);
+ const text = (
+
+ );
return (
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render many related cases correctly', () => {
(useFetchRelatedCases as jest.Mock).mockReturnValue({
@@ -32,7 +40,7 @@ describe(' ', () => {
dataCount: 2,
});
- const { getByTestId } = render( );
+ const { getByTestId } = renderRelatedCases();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -47,7 +55,7 @@ describe(' ', () => {
dataCount: 1,
});
- const { getByTestId } = render( );
+ const { getByTestId } = renderRelatedCases();
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
@@ -60,7 +68,7 @@ describe(' ', () => {
loading: true,
});
- const { getByTestId } = render( );
+ const { getByTestId } = renderRelatedCases();
expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument();
});
@@ -70,7 +78,7 @@ describe(' ', () => {
error: true,
});
- const { container } = render( );
+ const { container } = renderRelatedCases();
expect(container).toBeEmptyDOMElement();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.tsx
index d20e4fc09d56b..e56e35d7acd2a 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.tsx
@@ -6,7 +6,7 @@
*/
import React from 'react';
-import { CORRELATIONS_RELATED_CASES } from '../../shared/translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { useFetchRelatedCases } from '../../shared/hooks/use_fetch_related_cases';
import { InsightsSummaryRow } from './insights_summary_row';
import { INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID } from './test_ids';
@@ -25,7 +25,13 @@ export interface RelatedCasesProps {
*/
export const RelatedCases: React.VFC = ({ eventId }) => {
const { loading, error, dataCount } = useFetchRelatedCases({ eventId });
- const text = CORRELATIONS_RELATED_CASES(dataCount);
+ const text = (
+
+ );
return (
', () => {
- it('should render response button correctly', () => {
- const { getByTestId } = render(
+const renderResponseButton = (panelContextValue: RightPanelContext = mockContextValue) =>
+ render(
+
-
+
- );
+
+ );
+describe(' ', () => {
+ it('should render response button correctly', () => {
+ const panelContextValue = { ...mockContextValue, searchHit: mockValidSearchHit };
+ const { getByTestId, queryByTestId } = renderResponseButton(panelContextValue);
expect(getByTestId(RESPONSE_BUTTON_TEST_ID)).toBeInTheDocument();
- });
-
- it('should not render response button when searchHit is undefined', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
-
- expect(getByTestId(RESPONSE_EMPTY_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RESPONSE_BUTTON_TEST_ID)).toHaveTextContent('Response');
+ expect(queryByTestId(RESPONSE_EMPTY_TEST_ID)).not.toBeInTheDocument();
});
it(`should not render investigation guide button when searchHit doesn't have correct data`, () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const panelContextValue = { ...mockContextValue, searchHit: mockInvalidSearchHit };
+ const { getByTestId, queryByTestId } = renderResponseButton(panelContextValue);
expect(getByTestId(RESPONSE_EMPTY_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(RESPONSE_EMPTY_TEST_ID)).toHaveTextContent(
+ 'There are no response actions defined for this event.'
+ );
+ expect(queryByTestId(RESPONSE_BUTTON_TEST_ID)).not.toBeInTheDocument();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/response_button.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/response_button.tsx
index b1e4e94296a46..fe6a9dd20d59a 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/response_button.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/response_button.tsx
@@ -7,6 +7,7 @@
import React, { useCallback } from 'react';
import { EuiButton } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { expandDottedObject } from '../../../../common/utils/expand_dotted';
import type {
ExpandedEventFieldsObject,
@@ -15,7 +16,6 @@ import type {
import { useRightPanelContext } from '../context';
import { LeftPanelKey, LeftPanelResponseTab } from '../../left';
import { RESPONSE_BUTTON_TEST_ID, RESPONSE_EMPTY_TEST_ID } from './test_ids';
-import { RESPONSE_EMPTY, RESPONSE_TITLE } from './translations';
/**
* Response button that opens Response section in the left panel
@@ -45,14 +45,22 @@ export const ResponseButton: React.FC = () => {
return (
<>
{!responseActions ? (
- {RESPONSE_EMPTY}
+
+
+
) : (
- {RESPONSE_TITLE}
+
)}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/response_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/response_section.test.tsx
index d15ad34790ea6..ebff6c0e704fe 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/response_section.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/response_section.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { RESPONSE_SECTION_CONTENT_TEST_ID, RESPONSE_SECTION_HEADER_TEST_ID } from './test_ids';
import { RightPanelContext } from '../context';
@@ -15,40 +16,33 @@ import { ResponseSection } from './response_section';
const flyoutContextValue = {} as unknown as ExpandableFlyoutContext;
const panelContextValue = {} as unknown as RightPanelContext;
-describe(' ', () => {
- it('should render the component collapsed', () => {
- const { getByTestId } = render(
+const renderResponseSection = () =>
+ render(
+
- );
+
+ );
+
+describe(' ', () => {
+ it('should render the component collapsed', () => {
+ const { getByTestId } = renderResponseSection();
expect(getByTestId(RESPONSE_SECTION_HEADER_TEST_ID)).toBeInTheDocument();
});
it('should render the component expanded', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId } = renderResponseSection();
expect(getByTestId(RESPONSE_SECTION_HEADER_TEST_ID)).toBeInTheDocument();
expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument();
});
it('should expand the component when clicking on the arrow on header', () => {
- const { getByTestId } = render(
-
-
-
-
-
- );
+ const { getByTestId } = renderResponseSection();
getByTestId(RESPONSE_SECTION_HEADER_TEST_ID).click();
expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/response_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/response_section.tsx
index 18480dde09dde..96a0b070020e2 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/response_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/response_section.tsx
@@ -7,10 +7,10 @@
import type { VFC } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ResponseButton } from './response_button';
import { ExpandableSection } from './expandable_section';
import { RESPONSE_SECTION_TEST_ID } from './test_ids';
-import { RESPONSE_TITLE } from './translations';
export interface ResponseSectionProps {
/**
* Boolean to allow the component to be expanded or collapsed on first render
@@ -25,7 +25,12 @@ export const ResponseSection: VFC = ({ expanded = false })
return (
+ }
data-test-subj={RESPONSE_SECTION_TEST_ID}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.test.tsx
index 554b6c90db32a..04e399fc55281 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { RightPanelContext } from '../context';
import {
@@ -15,17 +16,22 @@ import {
import { RiskScore } from './risk_score';
import { mockGetFieldsData } from '../mocks/mock_context';
+const renderRiskScore = (contextValue: RightPanelContext) =>
+ render(
+
+
+
+
+
+ );
+
describe(' ', () => {
it('should render risk score information', () => {
const contextValue = {
getFieldsData: jest.fn().mockImplementation(mockGetFieldsData),
} as unknown as RightPanelContext;
- const { getByTestId } = render(
-
-
-
- );
+ const { getByTestId } = renderRiskScore(contextValue);
expect(getByTestId(FLYOUT_HEADER_RISK_SCORE_TITLE_TEST_ID)).toBeInTheDocument();
const riskScore = getByTestId(FLYOUT_HEADER_RISK_SCORE_VALUE_TEST_ID);
@@ -38,11 +44,7 @@ describe(' ', () => {
getFieldsData: jest.fn(),
} as unknown as RightPanelContext;
- const { container } = render(
-
-
-
- );
+ const { container } = renderRiskScore(contextValue);
expect(container).toBeEmptyDOMElement();
});
@@ -52,11 +54,7 @@ describe(' ', () => {
getFieldsData: jest.fn().mockImplementation(() => 123),
} as unknown as RightPanelContext;
- const { container } = render(
-
-
-
- );
+ const { container } = renderRiskScore(contextValue);
expect(container).toBeEmptyDOMElement();
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.tsx
index b14aa88f91d0e..fe15151e467cf 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/risk_score.tsx
@@ -9,11 +9,11 @@ import type { FC } from 'react';
import React, { memo } from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui';
import { ALERT_RISK_SCORE } from '@kbn/rule-data-utils';
+import { FormattedMessage } from '@kbn/i18n-react';
import {
FLYOUT_HEADER_RISK_SCORE_TITLE_TEST_ID,
FLYOUT_HEADER_RISK_SCORE_VALUE_TEST_ID,
} from './test_ids';
-import { RISK_SCORE_TITLE } from './translations';
import { useRightPanelContext } from '../context';
/**
@@ -40,7 +40,12 @@ export const RiskScore: FC = memo(() => {
- {`${RISK_SCORE_TITLE}:`}
+
+
+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview.tsx
index 9ad7e2bd05d75..1bfca23f84ffa 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview.tsx
@@ -6,24 +6,20 @@
*/
import { EuiCode, EuiIcon, useEuiTheme } from '@elastic/eui';
+import type { ReactElement } from 'react';
import React, { useMemo, type FC } from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { SESSION_PREVIEW_TEST_ID } from './test_ids';
import { useRightPanelContext } from '../context';
import { SIGNAL_RULE_NAME_FIELD_NAME } from '../../../timelines/components/timeline/body/renderers/constants';
import { PreferenceFormattedDate } from '../../../common/components/formatted_date';
import { useProcessData } from '../hooks/use_process_data';
-import {
- SESSION_PREVIEW_COMMAND_TEXT,
- SESSION_PREVIEW_PROCESS_TEXT,
- SESSION_PREVIEW_RULE_TEXT,
- SESSION_PREVIEW_TIME_TEXT,
-} from './translations';
import { RenderRuleName } from '../../../timelines/components/timeline/body/renderers/formatted_field_helpers';
/**
* One-off helper to make sure that inline values are rendered consistently
*/
-const ValueContainer: FC<{ text?: string }> = ({ text, children }) => (
+const ValueContainer: FC<{ text?: ReactElement }> = ({ text, children }) => (
<>
{text && (
<>
@@ -53,7 +49,14 @@ export const SessionPreview: FC = () => {
const processNameFragment = useMemo(() => {
return (
processName && (
-
+
+ }
+ >
{processName}
)
@@ -63,7 +66,14 @@ export const SessionPreview: FC = () => {
const timeFragment = useMemo(() => {
return (
startAt && (
-
+
+ }
+ >
)
@@ -74,7 +84,14 @@ export const SessionPreview: FC = () => {
return (
ruleName &&
ruleId && (
-
+
+ }
+ >
{
const commandFragment = useMemo(() => {
return (
command && (
-
+
+ }
+ >
{workdir} {command}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.test.tsx
index 0568c740f1de4..c7057827fa101 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.test.tsx
@@ -12,7 +12,11 @@ import { RightPanelContext } from '../context';
import { SessionPreviewContainer } from './session_preview_container';
import { useSessionPreview } from '../hooks/use_session_preview';
import { useLicense } from '../../../common/hooks/use_license';
-import { SESSION_PREVIEW_TEST_ID } from './test_ids';
+import {
+ SESSION_PREVIEW_NO_DATA_TEST_ID,
+ SESSION_PREVIEW_TEST_ID,
+ SESSION_PREVIEW_UPSELL_TEST_ID,
+} from './test_ids';
import {
EXPANDABLE_PANEL_CONTENT_TEST_ID,
EXPANDABLE_PANEL_HEADER_TITLE_ICON_TEST_ID,
@@ -35,10 +39,6 @@ const sessionViewConfig = {
sessionStartTime: 'sessionStartTime',
};
-const TEST_ID = SESSION_PREVIEW_TEST_ID;
-const ERROR_TEST_ID = `${SESSION_PREVIEW_TEST_ID}Error`;
-const UPSELL_TEST_ID = `${SESSION_PREVIEW_TEST_ID}UpSell`;
-
const renderSessionPreview = () =>
render(
@@ -59,9 +59,9 @@ describe('SessionPreviewContainer', () => {
const { getByTestId, queryByTestId } = renderSessionPreview();
- expect(getByTestId(TEST_ID)).toBeInTheDocument();
- expect(queryByTestId(ERROR_TEST_ID)).not.toBeInTheDocument();
- expect(queryByTestId(UPSELL_TEST_ID)).not.toBeInTheDocument();
+ expect(getByTestId(SESSION_PREVIEW_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(SESSION_PREVIEW_NO_DATA_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(SESSION_PREVIEW_UPSELL_TEST_ID)).not.toBeInTheDocument();
expect(
getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID))
).toBeInTheDocument();
@@ -85,9 +85,12 @@ describe('SessionPreviewContainer', () => {
const { getByTestId, queryByTestId } = renderSessionPreview();
- expect(queryByTestId(TEST_ID)).not.toBeInTheDocument();
- expect(getByTestId(ERROR_TEST_ID)).toBeInTheDocument();
- expect(queryByTestId(UPSELL_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(SESSION_PREVIEW_TEST_ID)).not.toBeInTheDocument();
+ expect(getByTestId(SESSION_PREVIEW_NO_DATA_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(SESSION_PREVIEW_NO_DATA_TEST_ID)).toHaveTextContent(
+ 'You can only view Linux session details if you’ve enabled the Include session data setting in your Elastic Defend integration policy. Refer to Enable Session View dataExternal link(opens in a new tab or window) for more information.'
+ );
+ expect(queryByTestId(SESSION_PREVIEW_UPSELL_TEST_ID)).not.toBeInTheDocument();
expect(
getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID))
).toBeInTheDocument();
@@ -99,9 +102,12 @@ describe('SessionPreviewContainer', () => {
const { getByTestId, queryByTestId } = renderSessionPreview();
- expect(queryByTestId(TEST_ID)).not.toBeInTheDocument();
- expect(queryByTestId(ERROR_TEST_ID)).not.toBeInTheDocument();
- expect(getByTestId(UPSELL_TEST_ID)).toBeInTheDocument();
+ expect(queryByTestId(SESSION_PREVIEW_TEST_ID)).not.toBeInTheDocument();
+ expect(queryByTestId(SESSION_PREVIEW_NO_DATA_TEST_ID)).not.toBeInTheDocument();
+ expect(getByTestId(SESSION_PREVIEW_UPSELL_TEST_ID)).toBeInTheDocument();
+ expect(getByTestId(SESSION_PREVIEW_UPSELL_TEST_ID)).toHaveTextContent(
+ 'This feature requires an Enterprise subscription'
+ );
expect(
getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID))
).toBeInTheDocument();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.tsx
index 49a90921e2998..e3fe9a191ebcb 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/session_preview_container.tsx
@@ -18,8 +18,11 @@ import { useInvestigateInTimeline } from '../../../detections/components/alerts_
import { useRightPanelContext } from '../context';
import { ALERTS_ACTIONS } from '../../../common/lib/apm/user_actions';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
-import { SESSION_PREVIEW_TEST_ID } from './test_ids';
-import { SESSION_PREVIEW_TITLE } from './translations';
+import {
+ SESSION_PREVIEW_NO_DATA_TEST_ID,
+ SESSION_PREVIEW_TEST_ID,
+ SESSION_PREVIEW_UPSELL_TEST_ID,
+} from './test_ids';
import { useStartTransaction } from '../../../common/lib/apm/use_start_transaction';
import { setActiveTabTimeline } from '../../../timelines/store/timeline/actions';
import { getScopedActions } from '../../../helpers';
@@ -67,15 +70,15 @@ export const SessionPreviewContainer: FC = () => {
const { euiTheme } = useEuiTheme();
const noSessionMessage = !isEnterprisePlus ? (
-
+
@@ -84,9 +87,9 @@ export const SessionPreviewContainer: FC = () => {
/>
) : !sessionViewConfig ? (
-
+
{
`}
>
@@ -107,7 +110,7 @@ export const SessionPreviewContainer: FC = () => {
target="_blank"
>
@@ -120,7 +123,12 @@ export const SessionPreviewContainer: FC = () => {
return (
+ ),
iconType: 'timeline',
...(isEnabled && { callback: goToSessionViewTab }),
}}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx
index c5f49400f088c..390f9997e0892 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx
@@ -11,10 +11,10 @@ import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui';
import { ALERT_SEVERITY } from '@kbn/rule-data-utils';
import type { Severity } from '@kbn/securitysolution-io-ts-alerting-types';
import { CellActionsMode } from '@kbn/cell-actions';
+import { FormattedMessage } from '@kbn/i18n-react';
import { getSourcererScopeId } from '../../../helpers';
import { SecurityCellActions } from '../../../common/components/cell_actions';
import { SecurityCellActionsTrigger } from '../../../actions/constants';
-import { SEVERITY_TITLE } from './translations';
import { useRightPanelContext } from '../context';
import { SeverityBadge } from '../../../detections/components/rules/severity_badge';
import { FLYOUT_HEADER_SEVERITY_TITLE_TEST_ID } from './test_ids';
@@ -46,7 +46,12 @@ export const DocumentSeverity: FC = memo(() => {
- {`${SEVERITY_TITLE}:`}
+
+
+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.test.tsx
index 00b757541d587..718fd635b4bc4 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.test.tsx
@@ -5,6 +5,7 @@
* 2.0.
*/
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render, screen, fireEvent } from '@testing-library/react';
import { copyToClipboard } from '@elastic/eui';
import { ShareButton } from './share_button';
@@ -18,15 +19,22 @@ jest.mock('@elastic/eui', () => ({
EuiCopy: jest.fn(({ children: functionAsChild }) => functionAsChild(jest.fn())),
}));
-describe('ShareButton', () => {
- const alertUrl = 'https://example.com/alert';
+const alertUrl = 'https://example.com/alert';
+
+const renderShareButton = () =>
+ render(
+
+
+
+ );
+describe('ShareButton', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('renders the share button', () => {
- render( );
+ renderShareButton();
expect(screen.getByTestId(FLYOUT_HEADER_SHARE_BUTTON_TEST_ID)).toBeInTheDocument();
});
@@ -41,7 +49,7 @@ describe('ShareButton', () => {
},
});
- render( );
+ renderShareButton();
fireEvent.click(screen.getByTestId(FLYOUT_HEADER_SHARE_BUTTON_TEST_ID));
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx
index 04405e9b7a31a..034ebd0aa102a 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx
@@ -8,9 +8,9 @@
import { copyToClipboard, EuiButtonEmpty, EuiCopy } from '@elastic/eui';
import type { FC } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { FLYOUT_URL_PARAM } from '../../shared/hooks/url/use_sync_flyout_state_with_url';
import { FLYOUT_HEADER_SHARE_BUTTON_TEST_ID } from './test_ids';
-import { SHARE } from './translations';
interface ShareButtonProps {
/**
@@ -41,7 +41,10 @@ export const ShareButton: FC = ({ alertUrl }) => {
iconType="share"
data-test-subj={FLYOUT_HEADER_SHARE_BUTTON_TEST_ID}
>
- {SHARE}
+
)}
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.test.tsx
index 585e8f02ace03..54ae69fba7c40 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.test.tsx
@@ -6,49 +6,63 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import {
SUMMARY_ROW_ICON_TEST_ID,
SUMMARY_ROW_VALUE_TEST_ID,
INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID,
- SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID,
+ INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID,
} from './test_ids';
import { SuppressedAlerts } from './suppressed_alerts';
const ICON_TEST_ID = SUMMARY_ROW_ICON_TEST_ID(INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID);
const VALUE_TEST_ID = SUMMARY_ROW_VALUE_TEST_ID(INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID);
+const renderSuppressedAlerts = (alertSuppressionCount: number) =>
+ render(
+
+
+
+ );
+
describe(' ', () => {
it('should render zero suppressed alert correctly', () => {
- const { getByTestId } = render( );
+ const { getByTestId } = renderSuppressedAlerts(0);
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
expect(value).toHaveTextContent('0 suppressed alert');
expect(getByTestId(VALUE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)).toBeInTheDocument();
+ expect(
+ getByTestId(INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)
+ ).toBeInTheDocument();
});
it('should render single suppressed alert correctly', () => {
- const { getByTestId } = render( );
+ const { getByTestId } = renderSuppressedAlerts(1);
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
expect(value).toHaveTextContent('1 suppressed alert');
expect(getByTestId(VALUE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)).toBeInTheDocument();
+ expect(
+ getByTestId(INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)
+ ).toBeInTheDocument();
});
it('should render multiple suppressed alerts row correctly', () => {
- const { getByTestId } = render( );
+ const { getByTestId } = renderSuppressedAlerts(2);
expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument();
const value = getByTestId(VALUE_TEST_ID);
expect(value).toBeInTheDocument();
expect(value).toHaveTextContent('2 suppressed alerts');
expect(getByTestId(VALUE_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)).toBeInTheDocument();
+ expect(
+ getByTestId(INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID)
+ ).toBeInTheDocument();
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.tsx
index 4732d43cadff9..9d02fdf859805 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/suppressed_alerts.tsx
@@ -7,14 +7,13 @@
import React from 'react';
import { EuiFlexGroup, EuiFlexItem, EuiBetaBadge } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import {
INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID,
- SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID,
+ INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID,
} from './test_ids';
-import { CORRELATIONS_SUPPRESSED_ALERTS } from '../../shared/translations';
import { InsightsSummaryRow } from './insights_summary_row';
import { SUPPRESSED_ALERTS_COUNT_TECHNICAL_PREVIEW } from '../../../common/components/event_details/insights/translations';
-import { TECHNICAL_PREVIEW_MESSAGE } from './translations';
export interface SuppressedAlertsProps {
/**
@@ -35,7 +34,13 @@ export const SuppressedAlerts: React.VFC = ({ alertSuppre
error={false}
icon={'layers'}
value={alertSuppressionCount}
- text={CORRELATIONS_SUPPRESSED_ALERTS(alertSuppressionCount)}
+ text={
+
+ }
data-test-subj={INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID}
key={`correlation-row-suppressed-alerts`}
/>
@@ -45,9 +50,14 @@ export const SuppressedAlerts: React.VFC = ({ alertSuppre
label={SUPPRESSED_ALERTS_COUNT_TECHNICAL_PREVIEW}
size="s"
iconType="beaker"
- tooltipContent={TECHNICAL_PREVIEW_MESSAGE}
+ tooltipContent={
+
+ }
tooltipPosition="bottom"
- data-test-subj={SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID}
+ data-test-subj={INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts
index 6f0ee15d7db01..8145b8e5fb258 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/test_ids.ts
@@ -109,23 +109,19 @@ export const INSIGHTS_THREAT_INTELLIGENCE_CONTAINER_TEST_ID = `${INSIGHTS_THREAT
export const INSIGHTS_CORRELATIONS_TEST_ID =
'securitySolutionDocumentDetailsFlyoutInsightsCorrelations';
-export const INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutInsightsCorrelationsSupressedAlerts';
-export const SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutSupressedAlertsTechnicalPreview';
-export const INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutInsightsCorrelationsRelatedCases';
-export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutInsightsCorrelationsRelatedAlertsBySession';
-export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutInsightsCorrelationsRelatedAlertsBySameSourceEvent';
-export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID =
- 'securitySolutionDocumentDetailsFlyoutInsightsCorrelationsRelatedAlertsByAncestry';
+export const INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}NoData`;
+export const INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}SuppressedAlerts`;
+export const INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID = `${INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID}TechnicalPreview`;
+export const INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}RelatedCases`;
+export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}RelatedAlertsBySession`;
+export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}RelatedAlertsBySameSourceEvent`;
+export const INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID = `${INSIGHTS_CORRELATIONS_TEST_ID}RelatedAlertsByAncestry`;
/* Insights Prevalence */
export const INSIGHTS_PREVALENCE_TEST_ID =
'securitySolutionDocumentDetailsFlyoutInsightsPrevalence';
+export const INSIGHTS_PREVALENCE_NO_DATA_TEST_ID = `${INSIGHTS_PREVALENCE_TEST_ID}NoData`;
/* Visualizations section */
@@ -133,7 +129,10 @@ export const VISUALIZATIONS_SECTION_TEST_ID = 'securitySolutionDocumentDetailsVi
export const VISUALIZATIONS_SECTION_HEADER_TEST_ID =
'securitySolutionDocumentDetailsVisualizationsTitleHeader';
export const ANALYZER_PREVIEW_TEST_ID = 'securitySolutionDocumentDetailsAnalyzerPreview';
+export const ANALYZER_PREVIEW_NO_DATA_TEST_ID = `${ANALYZER_PREVIEW_TEST_ID}NoData`;
export const SESSION_PREVIEW_TEST_ID = 'securitySolutionDocumentDetailsSessionPreview';
+export const SESSION_PREVIEW_UPSELL_TEST_ID = `${SESSION_PREVIEW_TEST_ID}UpSell`;
+export const SESSION_PREVIEW_NO_DATA_TEST_ID = `${SESSION_PREVIEW_TEST_ID}NoData`;
/* Response section */
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.test.tsx
index 4d3d3334862ba..a111e5469e614 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.test.tsx
@@ -103,7 +103,7 @@ describe(' ', () => {
);
});
- it('should render 0 field enriched', () => {
+ it('should render 0 fields enriched', () => {
(useFetchThreatIntelligence as jest.Mock).mockReturnValue({
loading: false,
threatMatchesCount: 1,
@@ -113,11 +113,11 @@ describe(' ', () => {
const { getByTestId } = render(renderThreatIntelligenceOverview(panelContextValue));
expect(getByTestId(CONTENT_TEST_ID)).toHaveTextContent(
- '0 field enriched with threat intelligence'
+ '0 fields enriched with threat intelligence'
);
});
- it('should render 0 match detected', () => {
+ it('should render 0 matches detected', () => {
(useFetchThreatIntelligence as jest.Mock).mockReturnValue({
loading: false,
threatMatchesCount: 0,
@@ -126,7 +126,7 @@ describe(' ', () => {
const { getByTestId } = render(renderThreatIntelligenceOverview(panelContextValue));
- expect(getByTestId(CONTENT_TEST_ID)).toHaveTextContent('0 threat match detected');
+ expect(getByTestId(CONTENT_TEST_ID)).toHaveTextContent('0 threat matches detected');
});
it('should render loading', () => {
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.tsx
index 42253e61effe2..0175d44e4f4bd 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/threat_intelligence_overview.tsx
@@ -9,18 +9,12 @@ import type { FC } from 'react';
import React, { useCallback } from 'react';
import { EuiFlexGroup } from '@elastic/eui';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { ExpandablePanel } from '../../shared/components/expandable_panel';
import { useFetchThreatIntelligence } from '../hooks/use_fetch_threat_intelligence';
import { InsightsSummaryRow } from './insights_summary_row';
import { useRightPanelContext } from '../context';
import { INSIGHTS_THREAT_INTELLIGENCE_TEST_ID } from './test_ids';
-import {
- THREAT_INTELLIGENCE_TITLE,
- THREAT_MATCH_DETECTED,
- THREAT_ENRICHMENT,
- THREAT_MATCHES_DETECTED,
- THREAT_ENRICHMENTS,
-} from './translations';
import { LeftPanelKey, LeftPanelInsightsTab } from '../../left';
import { THREAT_INTELLIGENCE_TAB_ID } from '../../left/components/threat_intelligence_details';
@@ -55,7 +49,12 @@ export const ThreatIntelligenceOverview: FC = () => {
return (
+ ),
callback: goToThreatIntelligenceTab,
iconType: 'arrowStart',
}}
@@ -70,14 +69,26 @@ export const ThreatIntelligenceOverview: FC = () => {
loading={loading}
icon={'warning'}
value={threatMatchesCount}
- text={threatMatchesCount <= 1 ? THREAT_MATCH_DETECTED : THREAT_MATCHES_DETECTED}
+ text={
+
+ }
data-test-subj={INSIGHTS_THREAT_INTELLIGENCE_TEST_ID}
/>
+ }
data-test-subj={INSIGHTS_THREAT_INTELLIGENCE_TEST_ID}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts b/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts
deleted file mode 100644
index ea83a8f3a1a23..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/right/components/translations.ts
+++ /dev/null
@@ -1,301 +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 { i18n } from '@kbn/i18n';
-
-/* Header */
-
-export const EXPAND_DETAILS_BUTTON = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.expandDetailButton',
- { defaultMessage: 'Expand details' }
-);
-
-export const COLLAPSE_DETAILS_BUTTON = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.collapseDetailButton',
- { defaultMessage: 'Collapse details' }
-);
-
-export const EVENT_DETAILS = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.headerTitle',
- { defaultMessage: 'Event details' }
-);
-
-export const SEVERITY_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.severityTitle',
- {
- defaultMessage: 'Severity',
- }
-);
-
-export const RISK_SCORE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.riskScoreTitle',
- {
- defaultMessage: 'Risk score',
- }
-);
-
-export const RULE_SUMMARY_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.ruleSummaryText',
- {
- defaultMessage: 'Show rule summary',
- }
-);
-
-export const ALERT_REASON_DETAILS_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.alertReasonDetailsText',
- {
- defaultMessage: 'Show full reason',
- }
-);
-
-/* About section */
-
-export const ABOUT_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.aboutTitle',
- {
- defaultMessage: 'About',
- }
-);
-
-export const RULE_DESCRIPTION_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.ruleDescriptionTitle',
- {
- defaultMessage: 'Rule description',
- }
-);
-
-export const PREVIEW_RULE_DETAILS = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.previewRuleDetailsText',
- { defaultMessage: 'Preview rule details' }
-);
-
-export const PREVIEW_ALERT_REASON_DETAILS = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.previewAlertReasonDetailsText',
- { defaultMessage: 'Preview alert reason' }
-);
-
-export const DOCUMENT_DESCRIPTION_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.documentDescriptionTitle',
- {
- defaultMessage: 'Document description',
- }
-);
-
-export const ALERT_REASON_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.alertReasonTitle',
- {
- defaultMessage: 'Alert reason',
- }
-);
-
-export const DOCUMENT_REASON_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.documentReasonTitle',
- {
- defaultMessage: 'Document reason',
- }
-);
-
-/* Investigation section */
-
-export const INVESTIGATION_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.investigationSectionTitle',
- {
- defaultMessage: 'Investigation',
- }
-);
-
-export const HIGHLIGHTED_FIELDS_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.highlightedFieldsTitle',
- { defaultMessage: 'Highlighted fields' }
-);
-
-export const HIGHLIGHTED_FIELDS_FIELD_COLUMN = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.highlightedFields.fieldColumn',
- { defaultMessage: 'Field' }
-);
-
-export const HIGHLIGHTED_FIELDS_VALUE_COLUMN = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.highlightedFields.valueColumn',
- { defaultMessage: 'Value' }
-);
-
-/* Insights section */
-
-export const ENTITIES_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.entitiesTitle',
- { defaultMessage: 'Entities' }
-);
-
-export const ENTITIES_NO_DATA_MESSAGE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.entitiesNoDataMessage',
- {
- defaultMessage: 'Host and user information are unavailable for this alert',
- }
-);
-
-export const THREAT_INTELLIGENCE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.threatIntelligenceTitle',
- { defaultMessage: 'Threat intelligence' }
-);
-
-export const INSIGHTS_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.insightsTitle',
- { defaultMessage: 'Insights' }
-);
-
-export const CORRELATIONS_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.correlationsTitle',
- { defaultMessage: 'Correlations' }
-);
-
-export const CORRELATIONS_ERROR = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.correlations.error',
- {
- defaultMessage: 'No correlations data available',
- }
-);
-
-export const PREVALENCE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.prevalenceTitle',
- { defaultMessage: 'Prevalence' }
-);
-
-export const PREVALENCE_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.prevalenceNoData',
- {
- defaultMessage: 'No prevalence data available.',
- }
-);
-
-export const THREAT_MATCH_DETECTED = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatch',
- {
- defaultMessage: `threat match detected`,
- }
-);
-
-export const THREAT_MATCHES_DETECTED = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatches',
- {
- defaultMessage: `threat matches detected`,
- }
-);
-
-export const THREAT_ENRICHMENT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichment',
- {
- defaultMessage: `field enriched with threat intelligence`,
- }
-);
-
-export const THREAT_ENRICHMENTS = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichments',
- {
- defaultMessage: `fields enriched with threat intelligence`,
- }
-);
-
-export const PREVALENCE_ROW_UNCOMMON = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab.prevalenceRowText',
- {
- defaultMessage: 'is uncommon',
- }
-);
-
-export const VISUALIZATIONS_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.visualizationsTitle',
- { defaultMessage: 'Visualizations' }
-);
-
-export const ANALYZER_PREVIEW_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.analyzerPreviewTitle',
- { defaultMessage: 'Analyzer preview' }
-);
-
-export const SHARE = i18n.translate('xpack.securitySolution.flyout.documentDetails.share', {
- defaultMessage: 'Share Alert',
-});
-
-export const INVESTIGATION_GUIDE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.investigationGuideTitle',
- {
- defaultMessage: 'Investigation guide',
- }
-);
-
-export const INVESTIGATION_GUIDE_BUTTON = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.investigationGuideButton',
- {
- defaultMessage: 'Show investigation guide',
- }
-);
-
-export const INVESTIGATION_GUIDE_NO_DATA = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.investigationGuideNoData',
- {
- defaultMessage: 'There’s no investigation guide for this rule.',
- }
-);
-
-export const SESSION_PREVIEW_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.sessionPreview.title',
- {
- defaultMessage: 'Session viewer preview',
- }
-);
-
-export const SESSION_PREVIEW_PROCESS_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.sessionPreview.processText',
- {
- defaultMessage: 'started',
- }
-);
-
-export const SESSION_PREVIEW_TIME_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.sessionPreview.timeText',
- {
- defaultMessage: 'at',
- }
-);
-
-export const SESSION_PREVIEW_RULE_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.sessionPreview.ruleText',
- {
- defaultMessage: 'with rule',
- }
-);
-
-export const SESSION_PREVIEW_COMMAND_TEXT = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.sessionPreview.commandText',
- {
- defaultMessage: 'by',
- }
-);
-
-export const RESPONSE_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.responseSectionTitle',
- {
- defaultMessage: 'Response',
- }
-);
-
-export const RESPONSE_EMPTY = i18n.translate('xpack.securitySolution.flyout.response.empty', {
- defaultMessage: 'There are no response actions defined for this event.',
-});
-
-export const TECHNICAL_PREVIEW_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.technicalPreviewTitle',
- { defaultMessage: 'Technical preview' }
-);
-
-export const TECHNICAL_PREVIEW_MESSAGE = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.technicalPreviewMessage',
- {
- defaultMessage:
- 'This functionality is in technical preview and may be changed or removed completely in a future release. Elastic will take a best effort approach to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.',
- }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/user_entity_overview.tsx
index 998f6f71b02a7..941a5c299ffbe 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/user_entity_overview.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/user_entity_overview.tsx
@@ -18,6 +18,7 @@ import {
import { css } from '@emotion/css';
import { getOr } from 'lodash/fp';
import { useExpandableFlyoutContext } from '@kbn/expandable-flyout';
+import { FormattedMessage } from '@kbn/i18n-react';
import { LeftPanelInsightsTab, LeftPanelKey } from '../../left';
import { ENTITIES_TAB_ID } from '../../left/components/entities_details';
import { useRightPanelContext } from '../context';
@@ -44,7 +45,6 @@ import {
ENTITIES_USER_OVERVIEW_LINK_TEST_ID,
TECHNICAL_PREVIEW_ICON_TEST_ID,
} from './test_ids';
-import { TECHNICAL_PREVIEW_TITLE, TECHNICAL_PREVIEW_MESSAGE } from './translations';
import { useObservedUserDetails } from '../../../explore/users/containers/users/observed_details';
const USER_ICON = 'user';
@@ -149,10 +149,20 @@ export const UserEntityOverview: React.FC = ({ userName
<>
{i18n.USER_RISK_CLASSIFICATION}
+ }
size="m"
type="iInCircle"
- content={TECHNICAL_PREVIEW_MESSAGE}
+ content={
+
+ }
position="bottom"
iconProps={{
className: 'eui-alignTop',
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.test.tsx
index a427cdf04bce9..2d66833843331 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.test.tsx
@@ -6,6 +6,7 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { VISUALIZATIONS_SECTION_HEADER_TEST_ID } from './test_ids';
import { TestProviders } from '../../../common/mock';
@@ -42,11 +43,13 @@ describe(' ', () => {
} as unknown as ExpandableFlyoutContext;
const { getByTestId, getAllByRole } = render(
-
-
-
-
-
+
+
+
+
+
+
+
);
expect(getByTestId(VISUALIZATIONS_SECTION_HEADER_TEST_ID)).toBeInTheDocument();
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.tsx
index b2cc0d2969c7e..4b53911bea590 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/components/visualizations_section.tsx
@@ -7,11 +7,11 @@
import React from 'react';
import { EuiSpacer } from '@elastic/eui';
+import { FormattedMessage } from '@kbn/i18n-react';
import { AnalyzerPreviewContainer } from './analyzer_preview_container';
import { SessionPreviewContainer } from './session_preview_container';
import { ExpandableSection } from './expandable_section';
import { VISUALIZATIONS_SECTION_TEST_ID } from './test_ids';
-import { VISUALIZATIONS_TITLE } from './translations';
export interface VisualizationsSectionProps {
/**
@@ -29,7 +29,12 @@ export const VisualizationsSection: React.FC = ({
return (
+ }
data-test-subj={VISUALIZATIONS_SECTION_TEST_ID}
>
diff --git a/x-pack/plugins/security_solution/public/flyout/right/tabs.tsx b/x-pack/plugins/security_solution/public/flyout/right/tabs.tsx
index 89802787283fe..1cdc25f36c01b 100644
--- a/x-pack/plugins/security_solution/public/flyout/right/tabs.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/right/tabs.tsx
@@ -5,17 +5,18 @@
* 2.0.
*/
+import type { ReactElement } from 'react';
import React from 'react';
+import { FormattedMessage } from '@kbn/i18n-react';
import { JSON_TAB_TEST_ID, OVERVIEW_TAB_TEST_ID, TABLE_TAB_TEST_ID } from './test_ids';
import type { RightPanelPaths } from '.';
import { JsonTab } from './tabs/json_tab';
import { OverviewTab } from './tabs/overview_tab';
import { TableTab } from './tabs/table_tab';
-import { JSON_TAB, OVERVIEW_TAB, TABLE_TAB } from './translations';
export type RightPanelTabsType = Array<{
id: RightPanelPaths;
- name: string;
+ name: ReactElement;
content: React.ReactElement;
'data-test-subj': string;
}>;
@@ -27,19 +28,34 @@ export const tabs: RightPanelTabsType = [
{
id: 'overview',
'data-test-subj': OVERVIEW_TAB_TEST_ID,
- name: OVERVIEW_TAB,
+ name: (
+
+ ),
content: ,
},
{
id: 'table',
'data-test-subj': TABLE_TAB_TEST_ID,
- name: TABLE_TAB,
+ name: (
+
+ ),
content: ,
},
{
id: 'json',
'data-test-subj': JSON_TAB_TEST_ID,
- name: JSON_TAB,
+ name: (
+
+ ),
content: ,
},
];
diff --git a/x-pack/plugins/security_solution/public/flyout/right/tabs/translations.ts b/x-pack/plugins/security_solution/public/flyout/right/tabs/translations.ts
deleted file mode 100644
index 741a12676a094..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/right/tabs/translations.ts
+++ /dev/null
@@ -1,22 +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 { i18n } from '@kbn/i18n';
-
-export const DOCUMENT_ERROR_TITLE = i18n.translate(
- 'xpack.securitySolution.flyout.documentErrorTitle',
- {
- defaultMessage: 'document information',
- }
-);
-
-export const DOCUMENT_ERROR_DETAILS = i18n.translate(
- 'xpack.securitySolution.flyout.documentErrorMessage',
- {
- defaultMessage: 'the document fields and values',
- }
-);
diff --git a/x-pack/plugins/security_solution/public/flyout/right/translations.ts b/x-pack/plugins/security_solution/public/flyout/right/translations.ts
deleted file mode 100644
index fe4b31c2aef64..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/right/translations.ts
+++ /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 { i18n } from '@kbn/i18n';
-
-export const OVERVIEW_TAB = i18n.translate(
- 'xpack.securitySolution.flyout.documentDetails.overviewTab',
- { defaultMessage: 'Overview' }
-);
-
-export const TABLE_TAB = i18n.translate('xpack.securitySolution.flyout.documentDetails.tableTab', {
- defaultMessage: 'Table',
-});
-
-export const JSON_TAB = i18n.translate('xpack.securitySolution.flyout.documentDetails.jsonTab', {
- defaultMessage: 'JSON',
-});
diff --git a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.test.tsx b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.test.tsx
index e3db86494b481..f0565fe1df43f 100644
--- a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.test.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.test.tsx
@@ -6,16 +6,22 @@
*/
import React from 'react';
+import { __IntlProvider as IntlProvider } from '@kbn/i18n-react';
import { render } from '@testing-library/react';
import { FlyoutError } from './flyout_error';
-import { ERROR_MESSAGE, ERROR_TITLE, FLYOUT_ERROR } from '../translations';
import { FLYOUT_ERROR_TEST_ID } from '../test_ids';
describe(' ', () => {
it('should render error title and body', () => {
- const { getByTestId } = render( );
+ const { getByTestId } = render(
+
+
+
+ );
expect(getByTestId(FLYOUT_ERROR_TEST_ID)).toBeInTheDocument();
- expect(getByTestId(FLYOUT_ERROR_TEST_ID)).toHaveTextContent(ERROR_TITLE(FLYOUT_ERROR));
- expect(getByTestId(FLYOUT_ERROR_TEST_ID)).toHaveTextContent(ERROR_MESSAGE(FLYOUT_ERROR));
+ expect(getByTestId(FLYOUT_ERROR_TEST_ID)).toHaveTextContent('Unable to display data');
+ expect(getByTestId(FLYOUT_ERROR_TEST_ID)).toHaveTextContent(
+ 'There was an error displaying data.'
+ );
});
});
diff --git a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.tsx b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.tsx
index 700ba9850b75d..bda4e581e164b 100644
--- a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.tsx
+++ b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_error.tsx
@@ -7,7 +7,7 @@
import React from 'react';
import { EuiEmptyPrompt, EuiFlexItem } from '@elastic/eui';
-import { ERROR_MESSAGE, ERROR_TITLE, FLYOUT_ERROR } from '../translations';
+import { FormattedMessage } from '@kbn/i18n-react';
import { FLYOUT_ERROR_TEST_ID } from '../test_ids';
/**
@@ -18,8 +18,24 @@ export const FlyoutError: React.VFC = () => (
{ERROR_TITLE(FLYOUT_ERROR)}}
- body={{ERROR_MESSAGE(FLYOUT_ERROR)}
}
+ title={
+
+
+
+ }
+ body={
+
+
+
+ }
data-test-subj={FLYOUT_ERROR_TEST_ID}
/>
diff --git a/x-pack/plugins/security_solution/public/flyout/shared/translations.ts b/x-pack/plugins/security_solution/public/flyout/shared/translations.ts
deleted file mode 100644
index 5ecf772c5c0c0..0000000000000
--- a/x-pack/plugins/security_solution/public/flyout/shared/translations.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-import { i18n } from '@kbn/i18n';
-
-export const FLYOUT_ERROR = i18n.translate('xpack.securitySolution.flyout.documentDetails.error', {
- defaultMessage: 'data',
-});
-
-export const ERROR_TITLE = (title: string) =>
- i18n.translate('xpack.securitySolution.flyout.errorTitle', {
- values: { title },
- defaultMessage: 'Unable to display {title}',
- });
-
-export const ERROR_MESSAGE = (message: string) =>
- i18n.translate('xpack.securitySolution.flyout.errorMessage', {
- values: { message },
- defaultMessage: 'There was an error displaying {message}',
- });
-
-export const CORRELATIONS_SUPPRESSED_ALERTS = (count: number) =>
- i18n.translate('xpack.securitySolution.flyout.documentDetails.correlations.suppressedAlerts', {
- defaultMessage: 'suppressed {count, plural, =1 {alert} other {alerts}}',
- values: { count },
- });
-
-export const CORRELATIONS_ANCESTRY_ALERTS = (count: number) =>
- i18n.translate('xpack.securitySolution.flyout.documentDetails.correlations.ancestryAlerts', {
- defaultMessage: '{count, plural, one {alert} other {alerts}} related by ancestry',
- values: { count },
- });
-
-export const CORRELATIONS_SAME_SOURCE_ALERTS = (count: number) =>
- i18n.translate('xpack.securitySolution.flyout.documentDetails.correlations.sourceAlerts', {
- defaultMessage: '{count, plural, one {alert} other {alerts}} related by source event',
- values: { count },
- });
-
-export const CORRELATIONS_SESSION_ALERTS = (count: number) =>
- i18n.translate('xpack.securitySolution.flyout.documentDetails.correlations.sessionAlerts', {
- defaultMessage: '{count, plural, one {alert} other {alerts}} related by session',
- values: { count },
- });
-
-export const CORRELATIONS_RELATED_CASES = (count: number) =>
- i18n.translate('xpack.securitySolution.flyout.documentDetails.correlations.relatedCases', {
- defaultMessage: 'related {count, plural, one {case} other {cases}}',
- values: { count },
- });
diff --git a/x-pack/plugins/security_solution/public/management/components/page_overlay/page_overlay.tsx b/x-pack/plugins/security_solution/public/management/components/page_overlay/page_overlay.tsx
index e6f8f2b207ea8..77b39c9689a46 100644
--- a/x-pack/plugins/security_solution/public/management/components/page_overlay/page_overlay.tsx
+++ b/x-pack/plugins/security_solution/public/management/components/page_overlay/page_overlay.tsx
@@ -253,8 +253,6 @@ export const PageOverlay = memo(
useEffect(() => {
if (
isMounted() &&
- // @ts-expect-error ts upgrade v4.7.4
- onHide &&
hideOnUrlPathnameChange &&
!isHidden &&
openedOnPathName &&
diff --git a/x-pack/plugins/security_solution/public/management/cypress.config.ts b/x-pack/plugins/security_solution/public/management/cypress.config.ts
index b02724cb8eec8..34e7ae02cb626 100644
--- a/x-pack/plugins/security_solution/public/management/cypress.config.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress.config.ts
@@ -37,7 +37,7 @@ export default defineCypressConfig({
ELASTICSEARCH_URL: 'http://localhost:9200',
FLEET_SERVER_URL: 'https://localhost:8220',
// Username/password used for both elastic and kibana
- KIBANA_USERNAME: 'elastic',
+ KIBANA_USERNAME: 'system_indices_superuser',
KIBANA_PASSWORD: 'changeme',
ELASTICSEARCH_USERNAME: 'system_indices_superuser',
ELASTICSEARCH_PASSWORD: 'changeme',
diff --git a/x-pack/plugins/security_solution/public/management/cypress_endpoint.config.ts b/x-pack/plugins/security_solution/public/management/cypress_endpoint.config.ts
index 73f260d63b4b9..cd1a4c506bc38 100644
--- a/x-pack/plugins/security_solution/public/management/cypress_endpoint.config.ts
+++ b/x-pack/plugins/security_solution/public/management/cypress_endpoint.config.ts
@@ -39,6 +39,10 @@ export default defineCypressConfig({
'cypress-react-selector': {
root: '#security-solution-app',
},
+ KIBANA_USERNAME: 'system_indices_superuser',
+ KIBANA_PASSWORD: 'changeme',
+ ELASTICSEARCH_USERNAME: 'system_indices_superuser',
+ ELASTICSEARCH_PASSWORD: 'changeme',
},
e2e: {
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
index 3d5b1a95d66da..2707bf7b04ebc 100644
--- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
+++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs_content/index.tsx
@@ -100,33 +100,19 @@ interface BasicTimelineTab {
}
const AssistantTab: React.FC<{
- isAssistantEnabled: boolean;
- renderCellValue: (props: CellValueElementProps) => React.ReactNode;
- rowRenderers: RowRenderer[];
- timelineId: TimelineId;
shouldRefocusPrompt: boolean;
setConversationId: Dispatch>;
-}> = memo(
- ({
- isAssistantEnabled,
- renderCellValue,
- rowRenderers,
- timelineId,
- shouldRefocusPrompt,
- setConversationId,
- }) => (
- }>
-
-
-
-
- )
-);
+}> = memo(({ shouldRefocusPrompt, setConversationId }) => (
+ }>
+
+
+
+
+));
AssistantTab.displayName = 'AssistantTab';
@@ -147,7 +133,7 @@ const ActiveTimelineTab = memo(
showTimeline,
}) => {
const isDiscoverInTimelineEnabled = useIsExperimentalFeatureEnabled('discoverInTimeline');
- const { hasAssistantPrivilege, isAssistantEnabled } = useAssistantAvailability();
+ const { hasAssistantPrivilege } = useAssistantAvailability();
const getTab = useCallback(
(tab: TimelineTabs) => {
switch (tab) {
@@ -235,10 +221,6 @@ const ActiveTimelineTab = memo(
{(activeTimelineTab === TimelineTabs.securityAssistant ||
hasTimelineConversationStarted) && (
response.items[0]);
+ found = await retryOnError(
+ async () =>
+ fetchFleetAgents(kbnClient, {
+ perPage: 1,
+ kuery: `(local_metadata.host.hostname.keyword : "${hostname}") and (status:online)`,
+ showInactive: false,
+ }).then((response) => response.items[0]),
+ RETRYABLE_TRANSIENT_ERRORS
+ );
if (!found) {
// sleep and check again
diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts
index f1b69c8665fc6..1f0c7da3bbad6 100644
--- a/x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts
+++ b/x-pack/plugins/security_solution/scripts/endpoint/common/format_axios_error.ts
@@ -22,7 +22,11 @@ export class FormattedAxiosError extends Error {
};
constructor(axiosError: AxiosError) {
- super(axiosError.message);
+ super(
+ `${axiosError.message}${
+ axiosError?.response?.data ? `: ${JSON.stringify(axiosError?.response?.data)}` : ''
+ }`
+ );
this.request = {
method: axiosError.config?.method ?? '?',
diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts
index 366b2a81cefcb..7e5d9a95efe76 100644
--- a/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts
+++ b/x-pack/plugins/security_solution/scripts/endpoint/common/stack_services.ts
@@ -15,11 +15,15 @@ import nodeFetch from 'node-fetch';
import type { ReqOptions } from '@kbn/test/src/kbn_client/kbn_client_requester';
import { type AxiosResponse } from 'axios';
import type { ClientOptions } from '@elastic/elasticsearch/lib/client';
+import fs from 'fs';
+import { CA_CERT_PATH } from '@kbn/dev-utils';
import { catchAxiosErrorFormatAndThrow } from './format_axios_error';
import { isLocalhost } from './is_localhost';
import { getLocalhostRealIp } from './localhost_services';
import { createSecuritySuperuser } from './security_user_services';
+const CA_CERTIFICATE: Buffer = fs.readFileSync(CA_CERT_PATH);
+
export interface RuntimeServices {
kbnClient: KbnClient;
esClient: Client;
@@ -64,6 +68,8 @@ interface CreateRuntimeServicesOptions {
esPassword?: string;
log?: ToolingLog;
asSuperuser?: boolean;
+ /** If true, then a certificate will not be used when creating the Kbn/Es clients when url is `https` */
+ noCertForSsl?: boolean;
}
class KbnClientExtended extends KbnClient {
@@ -105,26 +111,39 @@ export const createRuntimeServices = async ({
esPassword,
log = new ToolingLog({ level: 'info', writeTo: process.stdout }),
asSuperuser = false,
+ noCertForSsl,
}: CreateRuntimeServicesOptions): Promise => {
let username = _username;
let password = _password;
if (asSuperuser) {
await waitForKibana(kibanaUrl);
+ const tmpEsClient = createEsClient({
+ url: elasticsearchUrl,
+ username,
+ password,
+ log,
+ noCertForSsl,
+ });
- const superuserResponse = await createSecuritySuperuser(
- createEsClient({
- url: elasticsearchUrl,
- username,
- password,
- log,
- })
- );
+ const isServerlessEs = (await tmpEsClient.info()).version.build_flavor === 'serverless';
+
+ if (isServerlessEs) {
+ log?.warning(
+ 'Creating Security Superuser is not supported in current environment. ES is running in serverless mode. ' +
+ 'Will use username [system_indices_superuser] instead.'
+ );
+
+ username = 'system_indices_superuser';
+ password = 'changeme';
+ } else {
+ const superuserResponse = await createSecuritySuperuser(tmpEsClient);
- ({ username, password } = superuserResponse);
+ ({ username, password } = superuserResponse);
- if (superuserResponse.created) {
- log.info(`Kibana user [${username}] was crated with password [${password}]`);
+ if (superuserResponse.created) {
+ log.info(`Kibana user [${username}] was crated with password [${password}]`);
+ }
}
}
@@ -133,16 +152,17 @@ export const createRuntimeServices = async ({
const fleetURL = new URL(fleetServerUrl);
return {
- kbnClient: createKbnClient({ log, url: kibanaUrl, username, password, apiKey }),
+ kbnClient: createKbnClient({ log, url: kibanaUrl, username, password, apiKey, noCertForSsl }),
esClient: createEsClient({
log,
url: elasticsearchUrl,
username: esUsername ?? username,
password: esPassword ?? password,
apiKey,
+ noCertForSsl,
}),
log,
- localhostRealIp: await getLocalhostRealIp(),
+ localhostRealIp: getLocalhostRealIp(),
apiKey: apiKey ?? '',
user: {
username,
@@ -188,6 +208,7 @@ export const createEsClient = ({
password,
apiKey,
log,
+ noCertForSsl,
}: {
url: string;
username: string;
@@ -195,11 +216,19 @@ export const createEsClient = ({
/** If defined, both `username` and `password` will be ignored */
apiKey?: string;
log?: ToolingLog;
+ noCertForSsl?: boolean;
}): Client => {
+ const isHttps = new URL(url).protocol.startsWith('https');
const clientOptions: ClientOptions = {
node: buildUrlWithCredentials(url, apiKey ? '' : username, apiKey ? '' : password),
};
+ if (isHttps && !noCertForSsl) {
+ clientOptions.tls = {
+ ca: [CA_CERTIFICATE],
+ };
+ }
+
if (apiKey) {
clientOptions.auth = { apiKey };
}
@@ -217,6 +246,7 @@ export const createKbnClient = ({
password,
apiKey,
log = new ToolingLog(),
+ noCertForSsl,
}: {
url: string;
username: string;
@@ -224,16 +254,28 @@ export const createKbnClient = ({
/** If defined, both `username` and `password` will be ignored */
apiKey?: string;
log?: ToolingLog;
+ noCertForSsl?: boolean;
}): KbnClient => {
- const kbnUrl = buildUrlWithCredentials(url, username, password);
+ const isHttps = new URL(url).protocol.startsWith('https');
+ const clientOptions: ConstructorParameters[0] = {
+ log,
+ apiKey,
+ url: buildUrlWithCredentials(url, username, password),
+ };
+
+ if (isHttps && !noCertForSsl) {
+ clientOptions.certificateAuthorities = [CA_CERTIFICATE];
+ }
if (log) {
log.verbose(
- `Creating Kibana client with URL: ${kbnUrl} ${apiKey ? ` + ApiKey: ${apiKey}` : ''}`
+ `Creating Kibana client with URL: ${clientOptions.url} ${
+ apiKey ? ` + ApiKey: ${apiKey}` : ''
+ }`
);
}
- return new KbnClientExtended({ log, url: kbnUrl, apiKey });
+ return new KbnClientExtended(clientOptions);
};
/**
@@ -287,3 +329,18 @@ export const waitForKibana = async (kbnUrl: string): Promise => {
{ maxTimeout: 10000 }
);
};
+
+export const isServerlessKibanaFlavor = async (kbnClient: KbnClient): Promise => {
+ const kbnStatus = await fetchKibanaStatus(kbnClient);
+
+ // If we don't have status for plugins, then error
+ // the Status API will always return something (its an open API), but if auth was successful,
+ // it will also return more data.
+ if (!kbnStatus.status.plugins) {
+ throw new Error(
+ `Unable to retrieve Kibana plugins status (likely an auth issue with the username being used for kibana)`
+ );
+ }
+
+ return kbnStatus.status.plugins?.serverless?.level === 'available';
+};
diff --git a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts
index c0be16370ddcc..c1c38dcf8b30a 100644
--- a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts
+++ b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts
@@ -19,7 +19,7 @@ import { METADATA_DATASTREAM } from '../../common/endpoint/constants';
import { EndpointMetadataGenerator } from '../../common/endpoint/data_generators/endpoint_metadata_generator';
import { indexHostsAndAlerts } from '../../common/endpoint/index_data';
import { ANCESTRY_LIMIT, EndpointDocGenerator } from '../../common/endpoint/generate_data';
-import { fetchStackVersion } from './common/stack_services';
+import { fetchStackVersion, isServerlessKibanaFlavor } from './common/stack_services';
import { ENDPOINT_ALERTS_INDEX, ENDPOINT_EVENTS_INDEX } from './common/constants';
import { getWithResponseActionsRole } from './common/roles_users/with_response_actions_role';
import { getNoResponseActionsRole } from './common/roles_users/without_response_actions_role';
@@ -161,6 +161,8 @@ function updateURL({
}
async function main() {
+ const startTime = new Date().getTime();
+
const argv = yargs.help().options({
seed: {
alias: 's',
@@ -318,17 +320,16 @@ async function main() {
default: false,
},
}).argv;
- let ca: Buffer;
+ let ca: Buffer;
let clientOptions: ClientOptions;
let url: string;
let node: string;
- const toolingLogOptions = {
- log: new ToolingLog({
- level: 'info',
- writeTo: process.stdout,
- }),
- };
+ const logger = new ToolingLog({
+ level: 'info',
+ writeTo: process.stdout,
+ });
+ const toolingLogOptions = { log: logger };
let kbnClientOptions: KbnClientOptions = {
...toolingLogOptions,
@@ -350,38 +351,62 @@ async function main() {
clientOptions = { node: argv.node };
}
let client = new Client(clientOptions);
+ let kbnClient = new KbnClient({ ...kbnClientOptions });
let user: UserInfo | undefined;
- // if fleet flag is used
- if (argv.fleet) {
- // add endpoint user if --withNewUser flag has values as username:password
- const newUserCreds =
- argv.withNewUser.indexOf(':') !== -1 ? argv.withNewUser.split(':') : undefined;
- user = await addUser(
- client,
- newUserCreds
- ? {
- username: newUserCreds[0],
- password: newUserCreds[1],
- }
- : undefined
+ const isServerless = await isServerlessKibanaFlavor(kbnClient);
+
+ logger.info(`Build flavor: ${isServerless ? 'serverless' : 'non-serverless'}`);
+
+ if (argv.fleet && !argv.withNewUser && !isServerless) {
+ // warn and exit when using fleet flag
+ logger.error(
+ 'Please use the --withNewUser=username:password flag to add a custom user with required roles when --fleet is enabled!'
);
+ // eslint-disable-next-line no-process-exit
+ process.exit(0);
+ }
- // update client and kibana options before instantiating
- if (user) {
- // use endpoint user for Es and Kibana URLs
+ // if fleet flag is used
+ if (argv.fleet) {
+ if (!isServerless) {
+ // add endpoint user if --withNewUser flag has values as username:password
+ const newUserCreds =
+ argv.withNewUser.indexOf(':') !== -1 ? argv.withNewUser.split(':') : undefined;
+ user = await addUser(
+ client,
+ newUserCreds
+ ? {
+ username: newUserCreds[0],
+ password: newUserCreds[1],
+ }
+ : undefined
+ );
+
+ // update client and kibana options before instantiating
+ if (user) {
+ // use endpoint user for Es and Kibana URLs
+
+ url = updateURL({ url: argv.kibana, user });
+ node = updateURL({ url: argv.node, user });
+
+ kbnClientOptions = {
+ ...kbnClientOptions,
+ url,
+ };
- url = updateURL({ url: argv.kibana, user });
- node = updateURL({ url: argv.node, user });
+ client = new Client({ ...clientOptions, node });
+ kbnClient = new KbnClient({ ...kbnClientOptions });
- kbnClientOptions = {
- ...kbnClientOptions,
- url,
- };
- client = new Client({ ...clientOptions, node });
+ logger.verbose(`ES/KBN clients updated to login using: ${JSON.stringify(user)}`);
+ }
+ } else {
+ logger.warning(
+ 'Option `--withNewUser` not supported in serverless.\n' +
+ 'Ensure that `--kibana` and `--node` options are defined with username/password of ' +
+ '`system_indices_superuser:changeme`'
+ );
}
}
- // instantiate kibana client
- const kbnClient = new KbnClient({ ...kbnClientOptions });
if (argv.delete) {
await deleteIndices(
@@ -391,6 +416,12 @@ async function main() {
}
if (argv.rbacUser) {
+ if (isServerless) {
+ // FIXME:PT create users in serverless when that capability is available
+
+ throw new Error(`Can not use '--rbacUser' option against serverless deployment`);
+ }
+
// Add roles and users with response actions kibana privileges
for (const role of Object.keys(rolesMapping)) {
const addedRole = await addRole(kbnClient, {
@@ -398,32 +429,15 @@ async function main() {
...rolesMapping[role],
});
if (addedRole) {
- console.log(`Successfully added ${role} role`);
+ logger.info(`Successfully added ${role} role`);
await addUser(client, { username: role, password: 'changeme', roles: [role] });
} else {
- console.log(`Failed to add role, ${role}`);
+ logger.warning(`Failed to add role, ${role}`);
}
}
}
- let seed = argv.seed;
-
- if (!seed) {
- seed = Math.random().toString();
- console.log(`No seed supplied, using random seed: ${seed}`);
- }
-
- const startTime = new Date().getTime();
-
- if (argv.fleet && !argv.withNewUser) {
- // warn and exit when using fleet flag
- console.log(
- 'Please use the --withNewUser=username:password flag to add a custom user with required roles when --fleet is enabled!'
- );
- // eslint-disable-next-line no-process-exit
- process.exit(0);
- }
-
+ const seed = argv.seed || Math.random().toString();
let DocGenerator: typeof EndpointDocGenerator = EndpointDocGenerator;
// If `--randomVersions` is NOT set, then use custom generator that ensures all data generated
@@ -446,6 +460,7 @@ async function main() {
};
}
+ logger.info('Indexing host and alerts...');
await indexHostsAndAlerts(
client,
kbnClient,
@@ -475,11 +490,12 @@ async function main() {
);
// delete endpoint_user after
- if (user) {
+ if (user && !isServerless) {
const deleted = await deleteUser(client, user.username);
if (deleted.found) {
- console.log(`User ${user.username} deleted successfully!`);
+ logger.info(`User ${user.username} deleted successfully!`);
}
}
- console.log(`Creating and indexing documents took: ${new Date().getTime() - startTime}ms`);
+
+ logger.info(`Creating and indexing documents took: ${new Date().getTime() - startTime}ms`);
}
diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts
index f1b131fc63721..4cb94c1dc814f 100644
--- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts
+++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel.ts
@@ -128,7 +128,7 @@ ${JSON.stringify(cypressConfigFile, null, 2)}
const isGrepReturnedFilePaths = _.isArray(grepSpecPattern);
const isGrepReturnedSpecPattern = !isGrepReturnedFilePaths && grepSpecPattern === specPattern;
- const { grepFilterSpecs } = cypressConfigFile.env;
+ const grepFilterSpecs = cypressConfigFile.env?.grepFilterSpecs;
// IMPORTANT!
// When grep returns the same spec pattern as it gets in its arguments, we treat it as
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/auditbeat.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/auditbeat.tsx
deleted file mode 100644
index a8ee074b135dd..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/auditbeat.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-import type { SVGProps } from 'react';
-import React from 'react';
-export const IconAuditbeat: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconAuditbeat;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/chart_arrow.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/chart_arrow.tsx
new file mode 100644
index 0000000000000..a47515435fa86
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/chart_arrow.tsx
@@ -0,0 +1,58 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconChartArrow: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconChartArrow;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/dashboard.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/dashboard.tsx
new file mode 100644
index 0000000000000..5ca7002cfaba0
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/dashboard.tsx
@@ -0,0 +1,58 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconDashboard: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconDashboard;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/data_connector.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/data_connector.tsx
deleted file mode 100644
index 26a4ca9ea24c9..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/data_connector.tsx
+++ /dev/null
@@ -1,36 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconDataConnector: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconDataConnector;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/data_view.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/data_view.tsx
new file mode 100644
index 0000000000000..85461e05bd66d
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/data_view.tsx
@@ -0,0 +1,52 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconDataView: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconDataView;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/dev_tools.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/dev_tools.tsx
deleted file mode 100644
index 49f2c129e4a79..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/dev_tools.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 type { SVGProps } from 'react';
-import React from 'react';
-export const IconDevTools: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconDevTools;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat.tsx
new file mode 100644
index 0000000000000..0859cdb3329ab
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat.tsx
@@ -0,0 +1,32 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconFilebeat: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconFilebeat;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat_chart.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat_chart.tsx
new file mode 100644
index 0000000000000..df3243ba8d043
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/filebeat_chart.tsx
@@ -0,0 +1,42 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconFilebeatChart: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconFilebeatChart;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/graph.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/graph.tsx
deleted file mode 100644
index 9223de9461975..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/graph.tsx
+++ /dev/null
@@ -1,46 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconGraph: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconGraph;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/infra.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/infra.tsx
new file mode 100644
index 0000000000000..5e4e1070d5f9e
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/infra.tsx
@@ -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 type { SVGProps } from 'react';
+import React from 'react';
+export const IconInfra: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconInfra;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/intuitive.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/intuitive.tsx
new file mode 100644
index 0000000000000..cacf9dc7be11f
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/intuitive.tsx
@@ -0,0 +1,64 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconIntuitive: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconIntuitive;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/jobs.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/jobs.tsx
new file mode 100644
index 0000000000000..a6eb6c20d446a
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/jobs.tsx
@@ -0,0 +1,67 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconJobs: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconJobs;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/keyword.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/keyword.tsx
new file mode 100644
index 0000000000000..f25d5c4d9b3f8
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/keyword.tsx
@@ -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 type { SVGProps } from 'react';
+import React from 'react';
+export const IconKeyword: React.FC> = (props) => (
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconKeyword;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/logging.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/logging.tsx
deleted file mode 100644
index baab149c29412..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/logging.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-import type { SVGProps } from 'react';
-import React from 'react';
-export const IconLogging: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconLogging;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/manager.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/manager.tsx
new file mode 100644
index 0000000000000..e5646c378b7a6
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/manager.tsx
@@ -0,0 +1,61 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconManager: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconManager;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/marketing.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/marketing.tsx
new file mode 100644
index 0000000000000..6161e492b0edb
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/marketing.tsx
@@ -0,0 +1,49 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconMarketing: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconMarketing;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/product_features_alerting.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/product_features_alerting.tsx
deleted file mode 100644
index f856b7a7494f4..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/product_features_alerting.tsx
+++ /dev/null
@@ -1,59 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconProductFeaturesAlerting: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconProductFeaturesAlerting;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/rapid_bar_graph.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/rapid_bar_graph.tsx
new file mode 100644
index 0000000000000..3303b13e8183e
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/rapid_bar_graph.tsx
@@ -0,0 +1,46 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconRapidBarGraph: React.FC> = (props) => (
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconRapidBarGraph;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/replication.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/replication.tsx
new file mode 100644
index 0000000000000..18b4cf73d2adf
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/replication.tsx
@@ -0,0 +1,55 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconReplication: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconReplication;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/reporting.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/reporting.tsx
new file mode 100644
index 0000000000000..ba783401ef7e5
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/reporting.tsx
@@ -0,0 +1,37 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconReporting: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconReporting;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/searchable_snapshots.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/searchable_snapshots.tsx
deleted file mode 100644
index 9b199309fdee9..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/searchable_snapshots.tsx
+++ /dev/null
@@ -1,73 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconSearchableSnapshots: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconSearchableSnapshots;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/security_shield.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/security_shield.tsx
deleted file mode 100644
index 355718d77d1a0..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/security_shield.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 type { SVGProps } from 'react';
-import React from 'react';
-export const IconSecurityShield: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconSecurityShield;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/settings.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/settings.tsx
new file mode 100644
index 0000000000000..dbf362deea340
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/settings.tsx
@@ -0,0 +1,41 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+import type { SVGProps } from 'react';
+import React from 'react';
+export const IconSettings: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconSettings;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/siem.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/siem.tsx
deleted file mode 100644
index 00b775af8fa36..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/siem.tsx
+++ /dev/null
@@ -1,46 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconSiem: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconSiem;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/spaces.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/spaces.tsx
deleted file mode 100644
index 1a5e6300b1b9f..0000000000000
--- a/x-pack/plugins/security_solution_serverless/public/common/icons/spaces.tsx
+++ /dev/null
@@ -1,56 +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 { SVGProps } from 'react';
-import React from 'react';
-export const IconSpaces: React.FC> = ({ ...props }) => (
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-// eslint-disable-next-line import/no-default-export
-export default IconSpaces;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/users_roles.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/users_roles.tsx
new file mode 100644
index 0000000000000..3eb961f783f67
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/users_roles.tsx
@@ -0,0 +1,57 @@
+/*
+ * 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 { SVGProps } from 'react';
+import React from 'react';
+export const IconUsersRoles: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconUsersRoles;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/icons/visualization.tsx b/x-pack/plugins/security_solution_serverless/public/common/icons/visualization.tsx
new file mode 100644
index 0000000000000..983dcec736015
--- /dev/null
+++ b/x-pack/plugins/security_solution_serverless/public/common/icons/visualization.tsx
@@ -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 type { SVGProps } from 'react';
+import React from 'react';
+export const IconVisualization: React.FC> = ({ ...props }) => (
+
+
+
+
+
+
+
+);
+
+// eslint-disable-next-line import/no-default-export
+export default IconVisualization;
diff --git a/x-pack/plugins/security_solution_serverless/public/common/lazy_icons.tsx b/x-pack/plugins/security_solution_serverless/public/common/lazy_icons.tsx
index 2143eee79ebe9..f7e016d75c969 100644
--- a/x-pack/plugins/security_solution_serverless/public/common/lazy_icons.tsx
+++ b/x-pack/plugins/security_solution_serverless/public/common/lazy_icons.tsx
@@ -19,28 +19,38 @@ const withSuspenseIcon = (Component: React.ComponentType<
export const IconLensLazy = withSuspenseIcon(React.lazy(() => import('./icons/lens')));
export const IconEndpointLazy = withSuspenseIcon(React.lazy(() => import('./icons/endpoint')));
-export const IconDataConnectorLazy = withSuspenseIcon(
- React.lazy(() => import('./icons/data_connector'))
-);
export const IconIndexManagementLazy = withSuspenseIcon(
React.lazy(() => import('./icons/index_management'))
);
-export const IconSpacesLazy = withSuspenseIcon(React.lazy(() => import('./icons/spaces')));
-export const IconDevToolsLazy = withSuspenseIcon(React.lazy(() => import('./icons/dev_tools')));
export const IconFleetLazy = withSuspenseIcon(React.lazy(() => import('./icons/fleet')));
-export const IconAuditbeatLazy = withSuspenseIcon(React.lazy(() => import('./icons/auditbeat')));
-export const IconSiemLazy = withSuspenseIcon(React.lazy(() => import('./icons/siem')));
export const IconEcctlLazy = withSuspenseIcon(React.lazy(() => import('./icons/ecctl')));
-export const IconGraphLazy = withSuspenseIcon(React.lazy(() => import('./icons/graph')));
-export const IconLoggingLazy = withSuspenseIcon(React.lazy(() => import('./icons/logging')));
export const IconMapServicesLazy = withSuspenseIcon(
React.lazy(() => import('./icons/map_services'))
);
-export const IconSecurityShieldLazy = withSuspenseIcon(
- React.lazy(() => import('./icons/security_shield'))
-);
-export const IconProductFeaturesAlertingLazy = withSuspenseIcon(
- React.lazy(() => import('./icons/product_features_alerting'))
-);
export const IconTimelineLazy = withSuspenseIcon(React.lazy(() => import('./icons/timeline')));
export const IconOsqueryLazy = withSuspenseIcon(React.lazy(() => import('./icons/osquery')));
+export const IconUsersRolesLazy = withSuspenseIcon(React.lazy(() => import('./icons/users_roles')));
+export const IconReportingLazy = withSuspenseIcon(React.lazy(() => import('./icons/reporting')));
+export const IconVisualizationLazy = withSuspenseIcon(
+ React.lazy(() => import('./icons/visualization'))
+);
+export const IconMarketingLazy = withSuspenseIcon(React.lazy(() => import('./icons/marketing')));
+export const IconInfraLazy = withSuspenseIcon(React.lazy(() => import('./icons/infra')));
+export const IconKeywordLazy = withSuspenseIcon(React.lazy(() => import('./icons/keyword')));
+export const IconJobsLazy = withSuspenseIcon(React.lazy(() => import('./icons/jobs')));
+export const IconSettingsLazy = withSuspenseIcon(React.lazy(() => import('./icons/settings')));
+export const IconDashboardLazy = withSuspenseIcon(React.lazy(() => import('./icons/dashboard')));
+export const IconChartArrowLazy = withSuspenseIcon(React.lazy(() => import('./icons/chart_arrow')));
+export const IconManagerLazy = withSuspenseIcon(React.lazy(() => import('./icons/manager')));
+export const IconFilebeatLazy = withSuspenseIcon(React.lazy(() => import('./icons/filebeat')));
+export const IconDataViewLazy = withSuspenseIcon(React.lazy(() => import('./icons/data_view')));
+export const IconReplicationLazy = withSuspenseIcon(
+ React.lazy(() => import('./icons/replication'))
+);
+export const IconIntuitiveLazy = withSuspenseIcon(React.lazy(() => import('./icons/intuitive')));
+export const IconRapidBarGraphLazy = withSuspenseIcon(
+ React.lazy(() => import('./icons/rapid_bar_graph'))
+);
+export const IconFilebeatChartLazy = withSuspenseIcon(
+ React.lazy(() => import('./icons/filebeat_chart'))
+);
diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts
index 479323f5688c5..520cbdd192ae4 100644
--- a/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts
+++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts
@@ -39,6 +39,7 @@ export enum ExternalPageName {
// Ref: packages/default-nav/ml/default_navigation.ts
mlOverview = 'ml:overview',
mlNotifications = 'ml:notifications',
+ mlMemoryUsage = 'ml:memoryUsage',
mlAnomalyDetection = 'ml:anomalyDetection',
mlAnomalyExplorer = 'ml:anomalyExplorer',
mlSingleMetricViewer = 'ml:singleMetricViewer',
diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts
index bdd0f739e3e7c..32c7587097616 100644
--- a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts
+++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts
@@ -13,14 +13,21 @@ import type { ProjectLinkCategory, ProjectNavigationLink } from '../types';
import * as i18n from './ml_translations';
import {
IconLensLazy,
- IconEndpointLazy,
- IconSpacesLazy,
- IconIndexManagementLazy,
- IconDataConnectorLazy,
- IconDevToolsLazy,
- IconFleetLazy,
- IconAuditbeatLazy,
- IconSiemLazy,
+ IconMarketingLazy,
+ IconInfraLazy,
+ IconFilebeatChartLazy,
+ IconJobsLazy,
+ IconKeywordLazy,
+ IconDashboardLazy,
+ IconVisualizationLazy,
+ IconSettingsLazy,
+ IconChartArrowLazy,
+ IconManagerLazy,
+ IconFilebeatLazy,
+ IconReplicationLazy,
+ IconDataViewLazy,
+ IconIntuitiveLazy,
+ IconRapidBarGraphLazy,
} from '../../../common/lazy_icons';
// appLinks configures the Security Solution pages links
@@ -38,7 +45,11 @@ export const mlAppLink: LinkItem = {
export const mlNavCategories: ProjectLinkCategory[] = [
{
type: LinkCategoryType.separator,
- linkIds: [ExternalPageName.mlOverview, ExternalPageName.mlNotifications],
+ linkIds: [
+ ExternalPageName.mlOverview,
+ ExternalPageName.mlNotifications,
+ ExternalPageName.mlMemoryUsage,
+ ],
},
{
type: LinkCategoryType.title,
@@ -95,97 +106,97 @@ export const mlNavLinks: ProjectNavigationLink[] = [
{
id: ExternalPageName.mlNotifications,
title: i18n.NOTIFICATIONS_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconMarketingLazy,
description: i18n.NOTIFICATIONS_DESC,
},
+ {
+ id: ExternalPageName.mlMemoryUsage,
+ title: i18n.MEMORY_USAGE_TITLE,
+ landingIcon: IconInfraLazy,
+ description: i18n.MEMORY_USAGE_DESC,
+ },
{
id: ExternalPageName.mlAnomalyDetection,
title: i18n.ANOMALY_DETECTION_TITLE,
- landingIcon: IconSpacesLazy,
+ landingIcon: IconJobsLazy,
description: i18n.ANOMALY_DETECTION_DESC,
},
{
id: ExternalPageName.mlAnomalyExplorer,
title: i18n.ANOMALY_EXPLORER_TITLE,
- landingIcon: IconIndexManagementLazy,
+ landingIcon: IconKeywordLazy,
description: i18n.ANOMALY_EXPLORER_DESC,
},
{
id: ExternalPageName.mlSingleMetricViewer,
title: i18n.SINGLE_METRIC_VIEWER_TITLE,
- landingIcon: IconDataConnectorLazy,
+ landingIcon: IconVisualizationLazy,
description: i18n.SINGLE_METRIC_VIEWER_DESC,
},
{
id: ExternalPageName.mlSettings,
title: i18n.SETTINGS_TITLE,
- landingIcon: IconDevToolsLazy,
+ landingIcon: IconSettingsLazy,
description: i18n.SETTINGS_DESC,
},
{
id: ExternalPageName.mlDataFrameAnalytics,
title: i18n.DATA_FRAME_ANALYTICS_TITLE,
- landingIcon: IconIndexManagementLazy,
+ landingIcon: IconJobsLazy,
description: i18n.DATA_FRAME_ANALYTICS_DESC,
},
{
id: ExternalPageName.mlResultExplorer,
title: i18n.RESULT_EXPLORER_TITLE,
- landingIcon: IconFleetLazy,
+ landingIcon: IconDashboardLazy,
description: i18n.RESULT_EXPLORER_DESC,
},
{
id: ExternalPageName.mlAnalyticsMap,
title: i18n.ANALYTICS_MAP_TITLE,
- landingIcon: IconAuditbeatLazy,
+ landingIcon: IconChartArrowLazy,
description: i18n.ANALYTICS_MAP_DESC,
},
{
id: ExternalPageName.mlNodesOverview,
title: i18n.NODES_OVERVIEW_TITLE,
- landingIcon: IconSiemLazy,
+ landingIcon: IconManagerLazy,
description: i18n.NODES_OVERVIEW_DESC,
},
- {
- id: ExternalPageName.mlNodes,
- title: i18n.NODES_TITLE,
- landingIcon: IconEndpointLazy,
- description: i18n.NODES_DESC,
- },
{
id: ExternalPageName.mlFileUpload,
title: i18n.FILE_UPLOAD_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconFilebeatLazy,
description: i18n.FILE_UPLOAD_DESC,
},
{
id: ExternalPageName.mlIndexDataVisualizer,
title: i18n.INDEX_DATA_VISUALIZER_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconDataViewLazy,
description: i18n.INDEX_DATA_VISUALIZER_DESC,
},
{
id: ExternalPageName.mlDataComparison,
title: i18n.DATA_COMPARISON_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconRapidBarGraphLazy,
description: i18n.DATA_COMPARISON_DESC,
},
{
id: ExternalPageName.mlExplainLogRateSpikes,
title: i18n.LOG_RATE_ANALYSIS_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconFilebeatChartLazy,
description: i18n.LOG_RATE_ANALYSIS_DESC,
},
{
id: ExternalPageName.mlLogPatternAnalysis,
title: i18n.LOG_PATTERN_ANALYSIS_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconReplicationLazy,
description: i18n.LOG_PATTERN_ANALYSIS_DESC,
},
{
id: ExternalPageName.mlChangePointDetections,
title: i18n.CHANGE_POINT_DETECTIONS_TITLE,
- landingIcon: IconEndpointLazy,
+ landingIcon: IconIntuitiveLazy,
description: i18n.CHANGE_POINT_DETECTIONS_DESC,
},
];
diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts
index 500fcdd9da427..36a28d561bda5 100644
--- a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts
+++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts
@@ -69,6 +69,18 @@ export const NOTIFICATIONS_DESC = i18n.translate(
defaultMessage: 'Notifications page',
}
);
+export const MEMORY_USAGE_TITLE = i18n.translate(
+ 'xpack.securitySolutionServerless.navLinks.ml.memoryUsage.title',
+ {
+ defaultMessage: 'Memory usage',
+ }
+);
+export const MEMORY_USAGE_DESC = i18n.translate(
+ 'xpack.securitySolutionServerless.navLinks.ml.memoryUsage.desc',
+ {
+ defaultMessage: 'Memory usage page',
+ }
+);
export const ANOMALY_DETECTION_TITLE = i18n.translate(
'xpack.securitySolutionServerless.navLinks.ml.anomalyDetection.title',
{
@@ -90,7 +102,7 @@ export const ANOMALY_EXPLORER_TITLE = i18n.translate(
export const ANOMALY_EXPLORER_DESC = i18n.translate(
'xpack.securitySolutionServerless.navLinks.ml.anomalyExplorer.desc',
{
- defaultMessage: 'Anomaly explorer Page',
+ defaultMessage: 'Anomaly explorer page',
}
);
export const SINGLE_METRIC_VIEWER_TITLE = i18n.translate(
@@ -156,13 +168,13 @@ export const ANALYTICS_MAP_DESC = i18n.translate(
export const NODES_OVERVIEW_TITLE = i18n.translate(
'xpack.securitySolutionServerless.navLinks.ml.nodesOverview.title',
{
- defaultMessage: 'Model Management',
+ defaultMessage: 'Trained models',
}
);
export const NODES_OVERVIEW_DESC = i18n.translate(
'xpack.securitySolutionServerless.navLinks.ml.nodesOverview.desc',
{
- defaultMessage: 'Model Management page',
+ defaultMessage: 'Trained models page',
}
);
export const NODES_TITLE = i18n.translate(
diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/project_settings_links.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/project_settings_links.ts
index 643ec2e905298..69e560a929c09 100644
--- a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/project_settings_links.ts
+++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/project_settings_links.ts
@@ -11,12 +11,11 @@ import type { LinkItem } from '@kbn/security-solution-plugin/public';
import { ExternalPageName, SecurityPagePath } from '../constants';
import type { ProjectLinkCategory, ProjectNavigationLink } from '../types';
import {
- IconGraphLazy,
- IconLoggingLazy,
- IconIndexManagementLazy,
- IconSecurityShieldLazy,
IconMapServicesLazy,
- IconProductFeaturesAlertingLazy,
+ IconIndexManagementLazy,
+ IconUsersRolesLazy,
+ IconReportingLazy,
+ IconVisualizationLazy,
} from '../../../common/lazy_icons';
import * as i18n from './project_settings_translations';
@@ -43,7 +42,7 @@ export const createProjectSettingsLinkFromManage = (manageLink: LinkItem): LinkI
return {
...projectSettingsAppLink,
- links: projectSettingsSubLinks, // cloudDefend and endpoints links are added in the projectAppLinksSwitcher on runtime
+ links: projectSettingsSubLinks,
};
};
@@ -70,7 +69,6 @@ export const projectSettingsNavCategories: ProjectLinkCategory[] = [
categories: [
{
label: i18n.DATA_CATEGORY_TITLE,
- iconType: IconIndexManagementLazy,
linkIds: [
ExternalPageName.managementIndexManagement,
ExternalPageName.managementTransforms,
@@ -82,7 +80,6 @@ export const projectSettingsNavCategories: ProjectLinkCategory[] = [
},
{
label: i18n.ALERTS_INSIGHTS_CATEGORY_TITLE,
- iconType: IconProductFeaturesAlertingLazy,
linkIds: [
ExternalPageName.managementCases,
ExternalPageName.managementTriggersActionsConnectors,
@@ -91,7 +88,6 @@ export const projectSettingsNavCategories: ProjectLinkCategory[] = [
},
{
label: i18n.CONTENT_CATEGORY_TITLE,
- iconType: IconSecurityShieldLazy,
linkIds: [
ExternalPageName.managementObjects,
ExternalPageName.managementFiles,
@@ -101,7 +97,6 @@ export const projectSettingsNavCategories: ProjectLinkCategory[] = [
},
{
label: i18n.OTHER_CATEGORY_TITLE,
- iconType: IconMapServicesLazy,
linkIds: [ExternalPageName.managementApiKeys, ExternalPageName.managementSettings],
},
],
@@ -114,13 +109,13 @@ export const projectSettingsNavLinks: ProjectNavigationLink[] = [
id: ExternalPageName.cloudUsersAndRoles,
title: i18n.CLOUD_USERS_ROLES_TITLE,
description: i18n.CLOUD_USERS_ROLES_DESCRIPTION,
- landingIcon: IconGraphLazy,
+ landingIcon: IconUsersRolesLazy,
},
{
id: ExternalPageName.cloudBilling,
title: i18n.CLOUD_BILLING_TITLE,
description: i18n.CLOUD_BILLING_DESCRIPTION,
- landingIcon: IconLoggingLazy,
+ landingIcon: IconReportingLazy,
},
{
id: ExternalPageName.integrationsSecurity,
@@ -128,6 +123,18 @@ export const projectSettingsNavLinks: ProjectNavigationLink[] = [
description: i18n.INTEGRATIONS_DESCRIPTION,
landingIcon: IconIndexManagementLazy,
},
+ {
+ id: ExternalPageName.maps,
+ title: i18n.MAPS_TITLE,
+ description: i18n.MAPS_DESCRIPTION,
+ landingIcon: IconMapServicesLazy,
+ },
+ {
+ id: ExternalPageName.visualize,
+ title: i18n.VISUALIZE_TITLE,
+ description: i18n.VISUALIZE_DESCRIPTION,
+ landingIcon: IconVisualizationLazy,
+ },
{
id: ExternalPageName.managementIndexManagement,
title: i18n.MANAGEMENT_INDEX_MANAGEMENT_TITLE,
@@ -188,16 +195,4 @@ export const projectSettingsNavLinks: ProjectNavigationLink[] = [
id: ExternalPageName.managementSettings,
title: i18n.MANAGEMENT_SETTINGS_TITLE,
},
- {
- id: ExternalPageName.maps,
- title: i18n.MAPS_TITLE,
- description: i18n.MAPS_DESCRIPTION,
- landingIcon: IconGraphLazy,
- },
- {
- id: ExternalPageName.visualize,
- title: i18n.VISUALIZE_TITLE,
- description: i18n.VISUALIZE_DESCRIPTION,
- landingIcon: IconGraphLazy,
- },
];
diff --git a/x-pack/plugins/security_solution_serverless/server/endpoint/constants/metering.ts b/x-pack/plugins/security_solution_serverless/server/endpoint/constants/metering.ts
index 59d0e63c510e5..c4647e9bb8b10 100644
--- a/x-pack/plugins/security_solution_serverless/server/endpoint/constants/metering.ts
+++ b/x-pack/plugins/security_solution_serverless/server/endpoint/constants/metering.ts
@@ -14,4 +14,5 @@ export const METERING_TASK = {
SAMPLE_PERIOD_SECONDS: 3600,
THRESHOLD_MINUTES: 30,
USAGE_TYPE_PREFIX: 'security_solution_',
+ MISSING_PROJECT_ID: 'missing_project_id',
};
diff --git a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.test.ts b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.test.ts
index 58265076ce1c4..e459fdcff3bde 100644
--- a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.test.ts
+++ b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.test.ts
@@ -96,7 +96,7 @@ describe('EndpointMeteringService', () => {
const usageRecords = await endpointMeteringService.getUsageRecords(args);
expect(usageRecords[0]).toEqual({
- id: `endpoint-${agentId}-${timestamp}`,
+ id: `endpoint-${agentId}-${timestamp.toISOString()}`,
usage_timestamp: heartbeatDocSrc!.event.ingested,
creation_timestamp: heartbeatDocSrc!.event.ingested,
usage: {
@@ -140,7 +140,7 @@ describe('EndpointMeteringService', () => {
: `${ProductLine.cloud}_${ProductLine.endpoint}`;
expect(usageRecords[0]).toEqual({
- id: `endpoint-${agentId}-${timestamp}`,
+ id: `endpoint-${agentId}-${timestamp.toISOString()}`,
usage_timestamp: heartbeatDocSrc!.event.ingested,
creation_timestamp: heartbeatDocSrc!.event.ingested,
usage: {
diff --git a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts
index efa23e6698a3a..765ffcfeb76a4 100644
--- a/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts
+++ b/x-pack/plugins/security_solution_serverless/server/endpoint/services/metering_service.ts
@@ -6,7 +6,7 @@
*/
import type { AggregationsAggregate, SearchResponse } from '@elastic/elasticsearch/lib/api/types';
-import type { ElasticsearchClient } from '@kbn/core/server';
+import type { ElasticsearchClient, Logger } from '@kbn/core/server';
import { ENDPOINT_HEARTBEAT_INDEX } from '@kbn/security-solution-plugin/common/endpoint/constants';
import type { EndpointHeartbeat } from '@kbn/security-solution-plugin/common/endpoint/types';
@@ -14,6 +14,7 @@ import { ProductLine, ProductTier } from '../../../common/product';
import type { UsageRecord, MeteringCallbackInput } from '../../types';
import type { ServerlessSecurityConfig } from '../../config';
+
import { METERING_TASK } from '../constants/metering';
export class EndpointMeteringService {
@@ -27,6 +28,7 @@ export class EndpointMeteringService {
abortController,
lastSuccessfulReport,
config,
+ logger,
}: MeteringCallbackInput): Promise => {
this.setType(config);
if (!this.type) {
@@ -52,6 +54,7 @@ export class EndpointMeteringService {
const { agent, event } = _source;
const record = this.buildMeteringRecord({
+ logger,
agentId: agent.id,
timestampStr: event.ingested,
taskId,
@@ -87,11 +90,13 @@ export class EndpointMeteringService {
}
private buildMeteringRecord({
+ logger,
agentId,
timestampStr,
taskId,
- projectId = '',
+ projectId,
}: {
+ logger: Logger;
agentId: string;
timestampStr: string;
taskId: string;
@@ -102,10 +107,10 @@ export class EndpointMeteringService {
timestamp.setSeconds(0);
timestamp.setMilliseconds(0);
- return {
+ const usageRecord = {
// keep endpoint instead of this.type as id prefix so
// we don't double count in the event of add-on changes
- id: `endpoint-${agentId}-${timestamp}`,
+ id: `endpoint-${agentId}-${timestamp.toISOString()}`,
usage_timestamp: timestampStr,
creation_timestamp: timestampStr,
usage: {
@@ -116,12 +121,18 @@ export class EndpointMeteringService {
},
source: {
id: taskId,
- instance_group_id: projectId,
+ instance_group_id: projectId || METERING_TASK.MISSING_PROJECT_ID,
metadata: {
tier: this.tier,
},
},
};
+
+ if (!projectId) {
+ logger.error(`project id missing for record: ${JSON.stringify(usageRecord)}`);
+ }
+
+ return usageRecord;
}
private setType(config: ServerlessSecurityConfig) {
diff --git a/x-pack/plugins/security_solution_serverless/server/plugin.ts b/x-pack/plugins/security_solution_serverless/server/plugin.ts
index 950b5837fe02b..5d85f31de8c16 100644
--- a/x-pack/plugins/security_solution_serverless/server/plugin.ts
+++ b/x-pack/plugins/security_solution_serverless/server/plugin.ts
@@ -72,7 +72,7 @@ export class SecuritySolutionServerlessPlugin
logFactory: this.initializerContext.logger,
config: this.config,
taskManager: pluginsSetup.taskManager,
- cloudSetup: pluginsSetup.cloudSetup,
+ cloudSetup: pluginsSetup.cloud,
taskType: cloudSecurityMetringTaskProperties.taskType,
taskTitle: cloudSecurityMetringTaskProperties.taskTitle,
version: cloudSecurityMetringTaskProperties.version,
@@ -88,7 +88,7 @@ export class SecuritySolutionServerlessPlugin
version: ENDPOINT_METERING_TASK.VERSION,
meteringCallback: endpointMeteringService.getUsageRecords,
taskManager: pluginsSetup.taskManager,
- cloudSetup: pluginsSetup.cloudSetup,
+ cloudSetup: pluginsSetup.cloud,
});
pluginsSetup.serverless.setupProjectSettings(SECURITY_PROJECT_SETTINGS);
diff --git a/x-pack/plugins/security_solution_serverless/server/types.ts b/x-pack/plugins/security_solution_serverless/server/types.ts
index 1beca2fc23b9d..5c2aa0818cfd2 100644
--- a/x-pack/plugins/security_solution_serverless/server/types.ts
+++ b/x-pack/plugins/security_solution_serverless/server/types.ts
@@ -38,7 +38,7 @@ export interface SecuritySolutionServerlessPluginSetupDeps {
features: PluginSetupContract;
ml: MlPluginSetup;
taskManager: TaskManagerSetupContract;
- cloudSetup: CloudSetup;
+ cloud: CloudSetup;
}
export interface SecuritySolutionServerlessPluginStartDeps {
diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx
index 63d0b0d36fe53..0077a035d1e8d 100644
--- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx
+++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/query_form_type_chooser.tsx
@@ -7,6 +7,7 @@
import React, { useMemo } from 'react';
import {
+ EuiBetaBadge,
EuiButtonIcon,
EuiFlexGroup,
EuiFlexItem,
@@ -21,6 +22,24 @@ import { i18n } from '@kbn/i18n';
import { SearchType } from '../types';
import { useTriggerUiActionServices } from '../util';
+export const ExperimentalBadge = React.memo(() => (
+
+));
+ExperimentalBadge.displayName = 'ExperimentalBadge';
+
export interface QueryFormTypeProps {
searchType: SearchType | null;
onFormTypeSelect: (formType: SearchType | null) => void;
@@ -94,9 +113,18 @@ export const QueryFormTypeChooser: React.FC = ({
<>
-
- {activeFormTypeItem?.label}
-
+
+
+
+ {activeFormTypeItem?.label}
+
+
+ {activeFormTypeItem?.formType === SearchType.esqlQuery && (
+
+
+
+ )}
+
= ({
color="primary"
label={
- {item.label}
+
+
+ {item.label}
+
+ {item.formType === SearchType.esqlQuery && (
+
+
+
+ )}
+
{item.description}
diff --git a/x-pack/plugins/stack_connectors/common/gen_ai/schema.ts b/x-pack/plugins/stack_connectors/common/gen_ai/schema.ts
index 860976834076b..f82b89ee7c2b6 100644
--- a/x-pack/plugins/stack_connectors/common/gen_ai/schema.ts
+++ b/x-pack/plugins/stack_connectors/common/gen_ai/schema.ts
@@ -60,8 +60,8 @@ export const GenAiRunActionResponseSchema = schema.object(
},
{ unknowns: 'ignore' }
),
- finish_reason: schema.string(),
- index: schema.number(),
+ finish_reason: schema.maybe(schema.string()),
+ index: schema.maybe(schema.number()),
},
{ unknowns: 'ignore' }
)
diff --git a/x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts
index 41daa9d2148ad..1aa698e715db2 100644
--- a/x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts
+++ b/x-pack/plugins/synthetics/common/runtime_types/monitor/index.ts
@@ -5,5 +5,4 @@
* 2.0.
*/
-export * from './locations';
export * from './state';
diff --git a/x-pack/plugins/synthetics/common/runtime_types/monitor/locations.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor/locations.ts
deleted file mode 100644
index e37621c47ddf9..0000000000000
--- a/x-pack/plugins/synthetics/common/runtime_types/monitor/locations.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
- * or more contributor license agreements. Licensed under the Elastic License
- * 2.0; you may not use this file except in compliance with the Elastic License
- * 2.0.
- */
-
-import * as t from 'io-ts';
-import { CheckGeoType, SummaryType } from '../common';
-
-// IO type for validation
-export const MonitorLocationType = t.type({
- up_history: t.number,
- down_history: t.number,
- timestamp: t.string,
- summary: SummaryType,
- geo: CheckGeoType,
-});
-
-// Typescript type for type checking
-export type MonitorLocation = t.TypeOf;
-
-export const MonitorLocationsType = t.intersection([
- t.type({
- monitorId: t.string,
- up_history: t.number,
- down_history: t.number,
- }),
- t.partial({ locations: t.array(MonitorLocationType) }),
-]);
-export type MonitorLocations = t.TypeOf;
diff --git a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts
index 99ce709c2672e..af2304acb9e24 100644
--- a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts
+++ b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts
@@ -46,6 +46,10 @@ export const TLSSensitiveFieldsCodec = t.partial({
export const TLSCodec = t.intersection([TLSFieldsCodec, TLSSensitiveFieldsCodec]);
+const MonitorLocationsCodec = t.array(t.union([MonitorServiceLocationCodec, PrivateLocationCodec]));
+
+export type MonitorLocations = t.TypeOf;
+
// CommonFields
export const CommonFieldsCodec = t.intersection([
t.interface({
@@ -56,7 +60,7 @@ export const CommonFieldsCodec = t.intersection([
[ConfigKey.SCHEDULE]: ScheduleCodec,
[ConfigKey.APM_SERVICE_NAME]: t.string,
[ConfigKey.TAGS]: t.array(t.string),
- [ConfigKey.LOCATIONS]: t.array(t.union([MonitorServiceLocationCodec, PrivateLocationCodec])),
+ [ConfigKey.LOCATIONS]: MonitorLocationsCodec,
[ConfigKey.MONITOR_QUERY_ID]: t.string,
[ConfigKey.CONFIG_ID]: t.string,
}),
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/permissions.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/permissions.tsx
index 425a1f2ee0c60..f9dd560e4742e 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/permissions.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/components/permissions.tsx
@@ -30,12 +30,14 @@ export const FleetPermissionsCallout = () => {
*/
export const NoPermissionsTooltip = ({
canEditSynthetics = true,
+ canUsePublicLocations = true,
children,
}: {
canEditSynthetics?: boolean;
+ canUsePublicLocations?: boolean;
children: ReactNode;
}) => {
- const disabledMessage = getRestrictionReasonLabel(canEditSynthetics);
+ const disabledMessage = getRestrictionReasonLabel(canEditSynthetics, canUsePublicLocations);
if (disabledMessage) {
return (
@@ -47,8 +49,16 @@ export const NoPermissionsTooltip = ({
return <>{children}>;
};
-function getRestrictionReasonLabel(canEditSynthetics = true): string | undefined {
- return !canEditSynthetics ? CANNOT_PERFORM_ACTION_SYNTHETICS : undefined;
+function getRestrictionReasonLabel(
+ canEditSynthetics = true,
+ canUsePublicLocations = true
+): string | undefined {
+ const message = !canEditSynthetics ? CANNOT_PERFORM_ACTION_SYNTHETICS : undefined;
+ if (message) {
+ return message;
+ }
+
+ return !canUsePublicLocations ? CANNOT_PERFORM_ACTION_PUBLIC_LOCATIONS : undefined;
}
export const NEED_PERMISSIONS_PRIVATE_LOCATIONS = i18n.translate(
@@ -83,3 +93,10 @@ export const CANNOT_PERFORM_ACTION_SYNTHETICS = i18n.translate(
defaultMessage: 'You do not have sufficient permissions to perform this action.',
}
);
+
+export const CANNOT_PERFORM_ACTION_PUBLIC_LOCATIONS = i18n.translate(
+ 'xpack.synthetics.monitorManagement.canUsePublicLocations',
+ {
+ defaultMessage: 'You do not have sufficient permissions to use Elastic managed locations.',
+ }
+);
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx
index 67c49f6030208..a7ab9c4e7d56f 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/field_config.tsx
@@ -78,6 +78,7 @@ import {
ResponseCheckJSON,
ThrottlingConfig,
RequestBodyCheck,
+ SourceType,
} from '../types';
import { AlertConfigKey, ALLOWED_SCHEDULES_IN_MINUTES } from '../constants';
import { getDefaultFormFields } from './defaults';
@@ -404,8 +405,8 @@ export const FIELD = (readOnly?: boolean): FieldMap => ({
props: ({ field, setValue, locations, trigger }) => {
return {
options: Object.values(locations).map((location) => ({
- label: locations?.find((loc) => location.id === loc.id)?.label || '',
- id: location.id || '',
+ label: location.label,
+ id: location.id,
isServiceManaged: location.isServiceManaged || false,
isInvalid: location.isInvalid,
disabled: location.isInvalid,
@@ -417,7 +418,9 @@ export const FIELD = (readOnly?: boolean): FieldMap => ({
: location.isServiceManaged
? 'default'
: 'primary',
- label: locations?.find((loc) => location.id === loc.id)?.label ?? location.id,
+ label:
+ (location.label || locations?.find((loc) => location.id === loc.id)?.label) ??
+ location.id,
id: location.id || '',
isServiceManaged: location.isServiceManaged || false,
})),
@@ -483,66 +486,78 @@ export const FIELD = (readOnly?: boolean): FieldMap => ({
helpText: i18n.translate('xpack.synthetics.monitorConfig.edit.enabled.label', {
defaultMessage: `When disabled, the monitor doesn't run any tests. You can enable it at any time.`,
}),
- props: ({ setValue, field, trigger }): EuiSwitchProps => ({
- id: 'syntheticsMontiorConfigIsEnabled',
- label: i18n.translate('xpack.synthetics.monitorConfig.enabled.label', {
- defaultMessage: 'Enable Monitor',
- }),
- checked: field?.value || false,
- onChange: async (event) => {
- setValue(ConfigKey.ENABLED, !!event.target.checked);
- await trigger(ConfigKey.ENABLED);
- },
- 'data-test-subj': 'syntheticsEnableSwitch',
- // enabled is an allowed field for read only
- // isDisabled: readOnly,
- }),
+ props: ({ setValue, field, trigger, formState }): EuiSwitchProps => {
+ const isProjectMonitor =
+ formState.defaultValues?.[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT;
+ return {
+ id: 'syntheticsMontiorConfigIsEnabled',
+ label: i18n.translate('xpack.synthetics.monitorConfig.enabled.label', {
+ defaultMessage: 'Enable Monitor',
+ }),
+ checked: field?.value || false,
+ onChange: async (event) => {
+ setValue(ConfigKey.ENABLED, !!event.target.checked);
+ await trigger(ConfigKey.ENABLED);
+ },
+ 'data-test-subj': 'syntheticsEnableSwitch',
+ // enabled is an allowed field for read only
+ disabled: !isProjectMonitor && readOnly,
+ };
+ },
},
[AlertConfigKey.STATUS_ENABLED]: {
fieldKey: AlertConfigKey.STATUS_ENABLED,
component: Switch,
controlled: true,
- props: ({ setValue, field, trigger }): EuiSwitchProps => ({
- id: 'syntheticsMonitorConfigIsAlertEnabled',
- label: field?.value
- ? i18n.translate('xpack.synthetics.monitorConfig.enabledAlerting.label', {
- defaultMessage: 'Disable status alerts on this monitor',
- })
- : i18n.translate('xpack.synthetics.monitorConfig.disabledAlerting.label', {
- defaultMessage: 'Enable status alerts on this monitor',
- }),
- checked: field?.value || false,
- onChange: async (event) => {
- setValue(AlertConfigKey.STATUS_ENABLED, !!event.target.checked);
- await trigger(AlertConfigKey.STATUS_ENABLED);
- },
- 'data-test-subj': 'syntheticsAlertStatusSwitch',
- // alert config is an allowed field for read only
- // isDisabled: readOnly,
- }),
+ props: ({ setValue, field, trigger, formState }): EuiSwitchProps => {
+ const isProjectMonitor =
+ formState.defaultValues?.[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT;
+ return {
+ id: 'syntheticsMonitorConfigIsAlertEnabled',
+ label: field?.value
+ ? i18n.translate('xpack.synthetics.monitorConfig.enabledAlerting.label', {
+ defaultMessage: 'Disable status alerts on this monitor',
+ })
+ : i18n.translate('xpack.synthetics.monitorConfig.disabledAlerting.label', {
+ defaultMessage: 'Enable status alerts on this monitor',
+ }),
+ checked: field?.value || false,
+ onChange: async (event) => {
+ setValue(AlertConfigKey.STATUS_ENABLED, !!event.target.checked);
+ await trigger(AlertConfigKey.STATUS_ENABLED);
+ },
+ 'data-test-subj': 'syntheticsAlertStatusSwitch',
+ // alert config is an allowed field for read only
+ disabled: !isProjectMonitor && readOnly,
+ };
+ },
},
[AlertConfigKey.TLS_ENABLED]: {
fieldKey: AlertConfigKey.TLS_ENABLED,
component: Switch,
controlled: true,
- props: ({ setValue, field, trigger }): EuiSwitchProps => ({
- id: 'syntheticsMonitorConfigIsTlsAlertEnabled',
- label: field?.value
- ? i18n.translate('xpack.synthetics.monitorConfig.edit.alertTlsEnabled.label', {
- defaultMessage: 'Disable TLS alerts on this monitor.',
- })
- : i18n.translate('xpack.synthetics.monitorConfig.create.alertTlsEnabled.label', {
- defaultMessage: 'Enable TLS alerts on this monitor.',
- }),
- checked: field?.value || false,
- onChange: async (event) => {
- setValue(AlertConfigKey.TLS_ENABLED, !!event.target.checked);
- await trigger(AlertConfigKey.TLS_ENABLED);
- },
- 'data-test-subj': 'syntheticsAlertStatusSwitch',
- // alert config is an allowed field for read only
- // isDisabled: readOnly,
- }),
+ props: ({ setValue, field, trigger, formState }): EuiSwitchProps => {
+ const isProjectMonitor =
+ formState.defaultValues?.[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT;
+ return {
+ id: 'syntheticsMonitorConfigIsTlsAlertEnabled',
+ label: field?.value
+ ? i18n.translate('xpack.synthetics.monitorConfig.edit.alertTlsEnabled.label', {
+ defaultMessage: 'Disable TLS alerts on this monitor.',
+ })
+ : i18n.translate('xpack.synthetics.monitorConfig.create.alertTlsEnabled.label', {
+ defaultMessage: 'Enable TLS alerts on this monitor.',
+ }),
+ checked: field?.value || false,
+ onChange: async (event) => {
+ setValue(AlertConfigKey.TLS_ENABLED, !!event.target.checked);
+ await trigger(AlertConfigKey.TLS_ENABLED);
+ },
+ 'data-test-subj': 'syntheticsAlertStatusSwitch',
+ // alert config is an allowed field for read only
+ disabled: !isProjectMonitor && readOnly,
+ };
+ },
},
[ConfigKey.TAGS]: {
fieldKey: ConfigKey.TAGS,
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/index.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/index.tsx
index 33c8ec03e5ff9..bfd7ac5149a88 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/index.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/index.tsx
@@ -18,7 +18,8 @@ export const MonitorForm: React.FC<{
defaultValues?: SyntheticsMonitor;
space?: string;
readOnly?: boolean;
-}> = ({ children, defaultValues, space, readOnly = false }) => {
+ canUsePublicLocations: boolean;
+}> = ({ children, defaultValues, space, readOnly = false, canUsePublicLocations }) => {
const methods = useFormWrapped({
mode: 'onSubmit',
reValidateMode: 'onSubmit',
@@ -43,7 +44,7 @@ export const MonitorForm: React.FC<{
>
{children}
-
+
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx
index 4b73d71b90b09..316e57e4a5065 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx
@@ -16,7 +16,11 @@ import { format } from './formatter';
import { MonitorFields as MonitorFieldsType } from '../../../../../../common/runtime_types';
import { runOnceMonitor } from '../../../state/manual_test_runs/api';
-export const RunTestButton = () => {
+export const RunTestButton = ({
+ canUsePublicLocations = true,
+}: {
+ canUsePublicLocations?: boolean;
+}) => {
const { formState, getValues, handleSubmit } = useFormContext();
const [inProgress, setInProgress] = useState(false);
@@ -56,7 +60,7 @@ export const RunTestButton = () => {
{
+export const ActionBar = ({
+ readOnly = false,
+ canUsePublicLocations = true,
+}: {
+ readOnly: boolean;
+ canUsePublicLocations: boolean;
+}) => {
const { monitorId } = useParams<{ monitorId: string }>();
const history = useHistory();
const {
@@ -59,6 +65,7 @@ export const ActionBar = ({ readOnly = false }: { readOnly: boolean }) => {
onClick={() => {
setMonitorPendingDeletion(defaultValues as SyntheticsMonitor);
}}
+ isDisabled={!canEditSynthetics || !canUsePublicLocations}
>
{DELETE_MONITOR_LABEL}
@@ -75,16 +82,19 @@ export const ActionBar = ({ readOnly = false }: { readOnly: boolean }) => {
-
+
-
+
{isEdit ? UPDATE_MONITOR_LABEL : CREATE_MONITOR_LABEL}
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx
index 69b53c24d4cbc..16573ce19f57a 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx
@@ -12,6 +12,7 @@ import { EuiEmptyPrompt } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { useTrackPageview, useFetcher } from '@kbn/observability-shared-plugin/public';
import { IHttpFetchError, ResponseErrorBody } from '@kbn/core-http-browser';
+import { useCanUsePublicLocations } from '../../../../hooks/use_capabilities';
import { EditMonitorNotFound } from './edit_monitor_not_found';
import { LoadingState } from '../monitors_page/overview/overview/monitor_detail_flyout';
import { ConfigKey, SourceType } from '../../../../../common/runtime_types';
@@ -50,11 +51,15 @@ export const MonitorEditPage: React.FC = () => {
data?.id
);
+ const canUsePublicLocations = useCanUsePublicLocations(data?.[ConfigKey.LOCATIONS]);
+
if (monitorNotFoundError) {
return ;
}
- const isReadOnly = data?.[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT;
+ const isReadOnly =
+ data?.[ConfigKey.MONITOR_SOURCE_TYPE] === SourceType.PROJECT || !canUsePublicLocations;
+
const projectId = data?.[ConfigKey.PROJECT_ID];
if (locationsError) {
@@ -87,8 +92,13 @@ export const MonitorEditPage: React.FC = () => {
return data && locationsLoaded && !loading && !error ? (
<>
-
+
{
@@ -32,12 +34,9 @@ export const MonitorSteps = ({
return (
<>
- {readOnly ? (
- <>
-
-
- >
- ) : null}
+ {isEditFlow && (
+
+ )}
{isEditFlow ? (
steps.map((step) => (
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/read_only_callout.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/read_only_callout.tsx
index d20453be1c2ed..6f6f4533bb7dc 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/read_only_callout.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/read_only_callout.tsx
@@ -5,27 +5,65 @@
* 2.0.
*/
import React from 'react';
-import { EuiCallOut } from '@elastic/eui';
+import { EuiCallOut, EuiSpacer } from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
-export const ReadOnlyCallout = ({ projectId }: { projectId?: string }) => {
- return (
-
- }
- iconType="document"
- >
-
- {projectId} }}
- />
-
-
- );
+export const ReadOnlyCallout = ({
+ projectId,
+ canUsePublicLocations,
+}: {
+ projectId?: string;
+ canUsePublicLocations?: boolean;
+}) => {
+ if (projectId) {
+ return (
+ <>
+
+ }
+ iconType="document"
+ >
+
+ {projectId} }}
+ />
+
+
+
+ >
+ );
+ }
+
+ if (!canUsePublicLocations) {
+ return (
+ <>
+
+ }
+ iconType="alert"
+ >
+
+
+
+
+
+ >
+ );
+ }
+
+ return null;
};
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_selected_location.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_selected_location.tsx
index df9785bb9b98c..eabea42a34162 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_selected_location.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/hooks/use_selected_location.tsx
@@ -7,6 +7,7 @@
import { useEffect, useMemo } from 'react';
import { useDispatch, useSelector } from 'react-redux';
+import { ServiceLocation } from '../../../../../../common/runtime_types';
import { useSelectedMonitor } from './use_selected_monitor';
import { selectSelectedLocationId, setMonitorDetailsLocationAction } from '../../../state';
import { useUrlParams, useLocations } from '../../../hooks';
@@ -41,8 +42,12 @@ export const useSelectedLocation = (updateUrl = true) => {
monitor?.locations,
]);
- return useMemo(
- () => locations.find((loc) => loc.id === urlLocationId) ?? null,
- [urlLocationId, locations]
- );
+ return useMemo(() => {
+ let selLoc = locations.find((loc) => loc.id === urlLocationId) ?? null;
+ if (!selLoc) {
+ selLoc =
+ (monitor?.locations?.find((loc) => loc.id === urlLocationId) as ServiceLocation) ?? null;
+ }
+ return selLoc;
+ }, [locations, urlLocationId, monitor?.locations]);
};
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/run_test_manually.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/run_test_manually.tsx
index 55fb54dd0d0dc..a05bea3f7925e 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/run_test_manually.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/run_test_manually.tsx
@@ -9,6 +9,9 @@ import { EuiButton, EuiToolTip } from '@elastic/eui';
import React from 'react';
import { i18n } from '@kbn/i18n';
import { useDispatch, useSelector } from 'react-redux';
+import { CANNOT_PERFORM_ACTION_PUBLIC_LOCATIONS } from '../common/components/permissions';
+import { useCanUsePublicLocations } from '../../../../hooks/use_capabilities';
+import { ConfigKey } from '../../../../../common/constants/monitor_management';
import { TEST_NOW_ARIA_LABEL, TEST_SCHEDULED_LABEL } from '../monitor_add_edit/form/run_test_btn';
import { useSelectedMonitor } from './hooks/use_selected_monitor';
import {
@@ -22,7 +25,13 @@ export const RunTestManually = () => {
const { monitor } = useSelectedMonitor();
const testInProgress = useSelector(manualTestRunInProgressSelector(monitor?.config_id));
- const content = testInProgress ? TEST_SCHEDULED_LABEL : TEST_NOW_ARIA_LABEL;
+ const canUsePublicLocations = useCanUsePublicLocations(monitor?.[ConfigKey.LOCATIONS]);
+
+ const content = !canUsePublicLocations
+ ? CANNOT_PERFORM_ACTION_PUBLIC_LOCATIONS
+ : testInProgress
+ ? TEST_SCHEDULED_LABEL
+ : TEST_NOW_ARIA_LABEL;
return (
@@ -31,6 +40,7 @@ export const RunTestManually = () => {
color="success"
iconType="beaker"
isLoading={!Boolean(monitor) || testInProgress}
+ isDisabled={!canUsePublicLocations}
onClick={() => {
if (monitor) {
dispatch(
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_can_use_public_loc_id.ts b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_can_use_public_loc_id.ts
new file mode 100644
index 0000000000000..16842a401dc46
--- /dev/null
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/hooks/use_can_use_public_loc_id.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 { useSelector } from 'react-redux';
+import { useKibana } from '@kbn/kibana-react-plugin/public';
+import { selectOverviewState } from '../../../state';
+
+export const useCanUsePublicLocById = (configId: string) => {
+ const {
+ data: { monitors },
+ } = useSelector(selectOverviewState);
+
+ const hasManagedLocation = monitors?.filter(
+ (mon) => mon.configId === configId && mon.location.isServiceManaged
+ );
+
+ const canUsePublicLocations =
+ useKibana().services?.application?.capabilities.uptime.elasticManagedLocationsEnabled ?? true;
+
+ return hasManagedLocation ? !!canUsePublicLocations : true;
+};
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/columns.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/columns.tsx
index 0c415ce3d4fb8..6d9c97df97d52 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/columns.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/columns.tsx
@@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n';
import React from 'react';
import { useHistory } from 'react-router-dom';
import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public';
+import { useKibana } from '@kbn/kibana-react-plugin/public';
import { useCanEditSynthetics } from '../../../../../../hooks/use_capabilities';
import {
isStatusEnabled,
@@ -55,6 +56,15 @@ export function useMonitorListColumns({
return alertStatus(fields[ConfigKey.CONFIG_ID]) === FETCH_STATUS.LOADING;
};
+ const canUsePublicLocations =
+ useKibana().services?.application?.capabilities.uptime.elasticManagedLocationsEnabled ?? true;
+
+ const isPublicLocationsAllowed = (fields: EncryptedSyntheticsSavedMonitor) => {
+ const publicLocations = fields.locations.some((loc) => loc.isServiceManaged);
+
+ return publicLocations ? Boolean(canUsePublicLocations) : true;
+ };
+
const columns: Array> = [
{
align: 'left' as const,
@@ -166,14 +176,18 @@ export function useMonitorListColumns({
'data-test-subj': 'syntheticsMonitorEditAction',
isPrimary: true,
name: (fields) => (
-
+
{labels.EDIT_LABEL}
),
description: labels.EDIT_LABEL,
icon: 'pencil' as const,
type: 'icon' as const,
- enabled: (fields) => canEditSynthetics && !isActionLoading(fields),
+ enabled: (fields) =>
+ canEditSynthetics && !isActionLoading(fields) && isPublicLocationsAllowed(fields),
onClick: (fields) => {
history.push({
pathname: `/edit-monitor/${fields[ConfigKey.CONFIG_ID]}`,
@@ -184,7 +198,10 @@ export function useMonitorListColumns({
'data-test-subj': 'syntheticsMonitorDeleteAction',
isPrimary: true,
name: (fields) => (
-
+
{labels.DELETE_LABEL}
),
@@ -192,7 +209,8 @@ export function useMonitorListColumns({
icon: 'trash' as const,
type: 'icon' as const,
color: 'danger' as const,
- enabled: (fields) => canEditSynthetics && !isActionLoading(fields),
+ enabled: (fields) =>
+ canEditSynthetics && !isActionLoading(fields) && isPublicLocationsAllowed(fields),
onClick: (fields) => {
setMonitorPendingDeletion(fields);
},
@@ -207,7 +225,8 @@ export function useMonitorListColumns({
isStatusEnabled(fields[ConfigKey.ALERT_CONFIG]) ? 'bellSlash' : 'bell',
type: 'icon' as const,
color: 'danger' as const,
- enabled: (fields) => canEditSynthetics && !isActionLoading(fields),
+ enabled: (fields) =>
+ canEditSynthetics && !isActionLoading(fields) && isPublicLocationsAllowed(fields),
onClick: (fields) => {
updateAlertEnabledState({
monitor: {
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx
index c875b923a15c7..29555c0cf1e90 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx
@@ -10,7 +10,10 @@ import { EuiSwitch, EuiSwitchEvent, EuiLoadingSpinner } from '@elastic/eui';
import { euiStyled } from '@kbn/kibana-react-plugin/common';
import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public';
import { ConfigKey, EncryptedSyntheticsMonitor } from '../../../../../../../common/runtime_types';
-import { useCanEditSynthetics } from '../../../../../../hooks/use_capabilities';
+import {
+ useCanEditSynthetics,
+ useCanUsePublicLocations,
+} from '../../../../../../hooks/use_capabilities';
import { useMonitorEnableHandler } from '../../../../hooks';
import { NoPermissionsTooltip } from '../../../common/components/permissions';
import * as labels from './labels';
@@ -32,6 +35,8 @@ export const MonitorEnabled = ({
}: Props) => {
const canEditSynthetics = useCanEditSynthetics();
+ const canUsePublicLocations = useCanUsePublicLocations(monitor?.[ConfigKey.LOCATIONS]);
+
const monitorName = monitor[ConfigKey.NAME];
const statusLabels = useMemo(() => {
return {
@@ -63,11 +68,14 @@ export const MonitorEnabled = ({
{isLoading || initialLoading ? (
) : (
-
+
{
const locationsToDisplay = locations
.map((loc) => {
+ if (loc.label) {
+ return {
+ id: loc.id,
+ label: loc.label,
+ ...getLocationStatusColor(theme, loc.id, monitorId, status),
+ };
+ }
const fullLoc = allLocations.find((l) => l.id === loc.id);
if (fullLoc) {
return {
id: fullLoc.id,
label: fullLoc.label,
- ...getLocationStatusColor(theme, fullLoc.label, monitorId, status),
+ ...getLocationStatusColor(theme, fullLoc.id, monitorId, status),
};
}
})
@@ -41,7 +48,7 @@ export const MonitorLocations = ({ locations, monitorId, status }: Props) => {
function getLocationStatusColor(
euiTheme: ReturnType,
- locationLabel: string | undefined,
+ locationId: string,
monitorId: string,
overviewStatus: OverviewStatusState | null
) {
@@ -49,7 +56,7 @@ function getLocationStatusColor(
eui: { euiColorVis9, euiColorVis0, euiColorDisabled },
} = euiTheme;
- const locById = `${monitorId}-${locationLabel}`;
+ const locById = `${monitorId}-${locationId}`;
if (overviewStatus?.downConfigs[locById]) {
return { status: 'down', color: euiColorVis9 };
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx
index ad3c29a0f77bf..55dcdb3d06341 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx
@@ -14,10 +14,13 @@ import {
EuiPanel,
EuiLoadingSpinner,
EuiContextMenuPanelItemDescriptor,
+ EuiToolTip,
} from '@elastic/eui';
import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public';
import { useDispatch, useSelector } from 'react-redux';
import styled from 'styled-components';
+import { TEST_SCHEDULED_LABEL } from '../../../monitor_add_edit/form/run_test_btn';
+import { useCanUsePublicLocById } from '../../hooks/use_can_use_public_loc_id';
import { toggleStatusAlert } from '../../../../../../../common/runtime_types/monitor_management/alert_config';
import {
manualTestMonitorAction,
@@ -101,8 +104,7 @@ export function ActionsPopover({
}: Props) {
const euiShadow = useEuiShadow('l');
const dispatch = useDispatch();
- const location = useLocationName({ locationId });
- const locationName = location?.label || monitor.location.id;
+ const locationName = useLocationName(monitor);
const detailUrl = useMonitorDetailLocator({
configId: monitor.configId,
@@ -112,6 +114,8 @@ export function ActionsPopover({
const canEditSynthetics = useCanEditSynthetics();
+ const canUsePublicLocations = useCanUsePublicLocById(monitor.configId);
+
const labels = useMemo(
() => ({
enabledSuccessLabel: enabledSuccessLabel(monitor.name),
@@ -163,7 +167,6 @@ export function ActionsPopover({
};
const alertLoading = alertStatus(monitor.configId) === FETCH_STATUS.LOADING;
-
let popoverItems: EuiContextMenuPanelItemDescriptor[] = [
{
name: actionsMenuGoToMonitorName,
@@ -172,9 +175,17 @@ export function ActionsPopover({
},
quickInspectPopoverItem,
{
- name: runTestManually,
+ name: testInProgress ? (
+
+ {runTestManually}
+
+ ) : (
+
+ {runTestManually}
+
+ ),
icon: 'beaker',
- disabled: testInProgress,
+ disabled: testInProgress || !canUsePublicLocations,
onClick: () => {
dispatch(manualTestMonitorAction.get({ configId: monitor.configId, name: monitor.name }));
dispatch(setFlyoutConfig(null));
@@ -193,12 +204,15 @@ export function ActionsPopover({
},
{
name: (
-
+
{enableLabel}
),
icon: 'invert',
- disabled: !canEditSynthetics,
+ disabled: !canEditSynthetics || !canUsePublicLocations,
onClick: () => {
if (status !== FETCH_STATUS.LOADING) {
updateMonitorEnabledState(!monitor.isEnabled);
@@ -207,11 +221,14 @@ export function ActionsPopover({
},
{
name: (
-
+
{monitor.isStatusAlertEnabled ? disableAlertLabel : enableMonitorAlertLabel}
),
- disabled: !canEditSynthetics,
+ disabled: !canEditSynthetics || !canUsePublicLocations,
icon: alertLoading ? (
) : monitor.isStatusAlertEnabled ? (
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx
index ce6de294d7e60..8cd43387cf710 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx
@@ -64,8 +64,7 @@ export const MetricItem = ({
const [isMouseOver, setIsMouseOver] = useState(false);
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
const isErrorPopoverOpen = useSelector(selectErrorPopoverState);
- const locationName =
- useLocationName({ locationId: monitor.location.id })?.label || monitor.location?.id;
+ const locationName = useLocationName(monitor);
const { status, timestamp, ping, configIdByLocation } = useStatusByLocationOverview(
monitor.configId,
monitor.location.id
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid_item.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid_item.tsx
index 3fb27e202f996..501fcb4a4136f 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid_item.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid_item.tsx
@@ -27,8 +27,7 @@ export const OverviewGridItem = ({
monitor: MonitorOverviewItem;
onClick: (params: FlyoutParamProps) => void;
}) => {
- const locationName =
- useLocationName({ locationId: monitor.location?.id })?.label || monitor.location?.id;
+ const locationName = useLocationName(monitor);
const { timestamp } = useStatusByLocationOverview(monitor.configId, locationName);
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx
index d03b70d94768c..f798880608bcc 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.test.tsx
@@ -8,6 +8,7 @@ import React from 'react';
import { renderHook } from '@testing-library/react-hooks';
import { useLocationName } from './use_location_name';
import { WrappedHelper } from '../utils/testing';
+import { MonitorOverviewItem } from '../../../../common/runtime_types';
describe('useLocationName', () => {
beforeEach(() => {
@@ -47,16 +48,11 @@ describe('useLocationName', () => {
const { result } = renderHook(
() =>
useLocationName({
- locationId: 'us_central',
- }),
+ location: { id: 'us_central' },
+ } as MonitorOverviewItem),
{ wrapper: WrapperWithState }
);
- expect(result.current).toEqual({
- id: 'us_central',
- isServiceManaged: true,
- label: 'US Central',
- url: 'mockUrl',
- });
+ expect(result.current).toEqual('US Central');
});
it('returns the location id if matching location cannot be found', () => {
@@ -92,10 +88,10 @@ describe('useLocationName', () => {
const { result } = renderHook(
() =>
useLocationName({
- locationId: 'us_west',
- }),
+ location: { id: 'us_west' },
+ } as MonitorOverviewItem),
{ wrapper: WrapperWithState }
);
- expect(result.current).toEqual(undefined);
+ expect(result.current).toEqual('us_west');
});
});
diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.tsx
index 31782083541e2..b25112b15bb10 100644
--- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.tsx
+++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_location_name.tsx
@@ -7,9 +7,10 @@
import { useMemo, useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
+import { MonitorOverviewItem } from '../../../../common/runtime_types';
import { selectServiceLocationsState, getServiceLocations } from '../state';
-export function useLocationName({ locationId }: { locationId: string }) {
+export function useLocationName(monitor: MonitorOverviewItem) {
const dispatch = useDispatch();
const { locationsLoaded, locations } = useSelector(selectServiceLocationsState);
useEffect(() => {
@@ -17,12 +18,14 @@ export function useLocationName({ locationId }: { locationId: string }) {
dispatch(getServiceLocations());
}
});
+ const locationId = monitor?.location.id;
return useMemo(() => {
- if (!locationsLoaded) {
- return undefined;
+ if (!locationsLoaded || monitor.location.label) {
+ return monitor.location.label ?? monitor.location.id;
} else {
- return locations.find((location) => location.id === locationId);
+ const location = locations.find((loc) => loc.id === locationId);
+ return location?.label ?? (monitor.location.label || monitor.location.id);
}
- }, [locationsLoaded, locations, locationId]);
+ }, [locationsLoaded, locations, locationId, monitor]);
}
diff --git a/x-pack/plugins/synthetics/public/hooks/use_capabilities.ts b/x-pack/plugins/synthetics/public/hooks/use_capabilities.ts
index 5cde14df84f0e..082f9d9450d7c 100644
--- a/x-pack/plugins/synthetics/public/hooks/use_capabilities.ts
+++ b/x-pack/plugins/synthetics/public/hooks/use_capabilities.ts
@@ -6,7 +6,20 @@
*/
import { useKibana } from '@kbn/kibana-react-plugin/public';
+import { MonitorLocations } from '../../common/runtime_types';
export const useCanEditSynthetics = () => {
return !!useKibana().services?.application?.capabilities.uptime.save;
};
+
+export const useCanUsePublicLocations = (monLocations?: MonitorLocations) => {
+ const canUsePublicLocations =
+ useKibana().services?.application?.capabilities.uptime.elasticManagedLocationsEnabled ?? true;
+ const publicLocations = monLocations?.some((loc) => loc.isServiceManaged);
+
+ if (!publicLocations) {
+ return true;
+ }
+
+ return !!canUsePublicLocations;
+};
diff --git a/x-pack/plugins/synthetics/server/feature.ts b/x-pack/plugins/synthetics/server/feature.ts
index 36a5888928680..1a19baa01dcbe 100644
--- a/x-pack/plugins/synthetics/server/feature.ts
+++ b/x-pack/plugins/synthetics/server/feature.ts
@@ -7,6 +7,11 @@
import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
+import { i18n } from '@kbn/i18n';
+import {
+ SubFeaturePrivilegeGroupConfig,
+ SubFeaturePrivilegeGroupType,
+} from '@kbn/features-plugin/common';
import { syntheticsMonitorType, syntheticsParamType } from '../common/types/saved_objects';
import { SYNTHETICS_RULE_TYPES } from '../common/constants/synthetics_alerts';
import { privateLocationsSavedObjectName } from '../common/saved_objects/private_locations';
@@ -27,6 +32,24 @@ const ruleTypes = [
OBSERVABILITY_THRESHOLD_RULE_TYPE_ID,
];
+const elasticManagedLocationsEnabledPrivilege: SubFeaturePrivilegeGroupConfig = {
+ groupType: 'independent' as SubFeaturePrivilegeGroupType,
+ privileges: [
+ {
+ id: 'elastic_managed_locations_enabled',
+ name: i18n.translate('xpack.synthetics.features.elasticManagedLocations', {
+ defaultMessage: 'Elastic managed locations enabled',
+ }),
+ includeIn: 'all',
+ savedObject: {
+ all: [],
+ read: [],
+ },
+ ui: ['elasticManagedLocationsEnabled'],
+ },
+ ],
+};
+
export const uptimeFeature = {
id: PLUGIN.ID,
name: PLUGIN.NAME,
@@ -94,4 +117,12 @@ export const uptimeFeature = {
ui: ['show', 'alerting:save'],
},
},
+ subFeatures: [
+ {
+ name: i18n.translate('xpack.synthetics.features.app', {
+ defaultMessage: 'Synthetics',
+ }),
+ privilegeGroups: [elasticManagedLocationsEnabledPrivilege],
+ },
+ ],
};
diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts
index 4841ca581c077..0d5825dbbdd3f 100644
--- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts
+++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/delete_monitor.ts
@@ -6,6 +6,7 @@
*/
import { schema } from '@kbn/config-schema';
import { SavedObjectsClientContract, SavedObjectsErrorHelpers } from '@kbn/core/server';
+import { validatePermissions } from './edit_monitor';
import { SyntheticsServerSetup } from '../../types';
import { RouteContext, SyntheticsRestApiRouteFactory } from '../types';
import { syntheticsMonitorType } from '../../../common/types/saved_objects';
@@ -39,10 +40,13 @@ export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () =>
const { monitorId } = request.params;
try {
- const errors = await deleteMonitor({
+ const { errors, res } = await deleteMonitor({
routeContext,
monitorId,
});
+ if (res) {
+ return res;
+ }
if (errors && errors.length > 0) {
return response.ok({
@@ -68,7 +72,7 @@ export const deleteMonitor = async ({
routeContext: RouteContext;
monitorId: string;
}) => {
- const { spaceId, savedObjectsClient, server, syntheticsMonitorClient } = routeContext;
+ const { response, spaceId, savedObjectsClient, server, syntheticsMonitorClient } = routeContext;
const { logger, telemetry, stackVersion } = server;
const { monitor, monitorWithSecret } = await getMonitorToDelete(
@@ -78,6 +82,17 @@ export const deleteMonitor = async ({
spaceId
);
+ const err = await validatePermissions(routeContext, monitor.attributes.locations);
+ if (err) {
+ return {
+ res: response.forbidden({
+ body: {
+ message: err,
+ },
+ }),
+ };
+ }
+
let deletePromise;
try {
@@ -113,7 +128,7 @@ export const deleteMonitor = async ({
)
);
- return errors;
+ return { errors };
} catch (e) {
if (deletePromise) {
await deletePromise;
diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts
index d99261b49f2cf..69960d458c684 100644
--- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts
+++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts
@@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema';
import { SavedObjectsUpdateResponse, SavedObject } from '@kbn/core/server';
import { SavedObjectsErrorHelpers } from '@kbn/core/server';
import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common';
+import { getDecryptedMonitor } from '../../saved_objects/synthetics_monitor';
import { getPrivateLocations } from '../../synthetics_service/get_private_locations';
import { mergeSourceMonitor } from './helper';
import { RouteContext, SyntheticsRestApiRouteFactory } from '../types';
@@ -18,6 +19,7 @@ import {
SyntheticsMonitorWithSecretsAttributes,
SyntheticsMonitor,
ConfigKey,
+ MonitorLocations,
} from '../../../common/runtime_types';
import { SYNTHETICS_API_URLS } from '../../../common/constants';
import { validateMonitor } from './monitor_validation';
@@ -39,10 +41,10 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => (
}),
body: schema.any(),
},
+ writeAccess: true,
handler: async (routeContext): Promise => {
const { request, response, savedObjectsClient, server } = routeContext;
- const { encryptedSavedObjects, logger } = server;
- const encryptedSavedObjectsClient = encryptedSavedObjects.getClient();
+ const { logger } = server;
const monitor = request.body as SyntheticsMonitor;
const { monitorId } = request.params;
@@ -55,14 +57,11 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => (
/* Decrypting the previous monitor before editing ensures that all existing fields remain
* on the object, even in flows where decryption does not take place, such as the enabled tab
* on the monitor list table. We do not decrypt monitors in bulk for the monitor list table */
- const decryptedPreviousMonitor =
- await encryptedSavedObjectsClient.getDecryptedAsInternalUser(
- syntheticsMonitorType,
- monitorId,
- {
- namespace: previousMonitor.namespaces?.[0],
- }
- );
+ const decryptedPreviousMonitor = await getDecryptedMonitor(
+ server,
+ monitorId,
+ previousMonitor.namespaces?.[0]!
+ );
const normalizedPreviousMonitor = normalizeSecrets(decryptedPreviousMonitor).attributes;
const editedMonitor = mergeSourceMonitor(normalizedPreviousMonitor, monitor);
@@ -74,6 +73,15 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => (
return response.badRequest({ body: { message, attributes: { details, ...payload } } });
}
+ const err = await validatePermissions(routeContext, editedMonitor.locations);
+ if (err) {
+ return response.forbidden({
+ body: {
+ message: err,
+ },
+ });
+ }
+
const monitorWithRevision = {
...validationResult.decodedMonitor,
/* reset config hash to empty string. Ensures that the synthetics agent is able
@@ -230,3 +238,22 @@ export const syncEditedMonitor = async ({
throw e;
}
};
+
+export const validatePermissions = async (
+ { server, response, request }: RouteContext,
+ monitorLocations: MonitorLocations
+) => {
+ const hasPublicLocations = monitorLocations?.some((loc) => loc.isServiceManaged);
+ if (!hasPublicLocations) {
+ return;
+ }
+
+ const elasticManagedLocationsEnabled =
+ Boolean(
+ (await server.coreStart?.capabilities.resolveCapabilities(request)).uptime
+ .elasticManagedLocationsEnabled
+ ) ?? true;
+ if (!elasticManagedLocationsEnabled) {
+ return "You don't have permission to use public locations";
+ }
+};
diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/get_service_locations.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/get_service_locations.ts
index 01f4946b3508f..8c4df4a2461f8 100644
--- a/x-pack/plugins/synthetics/server/routes/synthetics_service/get_service_locations.ts
+++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/get_service_locations.ts
@@ -5,6 +5,8 @@
* 2.0.
*/
+import { toClientContract } from '../settings/private_locations/helpers';
+import { getPrivateLocationsAndAgentPolicies } from '../settings/private_locations/get_private_locations';
import { SyntheticsRestApiRouteFactory } from '../types';
import { getAllLocations } from '../../synthetics_service/get_all_locations';
import { SYNTHETICS_API_URLS } from '../../../common/constants';
@@ -13,16 +15,37 @@ export const getServiceLocationsRoute: SyntheticsRestApiRouteFactory = () => ({
method: 'GET',
path: SYNTHETICS_API_URLS.SERVICE_LOCATIONS,
validate: {},
- handler: async ({ server, savedObjectsClient, syntheticsMonitorClient }): Promise => {
- const { throttling, allLocations } = await getAllLocations({
- server,
- syntheticsMonitorClient,
- savedObjectsClient,
- });
+ handler: async ({
+ request,
+ server,
+ savedObjectsClient,
+ syntheticsMonitorClient,
+ }): Promise => {
+ const elasticManagedLocationsEnabled =
+ Boolean(
+ (await server.coreStart?.capabilities.resolveCapabilities(request)).uptime
+ .elasticManagedLocationsEnabled
+ ) ?? true;
- return {
- locations: allLocations,
- throttling,
- };
+ if (elasticManagedLocationsEnabled) {
+ const { throttling, allLocations } = await getAllLocations({
+ server,
+ syntheticsMonitorClient,
+ savedObjectsClient,
+ });
+
+ return {
+ locations: allLocations,
+ throttling,
+ };
+ } else {
+ const { locations: privateLocations, agentPolicies } =
+ await getPrivateLocationsAndAgentPolicies(savedObjectsClient, syntheticsMonitorClient);
+
+ const result = toClientContract({ locations: privateLocations }, agentPolicies).locations;
+ return {
+ locations: result,
+ };
+ }
},
});
diff --git a/x-pack/plugins/synthetics/server/synthetics_service/get_all_locations.ts b/x-pack/plugins/synthetics/server/synthetics_service/get_all_locations.ts
index 491bde96d4067..6eb6a62547156 100644
--- a/x-pack/plugins/synthetics/server/synthetics_service/get_all_locations.ts
+++ b/x-pack/plugins/synthetics/server/synthetics_service/get_all_locations.ts
@@ -47,6 +47,11 @@ const getServicePublicLocations = async (
server: SyntheticsServerSetup,
syntheticsMonitorClient: SyntheticsMonitorClient
) => {
+ if (!syntheticsMonitorClient.syntheticsService.isAllowed) {
+ return {
+ locations: [],
+ };
+ }
if (syntheticsMonitorClient.syntheticsService.locations.length === 0) {
return await getServiceLocations(server);
}
diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts
index eae3fb0082030..561a0e5a90e4c 100644
--- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts
+++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts
@@ -608,7 +608,7 @@ export class SyntheticsService {
await encryptedClient.createPointInTimeFinderDecryptedAsInternalUser({
type: syntheticsParamType,
perPage: 1000,
- namespaces: spaceId ? [spaceId] : undefined,
+ namespaces: spaceId ? [spaceId] : [ALL_SPACES_ID],
});
for await (const response of finder.find()) {
diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json
index 7d74a3369d08a..fb4219e6052f4 100644
--- a/x-pack/plugins/translations/translations/fr-FR.json
+++ b/x-pack/plugins/translations/translations/fr-FR.json
@@ -1317,7 +1317,6 @@
"data.search.aggs.rareTerms.aggTypesLabel": "Termes rares de {fieldName}",
"data.search.es_search.queryTimeValue": "{queryTime} ms",
"data.search.functions.geoBoundingBox.arguments.error": "Au moins un des groupes de paramètres suivants doit être fourni : {parameters}.",
- "data.search.searchSource.fetch.shardsFailedNotificationMessage": "Échec de {shardsFailed} des {shardsTotal} partitions",
"data.search.searchSource.indexPatternIdDescription": "ID dans l'index {kibanaIndexPattern}.",
"data.search.searchSource.queryTimeValue": "{queryTime} ms",
"data.search.searchSource.requestTimeValue": "{requestTime} ms",
@@ -2064,15 +2063,7 @@
"data.search.searchSource.dataViewDescription": "La vue de données qui a été interrogée.",
"data.search.searchSource.dataViewIdLabel": "ID de vue de données",
"data.search.searchSource.dataViewLabel": "Vue de données",
- "data.search.searchSource.fetch.requestTimedOutNotificationMessage": "Les données peuvent être incomplètes parce que votre requête est arrivée à échéance.",
- "data.search.searchSource.fetch.shardsFailedModal.close": "Fermer",
- "data.search.searchSource.fetch.shardsFailedModal.copyToClipboard": "Copier la réponse dans le presse-papiers",
- "data.search.searchSource.fetch.shardsFailedModal.showDetails": "Afficher les détails",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderRequest": "Requête",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderResponse": "Réponse",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderShardFailures": "Échecs de partition",
"data.search.searchSource.fetch.shardsFailedModal.tableColReason": "Raison",
- "data.search.searchSource.fetch.shardsFailedNotificationDescription": "Les données peuvent être incomplètes ou erronées.",
"data.search.searchSource.hitsDescription": "Le nombre de documents renvoyés par la requête.",
"data.search.searchSource.hitsLabel": "Résultats",
"data.search.searchSource.hitsTotalDescription": "Le nombre de documents correspondant à la requête.",
@@ -27137,18 +27128,6 @@
"xpack.observability.slo.update.errorNotification": "Un problème est survenu lors de la mise à jour de {name}",
"xpack.observability.slo.update.successNotification": "Mise à jour réussie de {name}",
"xpack.observability.syntheticsThrottlingEnabledExperimentDescription": "Activez les paramètres de régulation dans les configurations du moniteur Synthetics. Notez qu’il est possible que la régulation ne soit pas toujours disponible pour vos moniteurs, même si le paramètre est actif. Destiné à un usage interne uniquement. {link}",
- "xpack.observability.threshold.rule.alertDetailsAppSection.criterion.subtitle": "Dernière {lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError": "Il est possible que cette règle signale {matchedGroups} moins que prévu, car la requête de filtre comporte une correspondance pour {groupCount, plural, one {ce champ} many {ces champs} other {ces champs}}. Pour en savoir plus, consultez notre {filteringAndGroupingLink}.",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel": "Agrégation {name}",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.filterLabel": "Filtre KQL {name}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabel": "Dernière {lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabelWithGrouping": "Dernières {lookback} {timeLabel} de données pour {id}",
- "xpack.observability.threshold.rule.threshold.errorAlertReason": "Elasticsearch a échoué lors de l'interrogation des données pour {metric}",
- "xpack.observability.threshold.rule.threshold.firedAlertReason": "{metric} est {currentValue} dans les dernières {duration}{group}. Alerte lorsque {comparator} {threshold}.",
- "xpack.observability.threshold.rule.threshold.noDataAlertReason": "{metric} n'a signalé aucune donnée dans les dernières {interval} {group}",
- "xpack.observability.threshold.rule.threshold.recoveredAlertReason": "{metric} est maintenant {comparator} un seuil de {threshold} (la valeur actuelle est {currentValue}) pour {group}",
- "xpack.observability.threshold.rule.threshold.thresholdRange": "{a} et {b}",
- "xpack.observability.threshold.rule.thresholdExtraTitle": "Alerte lorsque {comparator} {threshold}.",
"xpack.observability.transactionRateLabel": "{value} tpm",
"xpack.observability.ux.coreVitals.averageMessage": " et inférieur à {bad}",
"xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd} ({ranksInd} %)",
@@ -27595,81 +27574,6 @@
"xpack.observability.statusVisualization.ux.link": "Ajouter des données",
"xpack.observability.statusVisualization.ux.title": "Expérience utilisateur",
"xpack.observability.syntheticsThrottlingEnabledExperimentName": "Activer la régulation Synthetics (Expérimentale)",
- "xpack.observability.threshold.rule..charts.errorMessage": "Oups, un problème est survenu",
- "xpack.observability.threshold.rule..charts.noDataMessage": "Aucune donnée graphique disponible",
- "xpack.observability.threshold.rule..timeLabels.days": "jours",
- "xpack.observability.threshold.rule..timeLabels.hours": "heures",
- "xpack.observability.threshold.rule..timeLabels.minutes": "minutes",
- "xpack.observability.threshold.rule..timeLabels.seconds": "secondes",
- "xpack.observability.threshold.rule.alertDetailsAppSection.summaryField.rule": "Règle",
- "xpack.observability.threshold.rule.alertDetailsAppSection.thresholdTitle": "Seuil dépassé",
- "xpack.observability.threshold.rule.alertDetailUrlActionVariableDescription": "Lien vers l’affichage de résolution des problèmes d’alerte pour voir plus de contextes et de détails. La chaîne sera vide si server.publicBaseUrl n'est pas configuré.",
- "xpack.observability.threshold.rule.alertDropdownTitle": "Alertes et règles",
- "xpack.observability.threshold.rule.alertFlyout.addCondition": "Ajouter une condition",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.avg": "Moyenne",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.cardinality": "Cardinalité",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.count": "Compte du document",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.max": "Max",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.min": "Min",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p95": "95e centile",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p99": "99e centile",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.rate": "Taux",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.sum": "Somme",
- "xpack.observability.threshold.rule.alertFlyout.alertDescription": "Alerter quand un type de données Observability atteint ou dépasse une valeur donnée.",
- "xpack.observability.threshold.rule.alertFlyout.alertOnGroupDisappear": "Me prévenir si un groupe cesse de signaler les données",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError.docsLink": "les documents",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerHelpText": "Créer une alerte pour chaque valeur unique. Par exemple : \"host.id\" ou \"cloud.region\".",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerText": "Regrouper les alertes par (facultatif)",
- "xpack.observability.threshold.rule.alertFlyout.customEquation": "Équation personnalisée",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.addCustomRow": "Ajouter une agrégation/un champ",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.deleteRowButton": "Supprimer",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationHelpMessage": "Prend en charge les expressions mathématiques de base",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelHelpMessage": "L'étiquette personnalisée s'affichera sur le graphique d'alerte et dans le titre de raison/d'alerte",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "Étiquette (facultatif)",
- "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[Ce paramètre n’est pas applicable à l’agrégateur du nombre de documents.]",
- "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "L'agrégation est requise.",
- "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "Le champ d'équation prend en charge uniquement les caractères suivants : A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =",
- "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "La requête de filtre n'est pas valide.",
- "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "L'indicateur est requis.",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired": "Le seuil est requis.",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdTypeRequired": "Les seuils doivent contenir un nombre valide.",
- "xpack.observability.threshold.rule.alertFlyout.error.timeRequred": "La taille de temps est requise.",
- "xpack.observability.threshold.rule.alertFlyout.groupDisappearHelpText": "Activez cette option pour déclencher l’action si un groupe précédemment détecté cesse de signaler des résultats. Ce n’est pas recommandé pour les infrastructures à montée en charge dynamique qui peuvent rapidement lancer ou stopper des nœuds automatiquement.",
- "xpack.observability.threshold.rule.alertFlyout.outsideRangeLabel": "N'est pas entre",
- "xpack.observability.threshold.rule.alertFlyout.removeCondition": "Retirer la condition",
- "xpack.observability.threshold.rule.alerting.noDataFormattedValue": "[AUCUNE DONNÉE]",
- "xpack.observability.threshold.rule.alerting.threshold.defaultActionMessage": "\\{\\{alertName\\}\\} - \\{\\{context.group\\}\\} est à l'état \\{\\{context.alertState\\}\\}\n\n Raison :\n \\{\\{context.reason\\}\\}\n ",
- "xpack.observability.threshold.rule.alerting.threshold.fired": "Alerte",
- "xpack.observability.threshold.rule.alerting.threshold.nodata": "Aucune donnée",
- "xpack.observability.threshold.rule.alerting.threshold.noDataFormattedValue": "[AUCUNE DONNÉE]",
- "xpack.observability.threshold.rule.alertsButton": "Alertes et règles",
- "xpack.observability.threshold.rule.cloudActionVariableDescription": "Objet cloud défini par ECS s'il est disponible dans la source.",
- "xpack.observability.threshold.rule.containerActionVariableDescription": "Objet conteneur défini par ECS s'il est disponible dans la source.",
- "xpack.observability.threshold.rule.createInventoryRuleButton": "Créer une règle d'inventaire",
- "xpack.observability.threshold.rule.createThresholdRuleButton": "Créer une règle de seuil",
- "xpack.observability.threshold.rule.groupByKeysActionVariableDescription": "Objet contenant les groupes qui fournissent les données",
- "xpack.observability.threshold.rule.hostActionVariableDescription": "Objet hôte défini par ECS s'il est disponible dans la source.",
- "xpack.observability.threshold.rule.infrastructureDropdownMenu": "Infrastructure",
- "xpack.observability.threshold.rule.infrastructureDropdownTitle": "Règles d'infrastructure",
- "xpack.observability.threshold.rule.labelsActionVariableDescription": "Liste d'étiquettes associées avec l'entité sur laquelle l'alerte s'est déclenchée.",
- "xpack.observability.threshold.rule.manageRules": "Gérer les règles",
- "xpack.observability.threshold.rule.metricsDropdownMenu": "Indicateurs",
- "xpack.observability.threshold.rule.metricsDropdownTitle": "Règles d'indicateurs",
- "xpack.observability.threshold.rule.orchestratorActionVariableDescription": "Objet orchestrateur défini par ECS s'il est disponible dans la source.",
- "xpack.observability.threshold.rule.reasonActionVariableDescription": "Une description concise de la raison du signalement",
- "xpack.observability.threshold.rule.sourceConfiguration.missingHttp": "Échec de chargement de la source : Aucun client HTTP disponible.",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureBody": "Nous n'avons pas pu appliquer les modifications à la configuration des indicateurs. Réessayez plus tard.",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureTitle": "La mise à jour de la configuration a échoué",
- "xpack.observability.threshold.rule.sourceConfiguration.updateSuccessTitle": "Les paramètres d'indicateurs ont bien été mis à jour",
- "xpack.observability.threshold.rule.tagsActionVariableDescription": "Liste de balises associées avec l'entité sur laquelle l'alerte s'est déclenchée.",
- "xpack.observability.threshold.rule.threshold.aboveRecovery": "supérieur à",
- "xpack.observability.threshold.rule.threshold.belowRecovery": "inférieur à",
- "xpack.observability.threshold.rule.threshold.betweenRecovery": "entre",
- "xpack.observability.threshold.rule.threshold.customEquation": "Équation personnalisée",
- "xpack.observability.threshold.rule.threshold.documentCount": "Nombre de documents",
- "xpack.observability.threshold.rule.timestampDescription": "Horodatage du moment où l'alerte a été détectée.",
- "xpack.observability.threshold.rule.valueActionVariableDescription": "Valeur de l'indicateur dans la condition spécifiée. Utilisation : (ctx.value.condition0, ctx.value.condition1, etc...).",
- "xpack.observability.threshold.rule.viewInAppUrlActionVariableDescription": "Lien vers la source de l’alerte",
"xpack.observability.threshold.ruleExplorer.groupByAriaLabel": "Graphique par",
"xpack.observability.threshold.ruleExplorer.groupByLabel": "Tout",
"xpack.observability.threshold.ruleName": "Seuil (Version d'évaluation technique)",
@@ -29876,8 +29780,6 @@
"xpack.securitySolution.exceptions.viewer.lastUpdated": "Mis à jour {updated}",
"xpack.securitySolution.exceptions.viewer.paginationDetails": "Affichage de {partOne} sur {partTwo}",
"xpack.securitySolution.fieldBrowser.descriptionForScreenReaderOnly": "Description pour le champ {field} :",
- "xpack.securitySolution.flyout.errorMessage": "Une erreur est survenue lors de l'affichage de {message}",
- "xpack.securitySolution.flyout.errorTitle": "Impossible d'afficher {title}",
"xpack.securitySolution.footer.autoRefreshActiveTooltip": "Lorsque le rafraîchissement automatique est activé, la chronologie vous montre les {numberOfItems} derniers événements qui correspondent à votre requête.",
"xpack.securitySolution.formattedNumber.countsLabel": "{mantissa}{scale}{hasRemainder}",
"xpack.securitySolution.header.editableTitle.editButtonAria": "Vous pouvez modifier {title} en cliquant",
@@ -33094,70 +32996,9 @@
"xpack.securitySolution.fleetIntegration.assets.name": "Hôtes",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.description": "Filtre d'événement pour Cloud Security. Créé par l'intégration Elastic Defend.",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.name": "Sessions non interactives",
- "xpack.securitySolution.flyout.analyzerErrorMessage": "analyseur",
"xpack.securitySolution.flyout.button.timeline": "chronologie",
- "xpack.securitySolution.flyout.correlations.caseNameColumnTitle": "Nom",
- "xpack.securitySolution.flyout.correlations.reasonColumnTitle": "Raison",
- "xpack.securitySolution.flyout.correlations.ruleColumnTitle": "Règle",
- "xpack.securitySolution.flyout.correlations.severityColumnTitle": "Sévérité",
- "xpack.securitySolution.flyout.correlations.statusColumnTitle": "Statut",
- "xpack.securitySolution.flyout.correlations.timestampColumnTitle": "Horodatage",
- "xpack.securitySolution.flyout.documentDetails.alertReasonTitle": "Raison d'alerte",
- "xpack.securitySolution.flyout.documentDetails.analyzerGraphButton": "Graph Analyseur",
- "xpack.securitySolution.flyout.documentDetails.analyzerPreviewTitle": "Aperçu de l'analyseur",
- "xpack.securitySolution.flyout.documentDetails.collapseDetailButton": "Réduire les détails de l'alerte",
- "xpack.securitySolution.flyout.documentDetails.correlationsButton": "Corrélations",
- "xpack.securitySolution.flyout.documentDetails.correlationsTitle": "Corrélations",
- "xpack.securitySolution.flyout.documentDetails.documentDescriptionTitle": "Description du document",
- "xpack.securitySolution.flyout.documentDetails.documentReasonTitle": "Motif du document",
- "xpack.securitySolution.flyout.documentDetails.entitiesButton": "Entités",
- "xpack.securitySolution.flyout.documentDetails.entitiesTitle": "Entités",
- "xpack.securitySolution.flyout.documentDetails.expandDetailButton": "Développer les détails de l'alerte",
- "xpack.securitySolution.flyout.documentDetails.highlightedFieldsTitle": "Champs en surbrillance",
- "xpack.securitySolution.flyout.documentDetails.insightsOptions": "Options des informations exploitables",
- "xpack.securitySolution.flyout.documentDetails.insightsTab": "Informations exploitables",
- "xpack.securitySolution.flyout.documentDetails.insightsTitle": "Informations exploitables",
- "xpack.securitySolution.flyout.documentDetails.investigationSectionTitle": "Investigation",
- "xpack.securitySolution.flyout.documentDetails.investigationsTab": "Investigation",
- "xpack.securitySolution.flyout.documentDetails.jsonTab": "JSON",
- "xpack.securitySolution.flyout.documentDetails.overviewTab": "Aperçu",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.prevalenceRowText": "est inhabituel",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichment": "champ enrichi avec la Threat Intelligence",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichments": "champs enrichis avec la Threat Intelligence",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatch": "correspondance de menace détectée",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatches": "correspondances de menaces détectées",
- "xpack.securitySolution.flyout.documentDetails.prevalenceButton": "Prévalence",
- "xpack.securitySolution.flyout.documentDetails.prevalenceTitle": "Prévalence",
- "xpack.securitySolution.flyout.documentDetails.riskScoreTitle": "Score de risque",
- "xpack.securitySolution.flyout.documentDetails.ruleDescriptionTitle": "Description de la règle",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.commandText": "par",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.processText": "démarré",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.ruleText": "avec la règle",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.timeText": "à",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.title": "Aperçu du visualiseur de session",
- "xpack.securitySolution.flyout.documentDetails.sessionViewButton": "Vue de session",
- "xpack.securitySolution.flyout.documentDetails.severityTitle": "Sévérité",
- "xpack.securitySolution.flyout.documentDetails.share": "Partager l'alerte",
- "xpack.securitySolution.flyout.documentDetails.tableTab": "Tableau",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceButton": "Threat Intelligence",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceTitle": "Threat Intelligence",
- "xpack.securitySolution.flyout.documentDetails.visualizationsTitle": "Visualisations",
- "xpack.securitySolution.flyout.documentDetails.visualizeOptions": "Options Visualize",
- "xpack.securitySolution.flyout.documentDetails.visualizeTab": "Visualiser",
- "xpack.securitySolution.flyout.documentErrorMessage": "les valeurs et champs du document",
- "xpack.securitySolution.flyout.documentErrorTitle": "informations du document",
"xpack.securitySolution.flyout.entities.failRelatedHostsDescription": "Impossible de lancer la recherche sur les hôtes associés",
"xpack.securitySolution.flyout.entities.failRelatedUsersDescription": "Impossible de lancer la recherche sur les utilisateurs associés",
- "xpack.securitySolution.flyout.entities.hostsInfoTitle": "Informations sur l’hôte",
- "xpack.securitySolution.flyout.entities.relatedEntitiesIpColumn": "Adresses IP",
- "xpack.securitySolution.flyout.entities.relatedEntitiesNameColumn": "Nom",
- "xpack.securitySolution.flyout.entities.relatedHostsTitle": "Hôtes associés",
- "xpack.securitySolution.flyout.entities.relatedUsersTitle": "Utilisateurs associés",
- "xpack.securitySolution.flyout.entities.usersInfoTitle": "Informations sur l’utilisateur",
- "xpack.securitySolution.flyout.prevalenceTableAlertCountColumnTitle": "Nombre d'alertes",
- "xpack.securitySolution.flyout.prevalenceTableDocCountColumnTitle": "Compte du document",
- "xpack.securitySolution.flyout.response.title": "Réponses",
- "xpack.securitySolution.flyout.sessionViewErrorMessage": "vue de session",
"xpack.securitySolution.footer.autoRefreshActiveDescription": "Actualisation automatique active",
"xpack.securitySolution.footer.cancel": "Annuler",
"xpack.securitySolution.footer.data": "données",
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index d518dba93269b..9c1bd25593a47 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -1331,7 +1331,6 @@
"data.search.aggs.rareTerms.aggTypesLabel": "{fieldName}の希少な用語",
"data.search.es_search.queryTimeValue": "{queryTime}ms",
"data.search.functions.geoBoundingBox.arguments.error": "次のパラメーターのグループの1つ以上を指定する必要があります:{parameters}。",
- "data.search.searchSource.fetch.shardsFailedNotificationMessage": "{shardsTotal}件中{shardsFailed}件のシャードでエラーが発生しました",
"data.search.searchSource.indexPatternIdDescription": "{kibanaIndexPattern}インデックス内のIDです。",
"data.search.searchSource.queryTimeValue": "{queryTime}ms",
"data.search.searchSource.requestTimeValue": "{requestTime}ms",
@@ -2078,15 +2077,7 @@
"data.search.searchSource.dataViewDescription": "照会されたデータビュー。",
"data.search.searchSource.dataViewIdLabel": "データビューID",
"data.search.searchSource.dataViewLabel": "データビュー",
- "data.search.searchSource.fetch.requestTimedOutNotificationMessage": "リクエストがタイムアウトしたため、データが不完全な可能性があります",
- "data.search.searchSource.fetch.shardsFailedModal.close": "閉じる",
- "data.search.searchSource.fetch.shardsFailedModal.copyToClipboard": "応答をクリップボードにコピー",
- "data.search.searchSource.fetch.shardsFailedModal.showDetails": "詳細を表示",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderRequest": "リクエスト",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderResponse": "応答",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderShardFailures": "シャードエラー",
"data.search.searchSource.fetch.shardsFailedModal.tableColReason": "理由",
- "data.search.searchSource.fetch.shardsFailedNotificationDescription": "データが不完全か誤りの可能性があります。",
"data.search.searchSource.hitsDescription": "クエリにより返されたドキュメントの数です。",
"data.search.searchSource.hitsLabel": "ヒット数",
"data.search.searchSource.hitsTotalDescription": "クエリに一致するドキュメントの数です。",
@@ -27137,18 +27128,6 @@
"xpack.observability.slo.update.errorNotification": "{name}の更新中にエラーが発生しました",
"xpack.observability.slo.update.successNotification": "正常に{name}を更新しました",
"xpack.observability.syntheticsThrottlingEnabledExperimentDescription": "シンセティック監視構成で調整設定を有効にします。設定が有効でも、モニターで調整を使用できない場合があります。内部使用専用です。{link}",
- "xpack.observability.threshold.rule.alertDetailsAppSection.criterion.subtitle": "最後の{lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError": "フィルタークエリには{groupCount, plural, other {これらのフィールド}}に対する一致が含まれているため、このルールによって、想定を下回る{matchedGroups}に関するアラートが発行される場合があります。詳細については、{filteringAndGroupingLink}を参照してください。",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel": "アグリゲーション{name}",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.filterLabel": "KQLフィルター{name}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabel": "最後の{lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabelWithGrouping": "{id}のデータの最後の{lookback} {timeLabel}",
- "xpack.observability.threshold.rule.threshold.errorAlertReason": "{metric}のデータのクエリを試行しているときに、Elasticsearchが失敗しました",
- "xpack.observability.threshold.rule.threshold.firedAlertReason": "{metric}は最後の{duration}{group}の{currentValue}です。{comparator} {threshold}のときにアラートを通知します。",
- "xpack.observability.threshold.rule.threshold.noDataAlertReason": "{metric}は最後の{interval}{group}でデータがないことを報告しました",
- "xpack.observability.threshold.rule.threshold.recoveredAlertReason": "{metric} が {comparator} に、{group} が {threshold} のしきい値(現在の値は {currentValue})になりました",
- "xpack.observability.threshold.rule.threshold.thresholdRange": "{a}および{b}",
- "xpack.observability.threshold.rule.thresholdExtraTitle": "{comparator} {threshold}のときにアラートを通知",
"xpack.observability.transactionRateLabel": "{value} tpm",
"xpack.observability.ux.coreVitals.averageMessage": " {bad}未満",
"xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd}({ranksInd}%)",
@@ -27595,81 +27574,6 @@
"xpack.observability.statusVisualization.ux.link": "データの追加",
"xpack.observability.statusVisualization.ux.title": "ユーザーエクスペリエンス",
"xpack.observability.syntheticsThrottlingEnabledExperimentName": "シンセティック調整を有効にする(実験)",
- "xpack.observability.threshold.rule..charts.errorMessage": "問題が発生しました",
- "xpack.observability.threshold.rule..charts.noDataMessage": "グラフデータがありません",
- "xpack.observability.threshold.rule..timeLabels.days": "日",
- "xpack.observability.threshold.rule..timeLabels.hours": "時間",
- "xpack.observability.threshold.rule..timeLabels.minutes": "分",
- "xpack.observability.threshold.rule..timeLabels.seconds": "秒",
- "xpack.observability.threshold.rule.alertDetailsAppSection.summaryField.rule": "ルール",
- "xpack.observability.threshold.rule.alertDetailsAppSection.thresholdTitle": "しきい値を超えました",
- "xpack.observability.threshold.rule.alertDetailUrlActionVariableDescription": "アラートトラブルシューティングビューにリンクして、さらに詳しい状況や詳細を確認できます。server.publicBaseUrlが構成されていない場合は、空の文字列になります。",
- "xpack.observability.threshold.rule.alertDropdownTitle": "アラートとルール",
- "xpack.observability.threshold.rule.alertFlyout.addCondition": "条件を追加",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.avg": "平均",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.cardinality": "基数",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.count": "ドキュメントカウント",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.max": "最高",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.min": "最低",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p95": "95パーセンタイル",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p99": "99パーセンタイル",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.rate": "レート",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.sum": "合計",
- "xpack.observability.threshold.rule.alertFlyout.alertDescription": "オブザーバビリティデータタイプが特定の値以上になったときにアラートを送信します。",
- "xpack.observability.threshold.rule.alertFlyout.alertOnGroupDisappear": "グループがデータのレポートを停止する場合にアラートで通知する",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError.docsLink": "ドキュメント",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerHelpText": "すべての一意の値についてアラートを作成します。例:「host.id」または「cloud.region」。",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerText": "アラートのグループ化条件(オプション)",
- "xpack.observability.threshold.rule.alertFlyout.customEquation": "カスタム等式",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.addCustomRow": "集約/フィールドを追加",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.deleteRowButton": "削除",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationHelpMessage": "基本数学式をサポートします",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelHelpMessage": "カスタムラベルにはアラートグラフと理由/アラートタイトルに表示されます",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "ラベル(任意)",
- "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[この設定は、ドキュメントカウントアグリゲーターには適用されません。]",
- "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "集約が必要です。",
- "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "等式フィールドでは次の文字のみを使用できます:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=",
- "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "フィルタークエリは無効です。",
- "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "メトリックが必要です。",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired": "しきい値が必要です。",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdTypeRequired": "しきい値には有効な数値を含める必要があります。",
- "xpack.observability.threshold.rule.alertFlyout.error.timeRequred": "ページサイズが必要です。",
- "xpack.observability.threshold.rule.alertFlyout.groupDisappearHelpText": "以前に検出されたグループが結果を報告しなくなった場合は、これを有効にすると、アクションがトリガーされます。自動的に急速にノードを開始および停止することがある動的に拡張するインフラストラクチャーでは、これは推奨されません。",
- "xpack.observability.threshold.rule.alertFlyout.outsideRangeLabel": "is not between",
- "xpack.observability.threshold.rule.alertFlyout.removeCondition": "条件を削除",
- "xpack.observability.threshold.rule.alerting.noDataFormattedValue": "[データなし]",
- "xpack.observability.threshold.rule.alerting.threshold.defaultActionMessage": "\\{\\{alertName\\}\\} - \\{\\{context.group\\}\\}は状態\\{\\{context.alertState\\}\\}です\n\n 理由:\n \\{\\{context.reason\\}\\}\n ",
- "xpack.observability.threshold.rule.alerting.threshold.fired": "アラート",
- "xpack.observability.threshold.rule.alerting.threshold.nodata": "データなし",
- "xpack.observability.threshold.rule.alerting.threshold.noDataFormattedValue": "[データなし]",
- "xpack.observability.threshold.rule.alertsButton": "アラートとルール",
- "xpack.observability.threshold.rule.cloudActionVariableDescription": "ソースで使用可能な場合に、ECSで定義されたクラウドオブジェクト。",
- "xpack.observability.threshold.rule.containerActionVariableDescription": "ソースで使用可能な場合に、ECSで定義されたコンテナーオブジェクト。",
- "xpack.observability.threshold.rule.createInventoryRuleButton": "インベントリルールの作成",
- "xpack.observability.threshold.rule.createThresholdRuleButton": "しきい値ルールを作成",
- "xpack.observability.threshold.rule.groupByKeysActionVariableDescription": "データを報告しているグループを含むオブジェクト",
- "xpack.observability.threshold.rule.hostActionVariableDescription": "ソースで使用可能な場合に、ECSで定義されたホストオブジェクト。",
- "xpack.observability.threshold.rule.infrastructureDropdownMenu": "インフラストラクチャー",
- "xpack.observability.threshold.rule.infrastructureDropdownTitle": "インフラストラクチャールール",
- "xpack.observability.threshold.rule.labelsActionVariableDescription": "このアラートがトリガーされたエンティティに関連付けられたラベルのリスト。",
- "xpack.observability.threshold.rule.manageRules": "ルールの管理",
- "xpack.observability.threshold.rule.metricsDropdownMenu": "メトリック",
- "xpack.observability.threshold.rule.metricsDropdownTitle": "メトリックルール",
- "xpack.observability.threshold.rule.orchestratorActionVariableDescription": "ソースで使用可能な場合に、ECSで定義されたオーケストレーターオブジェクト。",
- "xpack.observability.threshold.rule.reasonActionVariableDescription": "アラートの理由の簡潔な説明",
- "xpack.observability.threshold.rule.sourceConfiguration.missingHttp": "ソースの読み込みに失敗しました:HTTPクライアントがありません。",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureBody": "変更をメトリック構成に適用できませんでした。しばらくたってから再試行してください。",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureTitle": "構成の更新が失敗しました",
- "xpack.observability.threshold.rule.sourceConfiguration.updateSuccessTitle": "メトリック設定は正常に更新されました",
- "xpack.observability.threshold.rule.tagsActionVariableDescription": "このアラートがトリガーされたエンティティに関連付けられたタグのリスト。",
- "xpack.observability.threshold.rule.threshold.aboveRecovery": "より大",
- "xpack.observability.threshold.rule.threshold.belowRecovery": "より小",
- "xpack.observability.threshold.rule.threshold.betweenRecovery": "の間",
- "xpack.observability.threshold.rule.threshold.customEquation": "カスタム等式",
- "xpack.observability.threshold.rule.threshold.documentCount": "ドキュメントカウント",
- "xpack.observability.threshold.rule.timestampDescription": "アラートが検出された時点のタイムスタンプ。",
- "xpack.observability.threshold.rule.valueActionVariableDescription": "指定された条件のメトリックの値。使用方法:(ctx.value.condition0、ctx.value.condition1など)。",
- "xpack.observability.threshold.rule.viewInAppUrlActionVariableDescription": "アラートソースにリンク",
"xpack.observability.threshold.ruleExplorer.groupByAriaLabel": "graph/",
"xpack.observability.threshold.ruleExplorer.groupByLabel": "すべて",
"xpack.observability.threshold.ruleName": "しきい値(テクニカルプレビュー)",
@@ -29875,8 +29779,6 @@
"xpack.securitySolution.exceptions.viewer.lastUpdated": "{updated}を更新しました",
"xpack.securitySolution.exceptions.viewer.paginationDetails": "{partOne}/{partTwo}ページを表示中",
"xpack.securitySolution.fieldBrowser.descriptionForScreenReaderOnly": "フィールド{field}の説明:",
- "xpack.securitySolution.flyout.errorMessage": "{message}の表示中にエラーが発生しました",
- "xpack.securitySolution.flyout.errorTitle": "{title}を表示できません",
"xpack.securitySolution.footer.autoRefreshActiveTooltip": "自動更新が有効な間、タイムラインはクエリに一致する直近{numberOfItems}件のイベントを表示します。",
"xpack.securitySolution.formattedNumber.countsLabel": "{mantissa}{scale}{hasRemainder}",
"xpack.securitySolution.header.editableTitle.editButtonAria": "クリックすると{title}を編集できます",
@@ -33093,70 +32995,9 @@
"xpack.securitySolution.fleetIntegration.assets.name": "ホスト",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.description": "クラウドセキュリティのイベントフィルター。Elastic Defend統合によって作成。",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.name": "非インタラクティブセッション",
- "xpack.securitySolution.flyout.analyzerErrorMessage": "アナライザー",
"xpack.securitySolution.flyout.button.timeline": "タイムライン",
- "xpack.securitySolution.flyout.correlations.caseNameColumnTitle": "名前",
- "xpack.securitySolution.flyout.correlations.reasonColumnTitle": "理由",
- "xpack.securitySolution.flyout.correlations.ruleColumnTitle": "ルール",
- "xpack.securitySolution.flyout.correlations.severityColumnTitle": "深刻度",
- "xpack.securitySolution.flyout.correlations.statusColumnTitle": "ステータス",
- "xpack.securitySolution.flyout.correlations.timestampColumnTitle": "タイムスタンプ",
- "xpack.securitySolution.flyout.documentDetails.alertReasonTitle": "アラートの理由",
- "xpack.securitySolution.flyout.documentDetails.analyzerGraphButton": "アナライザーグラフ",
- "xpack.securitySolution.flyout.documentDetails.analyzerPreviewTitle": "アナライザープレビュー",
- "xpack.securitySolution.flyout.documentDetails.collapseDetailButton": "アラート詳細を折りたたむ",
- "xpack.securitySolution.flyout.documentDetails.correlationsButton": "相関関係",
- "xpack.securitySolution.flyout.documentDetails.correlationsTitle": "相関関係",
- "xpack.securitySolution.flyout.documentDetails.documentDescriptionTitle": "ドキュメント説明",
- "xpack.securitySolution.flyout.documentDetails.documentReasonTitle": "ドキュメント理由",
- "xpack.securitySolution.flyout.documentDetails.entitiesButton": "エンティティ",
- "xpack.securitySolution.flyout.documentDetails.entitiesTitle": "エンティティ",
- "xpack.securitySolution.flyout.documentDetails.expandDetailButton": "アラート詳細を展開",
- "xpack.securitySolution.flyout.documentDetails.highlightedFieldsTitle": "ハイライトされたフィールド",
- "xpack.securitySolution.flyout.documentDetails.insightsOptions": "インサイトオプション",
- "xpack.securitySolution.flyout.documentDetails.insightsTab": "インサイト",
- "xpack.securitySolution.flyout.documentDetails.insightsTitle": "インサイト",
- "xpack.securitySolution.flyout.documentDetails.investigationSectionTitle": "調査",
- "xpack.securitySolution.flyout.documentDetails.investigationsTab": "調査",
- "xpack.securitySolution.flyout.documentDetails.jsonTab": "JSON",
- "xpack.securitySolution.flyout.documentDetails.overviewTab": "概要",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.prevalenceRowText": "共通しない",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichment": "脅威インテリジェンスで拡張されたフィールド",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichments": "脅威インテリジェンスで拡張されたフィールド",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatch": "脅威一致が検出されました",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatches": "脅威一致が検出されました",
- "xpack.securitySolution.flyout.documentDetails.prevalenceButton": "発生率",
- "xpack.securitySolution.flyout.documentDetails.prevalenceTitle": "発生率",
- "xpack.securitySolution.flyout.documentDetails.riskScoreTitle": "リスクスコア",
- "xpack.securitySolution.flyout.documentDetails.ruleDescriptionTitle": "ルールの説明",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.commandText": "グループ基準",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.processText": "開始済み",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.ruleText": "ルールがある",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.timeText": "に",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.title": "セッションビューアープレビュー",
- "xpack.securitySolution.flyout.documentDetails.sessionViewButton": "セッションビュー",
- "xpack.securitySolution.flyout.documentDetails.severityTitle": "深刻度",
- "xpack.securitySolution.flyout.documentDetails.share": "アラートを共有",
- "xpack.securitySolution.flyout.documentDetails.tableTab": "表",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceButton": "脅威インテリジェンス",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceTitle": "脅威インテリジェンス",
- "xpack.securitySolution.flyout.documentDetails.visualizationsTitle": "ビジュアライゼーション",
- "xpack.securitySolution.flyout.documentDetails.visualizeOptions": "Visualizeオプション",
- "xpack.securitySolution.flyout.documentDetails.visualizeTab": "可視化",
- "xpack.securitySolution.flyout.documentErrorMessage": "ドキュメントフィールドおよび値",
- "xpack.securitySolution.flyout.documentErrorTitle": "ドキュメント情報",
"xpack.securitySolution.flyout.entities.failRelatedHostsDescription": "関連するホストで検索を実行できませんでした",
"xpack.securitySolution.flyout.entities.failRelatedUsersDescription": "関連するユーザーで検索を実行できませんでした",
- "xpack.securitySolution.flyout.entities.hostsInfoTitle": "ホスト情報",
- "xpack.securitySolution.flyout.entities.relatedEntitiesIpColumn": "IPアドレス",
- "xpack.securitySolution.flyout.entities.relatedEntitiesNameColumn": "名前",
- "xpack.securitySolution.flyout.entities.relatedHostsTitle": "関連するホスト",
- "xpack.securitySolution.flyout.entities.relatedUsersTitle": "関連するユーザー",
- "xpack.securitySolution.flyout.entities.usersInfoTitle": "ユーザー情報",
- "xpack.securitySolution.flyout.prevalenceTableAlertCountColumnTitle": "アラート件数",
- "xpack.securitySolution.flyout.prevalenceTableDocCountColumnTitle": "ドキュメントカウント",
- "xpack.securitySolution.flyout.response.title": "対応",
- "xpack.securitySolution.flyout.sessionViewErrorMessage": "セッションビュー",
"xpack.securitySolution.footer.autoRefreshActiveDescription": "自動更新アクション",
"xpack.securitySolution.footer.cancel": "キャンセル",
"xpack.securitySolution.footer.data": "データ",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index 99b6008b94bb4..75fcb531da66a 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -1331,7 +1331,6 @@
"data.search.aggs.rareTerms.aggTypesLabel": "{fieldName} 的稀有词",
"data.search.es_search.queryTimeValue": "{queryTime}ms",
"data.search.functions.geoBoundingBox.arguments.error": "必须至少提供一个以下参数组:{parameters}。",
- "data.search.searchSource.fetch.shardsFailedNotificationMessage": "{shardsTotal} 个分片有 {shardsFailed} 个失败",
"data.search.searchSource.indexPatternIdDescription": "{kibanaIndexPattern} 索引中的 ID。",
"data.search.searchSource.queryTimeValue": "{queryTime}ms",
"data.search.searchSource.requestTimeValue": "{requestTime}ms",
@@ -2078,15 +2077,7 @@
"data.search.searchSource.dataViewDescription": "被查询的数据视图。",
"data.search.searchSource.dataViewIdLabel": "数据视图 ID",
"data.search.searchSource.dataViewLabel": "数据视图",
- "data.search.searchSource.fetch.requestTimedOutNotificationMessage": "由于您的请求超时,数据可能不完整",
- "data.search.searchSource.fetch.shardsFailedModal.close": "关闭",
- "data.search.searchSource.fetch.shardsFailedModal.copyToClipboard": "将响应复制到剪贴板",
- "data.search.searchSource.fetch.shardsFailedModal.showDetails": "显示详情",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderRequest": "请求",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderResponse": "响应",
- "data.search.searchSource.fetch.shardsFailedModal.tabHeaderShardFailures": "分片错误",
"data.search.searchSource.fetch.shardsFailedModal.tableColReason": "原因",
- "data.search.searchSource.fetch.shardsFailedNotificationDescription": "数据可能不完整或有错误。",
"data.search.searchSource.hitsDescription": "查询返回的文档数目。",
"data.search.searchSource.hitsLabel": "命中数",
"data.search.searchSource.hitsTotalDescription": "与查询匹配的文档数目。",
@@ -27135,18 +27126,6 @@
"xpack.observability.slo.update.errorNotification": "更新 {name} 时出现问题",
"xpack.observability.slo.update.successNotification": "成功更新 {name}",
"xpack.observability.syntheticsThrottlingEnabledExperimentDescription": "在 Synthetics 监测配置中启用限制设置。请注意,即使该设置处于活动状态,可能仍然无法对您的监测应用限制。仅限内部使用。{link}",
- "xpack.observability.threshold.rule.alertDetailsAppSection.criterion.subtitle": "过去 {lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError": "此规则可能针对低于预期的 {matchedGroups} 告警,因为筛选查询包含{groupCount, plural, other {这些字段}}的匹配项。有关更多信息,请参阅 {filteringAndGroupingLink}。",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel": "聚合 {name}",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.filterLabel": "KQL 筛选 {name}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabel": "过去 {lookback} {timeLabel}",
- "xpack.observability.threshold.rule.alerts.dataTimeRangeLabelWithGrouping": "{id} 过去 {lookback} {timeLabel}的数据",
- "xpack.observability.threshold.rule.threshold.errorAlertReason": "Elasticsearch 尝试查询 {metric} 的数据时出现故障",
- "xpack.observability.threshold.rule.threshold.firedAlertReason": "过去 {duration}{group},{metric} 为 {currentValue}。{comparator} {threshold} 时告警。",
- "xpack.observability.threshold.rule.threshold.noDataAlertReason": "对于 {group},{metric} 在过去 {interval}中未报告数据",
- "xpack.observability.threshold.rule.threshold.recoveredAlertReason": "对于 {group},{metric} 现在{comparator}阈值 {threshold}(当前值为 {currentValue})",
- "xpack.observability.threshold.rule.threshold.thresholdRange": "{a} 和 {b}",
- "xpack.observability.threshold.rule.thresholdExtraTitle": "{comparator} {threshold} 时告警",
"xpack.observability.transactionRateLabel": "{value} tpm",
"xpack.observability.ux.coreVitals.averageMessage": " 且小于 {bad}",
"xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd} ({ranksInd}%)",
@@ -27593,81 +27572,6 @@
"xpack.observability.statusVisualization.ux.link": "添加数据",
"xpack.observability.statusVisualization.ux.title": "用户体验",
"xpack.observability.syntheticsThrottlingEnabledExperimentName": "启用 Synthetics 限制(实验性)",
- "xpack.observability.threshold.rule..charts.errorMessage": "哇哦,出问题了",
- "xpack.observability.threshold.rule..charts.noDataMessage": "没有可用图表数据",
- "xpack.observability.threshold.rule..timeLabels.days": "天",
- "xpack.observability.threshold.rule..timeLabels.hours": "小时",
- "xpack.observability.threshold.rule..timeLabels.minutes": "分钟",
- "xpack.observability.threshold.rule..timeLabels.seconds": "秒",
- "xpack.observability.threshold.rule.alertDetailsAppSection.summaryField.rule": "规则",
- "xpack.observability.threshold.rule.alertDetailsAppSection.thresholdTitle": "超出阈值",
- "xpack.observability.threshold.rule.alertDetailUrlActionVariableDescription": "链接到告警故障排除视图获取进一步的上下文和详情。如果未配置 server.publicBaseUrl,这将为空字符串。",
- "xpack.observability.threshold.rule.alertDropdownTitle": "告警和规则",
- "xpack.observability.threshold.rule.alertFlyout.addCondition": "添加条件",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.avg": "平均值",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.cardinality": "基数",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.count": "文档计数",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.max": "最大值",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.min": "最小值",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p95": "第 95 个百分位",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.p99": "第 99 个百分位",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.rate": "比率",
- "xpack.observability.threshold.rule.alertFlyout.aggregationText.sum": "求和",
- "xpack.observability.threshold.rule.alertFlyout.alertDescription": "任何 Observability 数据类型到达或超出给定值时告警。",
- "xpack.observability.threshold.rule.alertFlyout.alertOnGroupDisappear": "组停止报告数据时提醒我",
- "xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError.docsLink": "文档",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerHelpText": "为每个唯一值创建告警。例如:“host.id”或“cloud.region”。",
- "xpack.observability.threshold.rule.alertFlyout.createAlertPerText": "告警分组依据(可选)",
- "xpack.observability.threshold.rule.alertFlyout.customEquation": "定制方程",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.addCustomRow": "添加聚合/字段",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.deleteRowButton": "删除",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationHelpMessage": "支持基本匹配表达式",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelHelpMessage": "定制标签将在告警图表上以及原因/告警标题中显示",
- "xpack.observability.threshold.rule.alertFlyout.customEquationEditor.labelLabel": "标签(可选)",
- "xpack.observability.threshold.rule.alertFlyout.docCountNoDataDisabledHelpText": "[此设置不适用于文档计数聚合器。]",
- "xpack.observability.threshold.rule.alertFlyout.error.aggregationRequired": "“聚合”必填。",
- "xpack.observability.threshold.rule.alertFlyout.error.equation.invalidCharacters": "方程字段仅支持以下字符:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=",
- "xpack.observability.threshold.rule.alertFlyout.error.invalidFilterQuery": "筛选查询无效。",
- "xpack.observability.threshold.rule.alertFlyout.error.metricRequired": "“指标”必填。",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdRequired": "“阈值”必填。",
- "xpack.observability.threshold.rule.alertFlyout.error.thresholdTypeRequired": "阈值必须包含有效数字。",
- "xpack.observability.threshold.rule.alertFlyout.error.timeRequred": "“时间大小”必填。",
- "xpack.observability.threshold.rule.alertFlyout.groupDisappearHelpText": "启用此选项可在之前检测的组开始不报告任何数据时触发操作。不建议将此选项用于可能会快速自动启动和停止节点的动态扩展基础架构。",
- "xpack.observability.threshold.rule.alertFlyout.outsideRangeLabel": "不介于",
- "xpack.observability.threshold.rule.alertFlyout.removeCondition": "删除条件",
- "xpack.observability.threshold.rule.alerting.noDataFormattedValue": "[无数据]",
- "xpack.observability.threshold.rule.alerting.threshold.defaultActionMessage": "\\{\\{alertName\\}\\} - \\{\\{context.group\\}\\} 处于 \\{\\{context.alertState\\}\\} 状态\n\n 原因:\n \\{\\{context.reason\\}\\}\n ",
- "xpack.observability.threshold.rule.alerting.threshold.fired": "告警",
- "xpack.observability.threshold.rule.alerting.threshold.nodata": "无数据",
- "xpack.observability.threshold.rule.alerting.threshold.noDataFormattedValue": "[无数据]",
- "xpack.observability.threshold.rule.alertsButton": "告警和规则",
- "xpack.observability.threshold.rule.cloudActionVariableDescription": "ECS 定义的云对象(如果在源中可用)。",
- "xpack.observability.threshold.rule.containerActionVariableDescription": "ECS 定义的容器对象(如果在源中可用)。",
- "xpack.observability.threshold.rule.createInventoryRuleButton": "创建库存规则",
- "xpack.observability.threshold.rule.createThresholdRuleButton": "创建阈值规则",
- "xpack.observability.threshold.rule.groupByKeysActionVariableDescription": "包含正报告数据的组的对象",
- "xpack.observability.threshold.rule.hostActionVariableDescription": "ECS 定义的主机对象(如果在源中可用)。",
- "xpack.observability.threshold.rule.infrastructureDropdownMenu": "基础设施",
- "xpack.observability.threshold.rule.infrastructureDropdownTitle": "基础设施规则",
- "xpack.observability.threshold.rule.labelsActionVariableDescription": "与在其上触发此告警的实体关联的标签列表。",
- "xpack.observability.threshold.rule.manageRules": "管理规则",
- "xpack.observability.threshold.rule.metricsDropdownMenu": "指标",
- "xpack.observability.threshold.rule.metricsDropdownTitle": "指标规则",
- "xpack.observability.threshold.rule.orchestratorActionVariableDescription": "ECS 定义的 Orchestrator 对象(如果在源中可用)。",
- "xpack.observability.threshold.rule.reasonActionVariableDescription": "告警原因的简洁描述",
- "xpack.observability.threshold.rule.sourceConfiguration.missingHttp": "无法加载源:无 HTTP 客户端可用。",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureBody": "无法对指标配置应用更改。请稍后重试。",
- "xpack.observability.threshold.rule.sourceConfiguration.updateFailureTitle": "配置更新失败",
- "xpack.observability.threshold.rule.sourceConfiguration.updateSuccessTitle": "已成功更新指标设置",
- "xpack.observability.threshold.rule.tagsActionVariableDescription": "与在其上触发此告警的实体关联的标记列表。",
- "xpack.observability.threshold.rule.threshold.aboveRecovery": "高于",
- "xpack.observability.threshold.rule.threshold.belowRecovery": "低于",
- "xpack.observability.threshold.rule.threshold.betweenRecovery": "介于",
- "xpack.observability.threshold.rule.threshold.customEquation": "定制方程",
- "xpack.observability.threshold.rule.threshold.documentCount": "文档计数",
- "xpack.observability.threshold.rule.timestampDescription": "检测到告警时的时间戳。",
- "xpack.observability.threshold.rule.valueActionVariableDescription": "指定条件中的指标值。用法:(ctx.value.condition0, ctx.value.condition1, 诸如此类)。",
- "xpack.observability.threshold.rule.viewInAppUrlActionVariableDescription": "链接到告警源",
"xpack.observability.threshold.ruleExplorer.groupByAriaLabel": "图表绘制依据",
"xpack.observability.threshold.ruleExplorer.groupByLabel": "所有内容",
"xpack.observability.threshold.ruleName": "阈值(技术预览)",
@@ -29871,8 +29775,6 @@
"xpack.securitySolution.exceptions.viewer.lastUpdated": "已更新 {updated}",
"xpack.securitySolution.exceptions.viewer.paginationDetails": "正在显示 {partOne} 个,共 {partTwo} 个",
"xpack.securitySolution.fieldBrowser.descriptionForScreenReaderOnly": "{field} 字段的描述:",
- "xpack.securitySolution.flyout.errorMessage": "显示 {message} 时出现错误",
- "xpack.securitySolution.flyout.errorTitle": "无法显示 {title}",
"xpack.securitySolution.footer.autoRefreshActiveTooltip": "自动刷新已启用时,时间线将显示匹配查询的最近 {numberOfItems} 个事件。",
"xpack.securitySolution.formattedNumber.countsLabel": "{mantissa}{scale}{hasRemainder}",
"xpack.securitySolution.header.editableTitle.editButtonAria": "通过单击,可以编辑 {title}",
@@ -33089,70 +32991,9 @@
"xpack.securitySolution.fleetIntegration.assets.name": "主机",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.description": "云安全事件筛选。已由 Elastic Defend 集成创建。",
"xpack.securitySolution.fleetIntegration.elasticDefend.eventFilter.nonInteractiveSessions.name": "非交互式会话",
- "xpack.securitySolution.flyout.analyzerErrorMessage": "分析器",
"xpack.securitySolution.flyout.button.timeline": "时间线",
- "xpack.securitySolution.flyout.correlations.caseNameColumnTitle": "名称",
- "xpack.securitySolution.flyout.correlations.reasonColumnTitle": "原因",
- "xpack.securitySolution.flyout.correlations.ruleColumnTitle": "规则",
- "xpack.securitySolution.flyout.correlations.severityColumnTitle": "严重性",
- "xpack.securitySolution.flyout.correlations.statusColumnTitle": "状态",
- "xpack.securitySolution.flyout.correlations.timestampColumnTitle": "时间戳",
- "xpack.securitySolution.flyout.documentDetails.alertReasonTitle": "告警原因",
- "xpack.securitySolution.flyout.documentDetails.analyzerGraphButton": "分析器图表",
- "xpack.securitySolution.flyout.documentDetails.analyzerPreviewTitle": "分析器预览",
- "xpack.securitySolution.flyout.documentDetails.collapseDetailButton": "折叠告警详情",
- "xpack.securitySolution.flyout.documentDetails.correlationsButton": "相关性",
- "xpack.securitySolution.flyout.documentDetails.correlationsTitle": "相关性",
- "xpack.securitySolution.flyout.documentDetails.documentDescriptionTitle": "文档描述",
- "xpack.securitySolution.flyout.documentDetails.documentReasonTitle": "文档原因",
- "xpack.securitySolution.flyout.documentDetails.entitiesButton": "实体",
- "xpack.securitySolution.flyout.documentDetails.entitiesTitle": "实体",
- "xpack.securitySolution.flyout.documentDetails.expandDetailButton": "展开告警详情",
- "xpack.securitySolution.flyout.documentDetails.highlightedFieldsTitle": "突出显示的字段",
- "xpack.securitySolution.flyout.documentDetails.insightsOptions": "洞见选项",
- "xpack.securitySolution.flyout.documentDetails.insightsTab": "洞见",
- "xpack.securitySolution.flyout.documentDetails.insightsTitle": "洞见",
- "xpack.securitySolution.flyout.documentDetails.investigationSectionTitle": "调查",
- "xpack.securitySolution.flyout.documentDetails.investigationsTab": "调查",
- "xpack.securitySolution.flyout.documentDetails.jsonTab": "JSON",
- "xpack.securitySolution.flyout.documentDetails.overviewTab": "概览",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.prevalenceRowText": "不常见",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichment": "已使用威胁情报扩充字段",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatEnrichments": "已使用威胁情报扩充字段",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatch": "检测到威胁匹配",
- "xpack.securitySolution.flyout.documentDetails.overviewTab.threatIntelligence.threatMatches": "检测到威胁匹配",
- "xpack.securitySolution.flyout.documentDetails.prevalenceButton": "普及率",
- "xpack.securitySolution.flyout.documentDetails.prevalenceTitle": "普及率",
- "xpack.securitySolution.flyout.documentDetails.riskScoreTitle": "风险分数",
- "xpack.securitySolution.flyout.documentDetails.ruleDescriptionTitle": "规则描述",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.commandText": "依据",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.processText": "已启动",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.ruleText": "具有规则",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.timeText": "处于",
- "xpack.securitySolution.flyout.documentDetails.sessionPreview.title": "会话查看器预览",
- "xpack.securitySolution.flyout.documentDetails.sessionViewButton": "会话视图",
- "xpack.securitySolution.flyout.documentDetails.severityTitle": "严重性",
- "xpack.securitySolution.flyout.documentDetails.share": "共享告警",
- "xpack.securitySolution.flyout.documentDetails.tableTab": "表",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceButton": "威胁情报",
- "xpack.securitySolution.flyout.documentDetails.threatIntelligenceTitle": "威胁情报",
- "xpack.securitySolution.flyout.documentDetails.visualizationsTitle": "可视化",
- "xpack.securitySolution.flyout.documentDetails.visualizeOptions": "Visualize 选项",
- "xpack.securitySolution.flyout.documentDetails.visualizeTab": "Visualize",
- "xpack.securitySolution.flyout.documentErrorMessage": "文档字段和值",
- "xpack.securitySolution.flyout.documentErrorTitle": "文档信息",
"xpack.securitySolution.flyout.entities.failRelatedHostsDescription": "无法对相关主机执行搜索",
"xpack.securitySolution.flyout.entities.failRelatedUsersDescription": "无法对相关用户执行搜索",
- "xpack.securitySolution.flyout.entities.hostsInfoTitle": "主机信息",
- "xpack.securitySolution.flyout.entities.relatedEntitiesIpColumn": "IP 地址",
- "xpack.securitySolution.flyout.entities.relatedEntitiesNameColumn": "名称",
- "xpack.securitySolution.flyout.entities.relatedHostsTitle": "相关主机",
- "xpack.securitySolution.flyout.entities.relatedUsersTitle": "相关用户",
- "xpack.securitySolution.flyout.entities.usersInfoTitle": "用户信息",
- "xpack.securitySolution.flyout.prevalenceTableAlertCountColumnTitle": "告警计数",
- "xpack.securitySolution.flyout.prevalenceTableDocCountColumnTitle": "文档计数",
- "xpack.securitySolution.flyout.response.title": "响应",
- "xpack.securitySolution.flyout.sessionViewErrorMessage": "会话视图",
"xpack.securitySolution.footer.autoRefreshActiveDescription": "自动刷新已启用",
"xpack.securitySolution.footer.cancel": "取消",
"xpack.securitySolution.footer.data": "数据",
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts
index 6e2465e58c2fd..a2f3e1eb80392 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate.ts
@@ -5,7 +5,7 @@
* 2.0.
*/
import { AsApiContract } from '@kbn/actions-plugin/common';
-import { RuleAggregationFormattedResult } from '@kbn/alerting-plugin/common';
+import { AggregateRulesResponseBody } from '@kbn/alerting-plugin/common/routes/rule/apis/aggregate';
import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants';
import { mapFiltersToKql } from './map_filters_to_kql';
import {
@@ -14,6 +14,7 @@ import {
rewriteBodyRes,
rewriteTagsBodyRes,
GetRuleTagsResponse,
+ AggregateRulesResponse,
} from './aggregate_helpers';
export async function loadRuleTags({
@@ -43,7 +44,7 @@ export async function loadRuleAggregations({
ruleExecutionStatusesFilter,
ruleStatusesFilter,
tagsFilter,
-}: LoadRuleAggregationsProps): Promise {
+}: LoadRuleAggregationsProps): Promise {
const filters = mapFiltersToKql({
typesFilter,
actionTypesFilter,
@@ -51,7 +52,7 @@ export async function loadRuleAggregations({
ruleStatusesFilter,
tagsFilter,
});
- const res = await http.post>(
+ const res = await http.post(
`${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`,
{
body: JSON.stringify({
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_helpers.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_helpers.ts
index 61fff1e95a451..d093649f73740 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_helpers.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_helpers.ts
@@ -7,19 +7,34 @@
import { HttpSetup } from '@kbn/core/public';
import { RewriteRequestCase } from '@kbn/actions-plugin/common';
-import { RuleAggregationFormattedResult } from '@kbn/alerting-plugin/common';
+import { AggregateRulesResponseBody } from '@kbn/alerting-plugin/common/routes/rule/apis/aggregate';
import { RuleStatus } from '../../../types';
-export const rewriteBodyRes: RewriteRequestCase = ({
+export interface AggregateRulesResponse {
+ ruleExecutionStatus: Record;
+ ruleLastRunOutcome: Record;
+ ruleEnabledStatus: {
+ enabled: number;
+ disabled: number;
+ };
+ ruleMutedStatus: {
+ muted: number;
+ unmuted: number;
+ };
+ ruleSnoozedStatus: {
+ snoozed: number;
+ };
+ ruleTags: string[];
+}
+
+export const rewriteBodyRes = ({
rule_execution_status: ruleExecutionStatus,
rule_last_run_outcome: ruleLastRunOutcome,
rule_enabled_status: ruleEnabledStatus,
rule_muted_status: ruleMutedStatus,
rule_snoozed_status: ruleSnoozedStatus,
rule_tags: ruleTags,
- ...rest
-}: any) => ({
- ...rest,
+}: AggregateRulesResponseBody): AggregateRulesResponse => ({
ruleExecutionStatus,
ruleEnabledStatus,
ruleMutedStatus,
diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_kuery_filter.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_kuery_filter.ts
index 20d1fc9281b48..23941ae36ccc5 100644
--- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_kuery_filter.ts
+++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/aggregate_kuery_filter.ts
@@ -4,10 +4,13 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
-import { AsApiContract } from '@kbn/actions-plugin/common';
-import { RuleAggregationFormattedResult } from '@kbn/alerting-plugin/common';
+import { AggregateRulesResponseBody } from '@kbn/alerting-plugin/common/routes/rule/apis/aggregate';
import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants';
-import { LoadRuleAggregationsProps, rewriteBodyRes } from './aggregate_helpers';
+import {
+ AggregateRulesResponse,
+ LoadRuleAggregationsProps,
+ rewriteBodyRes,
+} from './aggregate_helpers';
import { mapFiltersToKueryNode } from './map_filters_to_kuery_node';
export async function loadRuleAggregationsWithKueryFilter({
@@ -18,7 +21,7 @@ export async function loadRuleAggregationsWithKueryFilter({
ruleExecutionStatusesFilter,
ruleStatusesFilter,
tagsFilter,
-}: LoadRuleAggregationsProps): Promise {
+}: LoadRuleAggregationsProps): Promise {
const filtersKueryNode = mapFiltersToKueryNode({
typesFilter,
actionTypesFilter,
@@ -28,7 +31,7 @@ export async function loadRuleAggregationsWithKueryFilter({
searchText,
});
- const res = await http.post>(
+ const res = await http.post(
`${INTERNAL_BASE_ALERTING_API_PATH}/rules/_aggregate`,
{
body: JSON.stringify({
@@ -37,5 +40,6 @@ export async function loadRuleAggregationsWithKueryFilter({
}),
}
);
+
return rewriteBodyRes(res);
}
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts
similarity index 90%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts
index 7bb8874dafed9..8df0f20e88de7 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_fired.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts
@@ -6,8 +6,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { createIndexConnector, createRule } from '../helpers/alerting_api_helper';
@@ -22,8 +25,8 @@ export default function ({ getService }: FtrProviderContext) {
const esDeleteAllIndices = getService('esDeleteAllIndices');
const logger = getService('log');
- describe('Threshold rule - AVG - PCT - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - AVG - PCT - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -44,7 +47,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/alerting/rule/${ruleId}`).set('kbn-xsrf', 'foo');
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -131,13 +134,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -145,14 +148,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts
similarity index 90%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts
index c0138d993e6bd..d57398def6381 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_pct_no_data.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts
@@ -5,8 +5,11 @@
* 2.0.
*/
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
@@ -20,8 +23,8 @@ export default function ({ getService }: FtrProviderContext) {
const esClient = getService('es');
const supertest = getService('supertest');
- describe('Threshold rule - AVG - PCT - NoData', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - AVG - PCT - NoData', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id-no-data';
let actionId: string;
@@ -40,7 +43,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/alerting/rule/${ruleId}`).set('kbn-xsrf', 'foo');
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -125,13 +128,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -139,14 +142,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.nodata');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.nodata'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts
similarity index 92%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts
index 1c35793e04337..b4570771b9f2f 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/avg_us_fired.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts
@@ -8,8 +8,11 @@
import moment from 'moment';
import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace';
import { format } from 'url';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../common/ftr_provider_context';
@@ -33,8 +36,8 @@ export default function ({ getService }: FtrProviderContext) {
const kibanaUrl = format(kibanaServerConfig);
const supertest = getService('supertest');
- describe('Threshold rule - AVG - US - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - AVG - US - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
@@ -60,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esDeleteAllIndices([ALERT_ACTION_INDEX]);
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -149,7 +152,7 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
alertId = (resp.hits.hits[0]._source as any)['kibana.alert.uuid'];
@@ -157,7 +160,7 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -165,14 +168,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
@@ -210,7 +216,7 @@ export default function ({ getService }: FtrProviderContext) {
indexName: ALERT_ACTION_INDEX,
});
- expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.threshold');
+ expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold');
expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql(
`https://localhost:5601/app/observability/alerts?_a=(kuery:%27kibana.alert.uuid:%20%22${alertId}%22%27%2CrangeFrom:%27${rangeFrom}%27%2CrangeTo:now%2Cstatus:all)`
);
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
similarity index 91%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
index 794902f19688f..8499511391ab6 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/custom_eq_avg_bytes_fired.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
@@ -12,8 +12,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { createIndexConnector, createRule } from '../helpers/alerting_api_helper';
@@ -28,8 +31,8 @@ export default function ({ getService }: FtrProviderContext) {
const esDeleteAllIndices = getService('esDeleteAllIndices');
const logger = getService('log');
- describe('Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -50,7 +53,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/alerting/rule/${ruleId}`).set('kbn-xsrf', 'foo');
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -139,13 +142,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -153,14 +156,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts
similarity index 90%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts
index 3361f4a04e185..99f313960fa6b 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/documents_count_fired.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts
@@ -6,8 +6,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { createIndexConnector, createRule } from '../helpers/alerting_api_helper';
@@ -22,8 +25,8 @@ export default function ({ getService }: FtrProviderContext) {
const esDeleteAllIndices = getService('esDeleteAllIndices');
const logger = getService('log');
- describe('Threshold rule - DOCUMENTS_COUNT - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - DOCUMENTS_COUNT - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -44,7 +47,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/alerting/rule/${ruleId}`).set('kbn-xsrf', 'foo');
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -129,13 +132,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -143,14 +146,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts
similarity index 92%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts
index 9d3e5e2bd17ad..5925907b471b6 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule/group_by_fired.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts
@@ -13,8 +13,11 @@
import moment from 'moment';
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { createIndexConnector, createRule } from '../helpers/alerting_api_helper';
@@ -35,8 +38,8 @@ export default function ({ getService }: FtrProviderContext) {
let alertId: string;
let startedAt: string;
- describe('Threshold rule - GROUP_BY - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe('Custom Threshold rule - GROUP_BY - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -57,7 +60,7 @@ export default function ({ getService }: FtrProviderContext) {
await supertest.delete(`/api/alerting/rule/${ruleId}`).set('kbn-xsrf', 'foo');
await supertest.delete(`/api/actions/connector/${actionId}`).set('kbn-xsrf', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -149,7 +152,7 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await waitForAlertInIndex({
esClient,
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
alertId = (resp.hits.hits[0]._source as any)['kibana.alert.uuid'];
@@ -157,7 +160,7 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -165,14 +168,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', 'host-0');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
@@ -220,7 +226,7 @@ export default function ({ getService }: FtrProviderContext) {
indexName: ALERT_ACTION_INDEX,
});
- expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.threshold');
+ expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold');
expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql(
`https://localhost:5601/app/observability/alerts?_a=(kuery:%27kibana.alert.uuid:%20%22${alertId}%22%27%2CrangeFrom:%27${rangeFrom}%27%2CrangeTo:now%2Cstatus:all)`
);
diff --git a/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts
similarity index 96%
rename from x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts
rename to x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts
index f4d26f961c234..3119a0ae46e63 100644
--- a/x-pack/test/alerting_api_integration/observability/threshold_rule_data_view.ts
+++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts
@@ -6,7 +6,10 @@
*/
import expect from '@kbn/expect';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../common/ftr_provider_context';
@@ -20,7 +23,7 @@ export default function ({ getService }: FtrProviderContext) {
const objectRemover = new ObjectRemover(supertest);
const es = getService('es');
- describe('Threshold rule data view >', () => {
+ describe('Custom Threshold rule data view >', () => {
const DATA_VIEW_ID = 'data-view-id';
let ruleId: string;
diff --git a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts
index a50e1b4e85c14..4bde235e97dd2 100644
--- a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts
+++ b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts
@@ -6,7 +6,7 @@
*/
import { MetricThresholdParams } from '@kbn/infra-plugin/common/alerting/metrics';
-import { ThresholdParams } from '@kbn/observability-plugin/common/threshold_rule/types';
+import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types';
import type { SuperTest, Test } from 'supertest';
export async function createIndexConnector({
diff --git a/x-pack/test/alerting_api_integration/observability/index.ts b/x-pack/test/alerting_api_integration/observability/index.ts
index 7bc5a5caab0b2..884c17d2abfd1 100644
--- a/x-pack/test/alerting_api_integration/observability/index.ts
+++ b/x-pack/test/alerting_api_integration/observability/index.ts
@@ -10,13 +10,13 @@ export default function ({ loadTestFile }: any) {
describe('Observability Rules', () => {
describe('Rules Endpoints', () => {
loadTestFile(require.resolve('./metric_threshold_rule'));
- loadTestFile(require.resolve('./threshold_rule/avg_pct_fired'));
- loadTestFile(require.resolve('./threshold_rule/avg_pct_no_data'));
- loadTestFile(require.resolve('./threshold_rule/avg_us_fired'));
- loadTestFile(require.resolve('./threshold_rule/custom_eq_avg_bytes_fired'));
- loadTestFile(require.resolve('./threshold_rule/documents_count_fired'));
- loadTestFile(require.resolve('./threshold_rule/group_by_fired'));
- loadTestFile(require.resolve('./threshold_rule_data_view'));
+ loadTestFile(require.resolve('./custom_threshold_rule/avg_pct_fired'));
+ loadTestFile(require.resolve('./custom_threshold_rule/avg_pct_no_data'));
+ loadTestFile(require.resolve('./custom_threshold_rule/avg_us_fired'));
+ loadTestFile(require.resolve('./custom_threshold_rule/custom_eq_avg_bytes_fired'));
+ loadTestFile(require.resolve('./custom_threshold_rule/documents_count_fired'));
+ loadTestFile(require.resolve('./custom_threshold_rule/group_by_fired'));
+ loadTestFile(require.resolve('./custom_threshold_rule_data_view'));
});
describe('Synthetics', () => {
loadTestFile(require.resolve('./synthetics_rule'));
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/aggregate.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/aggregate.ts
deleted file mode 100644
index 63fdfa8d498fa..0000000000000
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/aggregate.ts
+++ /dev/null
@@ -1,281 +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 { Spaces } from '../../../scenarios';
-import { getUrlPrefix, getTestRuleData, ObjectRemover, getEventLog } from '../../../../common/lib';
-import { FtrProviderContext } from '../../../../common/ftr_provider_context';
-
-// eslint-disable-next-line import/no-default-export
-export default function createAggregateTests({ getService }: FtrProviderContext) {
- const supertest = getService('supertest');
- const retry = getService('retry');
-
- const getEventLogWithRetry = async (id: string) => {
- await retry.try(async () => {
- return await getEventLog({
- getService,
- spaceId: Spaces.space1.id,
- type: 'alert',
- id,
- provider: 'alerting',
- actions: new Map([['execute', { equal: 1 }]]),
- });
- });
- };
-
- describe('aggregate', () => {
- const objectRemover = new ObjectRemover(supertest);
-
- afterEach(() => objectRemover.removeAll());
-
- it('should aggregate when there are no alerts', async () => {
- const response = await supertest.get(
- `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_aggregate`
- );
- expect(response.status).to.eql(200);
- expect(response.body).to.eql({
- rule_enabled_status: {
- disabled: 0,
- enabled: 0,
- },
- rule_execution_status: {
- ok: 0,
- active: 0,
- error: 0,
- pending: 0,
- unknown: 0,
- warning: 0,
- },
- rule_last_run_outcome: {
- succeeded: 0,
- warning: 0,
- failed: 0,
- },
- rule_muted_status: {
- muted: 0,
- unmuted: 0,
- },
- rule_snoozed_status: {
- snoozed: 0,
- },
- rule_tags: [],
- });
- });
-
- it('should aggregate alert status totals', async () => {
- const NumOkAlerts = 4;
- const NumActiveAlerts = 1;
- const NumErrorAlerts = 2;
-
- const okAlertIds: string[] = [];
- const activeAlertIds: string[] = [];
- const errorAlertIds: string[] = [];
-
- await Promise.all(
- [...Array(NumOkAlerts)].map(async () => {
- const okAlertId = await createTestAlert({
- rule_type_id: 'test.noop',
- schedule: { interval: '24h' },
- });
- okAlertIds.push(okAlertId);
- objectRemover.add(Spaces.space1.id, okAlertId, 'rule', 'alerting');
- })
- );
-
- await Promise.all(okAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await Promise.all(
- [...Array(NumActiveAlerts)].map(async () => {
- const activeAlertId = await createTestAlert({
- rule_type_id: 'test.patternFiring',
- schedule: { interval: '24h' },
- params: {
- pattern: { instance: new Array(100).fill(true) },
- },
- });
- activeAlertIds.push(activeAlertId);
- objectRemover.add(Spaces.space1.id, activeAlertId, 'rule', 'alerting');
- })
- );
-
- await Promise.all(activeAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await Promise.all(
- [...Array(NumErrorAlerts)].map(async () => {
- const errorAlertId = await createTestAlert({
- rule_type_id: 'test.throw',
- schedule: { interval: '24h' },
- });
- errorAlertIds.push(errorAlertId);
- objectRemover.add(Spaces.space1.id, errorAlertId, 'rule', 'alerting');
- })
- );
-
- await Promise.all(errorAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await retry.try(async () => {
- const response = await supertest.get(
- `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_aggregate`
- );
-
- expect(response.status).to.eql(200);
- expect(response.body).to.eql({
- rule_enabled_status: {
- disabled: 0,
- enabled: 7,
- },
- rule_execution_status: {
- ok: NumOkAlerts,
- active: NumActiveAlerts,
- error: NumErrorAlerts,
- pending: 0,
- unknown: 0,
- warning: 0,
- },
- rule_last_run_outcome: {
- succeeded: 5,
- warning: 0,
- failed: 2,
- },
- rule_muted_status: {
- muted: 0,
- unmuted: 7,
- },
- rule_snoozed_status: {
- snoozed: 0,
- },
- rule_tags: ['foo'],
- });
- });
- });
-
- describe('tags limit', () => {
- it('should be 50 be default', async () => {
- const numOfAlerts = 3;
- const numOfTagsPerAlert = 30;
-
- await Promise.all(
- [...Array(numOfAlerts)].map(async (_, alertIndex) => {
- const okAlertId = await createTestAlert({
- rule_type_id: 'test.noop',
- schedule: { interval: '24h' },
- tags: [...Array(numOfTagsPerAlert)].map(
- (__, i) => `tag-${i + numOfTagsPerAlert * alertIndex}`
- ),
- });
- objectRemover.add(Spaces.space1.id, okAlertId, 'rule', 'alerting');
- })
- );
-
- const response = await supertest.get(
- `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rules/_aggregate`
- );
-
- expect(response.body.rule_tags.length).to.eql(50);
- });
- });
-
- describe('legacy', () => {
- it('should aggregate alert status totals', async () => {
- const NumOkAlerts = 4;
- const NumActiveAlerts = 1;
- const NumErrorAlerts = 2;
-
- const okAlertIds: string[] = [];
- const activeAlertIds: string[] = [];
- const errorAlertIds: string[] = [];
-
- await Promise.all(
- [...Array(NumOkAlerts)].map(async () => {
- const okAlertId = await createTestAlert({
- rule_type_id: 'test.noop',
- schedule: { interval: '24h' },
- tags: ['a', 'b'],
- });
- okAlertIds.push(okAlertId);
- objectRemover.add(Spaces.space1.id, okAlertId, 'rule', 'alerting');
- })
- );
- await Promise.all(okAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await Promise.all(
- [...Array(NumActiveAlerts)].map(async () => {
- const activeAlertId = await createTestAlert({
- rule_type_id: 'test.patternFiring',
- schedule: { interval: '24h' },
- params: {
- pattern: { instance: new Array(100).fill(true) },
- },
- tags: ['a', 'c', 'f'],
- });
- activeAlertIds.push(activeAlertId);
- objectRemover.add(Spaces.space1.id, activeAlertId, 'rule', 'alerting');
- })
- );
- await Promise.all(activeAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await Promise.all(
- [...Array(NumErrorAlerts)].map(async () => {
- const errorAlertId = await createTestAlert({
- rule_type_id: 'test.throw',
- schedule: { interval: '24h' },
- tags: ['b', 'c', 'd'],
- });
- errorAlertIds.push(errorAlertId);
- objectRemover.add(Spaces.space1.id, errorAlertId, 'rule', 'alerting');
- })
- );
- await Promise.all(errorAlertIds.map((id) => getEventLogWithRetry(id)));
-
- await retry.try(async () => {
- const response = await supertest.get(
- `${getUrlPrefix(Spaces.space1.id)}/api/alerts/_aggregate`
- );
-
- expect(response.status).to.eql(200);
- expect(response.body).to.eql({
- alertExecutionStatus: {
- ok: NumOkAlerts,
- active: NumActiveAlerts,
- error: NumErrorAlerts,
- pending: 0,
- unknown: 0,
- warning: 0,
- },
- ruleEnabledStatus: {
- disabled: 0,
- enabled: 7,
- },
- ruleLastRunOutcome: {
- succeeded: 5,
- warning: 0,
- failed: 2,
- },
- ruleMutedStatus: {
- muted: 0,
- unmuted: 7,
- },
- ruleSnoozedStatus: {
- snoozed: 0,
- },
- ruleTags: ['a', 'b', 'c', 'd', 'f'],
- });
- });
- });
- });
- });
-
- async function createTestAlert(testAlertOverrides = {}) {
- const { body: createdAlert } = await supertest
- .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`)
- .set('kbn-xsrf', 'foo')
- .send(getTestRuleData(testAlertOverrides))
- .expect(200);
- return createdAlert.id;
- }
-}
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/index.ts
index 6dacd17642a10..7a0c24878d07f 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/index.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/index.ts
@@ -14,7 +14,6 @@ export default function alertingTests({ loadTestFile, getService }: FtrProviderC
before(async () => await buildUp(getService));
after(async () => await tearDown(getService));
- loadTestFile(require.resolve('./aggregate'));
loadTestFile(require.resolve('./aggregate_post'));
loadTestFile(require.resolve('./create'));
loadTestFile(require.resolve('./delete'));
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/check_registered_rule_types.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/check_registered_rule_types.ts
index 40197f1e18783..e748478b18432 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/check_registered_rule_types.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/check_registered_rule_types.ts
@@ -63,7 +63,7 @@ export default function createRegisteredRuleTypeTests({ getService }: FtrProvide
'monitoring_alert_elasticsearch_version_mismatch',
'monitoring_ccr_read_exceptions',
'monitoring_shard_size',
- 'observability.rules.threshold',
+ 'observability.rules.custom_threshold',
'apm.transaction_duration',
'apm.anomaly',
'apm.error_rate',
diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts
index d49df52bfcd1c..c786a41411a5b 100644
--- a/x-pack/test/api_integration/apis/security/privileges.ts
+++ b/x-pack/test/api_integration/apis/security/privileges.ts
@@ -55,7 +55,7 @@ export default function ({ getService }: FtrProviderContext) {
'file_operations_all',
'execute_operations_all',
],
- uptime: ['all', 'read', 'minimal_all', 'minimal_read'],
+ uptime: ['all', 'read', 'minimal_all', 'minimal_read', 'elastic_managed_locations_enabled'],
securitySolutionAssistant: ['all', 'read', 'minimal_all', 'minimal_read'],
securitySolutionCases: ['all', 'read', 'minimal_all', 'minimal_read', 'cases_delete'],
infrastructure: ['all', 'read', 'minimal_all', 'minimal_read'],
diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts
index c6982b3c6d53e..6c6d32c1cb1e9 100644
--- a/x-pack/test/api_integration/apis/security/privileges_basic.ts
+++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts
@@ -130,7 +130,13 @@ export default function ({ getService }: FtrProviderContext) {
'file_operations_all',
'execute_operations_all',
],
- uptime: ['all', 'read', 'minimal_all', 'minimal_read'],
+ uptime: [
+ 'all',
+ 'elastic_managed_locations_enabled',
+ 'read',
+ 'minimal_all',
+ 'minimal_read',
+ ],
securitySolutionAssistant: ['all', 'read', 'minimal_all', 'minimal_read'],
securitySolutionCases: ['all', 'read', 'minimal_all', 'minimal_read', 'cases_delete'],
infrastructure: ['all', 'read', 'minimal_all', 'minimal_read'],
diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group8/exception_operators_data_types/keyword_array.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group8/exception_operators_data_types/keyword_array.ts
index 7d95f6c9ec6bc..ff3611b4ab583 100644
--- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group8/exception_operators_data_types/keyword_array.ts
+++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group8/exception_operators_data_types/keyword_array.ts
@@ -154,8 +154,7 @@ export default ({ getService }: FtrProviderContext) => {
await waitForSignalsToBePresent(supertest, log, 1, [id]);
const signalsOpen = await getSignalsById(supertest, log, id);
const hits = signalsOpen.hits.hits.map((hit) => hit._source?.keyword).sort();
- // @ts-expect-error ts upgrade v4.7.4
- expect(hits.flat(Number.MAX_SAFE_INTEGER)).to.eql([]);
+ expect(hits.flat(10)).to.eql([]);
});
});
@@ -283,7 +282,7 @@ export default ({ getService }: FtrProviderContext) => {
await waitForSignalsToBePresent(supertest, log, 1, [id]);
const signalsOpen = await getSignalsById(supertest, log, id);
const hits = signalsOpen.hits.hits.map((hit) => hit._source?.keyword).sort();
- expect(hits.flat(Number.MAX_SAFE_INTEGER)).to.eql([]);
+ expect(hits.flat(10)).to.eql([]);
});
});
@@ -345,7 +344,7 @@ export default ({ getService }: FtrProviderContext) => {
await waitForSignalsToBePresent(supertest, log, 1, [id]);
const signalsOpen = await getSignalsById(supertest, log, id);
const hits = signalsOpen.hits.hits.map((hit) => hit._source?.keyword).sort();
- expect(hits.flat(Number.MAX_SAFE_INTEGER)).to.eql([]);
+ expect(hits.flat(10)).to.eql([]);
});
});
@@ -525,7 +524,7 @@ export default ({ getService }: FtrProviderContext) => {
await waitForSignalsToBePresent(supertest, log, 1, [id]);
const signalsOpen = await getSignalsById(supertest, log, id);
const hits = signalsOpen.hits.hits.map((hit) => hit._source?.keyword).sort();
- expect(hits.flat(Number.MAX_SAFE_INTEGER)).to.eql([]);
+ expect(hits.flat(10)).to.eql([]);
});
});
@@ -695,7 +694,7 @@ export default ({ getService }: FtrProviderContext) => {
await waitForSignalsToBePresent(supertest, log, 1, [id]);
const signalsOpen = await getSignalsById(supertest, log, id);
const hits = signalsOpen.hits.hits.map((hit) => hit._source?.keyword).sort();
- expect(hits.flat(Number.MAX_SAFE_INTEGER)).to.eql([]);
+ expect(hits.flat(10)).to.eql([]);
});
});
diff --git a/x-pack/test/functional/apps/discover/async_scripted_fields.js b/x-pack/test/functional/apps/discover/async_scripted_fields.js
index 0d48f42c5ba1e..d86298405b72d 100644
--- a/x-pack/test/functional/apps/discover/async_scripted_fields.js
+++ b/x-pack/test/functional/apps/discover/async_scripted_fields.js
@@ -27,7 +27,7 @@ export default function ({ getService, getPageObjects }) {
const security = getService('security');
const dashboardAddPanel = getService('dashboardAddPanel');
- describe('async search with scripted fields', function () {
+ describe('search with scripted fields', function () {
this.tags(['skipFirefox']);
before(async function () {
@@ -51,7 +51,7 @@ export default function ({ getService, getPageObjects }) {
await security.testUser.restoreDefaults();
});
- it('query should show failed shards callout', async function () {
+ it('query should show incomplete results callout', async function () {
if (false) {
/* If you had to modify the scripted fields, you could un-comment all this, run it, use es_archiver to update 'kibana_scripted_fields_on_logstash'
*/
@@ -81,11 +81,11 @@ export default function ({ getService, getPageObjects }) {
'dscNoResultsInterceptedWarningsCallout_warningTitle'
);
log.debug(shardMessage);
- expect(shardMessage).to.be('1 of 3 shards failed');
+ expect(shardMessage).to.be('The data might be incomplete or wrong.');
});
});
- it('query should show failed shards badge on dashboard', async function () {
+ it('query should show incomplete results badge on dashboard', async function () {
await security.testUser.setRoles([
'test_logstash_reader',
'global_discover_all',
diff --git a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts
index ee15563b7f208..7cc6f74c452e6 100644
--- a/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts
+++ b/x-pack/test/functional/apps/observability_log_explorer/header_menu.ts
@@ -8,6 +8,7 @@ import expect from '@kbn/expect';
import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getService, getPageObjects }: FtrProviderContext) {
+ const browser = getService('browser');
const esArchiver = getService('esArchiver');
const kibanaServer = getService('kibanaServer');
const retry = getService('retry');
@@ -35,6 +36,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
});
describe('Discover fallback link', () => {
+ before(async () => {
+ await PageObjects.observabilityLogExplorer.navigateTo();
+ });
+
it('should render a button link ', async () => {
const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink();
expect(await discoverLink.isDisplayed()).to.be(true);
@@ -77,5 +82,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
});
});
});
+
+ describe('Add data link', () => {
+ before(async () => {
+ await PageObjects.observabilityLogExplorer.navigateTo();
+ });
+
+ it('should render a button link ', async () => {
+ const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink();
+ expect(await onboardingLink.isDisplayed()).to.be(true);
+ });
+
+ it('should navigate to the observability onboarding overview page', async () => {
+ const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink();
+ onboardingLink.click();
+
+ await retry.try(async () => {
+ const url = await browser.getCurrentUrl();
+ expect(url).to.contain(`/app/observabilityOnboarding`);
+ });
+ });
+ });
});
}
diff --git a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts
index 3f0adc5783893..ae6ac9adab2f5 100644
--- a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts
+++ b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts
@@ -34,7 +34,8 @@ export default function ({ getService }: FtrProviderContext) {
},
};
- describe('creation with runtime mappings', function () {
+ // Failing: See https://github.com/elastic/kibana/issues/166395
+ describe.skip('creation with runtime mappings', function () {
before(async () => {
await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote');
await transform.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp');
diff --git a/x-pack/test/functional/page_objects/observability_log_explorer.ts b/x-pack/test/functional/page_objects/observability_log_explorer.ts
index 7e4b83083ace0..9e46c9bf826a3 100644
--- a/x-pack/test/functional/page_objects/observability_log_explorer.ts
+++ b/x-pack/test/functional/page_objects/observability_log_explorer.ts
@@ -323,6 +323,10 @@ export function ObservabilityLogExplorerPageObject({
return testSubjects.find('logExplorerDiscoverFallbackLink');
},
+ getOnboardingLink() {
+ return testSubjects.find('logExplorerOnboardingLink');
+ },
+
// Query Bar
getQueryBar() {
return testSubjects.find('queryInput');
diff --git a/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts b/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts
index 5f09137850a2d..f7f9b1eb9ff00 100644
--- a/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts
+++ b/x-pack/test/observability_functional/apps/observability/pages/rule_details_page.ts
@@ -36,8 +36,7 @@ export default ({ getService }: FtrProviderContext) => {
return true;
}
- // FLAKY: https://github.com/elastic/kibana/issues/165619
- describe.skip('Observability Rule Details page', function () {
+ describe('Observability Rule Details page', function () {
this.tags('includeFirefox');
let uptimeRuleId: string;
@@ -149,10 +148,14 @@ export default ({ getService }: FtrProviderContext) => {
describe('Alert summary widget component', () => {
before(async () => {
- await observability.alerts.common.navigateToRuleDetailsByRuleId(uptimeRuleId);
+ await observability.alerts.common.navigateToRuleDetailsByRuleId(logThresholdRuleId);
+ await retry.waitFor(
+ 'Rule details to be visible',
+ async () => await testSubjects.exists('ruleDetails')
+ );
});
- it('shows component on the rule detils page', async () => {
+ it('shows component on the rule details page', async () => {
await observability.components.alertSummaryWidget.getCompactComponentSelectorOrFail();
const timeRangeTitle =
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_auto_refresh.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_auto_refresh.cy.ts
index ffcfb468e0824..35e6e596131ec 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_auto_refresh.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_auto_refresh.cy.ts
@@ -22,6 +22,7 @@ import {
expectNumberOfRules,
selectRulesByName,
getRuleRow,
+ setRulesTableAutoRefreshIntervalSetting,
} from '../../../../tasks/alerts_detection_rules';
import { login, visit, visitWithoutDateRange } from '../../../../tasks/login';
@@ -30,8 +31,7 @@ import { createRule } from '../../../../tasks/api_calls/rules';
import { cleanKibana } from '../../../../tasks/common';
import { getNewRule } from '../../../../objects/rule';
-const DEFAULT_RULE_REFRESH_INTERVAL_VALUE = 60000;
-const NUM_OF_TEST_RULES = 6;
+const RULES_TABLE_REFRESH_INTERVAL_MS = 60000;
// TODO: https://github.com/elastic/kibana/issues/161540
describe(
@@ -42,82 +42,128 @@ describe(
cleanKibana();
login();
- for (let i = 1; i <= NUM_OF_TEST_RULES; ++i) {
- createRule(getNewRule({ name: `Test rule ${i}`, rule_id: `${i}`, enabled: false }));
- }
+ setRulesTableAutoRefreshIntervalSetting({
+ enabled: true,
+ refreshInterval: RULES_TABLE_REFRESH_INTERVAL_MS,
+ });
+ createRule(getNewRule({ name: 'Test rule 1', rule_id: '1', enabled: false }));
});
beforeEach(() => {
login();
});
- it('Auto refreshes rules', () => {
- mockGlobalClock();
- visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL);
+ it('gets deactivated when any rule selected and activated after rules unselected', () => {
+ visit(DETECTIONS_RULE_MANAGEMENT_URL);
+
+ expectNumberOfRules(RULES_MANAGEMENT_TABLE, 1);
+
+ // check refresh settings if it's enabled before selecting
+ expectAutoRefreshIsEnabled();
+
+ selectAllRules();
- expectNumberOfRules(RULES_MANAGEMENT_TABLE, NUM_OF_TEST_RULES);
+ // auto refresh should be deactivated (which means disabled without an ability to enable it) after rules selected
+ expectAutoRefreshIsDeactivated();
- // // mock 1 minute passing to make sure refresh is conducted
- cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
- cy.tick(DEFAULT_RULE_REFRESH_INTERVAL_VALUE);
- cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('be.visible');
+ clearAllRuleSelection();
- cy.contains(REFRESH_RULES_STATUS, 'Updated now');
+ // after all rules unselected, auto refresh should be reset to its previous state
+ expectAutoRefreshIsEnabled();
});
- it('should prevent table from rules refetch if any rule selected', () => {
- mockGlobalClock();
- visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL);
+ describe('when enabled', () => {
+ beforeEach(() => {
+ mockGlobalClock();
+ visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL);
- expectNumberOfRules(RULES_MANAGEMENT_TABLE, NUM_OF_TEST_RULES);
+ expectNumberOfRules(RULES_MANAGEMENT_TABLE, 1);
+ });
- selectRulesByName(['Test rule 1']);
+ it('refreshes rules after refresh interval has passed', () => {
+ cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS);
+ cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('be.visible');
- // mock 1 minute passing to make sure refresh is not conducted
- cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
- cy.tick(DEFAULT_RULE_REFRESH_INTERVAL_VALUE);
- cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
+ cy.contains(REFRESH_RULES_STATUS, 'Updated now');
+ });
- // ensure rule is still selected
- getRuleRow('Test rule 1').find(EUI_CHECKBOX).should('be.checked');
+ it('refreshes rules on window focus', () => {
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS / 2);
- cy.get(REFRESH_RULES_STATUS).should('have.not.text', 'Updated now');
+ cy.window().trigger('blur');
+ cy.window().trigger('focus');
+
+ cy.contains(REFRESH_RULES_STATUS, 'Updated now');
+ });
});
- it('should disable auto refresh when any rule selected and enable it after rules unselected', () => {
- visit(DETECTIONS_RULE_MANAGEMENT_URL);
+ describe('when disabled', () => {
+ beforeEach(() => {
+ mockGlobalClock();
+ visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL);
+ expectNumberOfRules(RULES_MANAGEMENT_TABLE, 1);
+ });
- expectNumberOfRules(RULES_MANAGEMENT_TABLE, NUM_OF_TEST_RULES);
+ it('does NOT refresh rules after refresh interval has passed', () => {
+ disableAutoRefresh();
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS * 2); // Make sure enough time has passed to verify auto-refresh doesn't happen
- // check refresh settings if it's enabled before selecting
- expectAutoRefreshIsEnabled();
+ cy.contains(REFRESH_RULES_STATUS, 'Updated 2 minutes ago');
+ });
- selectAllRules();
+ it('does NOT refresh rules on window focus', () => {
+ disableAutoRefresh();
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS * 2); // Make sure enough time has passed to verify auto-refresh doesn't happen
- // auto refresh should be deactivated (which means disabled without an ability to enable it) after rules selected
- expectAutoRefreshIsDeactivated();
+ cy.window().trigger('blur');
+ cy.window().trigger('focus');
- clearAllRuleSelection();
+ // We need to make sure window focus event doesn't cause refetching. Without some delay
+ // the following expectations always pass even. It happens since 'focus' event gets handled
+ // in an async way so the status text is updated with some delay.
+ // eslint-disable-next-line cypress/no-unnecessary-waiting
+ cy.wait(1000);
- // after all rules unselected, auto refresh should be reset to its previous state
- expectAutoRefreshIsEnabled();
- });
+ // By using a custom timeout make sure it doesn't wait too long due to global timeout configuration
+ // so the expected text appears after a refresh and the test passes while it shouldn't.
+ cy.contains(REFRESH_RULES_STATUS, 'Updated 2 minutes ago', { timeout: 10000 });
+ });
- it('should not enable auto refresh after rules were unselected if auto refresh was disabled', () => {
- visit(DETECTIONS_RULE_MANAGEMENT_URL);
+ it('does NOT get enabled after rules were unselected', () => {
+ disableAutoRefresh();
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS * 2); // Make sure enough time has passed to verify auto-refresh doesn't happen
- expectNumberOfRules(RULES_MANAGEMENT_TABLE, NUM_OF_TEST_RULES);
+ selectAllRules();
- disableAutoRefresh();
+ expectAutoRefreshIsDeactivated();
- selectAllRules();
+ clearAllRuleSelection();
- expectAutoRefreshIsDeactivated();
+ // after all rules unselected, auto refresh should still be disabled
+ expectAutoRefreshIsDisabled();
+ });
+ });
- clearAllRuleSelection();
+ describe('when one rule is selected', () => {
+ it('does NOT refresh after refresh interval has passed', () => {
+ mockGlobalClock();
+ visitWithoutDateRange(DETECTIONS_RULE_MANAGEMENT_URL);
+
+ expectNumberOfRules(RULES_MANAGEMENT_TABLE, 1);
+
+ selectRulesByName(['Test rule 1']);
+
+ // mock 1 minute passing to make sure refresh is not conducted
+ cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
+ cy.tick(RULES_TABLE_REFRESH_INTERVAL_MS * 2); // Make sure enough time has passed
+ cy.get(RULES_TABLE_AUTOREFRESH_INDICATOR).should('not.exist');
+
+ // ensure rule is still selected
+ getRuleRow('Test rule 1').find(EUI_CHECKBOX).should('be.checked');
- // after all rules unselected, auto refresh should still be disabled
- expectAutoRefreshIsDisabled();
+ cy.get(REFRESH_RULES_STATUS).should('have.not.text', 'Updated now');
+ });
});
}
);
diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts
index 969934eb5fee1..02c25f751e6a6 100644
--- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts
+++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts
@@ -268,13 +268,13 @@ describe(
cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_THREAT_INTELLIGENCE_VALUES)
.eq(0)
.should('be.visible')
- .and('have.text', '0 threat match detected'); // TODO work on getting proper IoC data to get proper data here
+ .and('have.text', '0 threat matches detected'); // TODO work on getting proper IoC data to get proper data here
// field with threat enrichement
cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB_INSIGHTS_THREAT_INTELLIGENCE_VALUES)
.eq(1)
.should('be.visible')
- .and('have.text', '0 field enriched with threat intelligence'); // TODO work on getting proper IoC data to get proper data here
+ .and('have.text', '0 fields enriched with threat intelligence'); // TODO work on getting proper IoC data to get proper data here
});
cy.log('should navigate to left panel Threat Intelligence tab');
diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts
index cb920e8093be1..304e35e6826bf 100644
--- a/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts
+++ b/x-pack/test/security_solution_cypress/cypress/tasks/alerts_detection_rules.ts
@@ -5,6 +5,7 @@
* 2.0.
*/
+import { DEFAULT_RULES_TABLE_REFRESH_SETTING } from '@kbn/security-solution-plugin/common/constants';
import {
COLLAPSED_ACTION_BTN,
CUSTOM_RULES_BTN,
@@ -64,6 +65,7 @@ import { PAGE_CONTENT_SPINNER } from '../screens/common/page';
import { goToRuleEditSettings } from './rule_details';
import { goToActionsStepTab } from './create_new_rule';
+import { setKibanaSetting } from './api_calls/kibana_advanced_settings';
export const getRulesManagementTableRows = () => cy.get(RULES_MANAGEMENT_TABLE).find(RULES_ROW);
@@ -516,3 +518,29 @@ const unselectRuleByName = (ruleName: string) => {
cy.log(`Make sure rule "${ruleName}" has been unselected`);
getRuleRow(ruleName).find(EUI_CHECKBOX).should('not.be.checked');
};
+
+/**
+ * Set Kibana `securitySolution:rulesTableRefresh` setting looking like
+ *
+ * ```
+ * { "on": true, "value": 60000 }
+ * ```
+ *
+ * @param enabled whether the auto-refresh is enabled
+ * @param refreshInterval refresh interval in milliseconds
+ */
+export const setRulesTableAutoRefreshIntervalSetting = ({
+ enabled,
+ refreshInterval,
+}: {
+ enabled: boolean;
+ refreshInterval: number; // milliseconds
+}) => {
+ setKibanaSetting(
+ DEFAULT_RULES_TABLE_REFRESH_SETTING,
+ JSON.stringify({
+ on: enabled,
+ value: refreshInterval,
+ })
+ );
+};
diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts
index f86cd0186c8c2..2c982adad5275 100644
--- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts
+++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts
@@ -5,30 +5,27 @@
* 2.0.
*/
+import { SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID } from '@kbn/management-settings-ids';
+import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '@kbn/security-solution-plugin/common/constants';
import { rootRequest } from '../common';
-const kibanaSettings = (body: Cypress.RequestBody) => {
+export const setKibanaSetting = (key: string, value: boolean | number | string) => {
rootRequest({
method: 'POST',
url: 'internal/kibana/settings',
- body,
+ body: { changes: { [key]: value } },
headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' },
});
};
-const relatedIntegrationsBody = (status: boolean): Cypress.RequestBody => {
- return { changes: { 'securitySolution:showRelatedIntegrations': status } };
-};
-
export const enableRelatedIntegrations = () => {
- kibanaSettings(relatedIntegrationsBody(true));
+ setKibanaSetting(SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID, true);
};
export const disableRelatedIntegrations = () => {
- kibanaSettings(relatedIntegrationsBody(false));
+ setKibanaSetting(SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID, false);
};
export const disableExpandableFlyout = () => {
- const body = { changes: { 'securitySolution:enableExpandableFlyout': false } };
- kibanaSettings(body);
+ setKibanaSetting(ENABLE_EXPANDABLE_FLYOUT_SETTING, false);
};
diff --git a/x-pack/test/security_solution_cypress/cypress/tsconfig.json b/x-pack/test/security_solution_cypress/cypress/tsconfig.json
index ec9ce83a98f03..b82ce28aa8f04 100644
--- a/x-pack/test/security_solution_cypress/cypress/tsconfig.json
+++ b/x-pack/test/security_solution_cypress/cypress/tsconfig.json
@@ -37,6 +37,7 @@
"@kbn/config-schema",
"@kbn/lists-plugin",
"@kbn/securitysolution-list-constants",
- "@kbn/security-plugin"
+ "@kbn/security-plugin",
+ "@kbn/management-settings-ids"
]
}
diff --git a/x-pack/test_serverless/api_integration/services/alerting_api.ts b/x-pack/test_serverless/api_integration/services/alerting_api.ts
index 8eb771d7eb11d..668dcdab82aa0 100644
--- a/x-pack/test_serverless/api_integration/services/alerting_api.ts
+++ b/x-pack/test_serverless/api_integration/services/alerting_api.ts
@@ -11,7 +11,7 @@ import type {
} from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { MetricThresholdParams } from '@kbn/infra-plugin/common/alerting/metrics';
-import { ThresholdParams } from '@kbn/observability-plugin/common/threshold_rule/types';
+import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types';
import { FtrProviderContext } from '../ftr_provider_context';
diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts
index 12d23a3c6d78e..799d87f65e10f 100644
--- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts
@@ -19,9 +19,7 @@ export default function ({ getService }: FtrProviderContext) {
const esClient = getService('es');
const objectRemover = new ObjectRemover(supertest);
- // FLAKY: https://github.com/elastic/kibana/issues/165779
- // FLAKY: https://github.com/elastic/kibana/issues/165388
- describe.skip('Alert documents', () => {
+ describe('Alert documents', () => {
const RULE_TYPE_ID = '.es-query';
const ALERT_INDEX = '.alerts-stack.alerts-default';
let ruleId: string;
diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts
index 7b86988e879c3..5422d6a7b8cee 100644
--- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/helpers/alerting_wait_for_helpers.ts
@@ -23,7 +23,7 @@ export async function waitForDocumentInIndex({
indexName: string;
num?: number;
}): Promise {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({ index: indexName });
if (response.hits.hits.length < num) {
@@ -74,7 +74,7 @@ export async function waitForAlertInIndex({
ruleId: string;
num: number;
}): Promise>> {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({
index: indexName,
@@ -115,7 +115,7 @@ export async function waitForAllTasksIdle({
esClient: Client;
filter: Date;
}): Promise {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({
index: '.kibana_task_manager',
@@ -167,7 +167,7 @@ export async function waitForAllTasks({
taskType: string;
attempts: number;
}): Promise {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({
index: '.kibana_task_manager',
@@ -225,7 +225,7 @@ export async function waitForDisabled({
ruleId: string;
filter: Date;
}): Promise {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({
index: '.kibana_task_manager',
@@ -280,7 +280,7 @@ export async function waitForExecutionEventLog({
ruleId: string;
num?: number;
}): Promise {
- return pRetry(
+ return await pRetry(
async () => {
const response = await esClient.search({
index: '.kibana-event-log*',
diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts
index dd6060a397059..e9d3c85f21028 100644
--- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts
@@ -35,8 +35,7 @@ export default function ({ getService }: FtrProviderContext) {
const esClient = getService('es');
const esDeleteAllIndices = getService('esDeleteAllIndices');
- // Failing: See https://github.com/elastic/kibana/issues/164017
- describe.skip('Alerting rules', () => {
+ describe('Alerting rules', () => {
const RULE_TYPE_ID = '.es-query';
const ALERT_ACTION_INDEX = 'alert-action-es-query';
let actionId: string;
@@ -119,22 +118,6 @@ export default function ({ getService }: FtrProviderContext) {
});
expect(resp.hits.hits.length).to.be(1);
- await waitForAllTasksIdle({
- esClient,
- filter: testStart,
- });
-
- await disableRule({
- supertest,
- ruleId,
- });
-
- await waitForDisabled({
- esClient,
- ruleId,
- filter: testStart,
- });
-
const document = resp.hits.hits[0];
expect(document._source).to.eql({
alertActionGroup: 'query matched',
@@ -157,7 +140,7 @@ export default function ({ getService }: FtrProviderContext) {
expect(eventLogResp.hits.hits.length).to.be(1);
const eventLogDocument = eventLogResp.hits.hits[0]._source;
- await validateEventLog(eventLogDocument, {
+ validateEventLog(eventLogDocument, {
ruleId,
ruleTypeId: RULE_TYPE_ID,
outcome: 'success',
@@ -928,7 +911,8 @@ function validateEventLog(event: any, params: ValidateEventLogParams) {
expect(event?.kibana?.alert?.rule?.execution?.metrics?.number_of_triggered_actions).to.be(1);
expect(event?.kibana?.alert?.rule?.execution?.metrics?.number_of_searches).to.be(1);
- expect(event?.kibana?.alert?.rule?.execution?.metrics?.es_search_duration_ms).to.be(0);
+ // Sometimes fast enough that it will report 0ms
+ expect(event?.kibana?.alert?.rule?.execution?.metrics?.es_search_duration_ms >= 0).to.be.ok();
expect(
event?.kibana?.alert?.rule?.execution?.metrics?.total_search_duration_ms
).to.be.greaterThan(0);
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts
similarity index 90%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts
index 77114463eb89f..f75faa2b2f686 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_fired.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts
@@ -6,8 +6,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
@@ -22,8 +25,8 @@ export default function ({ getService }: FtrProviderContext) {
// Blocked API: index_not_found_exception: no such index [.alerts-observability.threshold.alerts-default]
// Issue: https://github.com/elastic/kibana/issues/165138
- describe.skip('Threshold rule - AVG - PCT - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe.skip('Custom Threshold rule - AVG - PCT - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -49,7 +52,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'foo')
.set('x-elastic-internal-origin', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -131,13 +134,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await alertingApi.waitForAlertInIndex({
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -145,14 +148,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts
similarity index 90%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts
index cbfdf251ba602..fbcb7a1404293 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/avg_pct_no_data.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts
@@ -5,8 +5,11 @@
* 2.0.
*/
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
@@ -19,8 +22,8 @@ export default function ({ getService }: FtrProviderContext) {
// Blocked API: index_not_found_exception: no such index [.alerts-observability.threshold.alerts-default]
// Issue: https://github.com/elastic/kibana/issues/165138
- describe.skip('Threshold rule - AVG - PCT - NoData', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe.skip('Custom Threshold rule - AVG - PCT - NoData', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id-no-data';
let actionId: string;
@@ -44,7 +47,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'foo')
.set('x-elastic-internal-origin', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -124,13 +127,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await alertingApi.waitForAlertInIndex({
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -138,14 +141,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.nodata');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.nodata'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
similarity index 91%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
index 81b57e492f100..3e996e555b092 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/custom_eq_avg_bytes_fired.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts
@@ -12,8 +12,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
@@ -27,8 +30,8 @@ export default function ({ getService }: FtrProviderContext) {
const dataViewApi = getService('dataViewApi');
// Issue: https://github.com/elastic/kibana/issues/165138
- describe.skip('Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe.skip('Custom Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -54,7 +57,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'foo')
.set('x-elastic-internal-origin', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -138,13 +141,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await alertingApi.waitForAlertInIndex({
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -152,14 +155,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts
similarity index 90%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts
index ad0624a91dfb1..1fa95b8cab8a9 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/documents_count_fired.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts
@@ -6,8 +6,11 @@
*/
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
@@ -21,8 +24,8 @@ export default function ({ getService }: FtrProviderContext) {
const dataViewApi = getService('dataViewApi');
// Issue: https://github.com/elastic/kibana/issues/165138
- describe.skip('Threshold rule - DOCUMENTS_COUNT - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe.skip('Custom Threshold rule - DOCUMENTS_COUNT - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -48,7 +51,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'foo')
.set('x-elastic-internal-origin', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -128,13 +131,13 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await alertingApi.waitForAlertInIndex({
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -142,14 +145,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', '*');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts
similarity index 92%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts
index 5cadfbc6b3d9d..8bd8312a5184a 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/group_by_fired.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts
@@ -14,8 +14,11 @@
import { kbnTestConfig } from '@kbn/test';
import moment from 'moment';
import { cleanup, generate } from '@kbn/infra-forge';
-import { Aggregators, Comparator } from '@kbn/observability-plugin/common/threshold_rule/types';
-import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/threshold/threshold_executor';
+import {
+ Aggregators,
+ Comparator,
+} from '@kbn/observability-plugin/common/custom_threshold_rule/types';
+import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/custom_threshold_executor';
import expect from '@kbn/expect';
import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/observability-plugin/common/constants';
import { FtrProviderContext } from '../../../ftr_provider_context';
@@ -31,8 +34,8 @@ export default function ({ getService }: FtrProviderContext) {
let startedAt: string;
// Issue: https://github.com/elastic/kibana/issues/165138
- describe.skip('Threshold rule - GROUP_BY - FIRED', () => {
- const THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
+ describe.skip('Custom Threshold rule - GROUP_BY - FIRED', () => {
+ const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default';
const ALERT_ACTION_INDEX = 'alert-action-threshold';
const DATA_VIEW_ID = 'data-view-id';
let infraDataIndex: string;
@@ -58,7 +61,7 @@ export default function ({ getService }: FtrProviderContext) {
.set('kbn-xsrf', 'foo')
.set('x-elastic-internal-origin', 'foo');
await esClient.deleteByQuery({
- index: THRESHOLD_RULE_ALERT_INDEX,
+ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
query: { term: { 'kibana.alert.rule.uuid': ruleId } },
});
await esClient.deleteByQuery({
@@ -145,7 +148,7 @@ export default function ({ getService }: FtrProviderContext) {
it('should set correct information in the alert document', async () => {
const resp = await alertingApi.waitForAlertInIndex({
- indexName: THRESHOLD_RULE_ALERT_INDEX,
+ indexName: CUSTOM_THRESHOLD_RULE_ALERT_INDEX,
ruleId,
});
alertId = (resp.hits.hits[0]._source as any)['kibana.alert.uuid'];
@@ -153,7 +156,7 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.category',
- 'Threshold (Technical Preview)'
+ 'Custom threshold (BETA)'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.consumer', 'alerts');
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.name', 'Threshold rule');
@@ -161,14 +164,17 @@ export default function ({ getService }: FtrProviderContext) {
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.revision', 0);
expect(resp.hits.hits[0]._source).property(
'kibana.alert.rule.rule_type_id',
- 'observability.rules.threshold'
+ 'observability.rules.custom_threshold'
);
expect(resp.hits.hits[0]._source).property('kibana.alert.rule.uuid', ruleId);
expect(resp.hits.hits[0]._source).property('kibana.space_ids').contain('default');
expect(resp.hits.hits[0]._source)
.property('kibana.alert.rule.tags')
.contain('observability');
- expect(resp.hits.hits[0]._source).property('kibana.alert.action_group', 'threshold.fired');
+ expect(resp.hits.hits[0]._source).property(
+ 'kibana.alert.action_group',
+ 'custom_threshold.fired'
+ );
expect(resp.hits.hits[0]._source).property('tags').contain('observability');
expect(resp.hits.hits[0]._source).property('kibana.alert.instance.id', 'host-0');
expect(resp.hits.hits[0]._source).property('kibana.alert.workflow_status', 'open');
@@ -216,7 +222,7 @@ export default function ({ getService }: FtrProviderContext) {
});
const { protocol, hostname, port } = kbnTestConfig.getUrlParts();
- expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.threshold');
+ expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold');
expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql(
`${protocol}://${hostname}:${port}/app/observability/alerts?_a=(kuery:%27kibana.alert.uuid:%20%22${alertId}%22%27%2CrangeFrom:%27${rangeFrom}%27%2CrangeTo:now%2Cstatus:all)`
);
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/index.ts
similarity index 93%
rename from x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/index.ts
rename to x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/index.ts
index dbb8968d2d946..944068af6a21b 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/threshold_rule/index.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/index.ts
@@ -8,7 +8,7 @@
import { FtrProviderContext } from '../../../ftr_provider_context';
export default function ({ loadTestFile }: FtrProviderContext) {
- describe('Threshold Rule', function () {
+ describe('Custom Threshold Rule', function () {
loadTestFile(require.resolve('./avg_pct_fired'));
loadTestFile(require.resolve('./avg_pct_no_data'));
loadTestFile(require.resolve('./documents_count_fired'));
diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts
index d9643f91d70ae..a3a5ab552ee3f 100644
--- a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts
+++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts
@@ -9,6 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ loadTestFile }: FtrProviderContext) {
describe('Serverless observability API - feature flags', function () {
- loadTestFile(require.resolve('./threshold_rule'));
+ loadTestFile(require.resolve('./custom_threshold_rule'));
});
}
diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts
index 0b40780aace2b..5e3d235f10c53 100644
--- a/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts
+++ b/x-pack/test_serverless/functional/test_suites/observability/observability_log_explorer/header_menu.ts
@@ -8,6 +8,7 @@ import expect from '@kbn/expect';
import { FtrProviderContext } from '../../../ftr_provider_context';
export default function ({ getService, getPageObjects }: FtrProviderContext) {
+ const browser = getService('browser');
const esArchiver = getService('esArchiver');
const kibanaServer = getService('kibanaServer');
const retry = getService('retry');
@@ -36,6 +37,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
});
describe('Discover fallback link', () => {
+ before(async () => {
+ await PageObjects.observabilityLogExplorer.navigateTo();
+ });
+
it('should render a button link ', async () => {
const discoverLink = await PageObjects.observabilityLogExplorer.getDiscoverFallbackLink();
expect(await discoverLink.isDisplayed()).to.be(true);
@@ -78,5 +83,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
});
});
});
+
+ describe('Add data link', () => {
+ before(async () => {
+ await PageObjects.observabilityLogExplorer.navigateTo();
+ });
+
+ it('should render a button link ', async () => {
+ const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink();
+ expect(await onboardingLink.isDisplayed()).to.be(true);
+ });
+
+ it('should navigate to the observability onboarding overview page', async () => {
+ const onboardingLink = await PageObjects.observabilityLogExplorer.getOnboardingLink();
+ onboardingLink.click();
+
+ await retry.try(async () => {
+ const url = await browser.getCurrentUrl();
+ expect(url).to.contain(`/app/observabilityOnboarding`);
+ });
+ });
+ });
});
}
diff --git a/x-pack/test_serverless/functional/test_suites/security/cypress/cypress.config.ts b/x-pack/test_serverless/functional/test_suites/security/cypress/cypress.config.ts
index 33d7c582835d2..1db2cc6e0119f 100644
--- a/x-pack/test_serverless/functional/test_suites/security/cypress/cypress.config.ts
+++ b/x-pack/test_serverless/functional/test_suites/security/cypress/cypress.config.ts
@@ -20,6 +20,12 @@ export default defineCypressConfig({
viewportHeight: 946,
viewportWidth: 1680,
numTestsKeptInMemory: 10,
+ env: {
+ KIBANA_USERNAME: 'system_indices_superuser',
+ KIBANA_PASSWORD: 'changeme',
+ ELASTICSEARCH_USERNAME: 'system_indices_superuser',
+ ELASTICSEARCH_PASSWORD: 'changeme',
+ },
e2e: {
experimentalRunAllSpecs: true,
experimentalMemoryManagement: true,
diff --git a/yarn.lock b/yarn.lock
index e9c20dd8ff99a..8416457ad4a45 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2950,6 +2950,13 @@
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
+"@kayahr/text-encoding@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@kayahr/text-encoding/-/text-encoding-1.2.0.tgz#9d75de6b40d7694e524c8ce39fc6e08994680746"
+ integrity sha512-61R84DjOQvO4bakOl4Vwuw0wU3FLbFtfUf4ApJquQ2+N3AY2VlN0j9te8rpGFHx2mzvhWKetyDgVZiLeU2/dhA==
+ dependencies:
+ tslib "^2.5.2"
+
"@kbn/aad-fixtures-plugin@link:x-pack/test/alerting_api_integration/common/plugins/aad":
version "0.0.0"
uid ""
@@ -23394,10 +23401,10 @@ opener@^1.5.2:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
-openpgp@5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.3.0.tgz#e8fc97e538865b8c095dbd91c7be4203bd1dd1df"
- integrity sha512-qjCj0vYpV3dmmkE+vURiJ5kVAJwrMk8BPukvpWJiHcTNWKwPVsRS810plIe4klIcHVf1ScgUQwqtBbv99ff+kQ==
+openpgp@5.10.1:
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-5.10.1.tgz#3b137470187b79281719ced16fb9e60b822cfd24"
+ integrity sha512-SR5Ft+ej51d0+p53ld5Ney0Yiz0y8Mh1YYLJrvpRMbTaNhvS1QcDX0Oq1rW9sjBnQXtgrpWw2Zve3rm7K5C/pw==
dependencies:
asn1.js "^5.0.0"
@@ -29154,6 +29161,11 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
+tslib@^2.5.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
tslib@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"