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.
    +
    +

    config_properties_email - Connector request properties for an email connector Up

    +
    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.
    +
    Enum:
    +
    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.
    +
    +

    config_properties_genai - Connector request properties for a generative AI connector Up

    Defines properties for connectors when type is .gen-ai.
    @@ -1561,7 +1582,7 @@ Any modifications made to this file will be overwritten.

    connector_response_properties_email - Connector response properties for an email connector Up

    -
    config
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .email.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .email
    @@ -1861,12 +1882,12 @@ Any modifications made to this file will be overwritten.

    create_connector_request_email - Create email connector request Up

    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
    map[String, oas_any_type_not_mapped] Defines properties for connectors when type is .email.
    +
    config
    connector_type_id
    String The type of connector.
    Enum:
    .email
    name
    String The display name for the connector.
    -
    secrets
    map[String, oas_any_type_not_mapped] Defines secrets for connectors when type is .email.
    +
    secrets
    @@ -2425,6 +2446,15 @@ Any modifications made to this file will be overwritten.
    token
    String The D3 Security token.
    +
    +

    secrets_properties_email - Connector secrets properties for an email connector Up

    +
    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.
    +
    +

    secrets_properties_genai - Connector secrets properties for a generative AI connector Up

    Defines secrets for connectors when type is .gen-ai.
    @@ -2548,6 +2578,15 @@ Any modifications made to this file will be overwritten.
    secrets
    +
    +

    update_connector_request_email - Update email connector request Up

    +
    +
    +
    config
    +
    name
    String The display name for the connector.
    +
    secrets (optional)
    +
    +

    update_connector_request_index - Update index connector request Up

    @@ -2650,6 +2689,15 @@ Any modifications made to this file will be overwritten.
    secrets
    +

    update_connector_request_xmatters - Update xMatters connector request Up

    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.
    @@ -155,161 +85,7 @@ exports[`SearchResponseWarnings renders "callout" correctly 1`] = ` > -
    -
    -

    -

    -
  • -
  • -
    -

    -

    -
    -
    -
    -
    -
    - - 3 of 4 shards failed - -
    -
    -
    -
    -

    - The data might be incomplete or wrong. -

    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -

    -

    -
  • -
  • -
    -

    -

    -
    -
    -
    -
    -
    - - 1 of 4 shards failed - -
    -
    -
    -
    -

    - The data might be incomplete or wrong. -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
  • -
  • -
    -
    -
    - - 3 of 4 shards failed - -
    -
    -
    -
    -

    - The data might be incomplete or wrong. -

    -
    -
    -
    - -
    -
    -
  • -
  • -
    -
    -
    - - 3 of 4 shards failed - -
    -
    -
    -
    -

    - The data might be incomplete or wrong. -

    -
    -
    -
    - -
    -
    -
  • -
  • -
    -
    -
    - - 1 of 4 shards failed - -
    -
    -
    -
    -

    - The data might be incomplete or wrong. -

    + The data might be incomplete or wrong.
    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' ? : undefined, -})); +const interceptedWarnings = [ + { + originalWarning: searchResponseIncompleteWarningLocalCluster, + action: , + }, +]; 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 > - + - + - + - + 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 ? ( - - - - </EuiFlexItem> - <EuiFlexItem grow={false}>{children}</EuiFlexItem> - </EuiFlexGroup> - ) : 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<XYConfig & { dependsOn?: string[] }>; + ['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 ( - <> - <Section title={MetricsSectionTitle}> - <ChartGrid + const chartsToRender = useMemo( + () => + charts.filter( + (c) => + !c.dependsOn || + c.dependsOn.every((d) => (metadata?.features ?? []).some((f) => d === f.name)) + ), + [charts, metadata?.features] + ); + + return ( + <EuiFlexGrid columns={2} gutterSize="s" data-test-subj={`${props['data-test-subj']}Grid`}> + {chartsToRender.map((chartProp, index) => ( + <EuiFlexItem key={index} grow={false}> + <Chart + {...chartProp} assetName={assetName} - timeRange={timeRange} - charts={host.hostMetricChartsFullPage} - metricsDataView={metricsDataView} + dateRange={dateRange} logsDataView={logsDataView} - data-test-subj="infraAssetDetailsMetricsChart" - /> - </Section> - <EuiSpacer size="s" /> - <Section dependsOn={['nginx.stubstatus', 'nginx.access']} title={NginxMetricsSectionTitle}> - <ChartGrid - assetName={assetName} - timeRange={timeRange} - charts={[ - ...nginx.nginxStubstatusCharts.map((chart) => ({ - ...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']} /> - </Section> - </> - ); - } -); - -export const MetricsGridCompact = ({ - assetName, - metricsDataView, - logsDataView, - dateRange: timeRange, -}: Props) => ( - <Section title={MetricsSectionTitle}> - <ChartGrid - assetName={assetName} - timeRange={timeRange} - charts={host.hostMetricFlyoutCharts} - metricsDataView={metricsDataView} - logsDataView={logsDataView} - data-test-subj="infraAssetDetailsMetricsChart" - /> - </Section> -); + </EuiFlexItem> + ))} + </EuiFlexGrid> + ); +}; 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 ( + <> + <Section title={MetricsSectionTitle}> + <MetricsGrid + assetName={assetName} + dateRange={dateRange} + charts={host.hostMetricChartsFullPage} + metricsDataView={metricsDataView} + logsDataView={logsDataView} + data-test-subj="infraAssetDetailsMetricsChart" + /> + </Section> + <EuiSpacer size="s" /> + <Section dependsOn={['nginx.stubstatus', 'nginx.access']} title={NginxMetricsSectionTitle}> + <MetricsGrid + assetName={assetName} + dateRange={dateRange} + charts={[ + ...nginx.nginxStubstatusCharts.map((chart) => ({ + ...chart, + dependsOn: ['nginx.stubstatus'], + })), + ...nginx.nginxAccessCharts.map((chart) => ({ + ...chart, + dependsOn: ['nginx.access'], + })), + ]} + metricsDataView={metricsDataView} + logsDataView={logsDataView} + data-test-subj="infraAssetDetailsNginxMetricsChart" + /> + </Section> + </> + ); +}; + +export const MetricsSectionCompact = ({ + assetName, + metricsDataView, + logsDataView, + dateRange, +}: Props) => ( + <Section title={MetricsSectionTitle}> + <MetricsGrid + assetName={assetName} + dateRange={dateRange} + charts={host.hostMetricFlyoutCharts} + metricsDataView={metricsDataView} + logsDataView={logsDataView} + data-test-subj="infraAssetDetailsMetricsChart" + /> + </Section> +); + +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 ? ( + <EuiFlexGroup gutterSize="m" direction="column"> + <EuiFlexItem grow={false}> + <Title /> + </EuiFlexItem> + <EuiFlexItem grow={false}>{children}</EuiFlexItem> + </EuiFlexGroup> + ) : 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 ? ( - <MetricsGrid + <MetricsSection dateRange={parsedDateRange} logsDataView={logs.dataView} metricsDataView={metrics.dataView} assetName={asset.name} /> ) : ( - <MetricsGridCompact + <MetricsSectionCompact dateRange={parsedDateRange} logsDataView={logs.dataView} metricsDataView={metrics.dataView} @@ -59,7 +59,7 @@ export const Overview = () => { return ( <EuiFlexGroup direction="column" gutterSize="m"> <EuiFlexItem grow={false}> - <KPIGrid nodeName={asset.name} timeRange={parsedDateRange} dataView={metrics.dataView} /> + <KPIGrid assetName={asset.name} dateRange={parsedDateRange} dataView={metrics.dataView} /> </EuiFlexItem> <EuiFlexItem grow={false}> {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<TooltipContentProps>; }; -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 = ( - <LensWrapper - id={id} - attributes={attributes} - dateRange={dateRange} - disableTriggers={disableTriggers} - extraActions={extraActions} - filters={filters} - hidePanelTitles={hidePanelTitles} - lastReloadRequestTime={lastReloadRequestTime} - loading={isLoading} - style={sytle} - query={query} - overrides={overrides} - onBrushEnd={onBrushEnd} - onFilter={onFilter} - /> - ); - const content = !toolTip ? ( - lens - ) : ( - <EuiToolTip - delay="regular" - content={React.cloneElement(toolTip, { - formula, - })} - anchorClassName="eui-fullWidth" - > - {/* EuiToolTip forwards some event handlers to the child component. + const lens = ( + <LensWrapper + id={id} + attributes={attributes} + dateRange={dateRange} + disableTriggers={disableTriggers} + extraActions={extraActions} + filters={filters} + hidePanelTitles={hidePanelTitles} + lastReloadRequestTime={lastReloadRequestTime} + loading={isLoading} + style={{ height }} + query={query} + overrides={overrides} + onBrushEnd={onBrushEnd} + onFilter={onFilter} + /> + ); + const content = !toolTip ? ( + lens + ) : ( + <EuiToolTip + delay="regular" + content={React.cloneElement(toolTip, { + formula, + })} + anchorClassName="eui-fullWidth" + > + {/* EuiToolTip forwards some event handlers to the child component. Wrapping Lens inside a div prevents that from causing unnecessary re-renders */} - <div>{lens}</div> - </EuiToolTip> - ); + <div>{lens}</div> + </EuiToolTip> + ); - return ( - <EuiPanel - hasBorder={!!borderRadius} - borderRadius={borderRadius} - hasShadow={false} - paddingSize={error ? 'm' : 'none'} - data-test-subj={id} - css={css` - position: relative; - min-height: ${height}px; - `} - > - {error ? <ChartLoadError /> : content} - </EuiPanel> - ); -}; + return ( + <EuiPanel + hasBorder={!!borderRadius} + borderRadius={borderRadius} + hasShadow={false} + paddingSize={error ? 'm' : 'none'} + data-test-subj={id} + css={css` + position: relative; + min-height: ${height}px; + `} + > + {error ? <ChartLoadError /> : content} + </EuiPanel> + ); + } +); 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<NonNullable<LensEmbeddableInput['onBrushEnd']>>[0]; +export type OnFilterEvent = Parameters<NonNullable<LensEmbeddableInput['onFilter']>>[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(() => <TooltipContent description={toolTip} />, [toolTip]); + return ( <LensChart id={`hostsViewKPI-${id}`} dataView={dataView} dateRange={afterLoadedState.dateRange} filters={afterLoadedState.filters} - layers={{ ...layers, options: { ...layers.options, subtitle: getSubtitle() } }} + layers={layers} lastReloadRequestTime={afterLoadedState.lastReloadRequestTime} loading={loading} height={height} query={afterLoadedState.query} title={title} - toolTip={<TooltipContent description={toolTip} />} + 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 ( <LensChart id={`hostsView-metricChart-${id}`} diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx index 8a81088fb0460..d9310ae0d816b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx @@ -14,7 +14,7 @@ import { HostMetricsExplanationContent } from '../../../../../../components/lens import { Chart } from './chart'; import { Popover } from '../../table/popover'; -export const MetricsGrid = React.memo(() => { +export const MetricsGrid = () => { return ( <> <EuiFlexGroup gutterSize="xs" alignItems="center"> @@ -38,4 +38,4 @@ export const MetricsGrid = React.memo(() => { </EuiFlexGrid> </> ); -}); +}; 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<ControlPanels>({ 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 = <State>({ }, [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 = <State>({ 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: ( <> - <EuiText size="s"> - <strong>{warning.message}</strong> - <p>{warning.text}</p> - </EuiText> + <EuiText size="s">{warning.message}</EuiText> <EuiSpacer size="s" /> - {warning.text ? ( - <ShardFailureOpenModalButton - theme={theme} - title={warning.message} - size="m" - getRequestMeta={() => ({ - request: request as ShardFailureRequest, - response, - })} - color="primary" - isButtonEmpty={true} - /> - ) : null} + <OpenIncompleteResultsModalButton + theme={theme} + warning={warning} + size="m" + getRequestMeta={() => ({ + 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<string, UserMessage[]> = 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({ </EuiTitle> <EuiText size="s" color="subdued"> <FormattedMessage - id="xpack.observability.threshold.rule.alertDetailsAppSection.criterion.subtitle" + id="xpack.observability.customThreshold.rule.alertDetailsAppSection.criterion.subtitle" defaultMessage="Last {lookback} {timeLabel}" values={{ lookback: criterion.timeSize, @@ -180,7 +180,7 @@ export default function AlertDetailsAppSection({ metricValueFormatter(d, 'metric' in criterion ? criterion.metric : undefined) } title={i18n.translate( - 'xpack.observability.threshold.rule.alertDetailsAppSection.thresholdTitle', + 'xpack.observability.customThreshold.rule.alertDetailsAppSection.thresholdTitle', { defaultMessage: 'Threshold breached', } diff --git a/x-pack/plugins/observability/public/components/threshold/components/alert_flyout.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx similarity index 94% rename from x-pack/plugins/observability/public/components/threshold/components/alert_flyout.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx index e0d24d58eb0db..824d5b41d14ca 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/alert_flyout.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_flyout.tsx @@ -7,7 +7,7 @@ import React, { useCallback, useContext, useMemo } from 'react'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '../../../../common/constants'; -import { MetricsExplorerSeries } from '../../../../common/threshold_rule/metrics_explorer'; +import { MetricsExplorerSeries } from '../../../../common/custom_threshold_rule/metrics_explorer'; import { TriggerActionsContext } from './triggers_actions_context'; import { useAlertPrefillContext } from '../helpers/use_alert_prefill'; diff --git a/x-pack/plugins/observability/public/components/threshold/components/closable_popover_title.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/closable_popover_title.test.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/threshold/components/closable_popover_title.test.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/closable_popover_title.test.tsx diff --git a/x-pack/plugins/observability/public/components/threshold/components/closable_popover_title.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/closable_popover_title.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/threshold/components/closable_popover_title.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/closable_popover_title.tsx diff --git a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/criterion_preview_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx similarity index 85% rename from x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/criterion_preview_chart.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx index b9a1fc3b93327..a5ed7cd38c580 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/criterion_preview_chart/criterion_preview_chart.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/criterion_preview_chart/criterion_preview_chart.tsx @@ -12,24 +12,24 @@ import { i18n } from '@kbn/i18n'; import { EuiLoadingChart, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { sum, min as getMin, max as getMax } from 'lodash'; -import { GetLogAlertsChartPreviewDataSuccessResponsePayload } from '../../../../../common/threshold_rule/types'; -import { formatNumber } from '../../../../../common/threshold_rule/formatters/number'; +import { GetLogAlertsChartPreviewDataSuccessResponsePayload } from '../../../../../common/custom_threshold_rule/types'; +import { formatNumber } from '../../../../../common/custom_threshold_rule/formatters/number'; type Series = GetLogAlertsChartPreviewDataSuccessResponsePayload['data']['series']; export const NUM_BUCKETS = 20; export const TIME_LABELS = { - s: i18n.translate('xpack.observability.threshold.rule..timeLabels.seconds', { + s: i18n.translate('xpack.observability.customThreshold.rule..timeLabels.seconds', { defaultMessage: 'seconds', }), - m: i18n.translate('xpack.observability.threshold.rule..timeLabels.minutes', { + m: i18n.translate('xpack.observability.customThreshold.rule..timeLabels.minutes', { defaultMessage: 'minutes', }), - h: i18n.translate('xpack.observability.threshold.rule..timeLabels.hours', { + h: i18n.translate('xpack.observability.customThreshold.rule..timeLabels.hours', { defaultMessage: 'hours', }), - d: i18n.translate('xpack.observability.threshold.rule..timeLabels.days', { + d: i18n.translate('xpack.observability.customThreshold.rule..timeLabels.days', { defaultMessage: 'days', }), }; @@ -109,7 +109,7 @@ export function NoDataState() { <EmptyContainer> <EuiText color="subdued" data-test-subj="thresholdRuleNoChartData"> <FormattedMessage - id="xpack.observability.threshold.rule..charts.noDataMessage" + id="xpack.observability.customThreshold.rule..charts.noDataMessage" defaultMessage="No chart data available" /> </EuiText> @@ -132,7 +132,7 @@ export function ErrorState() { <EmptyContainer> <EuiText color="subdued" data-test-subj="thresholdRuleChartErrorState"> <FormattedMessage - id="xpack.observability.threshold.rule..charts.errorMessage" + id="xpack.observability.customThreshold.rule..charts.errorMessage" defaultMessage="Uh oh, something went wrong" /> </EuiText> 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} > <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.customEquationEditor.addCustomRow" + id="xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.addCustomRow" defaultMessage="Add aggregation/field" /> </EuiButtonEmpty> @@ -160,7 +160,7 @@ export function CustomEquationEditor({ <EuiFormRow fullWidth label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationAndThreshold', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.equationAndThreshold', { defaultMessage: 'Equation and threshold' } )} error={[errors.equation]} @@ -171,7 +171,7 @@ export function CustomEquationEditor({ <EuiExpression data-test-subj="customEquation" description={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.equationLabel', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.equationLabel', { defaultMessage: 'Equation' } )} value={equation ?? placeholder} @@ -196,13 +196,13 @@ export function CustomEquationEditor({ <ClosablePopoverTitle onClose={() => setCustomEqPopoverOpen(false)}> <span> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.customEquationLabel" + id="xpack.observability.customThreshold.rule.alertFlyout.customEquationLabel" defaultMessage="Custom equation" />   <EuiIconTip content={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationTooltip', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationTooltip', { defaultMessage: 'This supports basic math (A + B / C) and boolean logic (A < B ? A : B).', diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/index.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/index.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/index.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/index.tsx diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_controls.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_controls.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx similarity index 91% rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx index 7d8ab629e6e16..ebfdf0e979fc3 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/metric_row_with_agg.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx @@ -21,7 +21,10 @@ import { i18n } from '@kbn/i18n'; import { ValidNormalizedTypes } from '@kbn/triggers-actions-ui-plugin/public'; import { DataViewBase } from '@kbn/es-query'; import { FormattedMessage } from '@kbn/i18n-react'; -import { Aggregators, CustomMetricAggTypes } from '../../../../../common/threshold_rule/types'; +import { + Aggregators, + CustomMetricAggTypes, +} from '../../../../../common/custom_threshold_rule/types'; import { MetricRowControls } from './metric_row_controls'; import { NormalizedFields, MetricRowBaseProps } from './types'; import { ClosablePopoverTitle } from '../closable_popover_title'; @@ -115,7 +118,7 @@ export function MetricRowWithAgg({ <EuiFormRow fullWidth label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.aggregationLabel', { defaultMessage: 'Aggregation {name}', values: { name } } )} isInvalid={aggType !== Aggregators.COUNT && !field} @@ -144,7 +147,7 @@ export function MetricRowWithAgg({ <div> <ClosablePopoverTitle onClose={() => setAggTypePopoverOpen(false)}> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationLabel" + id="xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.aggregationLabel" defaultMessage="Aggregation {name}" values={{ name }} /> @@ -154,7 +157,7 @@ export function MetricRowWithAgg({ <EuiFlexItem grow> <EuiFormRow label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.aggregationType', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.aggregationType', { defaultMessage: 'Aggregation type' } )} isInvalid={isAggInvalid} @@ -180,7 +183,7 @@ export function MetricRowWithAgg({ {aggType === Aggregators.COUNT ? ( <EuiFormRow label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.filterLabel', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.filterLabel', { defaultMessage: 'KQL Filter {name}', values: { name } } )} > @@ -195,7 +198,7 @@ export function MetricRowWithAgg({ ) : ( <EuiFormRow label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.customEquationEditor.fieldLabel', + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.fieldLabel', { defaultMessage: 'Field name' } )} isInvalid={isFieldInvalid} diff --git a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/types.ts similarity index 96% rename from x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/types.ts index d7c4096753763..6d1c5184b04f5 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/custom_equation/types.ts +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/types.ts @@ -5,7 +5,7 @@ * 2.0. */ import { AggregationType, IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; -import { CustomThresholdExpressionMetric } from '../../../../../common/threshold_rule/types'; +import { CustomThresholdExpressionMetric } from '../../../../../common/custom_threshold_rule/types'; import { MetricExpression } from '../../types'; export type CustomMetrics = MetricExpression['metrics']; diff --git a/x-pack/plugins/observability/public/components/threshold/components/threshold.stories.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/threshold/components/threshold.stories.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx index df4242d5ebe36..8e1e6b590e601 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/threshold.stories.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.stories.tsx @@ -10,8 +10,8 @@ import { ComponentMeta } from '@storybook/react'; import { LIGHT_THEME } from '@elastic/charts'; import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; -import { Comparator } from '../../../../common/threshold_rule/types'; -import { Props, Threshold as Component } from './threshold'; +import { Comparator } from '../../../../common/custom_threshold_rule/types'; +import { Props, Threshold as Component } from './custom_threshold'; export default { component: Component, diff --git a/x-pack/plugins/observability/public/components/threshold/components/threshold.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx similarity index 90% rename from x-pack/plugins/observability/public/components/threshold/components/threshold.test.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx index 8aa2e98cf955c..a1d61e0ce28cd 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/threshold.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_threshold.test.tsx @@ -9,9 +9,9 @@ import { LIGHT_THEME } from '@elastic/charts'; import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { render } from '@testing-library/react'; -import { Props, Threshold } from './threshold'; +import { Props, Threshold } from './custom_threshold'; import React from 'react'; -import { Comparator } from '../../../../common/threshold_rule/types'; +import { Comparator } from '../../../../common/custom_threshold_rule/types'; describe('Threshold', () => { const renderComponent = (props: Partial<Props> = {}) => { 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: ( <span> - {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}`, + } + )} </span> ), 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' ? ( <EuiText size="xs" color="subdued"> <FormattedMessage - id="xpack.observability.threshold.rule.alerts.dataTimeRangeLabelWithGrouping" + id="xpack.observability.customThreshold.rule.alerts.dataTimeRangeLabelWithGrouping" defaultMessage="Last {lookback} {timeLabel} of data for {id}" values={{ id: series.id, timeLabel, lookback: timeSize! * 20 }} /> @@ -221,7 +221,7 @@ export function ExpressionChart({ ) : ( <EuiText size="xs" color="subdued"> <FormattedMessage - id="xpack.observability.threshold.rule.alerts.dataTimeRangeLabel" + id="xpack.observability.customThreshold.rule.alerts.dataTimeRangeLabel" defaultMessage="Last {lookback} {timeLabel}" values={{ timeLabel, lookback: timeSize! * 20 }} /> 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<ExpressionRowProps> = (props) => { <EuiButtonIcon data-test-subj="o11yExpressionRowButton" aria-label={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.removeCondition', + 'xpack.observability.customThreshold.rule.alertFlyout.removeCondition', { defaultMessage: 'Remove condition', } @@ -234,32 +234,41 @@ const ThresholdElement: React.FC<{ export const aggregationType: { [key: string]: AggregationType } = { avg: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.avg', { - defaultMessage: 'Average', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.avg', + { + defaultMessage: 'Average', + } + ), fieldRequired: true, validNormalizedTypes: ['number', 'histogram'], value: AGGREGATION_TYPES.AVERAGE, }, max: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.max', { - defaultMessage: 'Max', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.max', + { + defaultMessage: 'Max', + } + ), fieldRequired: true, validNormalizedTypes: ['number', 'date', 'histogram'], value: AGGREGATION_TYPES.MAX, }, min: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.min', { - defaultMessage: 'Min', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.min', + { + defaultMessage: 'Min', + } + ), fieldRequired: true, validNormalizedTypes: ['number', 'date', 'histogram'], value: AGGREGATION_TYPES.MIN, }, cardinality: { text: i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.aggregationText.cardinality', + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.cardinality', { defaultMessage: 'Cardinality', } @@ -269,41 +278,56 @@ export const aggregationType: { [key: string]: AggregationType } = { validNormalizedTypes: ['number', 'string', 'ip', 'date'], }, rate: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.rate', { - defaultMessage: 'Rate', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.rate', + { + defaultMessage: 'Rate', + } + ), fieldRequired: false, value: AGGREGATION_TYPES.RATE, validNormalizedTypes: ['number'], }, count: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.count', { - defaultMessage: 'Document count', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.count', + { + defaultMessage: 'Document count', + } + ), fieldRequired: false, value: AGGREGATION_TYPES.COUNT, validNormalizedTypes: ['number'], }, sum: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.sum', { - defaultMessage: 'Sum', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.sum', + { + defaultMessage: 'Sum', + } + ), fieldRequired: false, value: AGGREGATION_TYPES.SUM, validNormalizedTypes: ['number', 'histogram'], }, p95: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.p95', { - defaultMessage: '95th Percentile', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.p95', + { + defaultMessage: '95th Percentile', + } + ), fieldRequired: false, value: AGGREGATION_TYPES.P95, validNormalizedTypes: ['number', 'histogram'], }, p99: { - text: i18n.translate('xpack.observability.threshold.rule.alertFlyout.aggregationText.p99', { - defaultMessage: '99th Percentile', - }), + text: i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.aggregationText.p99', + { + defaultMessage: '99th Percentile', + } + ), fieldRequired: false, value: AGGREGATION_TYPES.P99, validNormalizedTypes: ['number', 'histogram'], diff --git a/x-pack/plugins/observability/public/components/threshold/components/group_by.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/group_by.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/threshold/components/group_by.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/group_by.tsx diff --git a/x-pack/plugins/observability/public/components/threshold/components/metrics_alert_dropdown.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx similarity index 80% rename from x-pack/plugins/observability/public/components/threshold/components/metrics_alert_dropdown.tsx rename to x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx index 97020ad49a5a4..91b97161f78da 100644 --- a/x-pack/plugins/observability/public/components/threshold/components/metrics_alert_dropdown.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/metrics_alert_dropdown.tsx @@ -44,15 +44,21 @@ export function MetricsAlertDropdown() { const infrastructureAlertsPanel = useMemo( () => ({ 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" > <FormattedMessage - id="xpack.observability.threshold.rule.alertsButton" + id="xpack.observability.customThreshold.rule.alertsButton" defaultMessage="Alerts and rules" /> </EuiHeaderLink> 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) { <EuiTitle size="xs"> <h5> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.selectDataViewPrompt" + id="xpack.observability.customThreshold.rule.alertFlyout.selectDataViewPrompt" defaultMessage="Select a data view" /> </h5> @@ -417,7 +417,7 @@ export default function Expressions(props: Props) { <EuiTitle size="xs"> <h5> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.defineTextQueryPrompt" + id="xpack.observability.customThreshold.rule.alertFlyout.defineTextQueryPrompt" defaultMessage="Define query filter (optional)" /> </h5> @@ -448,7 +448,7 @@ export default function Expressions(props: Props) { <EuiTitle size="xs"> <h5> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.setConditions" + id="xpack.observability.customThreshold.rule.alertFlyout.setConditions" defaultMessage="Set rule conditions" /> </h5> @@ -462,7 +462,7 @@ export default function Expressions(props: Props) { <EuiTitle size="xs"> <h5> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.condition" + id="xpack.observability.customThreshold.rule.alertFlyout.condition" defaultMessage="Condition {conditionNumber}" values={{ conditionNumber: idx + 1 }} /> @@ -514,18 +514,21 @@ export default function Expressions(props: Props) { onClick={addExpression} > <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.addCondition" + id="xpack.observability.customThreshold.rule.alertFlyout.addCondition" defaultMessage="Add condition" /> </EuiButtonEmpty> </div> <EuiSpacer size="m" /> <EuiFormRow - label={i18n.translate('xpack.observability.threshold.rule.alertFlyout.createAlertPerText', { - defaultMessage: 'Group alerts by (optional)', - })} + label={i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.createAlertPerText', + { + defaultMessage: 'Group alerts by (optional)', + } + )} helpText={i18n.translate( - 'xpack.observability.threshold.rule.alertFlyout.createAlertPerHelpText', + 'xpack.observability.customThreshold.rule.alertFlyout.createAlertPerHelpText', { defaultMessage: 'Create an alert for every unique value. For example: "host.id" or "cloud.region".', @@ -549,7 +552,7 @@ export default function Expressions(props: Props) { <EuiSpacer size="s" /> <EuiText size="xs" color="danger"> <FormattedMessage - id="xpack.observability.threshold.rule.alertFlyout.alertPerRedundantFilterError" + id="xpack.observability.customThreshold.rule.alertFlyout.alertPerRedundantFilterError" defaultMessage="This rule may alert on {matchedGroups} less than expected, because the filter query contains a match for {groupCount, plural, one {this field} other {these fields}}. For more information, refer to {filteringAndGroupingLink}." values={{ matchedGroups: <strong>{redundantFilterGroupBy.join(', ')}</strong>, @@ -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' } )} </EuiLink> @@ -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<number | null>) => { 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<InfraClientStartDeps & KibanaServices>; 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) { <EuiBadge color={euiLightVars.euiColorDisabled}> <EuiToolTip position="top" - content={i18n.translate('xpack.observability.slo.groupByBadge', { - defaultMessage: 'Group by {groupBy}', + content={i18n.translate('xpack.observability.slo.partitionByBadge', { + defaultMessage: 'Partition by {partitionKey}', values: { - groupBy: slo.groupBy, + partitionKey: slo.groupBy, }, })} display="block" diff --git a/x-pack/plugins/observability/public/context/constants.ts b/x-pack/plugins/observability/public/context/constants.ts index 962622b128ded..59e4822f42877 100644 --- a/x-pack/plugins/observability/public/context/constants.ts +++ b/x-pack/plugins/observability/public/context/constants.ts @@ -12,3 +12,4 @@ export const UPTIME_APP = 'uptime'; export const APM_APP = 'apm'; export const INFRA_LOGS_APP = 'infra_logs'; export const INFRA_METRICS_APP = 'infra_metrics'; +export const UNIVERSAL_PROFILING_APP = 'universal_profiling'; diff --git a/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx index 0f349f37cc068..3acc868a30c02 100644 --- a/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx +++ b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx @@ -61,7 +61,7 @@ describe('HasDataContextProvider', () => { 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(<BurnRate slo={slo} threshold={14.4} burnRate={undefined} isLoading={false} />); + + expect(screen.queryByTestId('sloDetailsBurnRateStat')).toHaveTextContent('--'); + }); + + it("displays the burn rate value when not 'undefined'", async () => { + const slo = buildSlo(); + render(<BurnRate slo={slo} threshold={14.4} burnRate={3.4} isLoading={false} />); + + expect(screen.queryByTestId('sloDetailsBurnRateStat')).toHaveTextContent('3.4x'); + }); + + it("displays the burn rate value when '0'", async () => { + const slo = buildSlo(); + render(<BurnRate slo={slo} threshold={14.4} burnRate={0} isLoading={false} />); + + 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 <EuiFlexGroup direction="row" justifyContent="flexEnd" alignItems="flexEnd"> <EuiFlexItem grow={false}> <EuiStat - title={burnRate ? `${numeral(burnRate).format('0.[00]')}x` : '--'} + title={burnRate !== undefined ? `${numeral(burnRate).format('0.[00]')}x` : '--'} titleColor="default" titleSize="s" textAlign="right" isLoading={isLoading} + data-test-subj="sloDetailsBurnRateStat" description={ <EuiTextColor color="default"> <span> 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<T extends FetchDataResponse = FetchDataResponse> = ( fetchDataParams: FetchDataParams ) => Promise<T>; @@ -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<string, unknown> { value?: Array<number | null> | 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 = <AlertResult>( @@ -393,7 +396,7 @@ const formatAlertResult = <AlertResult>( ) => { 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<number | string>) => { 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<number | string>; 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 = ({ <Route path="/" exact={true} - render={() => ( - <ObservablityLogExplorerMainRoute - appParams={appParams} - core={core} - logExplorer={logExplorer} - observabilityShared={observabilityShared} - serverless={serverless} - /> - )} + render={() => <ObservablityLogExplorerMainRoute appParams={appParams} core={core} />} /> </Routes> </Router> 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<PluginKibanaContextValue>['services']; state$: BehaviorSubject<LogExplorerStateContainer>; theme$: AppMountParameters['theme$']; } export const LogExplorerTopNavMenu = ({ setHeaderActionMenu, + services, state$, theme$, }: LogExplorerTopNavMenuProps) => { + const { serverless } = services; + + return Boolean(serverless) ? ( + <ServerlessTopNav services={services} state$={state$} /> + ) : ( + <StatefulTopNav + services={services} + setHeaderActionMenu={setHeaderActionMenu} + state$={state$} + theme$={theme$} + /> + ); +}; + +const ServerlessTopNav = ({ + services, + state$, +}: Pick<LogExplorerTopNavMenuProps, 'services' | 'state$'>) => { const { euiTheme } = useEuiTheme(); return ( - <HeaderMenuPortal setHeaderActionMenu={setHeaderActionMenu} theme$={theme$}> + <EuiHeader data-test-subj="logExplorerHeaderMenu"> + <EuiHeaderSection> + <EuiHeaderSectionItem> + <EuiHeaderLinks gutterSize="xs"> + <DiscoverLink services={services} state$={state$} /> + </EuiHeaderLinks> + </EuiHeaderSectionItem> + </EuiHeaderSection> <EuiHeaderSection - data-test-subj="logExplorerHeaderMenu" + side="right" css={css` gap: ${euiTheme.size.m}; `} > <EuiHeaderSectionItem> <EuiBetaBadge + size="s" + iconType="beta" label={betaBadgeTitle} tooltipContent={betaBadgeDescription} alignment="middle" /> </EuiHeaderSectionItem> - <EuiHeaderLinks gutterSize="xs"> - <DiscoverLink state$={state$} /> - </EuiHeaderLinks> + <EuiHeaderSectionItem> + <OnboardingLink services={services} /> + </EuiHeaderSectionItem> + </EuiHeaderSection> + </EuiHeader> + ); +}; + +const StatefulTopNav = ({ + setHeaderActionMenu, + services, + state$, + theme$, +}: LogExplorerTopNavMenuProps) => { + const { euiTheme } = useEuiTheme(); + + useEffect(() => { + const { chrome, i18n, theme } = services; + + if (chrome) { + chrome.setBreadcrumbsAppendExtension({ + content: toMountPoint( + <EuiHeaderSection + data-test-subj="logExplorerHeaderMenu" + css={css` + margin-left: ${euiTheme.size.m}; + `} + > + <EuiHeaderSectionItem> + <EuiBetaBadge + size="s" + iconType="beta" + label={betaBadgeTitle} + tooltipContent={betaBadgeDescription} + alignment="middle" + /> + </EuiHeaderSectionItem> + </EuiHeaderSection>, + { theme, i18n } + ), + }); + } + }, [euiTheme, services]); + + return ( + <HeaderMenuPortal setHeaderActionMenu={setHeaderActionMenu} theme$={theme$}> + <EuiHeaderSection data-test-subj="logExplorerHeaderMenu"> + <EuiHeaderSectionItem> + <EuiHeaderLinks gutterSize="xs"> + <DiscoverLink services={services} state$={state$} /> + <OnboardingLink services={services} /> + </EuiHeaderLinks> + </EuiHeaderSectionItem> </EuiHeaderSection> </HeaderMenuPortal> ); }; const DiscoverLink = React.memo( - ({ state$ }: { state$: BehaviorSubject<LogExplorerStateContainer> }) => { - const { - services: { discover }, - } = useKibanaContextForPlugin(); - + ({ services, state$ }: Pick<LogExplorerTopNavMenuProps, 'services' | 'state$'>) => { const { appState, logExplorerState } = useObservable<LogExplorerStateContainer>( state$.pipe( distinctUntilChanged<LogExplorerStateContainer>((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 ( <EuiHeaderLink - onClick={() => 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<LogExplorerTopNavMenuProps, 'services'>) => { + const locator = services.share.url.locators.get<ObservabilityOnboardingLocatorParams>( + OBSERVABILITY_ONBOARDING_LOCATOR + ); + + const onboardingUrl = locator?.useUrl({}); + + const navigateToOnboarding = () => { + locator?.navigate({}); + }; + + const onboardingLinkProps = getRouterLinkProps({ + href: onboardingUrl, + onClick: navigateToOnboarding, + }); + + return ( + <EuiButton + {...onboardingLinkProps} + fill + size="s" + iconType="indexOpen" + data-test-subj="logExplorerOnboardingLink" + > + {onboardingLinkTitle} + </EuiButton> + ); +}); 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 ( <> <LogExplorerTopNavMenu setHeaderActionMenu={setHeaderActionMenu} + services={services} state$={state$} theme$={theme$} /> 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<HTMLAnchorElement>) => + !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); + +const isLeftClickEvent = (event: React.MouseEvent<HTMLAnchorElement>) => event.button === 0; + +export const getRouterLinkProps = ({ href, onClick }: GetRouterLinkPropsDeps) => { + const guardedClickHandler = (event: React.MouseEvent<HTMLAnchorElement>) => { + 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 @@ +<svg width="48" height="46" viewBox="0 0 48 46" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_305_179324)"> +<path d="M46 0H2C0.89543 0 0 0.89543 0 2V18C0 19.1046 0.89543 20 2 20H46C47.1046 20 48 19.1046 48 18V2C48 0.89543 47.1046 0 46 0Z" fill="#F04E98"/> +<path d="M20 24H2C0.89543 24 0 24.8954 0 26V44C0 45.1046 0.89543 46 2 46H20C21.1046 46 22 45.1046 22 44V26C22 24.8954 21.1046 24 20 24Z" fill="#FEC514"/> +<path d="M45 25H29C27.8954 25 27 25.8954 27 27V43C27 44.1046 27.8954 45 29 45H45C46.1046 45 47 44.1046 47 43V27C47 25.8954 46.1046 25 45 25Z" stroke="#0077CC"/> +</g> +<defs> +<clipPath id="clip0_305_179324"> +<rect width="48" height="46" fill="white"/> +</clipPath> +</defs> +</svg> \ 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 ( - <Suspense fallback={null}> + <Suspense fallback={<EuiLoadingSpinner />}> <OsqueryResponseActionParamsForm onChange={onChange} defaultValues={defaultValues} diff --git a/x-pack/plugins/reporting/public/management/__test__/report_listing.test.helpers.tsx b/x-pack/plugins/reporting/public/management/__test__/report_listing.test.helpers.tsx index fc1b0f25d9c01..2d24736d7e13b 100644 --- a/x-pack/plugins/reporting/public/management/__test__/report_listing.test.helpers.tsx +++ b/x-pack/plugins/reporting/public/management/__test__/report_listing.test.helpers.tsx @@ -70,6 +70,7 @@ export const mockConfig = { roles: { enabled: false, }, + statefulSettings: { enabled: true }, }; const validCheck = { diff --git a/x-pack/plugins/reporting/public/management/report_listing.tsx b/x-pack/plugins/reporting/public/management/report_listing.tsx index 74753437f54ce..49607c6f38710 100644 --- a/x-pack/plugins/reporting/public/management/report_listing.tsx +++ b/x-pack/plugins/reporting/public/management/report_listing.tsx @@ -109,7 +109,7 @@ class ReportListingUi extends Component<Props, State> { } /> - <MigrateIlmPolicyCallOut toasts={toasts} /> + {config.statefulSettings.enabled ? <MigrateIlmPolicyCallOut toasts={toasts} /> : null} <EuiSpacer size={'l'} /> <div>{this.renderTable()}</div> 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<ReportingConfigType> = { - 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<typeof ConfigSchema>; 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<Array<string | RegExp>> = [ + '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 = <T, S>(destinationObj: T, srcObj: S): T => { */ export const retryOnError = async <T>( callback: () => Promise<T>, - errors: Array<string | RegExp>, + errors: Array<string | RegExp> | Readonly<Array<string | RegExp>>, logger?: ToolingLog, tryCount: number = 5, interval: number = 10000 @@ -60,6 +65,8 @@ export const retryOnError = async <T>( }); }; + log.indent(4); + let attempt = 1; let responsePromise: Promise<T>; @@ -71,13 +78,20 @@ export const retryOnError = async <T>( 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 <T>( 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<StartAppComponent> = ({ 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$<boolean>(DEFAULT_DARK_MODE); - const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = useKibana().services.docLinks; - - const assistantTelemetry = useAssistantTelemetry(); - return ( <EuiErrorBoundary> <i18n.Context> @@ -95,29 +67,7 @@ const StartAppComponent: FC<StartAppComponent> = ({ <ReduxStoreProvider store={store}> <KibanaThemeProvider theme$={theme$}> <EuiThemeProvider darkMode={darkMode}> - <AssistantProvider - actionTypeRegistry={actionTypeRegistry} - augmentMessageCodeBlocks={augmentMessageCodeBlocks} - assistantAvailability={assistantAvailability} - assistantLangChain={false} - assistantTelemetry={assistantTelemetry} - defaultAllow={defaultAllow} - defaultAllowReplacement={defaultAllowReplacement} - docLinks={{ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }} - baseAllow={DEFAULT_ALLOW} - baseAllowReplacement={DEFAULT_ALLOW_REPLACEMENT} - basePromptContexts={Object.values(PROMPT_CONTEXTS)} - baseQuickPrompts={BASE_SECURITY_QUICK_PROMPTS} - baseSystemPrompts={BASE_SECURITY_SYSTEM_PROMPTS} - getInitialConversations={getInitialConversation} - getComments={getComments} - http={http} - nameSpace={nameSpace} - setConversations={setConversations} - setDefaultAllow={setDefaultAllow} - setDefaultAllowReplacement={setDefaultAllowReplacement} - title={ASSISTANT_TITLE} - > + <AssistantProvider> <MlCapabilitiesProvider> <UserPrivilegesProvider kibanaCapabilities={capabilities}> <ManageUserInfo> 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( <TestProviders store={store}> <GlobalHeader setHeaderActionMenu={mockSetHeaderActionMenu} /> @@ -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( - <TestProviders store={store}> - <GlobalHeader setHeaderActionMenu={mockSetHeaderActionMenu} /> - </TestProviders> - ); - - 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(<OutPortal node={portalNode} />, { theme$: theme.theme$ }); @@ -91,7 +88,7 @@ export const GlobalHeader = React.memo( {showSourcerer && !showTimeline && ( <Sourcerer scope={sourcererScope} data-test-subj="sourcerer" /> )} - {hasAssistantPrivilege && <AssistantHeaderLink />} + <AssistantHeaderLink /> </EuiHeaderLinks> </EuiHeaderSectionItem> </EuiHeaderSection> 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<HomePageProps> = ({ children, setHeaderActionM </DragDropContextWrapper> <HelpMenu /> <TopValuesPopover /> + <AssistantOverlay /> </> </TourContextProvider> </ConsoleManager> 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(<AssistantHeaderLink />); + 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(<AssistantHeaderLink />); + expect(queryByTestId('assistantHeaderLink')).not.toBeInTheDocument(); + expect(queryByText('AI Assistant')).not.toBeInTheDocument(); + }); + + it('should call the assistant overlay to show on click', () => { + const { queryByTestId } = render(<AssistantHeaderLink />); + 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 ( - <EuiToolTip content={tooltipContent}> + <EuiToolTip content={TOOLTIP_CONTENT}> <EuiHeaderLink data-test-subj="assistantHeaderLink" color="primary" onClick={showOverlay}> <EuiFlexGroup gutterSize="s" alignItems="center"> <EuiFlexItem grow={false}> <AssistantAvatar size="xs" /> </EuiFlexItem> - <EuiFlexItem grow={false}> - {i18n.translate('xpack.securitySolution.globalHeader.assistantHeaderLink', { - defaultMessage: 'AI Assistant', - })} - </EuiFlexItem> + <EuiFlexItem grow={false}>{LINK_LABEL}</EuiFlexItem> </EuiFlexGroup> </EuiHeaderLink> </EuiToolTip> ); -}); - -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: () => <div data-test-subj="assistantOverlay" />, + useAssistantContext: () => ({ + assistantAvailability: mockAssistantAvailability(), + }), +})); + +describe('AssistantOverlay', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render the header link text', () => { + const { queryByTestId } = render(<AssistantOverlay />); + expect(queryByTestId('assistantOverlay')).toBeInTheDocument(); + }); + + it('should not render the header link if not authorized', () => { + mockAssistantAvailability.mockReturnValueOnce({ hasAssistantPrivilege: false }); + + const { queryByTestId } = render(<AssistantOverlay />); + 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 <ElasticAssistantOverlay />; +}; 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 ( + <ElasticAssistantProvider + actionTypeRegistry={actionTypeRegistry} + augmentMessageCodeBlocks={augmentMessageCodeBlocks} + assistantAvailability={assistantAvailability} + assistantLangChain={false} + assistantTelemetry={assistantTelemetry} + defaultAllow={defaultAllow} + defaultAllowReplacement={defaultAllowReplacement} + docLinks={{ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }} + baseAllow={DEFAULT_ALLOW} + baseAllowReplacement={DEFAULT_ALLOW_REPLACEMENT} + basePromptContexts={Object.values(PROMPT_CONTEXTS)} + baseQuickPrompts={BASE_SECURITY_QUICK_PROMPTS} + baseSystemPrompts={BASE_SECURITY_SYSTEM_PROMPTS} + getInitialConversations={getInitialConversation} + getComments={getComments} + http={http} + nameSpace={nameSpace} + setConversations={setConversations} + setDefaultAllow={setDefaultAllow} + setDefaultAllowReplacement={setDefaultAllowReplacement} + title={ASSISTANT_TITLE} + > + {children} + </ElasticAssistantProvider> + ); +}; 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< <Wrapper className={classes} style={style} {...otherProps}> {children} <AppGlobalStyle /> - {hasAssistantPrivilege && <AssistantOverlay isAssistantEnabled={isAssistantEnabled} />} </Wrapper> ); }; 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<ExceptionItemCardMetaInfoProps>( key={reference.id} > <EuiToolTip content={reference.name} anchorClassName="eui-textTruncate"> - <SecuritySolutionLinkAnchor - data-test-subj="ruleName" - deepLinkId={SecurityPageName.rules} - path={getRuleDetailsTabUrl(reference.id, RuleDetailTabs.alerts)} - external - > - {reference.name} - </SecuritySolutionLinkAnchor> + <LinkToRuleDetails external referenceId={reference.id} referenceName={reference.name} /> </EuiToolTip> </EuiContextMenuItem> )); @@ -136,15 +126,12 @@ export const ExceptionItemCardMetaInfo = memo<ExceptionItemCardMetaInfoProps>( key={listAndReferences.id} > <EuiToolTip content={listAndReferences.name} anchorClassName="eui-textTruncate"> - <SecuritySolutionLinkAnchor - data-test-subj="ruleName" - deepLinkId={SecurityPageName.exceptions} - // TODO: Update to list details URL once available - path={`/details/${listAndReferences?.list_id}`} + <LinkToListDetails + dataTestSubj="link-to-exception-list" + linkTitle={listAndReferences.name} + listId={listAndReferences?.list_id} external - > - {listAndReferences.name} - </SecuritySolutionLinkAnchor> + /> </EuiToolTip> </EuiContextMenuItem>, ]} 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', () => { /> </TestProviders> ); - 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 ( - <SecuritySolutionLinkAnchor - data-test-subj="exceptionListActionCell-link" - deepLinkId={SecurityPageName.exceptions} - path={`/details/${list.list_id}`} + <LinkToListDetails + dataTestSubj="exceptionListActionCell-link" + linkTitle={i18n.VIEW_LIST_DETAIL_ACTION} + listId={list.list_id} external - > - {i18n.VIEW_LIST_DETAIL_ACTION} - </SecuritySolutionLinkAnchor> + /> ); }, }, @@ -294,14 +288,11 @@ export const getRulesTableColumn = () => [ 'data-test-subj': 'ruleAction-view', render: (rule: Rule) => { return ( - <SecuritySolutionLinkAnchor - data-test-subj="ruleAction-viewDetails" - deepLinkId={SecurityPageName.rules} - path={getRuleDetailsTabUrl(rule.id, RuleDetailTabs.alerts)} + <LinkToRuleDetails external - > - {i18n.VIEW_RULE_DETAIL_ACTION} - </SecuritySolutionLinkAnchor> + 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 ( <UseField path={`${props.item.path}.params`} diff --git a/x-pack/plugins/security_solution/public/exceptions/components/index.ts b/x-pack/plugins/security_solution/public/exceptions/components/index.ts index 8de30af731151..66d203327cc37 100644 --- a/x-pack/plugins/security_solution/public/exceptions/components/index.ts +++ b/x-pack/plugins/security_solution/public/exceptions/components/index.ts @@ -8,7 +8,8 @@ export * from './create_shared_exception_list'; export * from './exceptions_list_card'; export * from './exceptions_utility'; export * from './import_exceptions_list_flyout'; -export * from './list_details_link_anchor'; +export * from './link_to_rule_details'; +export * from './link_to_list_details'; export * from './list_exception_items'; export * from './list_with_search'; export * from './manage_rules'; diff --git a/x-pack/plugins/security_solution/public/exceptions/components/link_to_list_details/index.tsx b/x-pack/plugins/security_solution/public/exceptions/components/link_to_list_details/index.tsx new file mode 100644 index 0000000000000..20e99dc7de60b --- /dev/null +++ b/x-pack/plugins/security_solution/public/exceptions/components/link_to_list_details/index.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { FC } from 'react'; + +import { SecuritySolutionLinkAnchor } from '../../../common/components/links'; +import { SecurityPageName } from '../../../../common/constants'; + +interface LinkToListDetailsProps { + linkTitle: string; + listId: 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 LinkToListDetailsComponent: FC<LinkToListDetailsProps> = ({ + linkTitle, + listId, + external, + dataTestSubj, +}) => { + return ( + <SecuritySolutionLinkAnchor + data-test-subj={`linkToRuleSecuritySolutionLink${dataTestSubj ?? ''}`} + deepLinkId={SecurityPageName.exceptions} + path={`/details/${listId}`} + target={external ? '_blank' : undefined} + > + {linkTitle} + </SecuritySolutionLinkAnchor> + ); +}; + +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<LinkAnchorProps> = ({ referenceName, referenceId, external }) => { +const LinkToRuleDetailsComponent: FC<LinkToRuleDetailsProps> = ({ + referenceName, + referenceId, + external, + dataTestSubj, +}) => { return ( <SecuritySolutionLinkAnchor - data-test-subj="SecuritySolutionLinkAnchor" + data-test-subj={`linkToRuleSecuritySolutionLink${dataTestSubj ?? ''}`} deepLinkId={SecurityPageName.rules} path={getRuleDetailsTabUrl(referenceId, RuleDetailTabs.alerts)} - external={external} + target={external ? '_blank' : undefined} > {referenceName} </SecuritySolutionLinkAnchor> ); }; -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<ListExceptionItemsProps> = ({ 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( + <IntlProvider locale="en"> + <PanelHeader /> + </IntlProvider> + ); + +describe('<PanelHeader />', () => { + (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' ? ( + <FormattedMessage + id="xpack.securitySolution.flyout.isolateHost.isolateTitle" + defaultMessage="Isolate host" + /> + ) : ( + <FormattedMessage + id="xpack.securitySolution.flyout.isolateHost.releaseTitle" + defaultMessage="Release host" + /> + ); return ( <EuiFlyoutHeader hasBorder> 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 = () => { )} </EuiFlexGroup> ) : ( - <div data-test-subj={`${CORRELATIONS_DETAILS_TEST_ID}Error`}> - {CORRELATIONS_ERROR_MESSAGE} - </div> + <p data-test-subj={CORRELATIONS_DETAILS_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.noDataDescription" + defaultMessage="No correlations data available." + /> + </p> )} </> ); 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( <TestProviders> <CorrelationsDetailsAlertsTable - title={'title'} + title={<p>{'title'}</p>} 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.timestampColumnLabel" + defaultMessage="Timestamp" + /> + ), 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.ruleColumnLabel" + defaultMessage="Rule" + /> + ), truncateText: true, }, { field: ALERT_REASON, - name: i18n.CORRELATIONS_REASON_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.reasonColumnLabel" + defaultMessage="Reason" + /> + ), truncateText: true, }, { field: 'kibana.alert.severity', - name: i18n.CORRELATIONS_SEVERITY_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.severityColumnLabel" + defaultMessage="Severity" + /> + ), 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('<EntitiesDetails />', () => { it('renders entities details correctly', () => { - const { getByTestId } = render( + const { getByTestId, queryByTestId } = render( <TestProviders> <LeftPanelContext.Provider value={mockContextValue}> <EntitiesDetails /> @@ -52,6 +52,7 @@ describe('<EntitiesDetails />', () => { 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('<EntitiesDetails />', () => { </TestProviders> ); 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('<EntitiesDetails />', () => { </TestProviders> ); 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 = () => { )} </EuiFlexGroup> ) : ( - <div data-test-subj={ENTITIES_DETAILS_NO_DATA_TEST_ID}>{ENTITIES_NO_DATA_MESSAGE}</div> + <p data-test-subj={ENTITIES_DETAILS_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.noDataDescription" + defaultMessage="Host and user information are unavailable for this alert." + /> + </p> )} </> ); 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<HostDetailsProps> = ({ hostName, timestamp, s () => [ { field: 'user', - name: i18n.RELATED_ENTITIES_NAME_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersNameColumnLabel" + defaultMessage="Name" + /> + ), render: (user: string) => ( <EuiText grow={false} size="xs"> <SecurityCellActions @@ -150,7 +155,12 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ hostName, timestamp, s }, { field: 'ip', - name: i18n.RELATED_ENTITIES_IP_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersIpColumnLabel" + defaultMessage="Ip addresses" + /> + ), render: (ips: string[]) => { return ( <DefaultFieldRenderer @@ -199,7 +209,13 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ hostName, timestamp, s </EuiFlexItem> <EuiFlexItem grow={false}> <EuiTitle size="xxxs"> - <EuiText>{`${i18n.RELATED_USERS_TITLE}: ${totalCount}`}</EuiText> + <EuiText> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersCountLabel" + defaultMessage="Related users: {count}" + values={{ count: totalCount }} + /> + </EuiText> </EuiTitle> </EuiFlexItem> </EuiFlexGroup> @@ -215,7 +231,12 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ hostName, timestamp, s return ( <> <EuiTitle size="xs"> - <h4>{i18n.HOST_TITLE}</h4> + <h4> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.hostDetailsTitle" + defaultMessage="Host" + /> + </h4> </EuiTitle> <EuiSpacer size="s" /> <ExpandablePanel @@ -228,7 +249,12 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ hostName, timestamp, s data-test-subj={HOST_DETAILS_TEST_ID} > <EuiTitle size="xxs"> - <h5>{i18n.HOSTS_INFO_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.hostDetailsInfoTitle" + defaultMessage="Host information" + /> + </h5> </EuiTitle> <EuiSpacer size="s" /> <AnomalyTableProvider @@ -263,11 +289,24 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ hostName, timestamp, s <EuiFlexGroup direction="row" gutterSize="xs" alignItems="center"> <EuiFlexItem grow={false}> <EuiTitle size="xxs"> - <h5>{i18n.RELATED_USERS_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersTitle" + defaultMessage="Related users" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem grow={false}> - <EuiToolTip content={i18n.RELATED_USERS_TOOL_TIP(hostName)}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersTooltip" + defaultMessage="After this alert was generated, these users logged into {hostName}. Check if this activity is normal." + values={{ hostName }} + /> + } + > <EuiIcon color="subdued" type="iInCircle" className="eui-alignTop" /> </EuiToolTip> </EuiFlexItem> @@ -287,11 +326,21 @@ export const HostDetails: React.FC<HostDetailsProps> = ({ 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={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersNoDataDescription" + defaultMessage="No users identified" + /> + } /> <InspectButton queryId={relatedUsersQueryId} - title={i18n.RELATED_USERS_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedUsersInspectButtonTitle" + defaultMessage="Related users" + /> + } inspectIndex={0} /> </RelatedUsersManage> 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('<InvestigationGuide />', () => { }); 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('<InvestigationGuide />', () => { }); 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} /> ) : ( - <div data-test-subj={INVESTIGATION_GUIDE_NO_DATA_TEST_ID}> + <p data-test-subj={INVESTIGATION_GUIDE_NO_DATA_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.investigationGuideNoData" + id="xpack.securitySolution.flyout.left.investigation.noDataDescription" defaultMessage="There’s no investigation guide for this rule. {documentation} to add one." values={{ documentation: ( @@ -60,14 +60,14 @@ export const InvestigationGuide: React.FC = () => { target="_blank" > <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.investigationGuideDocumentationLink" + id="xpack.securitySolution.flyout.left.investigation.noDataLinkText" defaultMessage="Edit the rule's settings" /> </EuiLink> ), }} /> - </div> + </p> )} </> ); 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( + <TestProviders> + <LeftPanelContext.Provider value={panelContextValue}> + <PrevalenceDetails /> + </LeftPanelContext.Provider> + </TestProviders> + ); + describe('PrevalenceDetails', () => { const licenseServiceMock = licenseService as jest.Mocked<typeof licenseService>; @@ -86,13 +96,7 @@ describe('PrevalenceDetails', () => { ], }); - const { getByTestId, getAllByTestId, queryByTestId } = render( - <TestProviders> - <LeftPanelContext.Provider value={panelContextValue}> - <PrevalenceDetails /> - </LeftPanelContext.Provider> - </TestProviders> - ); + 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( - <TestProviders> - <LeftPanelContext.Provider value={panelContextValue}> - <PrevalenceDetails /> - </LeftPanelContext.Provider> - </TestProviders> - ); + 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( - <LeftPanelContext.Provider value={panelContextValue}> - <PrevalenceDetails /> - </LeftPanelContext.Provider> - ); + 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( - <LeftPanelContext.Provider value={panelContextValue}> - <PrevalenceDetails /> - </LeftPanelContext.Provider> + 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<EuiBasicTableColumn<PrevalenceDetailsRow>> = [ { field: 'field', - name: PREVALENCE_TABLE_FIELD_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.fieldColumnLabel" + defaultMessage="Field" + /> + ), 'data-test-subj': PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID, render: (field: string) => <EuiText size="xs">{field}</EuiText>, width: '20%', }, { field: 'value', - name: PREVALENCE_TABLE_VALUE_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.valueColumnLabel" + defaultMessage="Value" + /> + ), 'data-test-subj': PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID, render: (value: string) => <EuiText size="xs">{value}</EuiText>, width: '20%', }, { name: ( - <EuiToolTip content={PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE_TOOLTIP}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.alertCountColumnTooltip" + defaultMessage="Total number of alerts with identical field value pairs." + /> + } + > <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem>{PREVALENCE_TABLE_ALERT_COUNT_COLUMN_TITLE}</EuiFlexItem> - <EuiFlexItem>{PREVALENCE_TABLE_COUNT_COLUMN_TITLE}</EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.alertCountColumnLabel" + defaultMessage="Alert" + /> + </EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.alertCountColumnCountLabel" + defaultMessage="count" + /> + </EuiFlexItem> </EuiFlexGroup> </EuiToolTip> ), @@ -123,10 +136,27 @@ const columns: Array<EuiBasicTableColumn<PrevalenceDetailsRow>> = [ }, { name: ( - <EuiToolTip content={PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE_TOOLTIP}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.documentCountColumnTooltip" + defaultMessage="Total number of event documents with identical field value pairs." + /> + } + > <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem>{PREVALENCE_TABLE_DOC_COUNT_COLUMN_TITLE}</EuiFlexItem> - <EuiFlexItem>{PREVALENCE_TABLE_COUNT_COLUMN_TITLE}</EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.documentCountColumnLabel" + defaultMessage="Document" + /> + </EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.documentCountColumnCountLabel" + defaultMessage="count" + /> + </EuiFlexItem> </EuiFlexGroup> </EuiToolTip> ), @@ -169,10 +199,27 @@ const columns: Array<EuiBasicTableColumn<PrevalenceDetailsRow>> = [ { field: 'hostPrevalence', name: ( - <EuiToolTip content={HOST_PREVALENCE_COLUMN_TITLE_TOOLTIP}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.hostPrevalenceColumnTooltip" + defaultMessage="Percentage of unique hosts with identical field value pairs." + /> + } + > <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem>{HOST_TITLE}</EuiFlexItem> - <EuiFlexItem>{PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE}</EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.hostPrevalenceColumnLabel" + defaultMessage="Host" + /> + </EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.hostPrevalenceColumnCountLabel" + defaultMessage="prevalence" + /> + </EuiFlexItem> </EuiFlexGroup> </EuiToolTip> ), @@ -185,10 +232,27 @@ const columns: Array<EuiBasicTableColumn<PrevalenceDetailsRow>> = [ { field: 'userPrevalence', name: ( - <EuiToolTip content={USER_PREVALENCE_COLUMN_TITLE_TOOLTIP}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.userPrevalenceColumnTooltip" + defaultMessage="Percentage of unique users with identical field value pairs." + /> + } + > <EuiFlexGroup direction="column" gutterSize="none"> - <EuiFlexItem>{USER_TITLE}</EuiFlexItem> - <EuiFlexItem>{PREVALENCE_TABLE_PREVALENCE_COLUMN_TITLE}</EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.userPrevalenceColumnLabel" + defaultMessage="User" + /> + </EuiFlexItem> + <EuiFlexItem> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.userPrevalenceColumnCountLabel" + defaultMessage="prevalence" + /> + </EuiFlexItem> </EuiFlexGroup> </EuiToolTip> ), @@ -270,15 +334,15 @@ export const PrevalenceDetails: React.FC = () => { const upsell = ( <> - <EuiCallOut data-test-subj={`${PREVALENCE_DETAILS_TABLE_TEST_ID}UpSell`}> + <EuiCallOut data-test-subj={PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.prevalenceTableAlertUpsell" + id="xpack.securitySolution.flyout.left.insights.prevalence.tableAlertUpsellDescription" defaultMessage="Preview of a {subscription} feature showing host and user prevalence." values={{ subscription: ( <EuiLink href="https://www.elastic.co/pricing/" target="_blank"> <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.prevalenceTableAlertUpsellLink" + id="xpack.securitySolution.flyout.left.insights.prevalence.tableAlertUpsellLinkText" defaultMessage="Platinum" /> </EuiLink> @@ -308,9 +372,12 @@ export const PrevalenceDetails: React.FC = () => { data-test-subj={PREVALENCE_DETAILS_TABLE_TEST_ID} /> ) : ( - <div data-test-subj={`${PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID}Error`}> - {PREVALENCE_NO_DATA_MESSAGE} - </div> + <p data-test-subj={PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalence.noDataDescription" + defaultMessage="No prevalence data available." + /> + </p> )} </EuiPanel> </> 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('<RelatedAlertsByAncestry />', () => { ); 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( + <TestProviders> + <RelatedAlertsByAncestry + documentId={documentId} + indices={indices} + scopeId={scopeId} + eventId={eventId} + /> + </TestProviders> + ); + 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<RelatedAlertsByAncestryProps> = indices, scopeId, }); - const title = `${dataCount} ${CORRELATIONS_ANCESTRY_ALERTS(dataCount)}`; if (error) { return null; @@ -53,12 +51,23 @@ export const RelatedAlertsByAncestry: React.VFC<RelatedAlertsByAncestryProps> = return ( <CorrelationsDetailsAlertsTable - title={title} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.ancestryAlertsTitle" + defaultMessage="{count} {count, plural, one {alert} other {alerts}} related by ancestry" + values={{ count: dataCount }} + /> + } loading={loading} alertIds={data} scopeId={scopeId} eventId={eventId} - noItemsMessage={RELATED_ALERTS_BY_ANCESTRY_NO_DATA} + noItemsMessage={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.ancestryAlertsNoDataDescription" + defaultMessage="No alerts related by ancestry." + /> + } 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('<RelatedAlertsBySameSourceEvent />', () => { ); 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( + <TestProviders> + <RelatedAlertsBySameSourceEvent + originalEventId={originalEventId} + scopeId={scopeId} + eventId={eventId} + /> + </TestProviders> + ); + 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<RelatedAlertsBySameSource originalEventId, scopeId, }); - const title = `${dataCount} ${CORRELATIONS_SAME_SOURCE_ALERTS(dataCount)}`; if (error) { return null; @@ -47,12 +45,23 @@ export const RelatedAlertsBySameSourceEvent: React.VFC<RelatedAlertsBySameSource return ( <CorrelationsDetailsAlertsTable - title={title} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.sourceAlertsTitle" + defaultMessage="{count} {count, plural, one {alert} other {alerts}} related by source event" + values={{ count: dataCount }} + /> + } loading={loading} alertIds={data} scopeId={scopeId} eventId={eventId} - noItemsMessage={RELATED_ALERTS_BY_SOURCE_EVENT_NO_DATA} + noItemsMessage={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.sourceAlertsNoDataDescription" + defaultMessage="No related source events." + /> + } 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('<RelatedAlertsBySession />', () => { ); 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( + <TestProviders> + <RelatedAlertsBySession entityId={entityId} scopeId={scopeId} eventId={eventId} /> + </TestProviders> + ); + 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<RelatedAlertsBySessionProps> = ({ entityId, scopeId, }); - const title = `${dataCount} ${CORRELATIONS_SESSION_ALERTS(dataCount)}`; if (error) { return null; @@ -47,12 +45,23 @@ export const RelatedAlertsBySession: React.VFC<RelatedAlertsBySessionProps> = ({ return ( <CorrelationsDetailsAlertsTable - title={title} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.sessionAlertsTitle" + defaultMessage="{count} {count, plural, one {alert} other {alerts}} related by session" + values={{ count: dataCount }} + /> + } loading={loading} alertIds={data} scopeId={scopeId} eventId={eventId} - noItemsMessage={RELATED_ALERTS_BY_SESSION_NO_DATA} + noItemsMessage={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.sessionAlertsNoDataDescription" + defaultMessage="No alerts related by session." + /> + } 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( + <IntlProvider locale="en"> + <RelatedCases eventId={eventId} /> + </IntlProvider> + ); + describe('<RelatedCases />', () => { it('should render many related cases correctly', () => { (useFetchRelatedCases as jest.Mock).mockReturnValue({ @@ -54,7 +62,7 @@ describe('<RelatedCases />', () => { dataCount: 1, }); - const { getByTestId } = render(<RelatedCases eventId={eventId} />); + 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('<RelatedCases />', () => { error: true, }); - const { container } = render(<RelatedCases eventId={eventId} />); + 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<EuiBasicTableColumn<RelatedCase>> = [ { field: 'title', - name: CORRELATIONS_CASE_NAME_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.nameColumnLabel" + defaultMessage="Name" + /> + ), truncateText: true, render: (value: string, caseData: RelatedCase) => ( <CaseDetailsLink detailName={caseData.id} title={caseData.title}> @@ -38,7 +38,12 @@ const columns: Array<EuiBasicTableColumn<RelatedCase>> = [ }, { field: 'status', - name: CORRELATIONS_CASE_STATUS_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.statusColumnLabel" + defaultMessage="Status" + /> + ), truncateText: true, }, ]; @@ -55,7 +60,6 @@ export interface RelatedCasesProps { */ export const RelatedCases: React.VFC<RelatedCasesProps> = ({ eventId }) => { const { loading, error, data, dataCount } = useFetchRelatedCases({ eventId }); - const title = `${dataCount} ${CORRELATIONS_RELATED_CASES(dataCount)}`; if (loading) { return <EuiSkeletonText lines={1} size="m" isLoading={loading} contentAriaLabel="Loading" />; @@ -68,7 +72,13 @@ export const RelatedCases: React.VFC<RelatedCasesProps> = ({ eventId }) => { return ( <ExpandablePanel header={{ - title, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.relatedCasesTitle" + defaultMessage="{count} related {count, plural, one {case} other {cases}}" + values={{ count: dataCount }} + /> + ), iconType: ICON, }} content={{ error }} @@ -83,7 +93,12 @@ export const RelatedCases: React.VFC<RelatedCasesProps> = ({ eventId }) => { items={data} columns={columns} pagination={true} - message={RELATED_CASES_NO_DATA} + message={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.relatedCasesNoDataDescription" + defaultMessage="No related cases." + /> + } data-test-subj={CORRELATIONS_DETAILS_CASES_SECTION_TABLE_TEST_ID} /> </ExpandablePanel> 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('<ResponseDetails />', () => { 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 ( <div data-test-subj={RESPONSE_DETAILS_TEST_ID}> <EuiTitle size="xxxs"> - <h5>{i18n.RESPONSE_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.left.response.responseTitle" + defaultMessage="Responses" + /> + </h5> </EuiTitle> <EuiSpacer size="s" /> {!responseActions ? ( <InlineBlock data-test-subj={RESPONSE_EMPTY_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.response.emptyMessage" + id="xpack.securitySolution.flyout.left.response.noDataDescription" defaultMessage="There are no response actions defined for this event. To add some, edit the rule’s settings and set up {link}." values={{ link: ( @@ -73,7 +77,7 @@ export const ResponseDetails: React.FC = () => { target="_blank" > <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.response.responseActionLink" + id="xpack.securitySolution.flyout.left.response.noDataLinkText" defaultMessage="response actions" /> </EuiLink> 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 = () => { <EuiEmptyPrompt iconType="error" color="danger" - title={<h2>{ERROR_TITLE(SESSION_VIEW_ERROR_MESSAGE)}</h2>} - body={<p>{ERROR_MESSAGE(SESSION_VIEW_ERROR_MESSAGE)}</p>} + title={ + <h2> + <FormattedMessage + id="xpack.securitySolution.flyout.left.visualize.sessionView.errorMessageTitle" + defaultMessage="Unable to display {title}" + values={{ title: 'session view' }} + /> + </h2> + } + body={ + <p> + <FormattedMessage + id="xpack.securitySolution.flyout.left.visualize.sessionView.errorMessageDescription" + defaultMessage="There was an error displaying {message}" + values={{ message: 'session view' }} + /> + </p> + } 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( + <TestProviders> + <LeftPanelContext.Provider value={mockContextValue}> + <SuppressedAlerts + alertSuppressionCount={alertSuppressionCount} + dataAsNestedObject={mockDataAsNestedObject} + /> + </LeftPanelContext.Provider> + </TestProviders> + ); + describe('<SuppressedAlerts />', () => { it('should render zero component correctly', () => { - const { getByTestId, queryByTestId } = render( - <TestProviders> - <LeftPanelContext.Provider value={mockContextValue}> - <SuppressedAlerts alertSuppressionCount={0} dataAsNestedObject={mockDataAsNestedObject} /> - </LeftPanelContext.Provider> - </TestProviders> - ); + const { getByTestId, queryByTestId } = renderSuppressedAlerts(0); expect(getByTestId(TITLE_ICON)).toBeInTheDocument(); expect(getByTestId(TITLE_TEXT)).toHaveTextContent('0 suppressed alert'); @@ -54,13 +60,7 @@ describe('<SuppressedAlerts />', () => { }); it('should render single component correctly', () => { - const { getByTestId, queryByTestId } = render( - <TestProviders> - <LeftPanelContext.Provider value={mockContextValue}> - <SuppressedAlerts alertSuppressionCount={1} dataAsNestedObject={mockDataAsNestedObject} /> - </LeftPanelContext.Provider> - </TestProviders> - ); + const { getByTestId, queryByTestId } = renderSuppressedAlerts(1); expect(getByTestId(TITLE_ICON)).toBeInTheDocument(); expect(getByTestId(TITLE_TEXT)).toHaveTextContent('1 suppressed alert'); @@ -70,13 +70,7 @@ describe('<SuppressedAlerts />', () => { }); it('should render multiple component correctly', () => { - const { getByTestId, queryByTestId } = render( - <TestProviders> - <LeftPanelContext.Provider value={mockContextValue}> - <SuppressedAlerts alertSuppressionCount={2} dataAsNestedObject={mockDataAsNestedObject} /> - </LeftPanelContext.Provider> - </TestProviders> - ); + 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<SuppressedAlertsProps> = ({ const title = ( <EuiFlexGroup alignItems="center" gutterSize="s"> <EuiFlexItem> - {`${alertSuppressionCount} ${CORRELATIONS_SUPPRESSED_ALERTS(alertSuppressionCount)}`} + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlations.suppressedAlertsTitle" + defaultMessage="{count} suppressed {count, plural, =1 {alert} other {alerts}}" + values={{ count: alertSuppressionCount }} + /> </EuiFlexItem> <EuiFlexItem> <EuiBetaBadge diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts index 03b768607c20c..57e1deb59136e 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts @@ -23,21 +23,23 @@ export const PREVALENCE_DETAILS_DATE_PICKER_TEST_ID = export const PREVALENCE_DETAILS_TABLE_TEST_ID = `${PREFIX}PrevalenceDetailsTable` as const; export const PREVALENCE_DETAILS_LOADING_TEST_ID = `${PREFIX}PrevalenceDetailsLoading` as const; export const PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableFieldCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}FieldCell` as const; export const PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableValueCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}ValueCell` as const; export const PREVALENCE_DETAILS_TABLE_ALERT_COUNT_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableAlertCountCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}AlertCountCell` as const; export const PREVALENCE_DETAILS_TABLE_DOC_COUNT_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableDocCountCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}DocCountCell` as const; export const PREVALENCE_DETAILS_TABLE_HOST_PREVALENCE_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableHostPrevalenceCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}HostPrevalenceCell` as const; export const PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID = - `${PREFIX}PrevalenceDetailsTableUserPrevalenceCell` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}UserPrevalenceCell` as const; export const PREVALENCE_DETAILS_TABLE_ERROR_TEST_ID = - `${PREFIX}PrevalenceDetailsTableError` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}Error` as const; export const PREVALENCE_DETAILS_TABLE_NO_DATA_TEST_ID = - `${PREFIX}PrevalenceDetailsTableNoData` as const; + `${PREVALENCE_DETAILS_TABLE_TEST_ID}NoData` as const; +export const PREVALENCE_DETAILS_TABLE_UPSELL_TEST_ID = + `${PREVALENCE_DETAILS_TABLE_TEST_ID}Upsell` as const; /* Entities */ @@ -53,6 +55,8 @@ export const HOST_DETAILS_RELATED_USERS_TABLE_TEST_ID = `${PREFIX}HostsDetailsRelatedUsersTable` as const; export const CORRELATIONS_DETAILS_TEST_ID = `${PREFIX}CorrelationsDetails` as const; +export const CORRELATIONS_DETAILS_NO_DATA_TEST_ID = + `${CORRELATIONS_DETAILS_TEST_ID}NoData` as const; export const THREAT_INTELLIGENCE_DETAILS_ENRICHMENTS_TEST_ID = `threat-match-detected` as const; export const THREAT_INTELLIGENCE_DETAILS_SPINNER_TEST_ID = diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/translations.ts b/x-pack/plugins/security_solution/public/flyout/left/components/translations.ts deleted file mode 100644 index 16c2349d87316..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/left/components/translations.ts +++ /dev/null @@ -1,272 +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 ENTITIES_NO_DATA_MESSAGE = i18n.translate( - 'xpack.securitySolution.flyout.entitiesNoDataMessage', - { - defaultMessage: 'Host and user information are unavailable for this alert.', - } -); - -export const ANALYZER_ERROR_MESSAGE = i18n.translate( - 'xpack.securitySolution.flyout.analyzerErrorMessage', - { - defaultMessage: 'analyzer', - } -); - -export const SESSION_VIEW_ERROR_MESSAGE = i18n.translate( - 'xpack.securitySolution.flyout.sessionViewErrorMessage', - { - defaultMessage: 'session view', - } -); - -export const CORRELATIONS_ERROR_MESSAGE = i18n.translate( - 'xpack.securitySolution.flyout.correlationsErrorMessage', - { - defaultMessage: 'No correlations data available', - } -); - -export const USER_TITLE = i18n.translate('xpack.securitySolution.flyout.entities.userTitle', { - defaultMessage: 'User', -}); - -export const USER_PREVALENCE_COLUMN_TITLE_TOOLTIP = i18n.translate( - 'xpack.securitySolution.flyout.entities.userPrevalenceColumTitleTooltip', - { - defaultMessage: 'Percentage of unique users with identical field value pairs', - } -); - -export const USERS_INFO_TITLE = i18n.translate( - 'xpack.securitySolution.flyout.entities.usersInfoTitle', - { - defaultMessage: 'User information', - } -); - -export const RELATED_HOSTS_TITLE = i18n.translate( - 'xpack.securitySolution.flyout.entities.relatedHostsTitle', - { - defaultMessage: 'Related hosts', - } -); - -export const RELATED_HOSTS_TABLE_NO_DATA = i18n.translate( - 'xpack.securitySolution.flyout.entities.relatedHostsTableNoData', - { - defaultMessage: 'No hosts identified', - } -); - -export const RELATED_HOSTS_TOOL_TIP = (userName: string) => - 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<UserDetailsProps> = ({ userName, timestamp, s () => [ { field: 'host', - name: i18n.RELATED_ENTITIES_NAME_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsNameColumnLabel" + defaultMessage="Name" + /> + ), render: (host: string) => ( <EuiText grow={false} size="xs"> <SecurityCellActions @@ -151,7 +156,12 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ userName, timestamp, s }, { field: 'ip', - name: i18n.RELATED_ENTITIES_IP_COLUMN_TITLE, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsIpColumnLabel" + defaultMessage="Ip addresses" + /> + ), render: (ips: string[]) => { return ( <DefaultFieldRenderer @@ -200,7 +210,13 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ userName, timestamp, s </EuiFlexItem> <EuiFlexItem grow={false}> <EuiTitle size="xxxs"> - <EuiText>{`${i18n.RELATED_HOSTS_TITLE}: ${totalCount}`}</EuiText> + <EuiText> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsCountLabel" + defaultMessage="Related hosts: {count}" + values={{ count: totalCount }} + /> + </EuiText> </EuiTitle> </EuiFlexItem> </EuiFlexGroup> @@ -216,7 +232,12 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ userName, timestamp, s return ( <> <EuiTitle size="xs"> - <h4>{i18n.USER_TITLE}</h4> + <h4> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.userDetailsTitle" + defaultMessage="User" + /> + </h4> </EuiTitle> <EuiSpacer size="s" /> <ExpandablePanel @@ -232,7 +253,12 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ userName, timestamp, s data-test-subj={USER_DETAILS_TEST_ID} > <EuiTitle size="xxs"> - <h5>{i18n.USERS_INFO_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.userDetailsInfoTitle" + defaultMessage="User information" + /> + </h5> </EuiTitle> <EuiSpacer size="s" /> <AnomalyTableProvider @@ -266,11 +292,24 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ userName, timestamp, s <EuiFlexGroup direction="row" gutterSize="xs" alignItems="center"> <EuiFlexItem grow={false}> <EuiTitle size="xxs"> - <h5>{i18n.RELATED_HOSTS_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsTitle" + defaultMessage="Related hosts" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem grow={false}> - <EuiToolTip content={i18n.RELATED_HOSTS_TOOL_TIP(userName)}> + <EuiToolTip + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsTooltip" + defaultMessage="After this alert was generated, {userName} logged into these hosts. Check if this activity is normal." + values={{ userName }} + /> + } + > <EuiIcon color="subdued" type="iInCircle" className="eui-alignTop" /> </EuiToolTip> </EuiFlexItem> @@ -290,11 +329,21 @@ export const UserDetails: React.FC<UserDetailsProps> = ({ 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={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsNoDataDescription" + defaultMessage="No hosts identified" + /> + } /> <InspectButton queryId={relatedHostsQueryId} - title={i18n.RELATED_HOSTS_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entities.relatedHostsInspectButtonTitle" + defaultMessage="Related hosts" + /> + } inspectIndex={0} /> </RelatedHostsManage> 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.visualize.tabLabel" + defaultMessage="Visualize" + /> + ), content: <VisualizeTab />, visible: false, }, { id: 'insights', 'data-test-subj': INSIGHTS_TAB_TEST_ID, - name: INSIGHTS_TAB, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.tabLabel" + defaultMessage="Insights" + /> + ), content: <InsightsTab />, visible: true, }, { id: 'investigation', 'data-test-subj': INVESTIGATION_TAB_TEST_ID, - name: INVESTIGATIONS_TAB, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.investigations.tabLabel" + defaultMessage="Investigation" + /> + ), content: <InvestigationTab />, visible: true, }, { id: 'response', 'data-test-subj': RESPONSE_TAB_TEST_ID, - name: RESPONSE_TAB, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.response.tabLabel" + defaultMessage="Response" + /> + ), content: <ResponseTab />, 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.entitiesButtonLabel" + defaultMessage="Entities" + /> + ), 'data-test-subj': INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID, }, { id: THREAT_INTELLIGENCE_TAB_ID, - label: THREAT_INTELLIGENCE_BUTTON, + label: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.threatIntelligenceButtonLabel" + defaultMessage="Threat intelligence" + /> + ), 'data-test-subj': INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON_TEST_ID, }, { id: PREVALENCE_TAB_ID, - label: PREVALENCE_BUTTON, + label: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.prevalenceButtonLabel" + defaultMessage="Prevalence" + /> + ), 'data-test-subj': INSIGHTS_TAB_PREVALENCE_BUTTON_TEST_ID, }, { id: CORRELATIONS_TAB_ID, - label: CORRELATIONS_BUTTON, + label: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.insights.correlationsButtonLabel" + defaultMessage="Correlations" + /> + ), 'data-test-subj': INSIGHTS_TAB_CORRELATIONS_BUTTON_TEST_ID, }, ]; @@ -97,7 +112,12 @@ export const InsightsTab: React.FC = memo(() => { <EuiButtonGroup color="primary" name="coarsness" - legend={INSIGHTS_BUTTONGROUP_OPTIONS} + legend={i18n.translate( + 'xpack.securitySolution.flyout.left.insights.buttonGroupButtonLabel', + { + defaultMessage: 'Insights options', + } + )} options={insightsButtons} idSelected={activeInsightsId} onChange={onChangeCompressed} diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs/translations.ts b/x-pack/plugins/security_solution/public/flyout/left/tabs/translations.ts deleted file mode 100644 index e000ba2feabf8..0000000000000 --- a/x-pack/plugins/security_solution/public/flyout/left/tabs/translations.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 { i18n } from '@kbn/i18n'; - -export const VISUALIZE_BUTTONGROUP_OPTIONS = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.visualizeOptions', - { - defaultMessage: 'Visualize options', - } -); - -export const SESSION_VIEW_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.sessionViewButton', - { - defaultMessage: 'Session View', - } -); - -export const ANALYZER_GRAPH_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.analyzerGraphButton', - { - defaultMessage: 'Analyzer Graph', - } -); - -export const INSIGHTS_BUTTONGROUP_OPTIONS = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.insightsOptions', - { - defaultMessage: 'Insights options', - } -); - -export const ENTITIES_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.entitiesButton', - { - defaultMessage: 'Entities', - } -); - -export const THREAT_INTELLIGENCE_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.threatIntelligenceButton', - { - defaultMessage: 'Threat intelligence', - } -); - -export const PREVALENCE_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.prevalenceButton', - { - defaultMessage: 'Prevalence', - } -); - -export const CORRELATIONS_BUTTON = i18n.translate( - 'xpack.securitySolution.flyout.documentDetails.correlationsButton', - { - defaultMessage: 'Correlations', - } -); diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx b/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx index baedc5c1cec73..923a2e9aa3ed6 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx @@ -10,6 +10,8 @@ import React, { memo, useState, useCallback, 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 { useLeftPanelContext } from '../context'; import { LeftPanelKey, LeftPanelVisualizeTab } from '..'; import { @@ -18,11 +20,6 @@ import { VISUALIZE_TAB_SESSION_VIEW_BUTTON_TEST_ID, } from './test_ids'; import { ANALYZE_GRAPH_ID, AnalyzeGraph } from '../components/analyze_graph'; -import { - ANALYZER_GRAPH_BUTTON, - SESSION_VIEW_BUTTON, - VISUALIZE_BUTTONGROUP_OPTIONS, -} from './translations'; import { SESSION_VIEW_ID, SessionView } from '../components/session_view'; import { ALERTS_ACTIONS } from '../../../common/lib/apm/user_actions'; import { useStartTransaction } from '../../../common/lib/apm/use_start_transaction'; @@ -30,12 +27,22 @@ import { useStartTransaction } from '../../../common/lib/apm/use_start_transacti const visualizeButtons: EuiButtonGroupOptionProps[] = [ { id: SESSION_VIEW_ID, - label: SESSION_VIEW_BUTTON, + label: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.visualize.sessionViewButtonLabel" + defaultMessage="Session View" + /> + ), 'data-test-subj': VISUALIZE_TAB_SESSION_VIEW_BUTTON_TEST_ID, }, { id: ANALYZE_GRAPH_ID, - label: ANALYZER_GRAPH_BUTTON, + label: ( + <FormattedMessage + id="xpack.securitySolution.flyout.left.visualize.analyzerGraphButtonLabel" + defaultMessage="Analyzer Graph" + /> + ), 'data-test-subj': VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID, }, ]; @@ -83,7 +90,12 @@ export const VisualizeTab: FC = memo(() => { <EuiButtonGroup color="primary" name="coarsness" - legend={VISUALIZE_BUTTONGROUP_OPTIONS} + legend={i18n.translate( + 'xpack.securitySolution.flyout.left.visualize.buttonGroupButtonLabel', + { + defaultMessage: 'Visualize options', + } + )} options={visualizeButtons} idSelected={activeVisualizationId} onChange={(id) => 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('<AlertReasonPreview />', () => { it('should render alert reason preview', () => { const { getByTestId } = render( - <PreviewPanelContext.Provider value={panelContextValue}> - <ThemeProvider theme={mockTheme}> - <AlertReasonPreview /> - </ThemeProvider> - </PreviewPanelContext.Provider> + <IntlProvider locale="en>"> + <PreviewPanelContext.Provider value={panelContextValue}> + <ThemeProvider theme={mockTheme}> + <AlertReasonPreview /> + </ThemeProvider> + </PreviewPanelContext.Provider> + </IntlProvider> ); 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 ( <EuiPanel hasShadow={false} data-test-subj={ALERT_REASON_PREVIEW_BODY_TEST_ID}> <EuiTitle> - <h6>{ALERT_REASON_TITLE}</h6> + <h6> + <FormattedMessage + id="xpack.securitySolution.flyout.preview.alertReason.panelTitle" + defaultMessage="Alert reason" + /> + </h6> </EuiTitle> <EuiSpacer size="m" /> <ReasonPreviewContainerWrapper> 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('<RulePreview />', () => { 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(() => { <RulePreviewTitle rule={rule} isSuppressed={!isExistingRule} /> <EuiHorizontalRule margin="s" /> <ExpandableSection - title={i18n.RULE_PREVIEW_ABOUT_TEXT} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.preview.rule.aboutLabel" + defaultMessage="About" + /> + } expanded data-test-subj={RULE_PREVIEW_ABOUT_TEST_ID} > @@ -103,7 +108,12 @@ export const RulePreview: React.FC = memo(() => { {defineRuleData && !isSavedQueryLoading && ( <> <ExpandableSection - title={i18n.RULE_PREVIEW_DEFINITION_TEXT} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.preview.rule.definitionLabel" + defaultMessage="Definition" + /> + } expanded={false} data-test-subj={RULE_PREVIEW_DEFINITION_TEST_ID} > @@ -125,7 +135,12 @@ export const RulePreview: React.FC = memo(() => { {scheduleRuleData && ( <> <ExpandableSection - title={i18n.RULE_PREVIEW_SCHEDULE_TEXT} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.preview.rule.scheduleLabel" + defaultMessage="Schedule" + /> + } expanded={false} data-test-subj={RULE_PREVIEW_SCHEDULE_TEST_ID} > @@ -141,7 +156,12 @@ export const RulePreview: React.FC = memo(() => { )} {hasActions && ( <ExpandableSection - title={i18n.RULE_PREVIEW_ACTIONS_TEXT} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.preview.rule.actionsLabel" + defaultMessage="Actions" + /> + } 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('<RulePreviewFooter />', () => { 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 /> </EuiFlexItem> 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: <RulePreview />, footer: <RulePreviewFooter />, }, { id: 'alert-reason-preview', - name: ALERT_REASON_PREVIEW, content: <AlertReasonPreview />, }, ]; 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<AboutSectionProps> = ({ expanded = true }) => { return ( <ExpandableSection expanded={expanded} - title={ABOUT_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.sectionTitle" + defaultMessage="About" + /> + } data-test-subj={ABOUT_SECTION_TEST_ID} > <Description /> 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 = () => { <EuiTreeView items={items} display="compressed" - aria-label={ANALYZER_PREVIEW_TITLE} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.visualizations.analyzerPreview.treeViewAriaLabel', + { + defaultMessage: 'Analyzer preview', + } + )} showExpansionArrows /> </div> 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( <TestProviders> @@ -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 ( <ExpandablePanel header={{ - title: ANALYZER_PREVIEW_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.analyzerPreview.analyzerPreviewTitle" + defaultMessage="Analyzer preview" + /> + ), iconType: 'timeline', ...(isEnabled && { callback: goToAnalyzerTab }), }} @@ -67,9 +71,9 @@ export const AnalyzerPreviewContainer: React.FC = () => { {isEnabled ? ( <AnalyzerPreview /> ) : ( - <div data-test-subj={`${ANALYZER_PREVIEW_TEST_ID}Error`}> + <p data-test-subj={ANALYZER_PREVIEW_NO_DATA_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.analyzerPreviewError" + id="xpack.securitySolution.flyout.right.visualizations.analyzerPreview.noDataDescription" defaultMessage="You can only visualize events triggered by hosts configured with the Elastic Defend integration or any {sysmon} data from {winlogbeat}. Refer to {link} for more information." values={{ sysmon: <EuiMark>{'sysmon'}</EuiMark>, @@ -80,14 +84,14 @@ export const AnalyzerPreviewContainer: React.FC = () => { target="_blank" > <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.analyzerPreviewErrorLink" + id="xpack.securitySolution.flyout.right.visualizations.analyzerPreview.noDataLinkText" defaultMessage="Visual event analyzer" /> </EuiLink> ), }} /> - </div> + </p> )} </ExpandablePanel> ); 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('<CorrelationsOverview />', () => { 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('<CorrelationsOverview />', () => { 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('<CorrelationsOverview />', () => { 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 ( <ExpandablePanel header={{ - title: CORRELATIONS_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.overviewTitle" + defaultMessage="Correlations" + /> + ), callback: goToCorrelationsTab, iconType: 'arrowStart', }} @@ -107,7 +112,12 @@ export const CorrelationsOverview: React.FC = () => { )} </EuiFlexGroup> ) : ( - <div data-test-subj={`${INSIGHTS_CORRELATIONS_TEST_ID}Error`}>{CORRELATIONS_ERROR}</div> + <p data-test-subj={INSIGHTS_CORRELATIONS_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.noDataDescription" + defaultMessage="No correlations data available." + /> + </p> )} </ExpandablePanel> ); 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( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContext}> - <Description /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={flyoutContextValue}> + <RightPanelContext.Provider value={panelContext}> + <Description /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> ); describe('<Description />', () => { @@ -73,7 +71,7 @@ describe('<Description />', () => { ); 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('<Description />', () => { ); 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('<Description />', () => { 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('<Description />', () => { indexName: panelContext.indexName, scopeId: panelContext.scopeId, banner: { - title: PREVIEW_RULE_DETAILS, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.description.rulePreviewTitle" + defaultMessage="Preview rule details" + /> + ), 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.description.rulePreviewTitle" + defaultMessage="Preview rule details" + /> + ), 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} + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.description.ruleSummaryButtonLabel" + defaultMessage="Show rule summary" + /> </EuiButtonEmpty> </EuiFlexItem> ), @@ -82,12 +85,22 @@ export const Description: FC = () => { {isAlert ? ( <EuiFlexGroup justifyContent="spaceBetween" alignItems="center"> <EuiFlexItem> - <h5>{RULE_DESCRIPTION_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.description.ruleTitle" + defaultMessage="Rule description" + /> + </h5> </EuiFlexItem> {viewRule} </EuiFlexGroup> ) : ( - <h5>{DOCUMENT_DESCRIPTION_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.description.documentTitle" + defaultMessage="Document description" + /> + </h5> )} </EuiTitle> </EuiFlexItem> 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('<EntitiesOverview />', () => { }); it('should render user and host', () => { - const { getByTestId } = render( + const { getByTestId, queryByTestId } = render( <TestProviders> <RightPanelContext.Provider value={mockContextValue}> <EntitiesOverview /> @@ -63,6 +63,7 @@ describe('<EntitiesOverview />', () => { ); 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('<EntitiesOverview />', () => { 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('<EntitiesOverview />', () => { 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('<EntitiesOverview />', () => { ); 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 = () => { <> <ExpandablePanel header={{ - title: ENTITIES_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.entitiesTitle" + defaultMessage="Entities" + /> + ), callback: goToEntitiesTab, iconType: 'arrowStart', }} @@ -67,7 +72,12 @@ export const EntitiesOverview: React.FC = () => { )} </EuiFlexGroup> ) : ( - <div data-test-subj={INSIGHTS_ENTITIES_NO_DATA_TEST_ID}>{ENTITIES_NO_DATA_MESSAGE}</div> + <p data-test-subj={INSIGHTS_ENTITIES_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.noDataDescription" + defaultMessage="Host and user information are unavailable for this alert." + /> + </p> )} </ExpandablePanel> </> 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( + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={flyoutContextValue}> + <RightPanelContext.Provider value={panelContextValue}> + <ExpandDetailButton /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> + ); + describe('<ExpandDetailButton />', () => { it('should render expand button', () => { const flyoutContextValue = { @@ -25,15 +40,14 @@ describe('<ExpandDetailButton />', () => { scopeId: 'scopeId', } as unknown as RightPanelContext; - const { getByTestId } = render( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <ExpandDetailButton /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> + 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('<ExpandDetailButton />', () => { } as unknown as ExpandableFlyoutContext; const panelContextValue = {} as unknown as RightPanelContext; - const { getByTestId } = render( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <ExpandDetailButton /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> + 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} + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.collapseDetailButtonLabel" + defaultMessage="Collapse details" + /> </EuiButtonEmpty> ) : ( <EuiButtonEmpty @@ -52,7 +55,10 @@ export const ExpandDetailButton: FC = memo(() => { iconType="arrowStart" data-test-subj={EXPAND_DETAILS_BUTTON_TEST_ID} > - {EXPAND_DETAILS_BUTTON} + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.expandDetailButtonLabel" + defaultMessage="Expand details" + /> </EuiButtonEmpty> ); }); 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 = <p>{'title'}</p>; const children = <div>{'content'}</div>; 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 = <p>{'title'}</p>; const children = <div>{'content'}</div>; 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('<HeaderTitle />', () => { 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<HeaderTitleProps> = memo(({ flyoutIsExpandable }) <EuiSpacer size="s" /> <EuiTitle size="s"> <h4 data-test-subj={FLYOUT_HEADER_TITLE_TEST_ID}> - {isAlert && !isEmpty(ruleName) ? ruleName : EVENT_DETAILS} + {isAlert && !isEmpty(ruleName) ? ( + ruleName + ) : ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.headerTitle" + defaultMessage="Event details" + /> + )} </h4> </EuiTitle> <EuiSpacer size="s" /> 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<EuiBasicTableColumn<HighlightedFieldsTableRow>> = [ { field: 'field', - name: HIGHLIGHTED_FIELDS_FIELD_COLUMN, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.highlightedFields.tableFieldColumnLabel" + defaultMessage="Field" + /> + ), 'data-test-subj': 'fieldCell', width: '50%', }, { field: 'description', - name: HIGHLIGHTED_FIELDS_VALUE_COLUMN, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.highlightedFields.tableValueColumnLabel" + defaultMessage="Value" + /> + ), 'data-test-subj': 'valueCell', width: '50%', render: (description: { @@ -108,7 +114,12 @@ export const HighlightedFields: FC = () => { <EuiFlexGroup direction="column" gutterSize="s"> <EuiFlexItem data-test-subj={HIGHLIGHTED_FIELDS_TITLE_TEST_ID}> <EuiTitle size="xxs"> - <h5>{HIGHLIGHTED_FIELDS_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.highlightedFields.highlightedFieldsTitle" + defaultMessage="Highlighted fields" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem data-test-subj={HIGHLIGHTED_FIELDS_DETAILS_TEST_ID}> 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<HostEntityOverviewProps> = ({ hostName <> {i18n.HOST_RISK_CLASSIFICATION} <EuiIconTip - title={TECHNICAL_PREVIEW_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.hostTechnicalPreviewButtonLabel" + defaultMessage="Technical preview" + /> + } size="m" type="iInCircle" - content={TECHNICAL_PREVIEW_MESSAGE} + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.hostTechnicalPreviewTooltip" + 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." + /> + } 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<InsightsSectionProps> = ({ expanded = false }) => { return ( - <ExpandableSection title={INSIGHTS_TITLE} expanded={expanded} data-test-subj={INSIGHTS_TEST_ID}> + <ExpandableSection + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.sectionTitle" + defaultMessage="Insights" + /> + } + expanded={expanded} + data-test-subj={INSIGHTS_TEST_ID} + > <EntitiesOverview /> <EuiSpacer size="s" /> <ThreatIntelligenceOverview /> 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) => ( - <ExpandableFlyoutContext.Provider value={mockFlyoutContextValue}> - <RightPanelContext.Provider value={context}> - <InvestigationGuide /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> +const renderInvestigationGuide = () => ( + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={mockFlyoutContextValue}> + <RightPanelContext.Provider value={mockContextValue}> + <InvestigationGuide /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> ); describe('<InvestigationGuide />', () => { @@ -37,16 +42,26 @@ describe('<InvestigationGuide />', () => { 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('<InvestigationGuide />', () => { 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('<InvestigationGuide />', () => { 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 = () => { <EuiFlexGroup direction="column" gutterSize="s"> <EuiFlexItem data-test-subj={INVESTIGATION_GUIDE_TEST_ID}> <EuiTitle size="xxs"> - <h5>{INVESTIGATION_GUIDE_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.investigationGuide.investigationGuideTitle" + defaultMessage="Investigation guide" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem> @@ -75,12 +76,18 @@ export const InvestigationGuide: React.FC = () => { iconType="documentation" data-test-subj={INVESTIGATION_GUIDE_BUTTON_TEST_ID} > - {INVESTIGATION_GUIDE_BUTTON} + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.investigationGuide.investigationGuideButtonLabel" + defaultMessage="Show investigation guide" + /> </EuiButton> ) : ( - <div data-test-subj={INVESTIGATION_GUIDE_NO_DATA_TEST_ID}> - {INVESTIGATION_GUIDE_NO_DATA} - </div> + <p data-test-subj={INVESTIGATION_GUIDE_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.investigationGuide.noDataDescription" + defaultMessage="There’s no investigation guide for this rule." + /> + </p> )} </EuiFlexItem> </EuiFlexGroup> 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( + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={flyoutContextValue}> + <RightPanelContext.Provider value={panelContextValue}> + <InvestigationSection expanded={expanded} /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> + ); + describe('<InvestigationSection />', () => { beforeEach(() => { jest.clearAllMocks(); mockUseRuleWithFallback.mockReturnValue({ rule: { note: 'test note' } }); }); it('should render the component collapsed', () => { - const { getByTestId } = render( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <InvestigationSection /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + const { getByTestId } = renderInvestigationSection(); expect(getByTestId(INVESTIGATION_SECTION_HEADER_TEST_ID)).toBeInTheDocument(); }); it('should render the component expanded', () => { - const { getByTestId } = render( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <InvestigationSection expanded={true} /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + 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( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <InvestigationSection /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + 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<DescriptionSectionProps> = ({ expanded = return ( <ExpandableSection expanded={expanded} - title={INVESTIGATION_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.investigation.sectionTitle" + defaultMessage="Investigation" + /> + } data-test-subj={INVESTIGATION_SECTION_TEST_ID} > <InvestigationGuide /> 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('<PrevalenceOverview />', () => { 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('<PrevalenceOverview />', () => { 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('<PrevalenceOverview />', () => { 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 ( <ExpandablePanel header={{ - title: PREVALENCE_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.prevalence.prevalenceTitle" + defaultMessage="Prevalence" + /> + ), callback: goToCorrelationsTab, iconType: 'arrowStart', }} @@ -82,12 +87,23 @@ export const PrevalenceOverview: FC = () => { uncommonData.map((d) => ( <InsightsSummaryRow icon={'warning'} - text={`${d.field}, ${d.value} ${PREVALENCE_ROW_UNCOMMON}`} + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.prevalence.rowDescription" + defaultMessage="{field}, {value} is uncommon" + values={{ field: d.field, value: d.value }} + /> + } data-test-subj={`${INSIGHTS_PREVALENCE_TEST_ID}${d.field}`} /> )) ) : ( - <div data-test-subj={`${INSIGHTS_PREVALENCE_TEST_ID}Error`}>{PREVALENCE_NO_DATA}</div> + <p data-test-subj={INSIGHTS_PREVALENCE_NO_DATA_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.prevalence.noDataDescription" + defaultMessage="No prevalence data available." + /> + </p> )} </EuiFlexGroup> </ExpandablePanel> 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( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContext}> - <Reason /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={flyoutContextValue}> + <RightPanelContext.Provider value={panelContext}> + <Reason /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> ); describe('<Reason />', () => { - 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('<Reason />', () => { indexName: panelContextValue.indexName, scopeId: panelContextValue.scopeId, banner: { - title: PREVIEW_ALERT_REASON_DETAILS, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.reason.alertReasonPreviewTitle" + defaultMessage="Preview alert reason" + /> + ), 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.reason.alertReasonPreviewTitle" + defaultMessage="Preview alert reason" + /> + ), 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} + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.reason.alertReasonButtonLabel" + defaultMessage="Show full reason" + /> </EuiButtonEmpty> </EuiFlexItem> ), @@ -78,12 +81,22 @@ export const Reason: FC = () => { {isAlert ? ( <EuiFlexGroup justifyContent="spaceBetween" alignItems="center"> <EuiFlexItem> - <h5>{ALERT_REASON_TITLE}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.reason.alertReasonTitle" + defaultMessage="Alert reason" + /> + </h5> </EuiFlexItem> {viewPreview} </EuiFlexGroup> ) : ( - DOCUMENT_REASON_TITLE + <p> + <FormattedMessage + id="xpack.securitySolution.flyout.right.about.reason.documentReasonTitle" + defaultMessage="Document reason" + /> + </p> )} </h5> </EuiTitle> 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( + <IntlProvider locale="en"> + <RelatedAlertsByAncestry documentId={documentId} indices={indices} scopeId={scopeId} /> + </IntlProvider> + ); + describe('<RelatedAlertsByAncestry />', () => { it('should render many related alerts correctly', () => { (useFetchRelatedAlertsByAncestry as jest.Mock).mockReturnValue({ @@ -40,9 +48,7 @@ describe('<RelatedAlertsByAncestry />', () => { dataCount: 2, }); - const { getByTestId } = render( - <RelatedAlertsByAncestry documentId={documentId} indices={indices} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsByAncestry(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -57,9 +63,7 @@ describe('<RelatedAlertsByAncestry />', () => { dataCount: 1, }); - const { getByTestId } = render( - <RelatedAlertsByAncestry documentId={documentId} indices={indices} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsByAncestry(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -72,9 +76,7 @@ describe('<RelatedAlertsByAncestry />', () => { loading: true, }); - const { getByTestId } = render( - <RelatedAlertsByAncestry documentId={documentId} indices={indices} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsByAncestry(); expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument(); }); @@ -84,9 +86,7 @@ describe('<RelatedAlertsByAncestry />', () => { error: true, }); - const { container } = render( - <RelatedAlertsByAncestry documentId={documentId} indices={indices} scopeId={scopeId} /> - ); + 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<RelatedAlertsByAncestryProps> = indices, scopeId, }); - const text = CORRELATIONS_ANCESTRY_ALERTS(dataCount); + const text = ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.ancestryAlertsLabel" + defaultMessage="{count, plural, one {alert} other {alerts}} related by ancestry" + values={{ count: dataCount }} + /> + ); return ( <InsightsSummaryRow diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.test.tsx index afcbaeb8c5c88..4d1c8b7aa9ea3 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_same_source_event.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, @@ -31,6 +32,13 @@ const LOADING_TEST_ID = SUMMARY_ROW_LOADING_TEST_ID( INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID ); +const renderRelatedAlertsBySameSourceEvent = () => + render( + <IntlProvider locale="en"> + <RelatedAlertsBySameSourceEvent originalEventId={originalEventId} scopeId={scopeId} /> + </IntlProvider> + ); + describe('<RelatedAlertsBySameSourceEvent />', () => { it('should render many related alerts correctly', () => { (useFetchRelatedAlertsBySameSourceEvent as jest.Mock).mockReturnValue({ @@ -39,9 +47,7 @@ describe('<RelatedAlertsBySameSourceEvent />', () => { dataCount: 2, }); - const { getByTestId } = render( - <RelatedAlertsBySameSourceEvent originalEventId={originalEventId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySameSourceEvent(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -56,9 +62,7 @@ describe('<RelatedAlertsBySameSourceEvent />', () => { dataCount: 1, }); - const { getByTestId } = render( - <RelatedAlertsBySameSourceEvent originalEventId={originalEventId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySameSourceEvent(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -71,9 +75,7 @@ describe('<RelatedAlertsBySameSourceEvent />', () => { loading: true, }); - const { getByTestId } = render( - <RelatedAlertsBySameSourceEvent originalEventId={originalEventId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySameSourceEvent(); expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument(); }); @@ -83,9 +85,7 @@ describe('<RelatedAlertsBySameSourceEvent />', () => { error: true, }); - const { container } = render( - <RelatedAlertsBySameSourceEvent originalEventId={originalEventId} scopeId={scopeId} /> - ); + 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<RelatedAlertsBySameSource originalEventId, scopeId, }); - const text = CORRELATIONS_SAME_SOURCE_ALERTS(dataCount); + const text = ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.sourceAlertsLabel" + defaultMessage="{count, plural, one {alert} other {alerts}} related by source event" + values={{ count: dataCount }} + /> + ); return ( <InsightsSummaryRow diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.test.tsx index 133f00e44b26b..263bda7a17af4 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/related_alerts_by_session.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, @@ -31,6 +32,13 @@ const LOADING_TEST_ID = SUMMARY_ROW_LOADING_TEST_ID( INSIGHTS_CORRELATIONS_RELATED_ALERTS_BY_SESSION_TEST_ID ); +const renderRelatedAlertsBySession = () => + render( + <IntlProvider locale="en"> + <RelatedAlertsBySession entityId={entityId} scopeId={scopeId} /> + </IntlProvider> + ); + describe('<RelatedAlertsBySession />', () => { it('should render many related alerts correctly', () => { (useFetchRelatedAlertsBySession as jest.Mock).mockReturnValue({ @@ -39,9 +47,7 @@ describe('<RelatedAlertsBySession />', () => { dataCount: 2, }); - const { getByTestId } = render( - <RelatedAlertsBySession entityId={entityId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySession(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -56,9 +62,7 @@ describe('<RelatedAlertsBySession />', () => { dataCount: 1, }); - const { getByTestId } = render( - <RelatedAlertsBySession entityId={entityId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySession(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -71,9 +75,7 @@ describe('<RelatedAlertsBySession />', () => { loading: true, }); - const { getByTestId } = render( - <RelatedAlertsBySession entityId={entityId} scopeId={scopeId} /> - ); + const { getByTestId } = renderRelatedAlertsBySession(); expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument(); }); @@ -83,7 +85,7 @@ describe('<RelatedAlertsBySession />', () => { error: true, }); - const { container } = render(<RelatedAlertsBySession entityId={entityId} scopeId={scopeId} />); + 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<RelatedAlertsBySessionProps> = ({ entityId, scopeId, }); - const text = CORRELATIONS_SESSION_ALERTS(dataCount); + const text = ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.sessionAlertsLabel" + defaultMessage="{count, plural, one {alert} other {alerts}} related by session" + values={{ count: dataCount }} + /> + ); return ( <InsightsSummaryRow diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.test.tsx index 7d0d1a88fb2ec..d280b25f93414 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/related_cases.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/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 { INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID, @@ -24,6 +25,13 @@ const ICON_TEST_ID = SUMMARY_ROW_ICON_TEST_ID(INSIGHTS_CORRELATIONS_RELATED_CASE const VALUE_TEST_ID = SUMMARY_ROW_VALUE_TEST_ID(INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID); const LOADING_TEST_ID = SUMMARY_ROW_LOADING_TEST_ID(INSIGHTS_CORRELATIONS_RELATED_CASES_TEST_ID); +const renderRelatedCases = () => + render( + <IntlProvider locale="en"> + <RelatedCases eventId={eventId} /> + </IntlProvider> + ); + describe('<RelatedCases />', () => { it('should render many related cases correctly', () => { (useFetchRelatedCases as jest.Mock).mockReturnValue({ @@ -32,7 +40,7 @@ describe('<RelatedCases />', () => { dataCount: 2, }); - const { getByTestId } = render(<RelatedCases eventId={eventId} />); + const { getByTestId } = renderRelatedCases(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -47,7 +55,7 @@ describe('<RelatedCases />', () => { dataCount: 1, }); - const { getByTestId } = render(<RelatedCases eventId={eventId} />); + const { getByTestId } = renderRelatedCases(); expect(getByTestId(ICON_TEST_ID)).toBeInTheDocument(); const value = getByTestId(VALUE_TEST_ID); expect(value).toBeInTheDocument(); @@ -60,7 +68,7 @@ describe('<RelatedCases />', () => { loading: true, }); - const { getByTestId } = render(<RelatedCases eventId={eventId} />); + const { getByTestId } = renderRelatedCases(); expect(getByTestId(LOADING_TEST_ID)).toBeInTheDocument(); }); @@ -70,7 +78,7 @@ describe('<RelatedCases />', () => { error: true, }); - const { container } = render(<RelatedCases eventId={eventId} />); + 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<RelatedCasesProps> = ({ eventId }) => { const { loading, error, dataCount } = useFetchRelatedCases({ eventId }); - const text = CORRELATIONS_RELATED_CASES(dataCount); + const text = ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.relatedCasesLabel" + defaultMessage="related {count, plural, one {case} other {cases}}" + values={{ count: dataCount }} + /> + ); return ( <InsightsSummaryRow diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/response_button.test.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/response_button.test.tsx index 3cbed8191f342..0116b26e5c900 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/response_button.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/response_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 { RESPONSE_BUTTON_TEST_ID, RESPONSE_EMPTY_TEST_ID } from './test_ids'; @@ -34,40 +35,32 @@ const mockInvalidSearchHit = { fields: {}, } as unknown as SearchHit; -describe('<ResponseButton />', () => { - it('should render response button correctly', () => { - const { getByTestId } = render( +const renderResponseButton = (panelContextValue: RightPanelContext = mockContextValue) => + render( + <IntlProvider locale="en"> <ExpandableFlyoutContext.Provider value={mockFlyoutContextValue}> - <RightPanelContext.Provider value={{ ...mockContextValue, searchHit: mockValidSearchHit }}> + <RightPanelContext.Provider value={panelContextValue}> <ResponseButton /> </RightPanelContext.Provider> </ExpandableFlyoutContext.Provider> - ); + </IntlProvider> + ); +describe('<ResponseButton />', () => { + 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( - <ExpandableFlyoutContext.Provider value={mockFlyoutContextValue}> - <RightPanelContext.Provider value={mockContextValue}> - <ResponseButton /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); - - 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( - <ExpandableFlyoutContext.Provider value={mockFlyoutContextValue}> - <RightPanelContext.Provider - value={{ ...mockContextValue, searchHit: mockInvalidSearchHit }} - > - <ResponseButton /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + 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 ? ( - <div data-test-subj={RESPONSE_EMPTY_TEST_ID}>{RESPONSE_EMPTY}</div> + <p data-test-subj={RESPONSE_EMPTY_TEST_ID}> + <FormattedMessage + id="xpack.securitySolution.flyout.right.response.noDataDescription" + defaultMessage="There are no response actions defined for this event." + /> + </p> ) : ( <EuiButton onClick={goToResponseTab} iconType="documentation" data-test-subj={RESPONSE_BUTTON_TEST_ID} > - {RESPONSE_TITLE} + <FormattedMessage + id="xpack.securitySolution.flyout.right.response.responseButtonLabel" + defaultMessage="Response" + /> </EuiButton> )} </> 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('<ResponseSection />', () => { - it('should render the component collapsed', () => { - const { getByTestId } = render( +const renderResponseSection = () => + render( + <IntlProvider locale="en"> <ExpandableFlyoutContext.Provider value={flyoutContextValue}> <RightPanelContext.Provider value={panelContextValue}> <ResponseSection /> </RightPanelContext.Provider> </ExpandableFlyoutContext.Provider> - ); + </IntlProvider> + ); + +describe('<ResponseSection />', () => { + 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( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <ResponseSection expanded={true} /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + 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( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={panelContextValue}> - <ResponseSection /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> - ); + 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<ResponseSectionProps> = ({ expanded = false }) return ( <ExpandableSection expanded={expanded} - title={RESPONSE_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.response.sectionTitle" + defaultMessage="Response" + /> + } data-test-subj={RESPONSE_SECTION_TEST_ID} > <ResponseButton /> 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( + <IntlProvider locale="en"> + <RightPanelContext.Provider value={contextValue}> + <RiskScore /> + </RightPanelContext.Provider> + </IntlProvider> + ); + describe('<RiskScore />', () => { it('should render risk score information', () => { const contextValue = { getFieldsData: jest.fn().mockImplementation(mockGetFieldsData), } as unknown as RightPanelContext; - const { getByTestId } = render( - <RightPanelContext.Provider value={contextValue}> - <RiskScore /> - </RightPanelContext.Provider> - ); + 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('<RiskScore />', () => { getFieldsData: jest.fn(), } as unknown as RightPanelContext; - const { container } = render( - <RightPanelContext.Provider value={contextValue}> - <RiskScore /> - </RightPanelContext.Provider> - ); + const { container } = renderRiskScore(contextValue); expect(container).toBeEmptyDOMElement(); }); @@ -52,11 +54,7 @@ describe('<RiskScore />', () => { getFieldsData: jest.fn().mockImplementation(() => 123), } as unknown as RightPanelContext; - const { container } = render( - <RightPanelContext.Provider value={contextValue}> - <RiskScore /> - </RightPanelContext.Provider> - ); + 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(() => { <EuiFlexGroup alignItems="center" direction="row" gutterSize="xs"> <EuiFlexItem grow={false}> <EuiTitle size="xxs" data-test-subj={FLYOUT_HEADER_RISK_SCORE_TITLE_TEST_ID}> - <h5>{`${RISK_SCORE_TITLE}:`}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.riskScoreTitle" + defaultMessage="Risk score:" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem grow={false}> 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 && ( - <ValueContainer text={SESSION_PREVIEW_PROCESS_TEXT}> + <ValueContainer + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.processDescription" + defaultMessage="started" + /> + } + > <span style={emphasisStyles}>{processName}</span> </ValueContainer> ) @@ -63,7 +66,14 @@ export const SessionPreview: FC = () => { const timeFragment = useMemo(() => { return ( startAt && ( - <ValueContainer text={SESSION_PREVIEW_TIME_TEXT}> + <ValueContainer + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.timeDescription" + defaultMessage="at" + /> + } + > <PreferenceFormattedDate value={new Date(startAt)} /> </ValueContainer> ) @@ -74,7 +84,14 @@ export const SessionPreview: FC = () => { return ( ruleName && ruleId && ( - <ValueContainer text={SESSION_PREVIEW_RULE_TEXT}> + <ValueContainer + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.ruleDescription" + defaultMessage="with rule" + /> + } + > <RenderRuleName contextId={scopeId} eventId={eventId} @@ -93,7 +110,14 @@ export const SessionPreview: FC = () => { const commandFragment = useMemo(() => { return ( command && ( - <ValueContainer text={SESSION_PREVIEW_COMMAND_TEXT}> + <ValueContainer + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.commandDescription" + defaultMessage="by" + /> + } + > <EuiCode> {workdir} {command} </EuiCode> 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( <TestProviders> @@ -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 ? ( - <div data-test-subj={`${SESSION_PREVIEW_TEST_ID}UpSell`}> + <div data-test-subj={SESSION_PREVIEW_UPSELL_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.sessionPreviewUpsell" + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellDescription" defaultMessage="This feature requires an {subscription}" values={{ subscription: ( <EuiLink href="https://www.elastic.co/pricing/" target="_blank"> <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.sessionPreviewUpsellLink" + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.upsellLinkText" defaultMessage="Enterprise subscription" /> </EuiLink> @@ -84,9 +87,9 @@ export const SessionPreviewContainer: FC = () => { /> </div> ) : !sessionViewConfig ? ( - <div data-test-subj={`${SESSION_PREVIEW_TEST_ID}Error`}> + <div data-test-subj={SESSION_PREVIEW_NO_DATA_TEST_ID}> <FormattedMessage - id="xpack.securitySolution.flyout.sessionPreviewError" + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataDescription" defaultMessage="You can only view Linux session details if you’ve enabled the {setting} setting in your Elastic Defend integration policy. Refer to {link} for more information." values={{ setting: ( @@ -96,7 +99,7 @@ export const SessionPreviewContainer: FC = () => { `} > <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.sessionPreviewErrorSetting" + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataSettingDescription" defaultMessage="Include session data" /> </span> @@ -107,7 +110,7 @@ export const SessionPreviewContainer: FC = () => { target="_blank" > <FormattedMessage - id="xpack.securitySolution.flyout.documentDetails.sessionPreviewErrorLink" + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.noDataLinkText" defaultMessage="Enable Session View data" /> </EuiLink> @@ -120,7 +123,12 @@ export const SessionPreviewContainer: FC = () => { return ( <ExpandablePanel header={{ - title: SESSION_PREVIEW_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sessionPreview.sessionPreviewTitle" + defaultMessage="Session viewer preview" + /> + ), 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(() => { <EuiFlexGroup alignItems="center" direction="row" gutterSize="xs"> <EuiFlexItem grow={false}> <EuiTitle size="xxs" data-test-subj={FLYOUT_HEADER_SEVERITY_TITLE_TEST_ID}> - <h5>{`${SEVERITY_TITLE}:`}</h5> + <h5> + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.severityTitle" + defaultMessage="Severity:" + /> + </h5> </EuiTitle> </EuiFlexItem> <EuiFlexItem grow={false}> 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( + <IntlProvider locale="en"> + <ShareButton alertUrl={alertUrl} /> + </IntlProvider> + ); +describe('ShareButton', () => { beforeEach(() => { jest.clearAllMocks(); }); it('renders the share button', () => { - render(<ShareButton alertUrl={alertUrl} />); + renderShareButton(); expect(screen.getByTestId(FLYOUT_HEADER_SHARE_BUTTON_TEST_ID)).toBeInTheDocument(); }); @@ -41,7 +49,7 @@ describe('ShareButton', () => { }, }); - render(<ShareButton alertUrl={alertUrl} />); + 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<ShareButtonProps> = ({ alertUrl }) => { iconType="share" data-test-subj={FLYOUT_HEADER_SHARE_BUTTON_TEST_ID} > - {SHARE} + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.shareButtonLabel" + defaultMessage="Share Alert" + /> </EuiButtonEmpty> )} </EuiCopy> 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( + <IntlProvider locale="en"> + <SuppressedAlerts alertSuppressionCount={alertSuppressionCount} /> + </IntlProvider> + ); + describe('<SuppressedAlerts />', () => { it('should render zero suppressed alert correctly', () => { - const { getByTestId } = render(<SuppressedAlerts alertSuppressionCount={0} />); + 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(<SuppressedAlerts alertSuppressionCount={1} />); + 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(<SuppressedAlerts alertSuppressionCount={2} />); + 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<SuppressedAlertsProps> = ({ alertSuppre error={false} icon={'layers'} value={alertSuppressionCount} - text={CORRELATIONS_SUPPRESSED_ALERTS(alertSuppressionCount)} + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.correlations.suppressedAlertsLabel" + defaultMessage="suppressed {count, plural, =1 {alert} other {alerts}}" + values={{ count: alertSuppressionCount }} + /> + } data-test-subj={INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TEST_ID} key={`correlation-row-suppressed-alerts`} /> @@ -45,9 +50,14 @@ export const SuppressedAlerts: React.VFC<SuppressedAlertsProps> = ({ alertSuppre label={SUPPRESSED_ALERTS_COUNT_TECHNICAL_PREVIEW} size="s" iconType="beaker" - tooltipContent={TECHNICAL_PREVIEW_MESSAGE} + tooltipContent={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.suppressedAlertTechnicalPreviewTooltip" + 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." + /> + } tooltipPosition="bottom" - data-test-subj={SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID} + data-test-subj={INSIGHTS_CORRELATIONS_SUPPRESSED_ALERTS_TECHNICAL_PREVIEW_TEST_ID} /> </EuiFlexItem> </EuiFlexGroup> 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('<ThreatIntelligenceOverview />', () => { ); }); - 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('<ThreatIntelligenceOverview />', () => { 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('<ThreatIntelligenceOverview />', () => { 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 ( <ExpandablePanel header={{ - title: THREAT_INTELLIGENCE_TITLE, + title: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.threatIntelligence.threatIntelligenceTitle" + defaultMessage="Threat intelligence" + /> + ), 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={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.threatIntelligence.threatMatchDescription" + defaultMessage="threat {count, plural, one {match} other {matches}} detected" + values={{ count: threatMatchesCount }} + /> + } data-test-subj={INSIGHTS_THREAT_INTELLIGENCE_TEST_ID} /> <InsightsSummaryRow loading={loading} icon={'warning'} value={threatEnrichmentsCount} - text={threatEnrichmentsCount <= 1 ? THREAT_ENRICHMENT : THREAT_ENRICHMENTS} + text={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.threatIntelligence.threatEnrichmentDescription" + defaultMessage="{count, plural, one {field} other {fields}} enriched with threat intelligence" + values={{ count: threatEnrichmentsCount }} + /> + } data-test-subj={INSIGHTS_THREAT_INTELLIGENCE_TEST_ID} /> </EuiFlexGroup> 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<UserEntityOverviewProps> = ({ userName <> {i18n.USER_RISK_CLASSIFICATION} <EuiIconTip - title={TECHNICAL_PREVIEW_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.userTechnicalPreviewButtonLabel" + defaultMessage="Technical preview" + /> + } size="m" type="iInCircle" - content={TECHNICAL_PREVIEW_MESSAGE} + content={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.insights.entities.userTechnicalPreviewTooltip" + 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." + /> + } 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('<VisualizationsSection />', () => { } as unknown as ExpandableFlyoutContext; const { getByTestId, getAllByRole } = render( - <ExpandableFlyoutContext.Provider value={flyoutContextValue}> - <RightPanelContext.Provider value={contextValue}> - <VisualizationsSection /> - </RightPanelContext.Provider> - </ExpandableFlyoutContext.Provider> + <IntlProvider locale="en"> + <ExpandableFlyoutContext.Provider value={flyoutContextValue}> + <RightPanelContext.Provider value={contextValue}> + <VisualizationsSection /> + </RightPanelContext.Provider> + </ExpandableFlyoutContext.Provider> + </IntlProvider> ); 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<VisualizationsSectionProps> = ({ return ( <ExpandableSection expanded={expanded} - title={VISUALIZATIONS_TITLE} + title={ + <FormattedMessage + id="xpack.securitySolution.flyout.right.visualizations.sectionTitle" + defaultMessage="Visualizations" + /> + } data-test-subj={VISUALIZATIONS_SECTION_TEST_ID} > <SessionPreviewContainer /> 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: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.overviewTabLabel" + defaultMessage="Overview" + /> + ), content: <OverviewTab />, }, { id: 'table', 'data-test-subj': TABLE_TAB_TEST_ID, - name: TABLE_TAB, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.tableTabLabel" + defaultMessage="Table" + /> + ), content: <TableTab />, }, { id: 'json', 'data-test-subj': JSON_TAB_TEST_ID, - name: JSON_TAB, + name: ( + <FormattedMessage + id="xpack.securitySolution.flyout.right.header.jsonTabLabel" + defaultMessage="JSON" + /> + ), content: <JsonTab />, }, ]; 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('<FlyoutError />', () => { it('should render error title and body', () => { - const { getByTestId } = render(<FlyoutError />); + const { getByTestId } = render( + <IntlProvider locale="en"> + <FlyoutError /> + </IntlProvider> + ); 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 = () => ( <EuiEmptyPrompt iconType="error" color="danger" - title={<h2>{ERROR_TITLE(FLYOUT_ERROR)}</h2>} - body={<p>{ERROR_MESSAGE(FLYOUT_ERROR)}</p>} + title={ + <h2> + <FormattedMessage + id="xpack.securitySolution.flyout.shared.errorTitle" + defaultMessage="Unable to display {title}." + values={{ title: 'data' }} + /> + </h2> + } + body={ + <p> + <FormattedMessage + id="xpack.securitySolution.flyout.shared.errorDescription" + defaultMessage="There was an error displaying {message}." + values={{ message: 'data' }} + /> + </p> + } data-test-subj={FLYOUT_ERROR_TEST_ID} /> </EuiFlexItem> 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<PageOverlayProps>( 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<SetStateAction<string>>; -}> = memo( - ({ - isAssistantEnabled, - renderCellValue, - rowRenderers, - timelineId, - shouldRefocusPrompt, - setConversationId, - }) => ( - <Suspense fallback={<EuiSkeletonText lines={10} />}> - <AssistantTabContainer> - <Assistant - isAssistantEnabled={isAssistantEnabled} - conversationId={TIMELINE_CONVERSATION_TITLE} - setConversationId={setConversationId} - shouldRefocusPrompt={shouldRefocusPrompt} - /> - </AssistantTabContainer> - </Suspense> - ) -); +}> = memo(({ shouldRefocusPrompt, setConversationId }) => ( + <Suspense fallback={<EuiSkeletonText lines={10} />}> + <AssistantTabContainer> + <Assistant + conversationId={TIMELINE_CONVERSATION_TITLE} + setConversationId={setConversationId} + shouldRefocusPrompt={shouldRefocusPrompt} + /> + </AssistantTabContainer> + </Suspense> +)); AssistantTab.displayName = 'AssistantTab'; @@ -147,7 +133,7 @@ const ActiveTimelineTab = memo<ActiveTimelineTabProps>( 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<ActiveTimelineTabProps>( {(activeTimelineTab === TimelineTabs.securityAssistant || hasTimelineConversationStarted) && ( <AssistantTab - isAssistantEnabled={isAssistantEnabled} - renderCellValue={renderCellValue} - rowRenderers={rowRenderers} - timelineId={timelineId} setConversationId={setConversationId} shouldRefocusPrompt={ showTimeline && activeTimelineTab === TimelineTabs.securityAssistant diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts index aff700948b344..db3fe4b32f1e4 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_services.ts @@ -37,6 +37,10 @@ import type { import nodeFetch from 'node-fetch'; import semver from 'semver'; import axios from 'axios'; +import { + RETRYABLE_TRANSIENT_ERRORS, + retryOnError, +} from '../../../common/endpoint/data_loaders/utils'; import { fetchKibanaStatus } from './stack_services'; import { catchAxiosErrorFormatAndThrow } from './format_axios_error'; import { FleetAgentGenerator } from '../../../common/endpoint/data_generators/fleet_agent_generator'; @@ -137,11 +141,15 @@ export const waitForHostToEnroll = async ( let found: Agent | undefined; while (!found && !hasTimedOut()) { - found = await fetchFleetAgents(kbnClient, { - perPage: 1, - kuery: `(local_metadata.host.hostname.keyword : "${hostname}") and (status:online)`, - showInactive: false, - }).then((response) => 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<RuntimeServices> => { 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<typeof KbnClientExtended>[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<void> => { { maxTimeout: 10000 } ); }; + +export const isServerlessKibanaFlavor = async (kbnClient: KbnClient): Promise<boolean> => { + 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g> - <g id="Group"> - <path id="Stroke 1" d="M15 1H17V31H15V1Z" fill="#00BFB3" /> - <path id="Stroke 3" d="M13 29V31H1V1H13V3H3V29H13Z" fill="#535766" /> - <path id="Stroke 5" d="M29 3H19V1H31V31H19V29H29V3Z" fill="#535766" /> - </g> - </g> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M31.4185 4.11481L20.4558 15.0775L12.5084 7.13003L1.61832 18.0201L0.204102 16.6059L12.5084 4.3016L20.4558 12.249L30.0043 2.7006L31.4185 4.11481Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M3.01855 31V22H5.01855V31H3.01855Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M19.0186 31V22H21.0186V31H19.0186Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M11.0186 31V15H13.0186V31H11.0186Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M27.0186 31V15H29.0186V31H27.0186Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M29.9998 4.05764L24.9883 3.99993L25.0113 2.00006L31.9998 2.08054V9H29.9998V4.05764Z" + fill="#535966" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_22930)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M3 2C2.44828 2 2 2.44828 2 3V29C2 29.5517 2.44828 30 3 30H29C29.5517 30 30 29.5517 30 29V3C30 2.44828 29.5517 2 29 2H3ZM0 3C0 1.34372 1.34372 0 3 0H29C30.6563 0 32 1.34372 32 3V29C32 30.6563 30.6563 32 29 32H3C1.34372 32 0 30.6563 0 29V3Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M8 6H5V4H8V6Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M14 6H11V4H14V6Z" fill="#535966" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M11.3333 30V8H13.2V30H11.3333Z" + fill="#00BFB3" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M30 9.91304H2V8H30V9.91304Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M5 13H8V15H5V13Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M5 18H8V20H5V18Z" fill="#00BFB3" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M23.8277 15.1715C22.2663 13.6095 19.7337 13.6095 18.1723 15.1715C16.6095 16.7342 16.6097 19.2668 18.1716 20.8277L18.1723 20.8285C19.7337 22.3905 22.2663 22.3905 23.8277 20.8285L23.8284 20.8277C25.3903 19.2668 25.3905 16.7342 23.8277 15.1715ZM25.2422 13.7576C22.8997 11.4141 19.1003 11.4141 16.7578 13.7576C14.4141 16.1011 14.4141 19.9001 16.7578 22.2424C19.1003 24.5859 22.8997 24.5859 25.2422 22.2424C27.5859 19.9001 27.5859 16.1011 25.2422 13.7576Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M27.6572 26.0708L24.8282 23.2428L26.2422 21.8284L29.0712 24.6564L27.6572 26.0708Z" + fill="#535966" + /> + </g> + <defs> + <clipPath id="clip0_4044_22930"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g> - <path - id="Union" - d="M13.4119 25.6592L6.34092 18.5879L8.57159 17.9904L14.0097 23.4285L21.4382 21.438L23.4287 14.0094L17.9907 8.57145L18.5884 6.34074L25.6594 13.4117L23.3701 21.9555L28.32 26.9053L28.0212 28.0206L26.9057 28.3195L21.956 23.3698L13.4119 25.6592Z" - fill="#535766" - /> - <path - id="Union_2" - fillRule="evenodd" - clipRule="evenodd" - d="M19.5352 19.5357L14.7056 20.8298L11.17 17.2942L12.1653 13.5799L3.68008 5.0947L3.97898 3.9792L5.0942 3.68038L13.5796 12.1657L17.2938 11.1705L20.8293 14.706L19.5352 19.5357ZM18.5986 15.3038L17.9022 17.9027L15.3033 18.5991L13.4008 16.6965L14.0971 14.0976L16.696 13.4012L18.5986 15.3038Z" - fill="#00BFB3" - /> - </g> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M0.470703 11.6253H7.72125V30.5882H0.470703V11.6253ZM2.14391 13.2985V28.915H6.04805V13.2985H2.14391Z" + fill="#535766" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M9.95221 0.470581H17.2028V30.5882H9.95221V0.470581ZM11.6254 2.14378V28.915H15.5295V2.14378H11.6254Z" + fill="#535766" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M21.1069 8.27887V15.2505H19.4337V6.60566H26.6843V13.2231H25.0111V8.27887H21.1069Z" + fill="#535766" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M19.4336 22.2222C19.4336 19.1419 21.9307 16.6449 25.0109 16.6449C28.0912 16.6449 30.5883 19.1419 30.5883 22.2222C30.5883 25.3025 28.0912 27.7996 25.0109 27.7996C21.9307 27.7996 19.4336 25.3025 19.4336 22.2222ZM25.0109 18.3181C22.8547 18.3181 21.1068 20.066 21.1068 22.2222C21.1068 24.3784 22.8547 26.1264 25.0109 26.1264C27.1671 26.1264 28.9151 24.3784 28.9151 22.2222C28.9151 20.066 27.1671 18.3181 25.0109 18.3181Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M30.1504 29.1025L27.5016 26.4537L28.6847 25.2706L31.3335 27.9193L30.1504 29.1025Z" + fill="#00BFB3" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g clipPath="url(#clip0_2634_421128)"> - <g id="Group"> - <path - id="Fill 1" - fillRule="evenodd" - clipRule="evenodd" - d="M21 28H19V19.508L19.6 19.246C22.88 17.812 25 14.575 25 11C25 7.963 23.471 5.171 21 3.521V11H11V3.521C8.529 5.171 7 7.963 7 11C7 14.575 9.12 17.812 12.4 19.246L13 19.508V28H11V20.795C7.334 18.924 5 15.148 5 11C5 6.63 7.591 2.674 11.6 0.921998L13 0.309998V9H19V0.309998L20.4 0.921998C24.409 2.674 27 6.63 27 11C27 15.148 24.666 18.924 21 20.795V28Z" - fill="#535766" - /> - <path - id="Fill 3" - fillRule="evenodd" - clipRule="evenodd" - d="M11 32H21V30H11V32Z" - fill="#00BFB3" - /> - </g> - </g> - <defs> - <clipPath id="clip0_2634_421128"> - <rect width="32" height="32" fill="white" /> - </clipPath> - </defs> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M5 2C4.44828 2 4 2.44828 4 3V29C4 29.5517 4.44828 30 5 30H27C27.5517 30 28 29.5517 28 29V9.41421L20.5858 2H5ZM2 3C2 1.34372 3.34372 0 5 0H21.4142L30 8.58579V29C30 30.6563 28.6563 32 27 32H5C3.34372 32 2 30.6563 2 29V3Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M20 1H22V8H29V10H20V1Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M24 20H8V18H24V20Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M17 15H8V13H17V15Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M24 25H8V23H24V25Z" fill="#00BFB3" /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M5 2C4.44828 2 4 2.44828 4 3V29C4 29.5517 4.44828 30 5 30H27C27.5517 30 28 29.5517 28 29V9.41421L20.5858 2H5ZM2 3C2 1.34372 3.34372 0 5 0H21.4142L30 8.58579V29C30 30.6563 28.6563 32 27 32H5C3.34372 32 2 30.6563 2 29V3Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M20 1H22V8H29V10H20V1Z" fill="#535966" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M16.5 10L16.5 26H14.5L14.5 10L16.5 10Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M11.5 16L11.5 26H9.5L9.5 16H11.5Z" + fill="#00BFB3" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M21.5 20V26H19.5V20H21.5Z" fill="#00BFB3" /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <path - fillRule="evenodd" - clipRule="evenodd" - d="M24 14C22.897 14 22 14.897 22 16C22 17.103 22.897 18 24 18C25.103 18 26 17.103 26 16C26 14.897 25.103 14 24 14ZM24 20C21.794 20 20 18.206 20 16C20 13.794 21.794 12 24 12C26.206 12 28 13.794 28 16C28 18.206 26.206 20 24 20Z" - fill="#00BFB3" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M15.8105 2.37989C15.1655 2.37989 14.5335 2.69089 14.1475 3.26389C13.5335 4.17889 13.7775 5.42389 14.6925 6.03889C15.1375 6.33789 15.6705 6.44489 16.1935 6.34189C16.7165 6.23889 17.1695 5.93889 17.4675 5.49489C17.7655 5.05189 17.8735 4.51889 17.7705 3.99389C17.6675 3.46989 17.3675 3.01789 16.9235 2.71989C16.5815 2.48989 16.1945 2.37989 15.8105 2.37989ZM15.7995 8.38089C15.0125 8.38089 14.2445 8.14789 13.5775 7.69889C11.7475 6.46989 11.2575 3.97989 12.4875 2.14889C13.7175 0.317889 16.2075 -0.172111 18.0395 1.05989C18.9255 1.65489 19.5275 2.56089 19.7335 3.60889C19.9385 4.65789 19.7235 5.72389 19.1275 6.60989C18.5325 7.49689 17.6265 8.09889 16.5785 8.30489C16.3185 8.35589 16.0585 8.38089 15.7995 8.38089Z" - fill="#00BFB3" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M15.8037 25.6201C15.4107 25.6201 15.0267 25.7361 14.6927 25.9611C13.7777 26.5761 13.5327 27.8211 14.1477 28.7361C14.7627 29.6511 16.0097 29.8941 16.9237 29.2801C17.3667 28.9821 17.6677 28.5301 17.7707 28.0061C17.8727 27.4811 17.7657 26.9481 17.4677 26.5051C17.1697 26.0611 16.7167 25.7611 16.1937 25.6581C16.0637 25.6331 15.9327 25.6201 15.8037 25.6201ZM15.8147 31.6191C14.5257 31.6191 13.2587 30.9991 12.4877 29.8511C11.2577 28.0201 11.7467 25.5301 13.5767 24.3011C14.4627 23.7051 15.5277 23.4891 16.5777 23.6951C17.6267 23.9011 18.5327 24.5031 19.1277 25.3901C19.7237 26.2761 19.9387 27.3421 19.7337 28.3911C19.5277 29.4391 18.9257 30.3451 18.0387 30.9401C17.3567 31.3991 16.5807 31.6191 15.8147 31.6191Z" - fill="#00BFB3" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M6 16C6 14.897 6.897 14 8 14C9.103 14 10 14.897 10 16C10 17.103 9.103 18 8 18C6.897 18 6 17.103 6 16ZM18 17V15H11.858C11.697 14.38 11.393 13.823 10.98 13.357L13.292 9.917L11.632 8.802L9.32 12.241C8.905 12.095 8.465 12 8 12C5.794 12 4 13.794 4 16C4 18.206 5.794 20 8 20C8.465 20 8.905 19.905 9.32 19.759L11.632 23.198L13.292 22.083L10.98 18.643C11.393 18.177 11.697 17.62 11.858 17H18Z" - fill="#535766" - /> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_22869)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M9 14H32V32H9V14ZM11 16V30H30V16H11Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M31 24H10V22H31V24Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M17 20H13V18H17V20Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M17 28H13V26H17V28Z" fill="#00BFB3" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M5.62311 7.96014C6.26408 3.46188 10.1221 0 14.8 0C19.4791 0 23.3361 3.46211 23.9778 7.96028C25.9375 8.72369 27.5578 10.1658 28.5476 11.9999H26.1676C25.3118 10.9 24.1262 10.0685 22.7605 9.65388L22.1015 9.45383L22.0534 8.76683C21.7887 4.98508 18.6462 2 14.8 2C10.9547 2 7.8114 4.98516 7.54758 8.7666L7.49962 9.45401L6.84019 9.65397C4.03728 10.5039 2 13.1044 2 16.18C2 19.3164 4.11694 21.9582 7 22.7545V24.812C3.00198 23.9734 0 20.4274 0 16.18C0 12.435 2.33352 9.24079 5.62311 7.96014ZM27.2444 13.9999C27.275 14.0908 27.3038 14.1825 27.3307 14.275L28.2775 13.9999H27.2444Z" + fill="#535966" + /> + </g> + <defs> + <clipPath id="clip0_4044_22869"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M13 10C12.4477 10 12 10.4477 12 11V21H10V11C10 9.34315 11.3431 8 13 8C14.6569 8 16 9.34315 16 11V21H14V11C14 10.4477 13.5523 10 13 10Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M17 16C16.4477 16 16 16.4477 16 17V21H14V17C14 15.3431 15.3431 14 17 14C18.6569 14 20 15.3431 20 17V21H18V17C18 16.4477 17.5523 16 17 16Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M21 18C20.4477 18 20 18.4477 20 19V21H18V19C18 17.3431 19.3431 16 21 16C22.6569 16 24 17.3431 24 19V21H22V19C22 18.4477 21.5523 18 21 18Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M25 19C24.4477 19 24 19.4477 24 20V22.3607H22V20C22 18.3431 23.3431 17 25 17C26.6569 17 28 18.3431 28 20V23.8524C28 24.6992 27.7849 25.5321 27.375 26.2731L24.8909 30.7628C24.6813 31.1415 24.5714 31.5672 24.5714 32H22.5714C22.5714 31.2285 22.7674 30.4696 23.1409 29.7946L25.625 25.3048C25.871 24.8603 26 24.3605 26 23.8524V20C26 19.4477 25.5523 19 25 19Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M8.90532 18.7152L10.8096 17.2146L12.0475 18.7854L10.1432 20.2861C9.4213 20.8549 9 21.7233 9 22.6424V24.6827C9 25.3728 9.23793 26.0418 9.67369 26.577L12.1551 29.6243C12.7016 30.2954 13 31.1345 13 32H11C11 31.5946 10.8602 31.2015 10.6042 30.8871L8.12282 27.8398C7.39655 26.9479 7 25.8329 7 24.6827V22.6424C7 21.1106 7.70217 19.6633 8.90532 18.7152Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M12.5 0C6.70101 0 2 4.70101 2 10.5C2 14.218 3.93245 17.4847 6.84774 19.3504C7.17452 18.8632 7.58858 18.4312 8.07723 18.0791L8.321 17.9035C5.74124 16.4442 4 13.6754 4 10.5C4 5.80558 7.80558 2 12.5 2C17.1944 2 21 5.80558 21 10.5C21 11.831 20.6941 13.0905 20.1487 14.2121C20.3579 14.454 20.5344 14.7248 20.6716 15.0178C20.7794 15.006 20.889 15 21 15C21.3209 15 21.6301 15.0504 21.9199 15.1437C22.6114 13.7436 23 12.1672 23 10.5C23 4.70101 18.299 0 12.5 0Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M6 10.5C6 6.91015 8.91015 4 12.5 4C16.0899 4 19 6.91015 19 10.5C19 11.4358 18.8022 12.3255 18.4462 13.1294C18.1452 13.0451 17.8279 13 17.5 13C17.3302 13 17.1633 13.0121 17 13.0354V11C17 10.9185 16.9976 10.8376 16.9928 10.7574C16.9976 10.6722 17 10.5864 17 10.5C17 8.01472 14.9853 6 12.5 6C10.0147 6 8 8.01472 8 10.5C8 11.5716 8.3746 12.5558 9 13.3287V15.9782C7.19584 14.8231 6 12.8012 6 10.5Z" + fill="#00BFB3" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_22880)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M25.9995 17C24.8948 17 23.9995 17.8953 23.9995 19C23.9995 20.1047 24.8948 21 25.9995 21C27.1043 21 27.9995 20.1047 27.9995 19C27.9995 17.8953 27.1043 17 25.9995 17ZM21.9995 19C21.9995 16.7907 23.7903 15 25.9995 15C28.2088 15 29.9995 16.7907 29.9995 19C29.9995 21.2093 28.2088 23 25.9995 23C23.7903 23 21.9995 21.2093 21.9995 19Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M29.9995 27C29.9995 24.7903 28.2093 23 25.9995 23V21C29.3138 21 31.9995 23.6857 31.9995 27V32H29.9995V27Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M22.4278 25.1954C22.1541 25.7366 21.9995 26.3483 21.9995 27V32H19.9995V27C19.9995 26.0277 20.231 25.1074 20.6432 24.2926L22.4278 25.1954Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M19.9504 19.0408C20.8348 20.2317 22.2483 21 23.8425 21L25.9995 21V23L23.8425 23C21.5888 23 19.5903 21.9103 18.3447 20.2332L19.9504 19.0408Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M0 0H22V11H20V2H2V20H14V22H0V0Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M15 8H5V6H15V8Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M12 12H5V10H12V12Z" fill="#535966" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M15.8575 12.4855L18.8575 17.4855L17.1425 18.5145L14.1425 13.5145L15.8575 12.4855Z" + fill="#535966" + /> + </g> + <defs> + <clipPath id="clip0_4044_22880"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M16 1C7.71573 1 1 7.71573 1 16C1 24.2843 7.71573 31 16 31C24.2843 31 31 24.2843 31 16C31 7.71573 24.2843 1 16 1ZM15 3.03789C8.61759 3.52341 3.52341 8.61759 3.03789 15H6V17H3.03789C3.52341 23.3824 8.61759 28.4766 15 28.9621V26H17V28.9621C23.3824 28.4766 28.4766 23.3824 28.9621 17H26V15H28.9621C28.4766 8.61759 23.3824 3.52341 17 3.03789V6H15V3.03789Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M15.3408 9H16.6596L22.6596 23H20.4837L19.1979 20L12.8025 20L11.5168 23H9.34082L15.3408 9ZM16.0002 12.5386L18.3408 18L13.6596 18L16.0002 12.5386Z" + fill="#00BFB3" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <path fillRule="evenodd" clipRule="evenodd" d="M9 20H21V18H9V20Z" fill="#00BFB3" /> - <path fillRule="evenodd" clipRule="evenodd" d="M9 15H21V13H9V15Z" fill="#00BFB3" /> - <path fillRule="evenodd" clipRule="evenodd" d="M9 10H21V8H9V10Z" fill="#00BFB3" /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M30 6H26V5C26 3.897 26.897 3 28 3C29.103 3 30 3.897 30 5V6ZM22 29C20.897 29 20 28.103 20 27V24H6V5C6 3.897 6.897 3 8 3H24.556C24.212 3.591 24 4.269 24 5V27C24 28.103 23.103 29 22 29ZM4 29C2.897 29 2 28.103 2 27V26H18V27C18 27.728 18.195 28.411 18.537 29H4ZM28 1H8C5.794 1 4 2.794 4 5V24H0V27C0 29.206 1.794 31 4 31H22C24.206 31 26 29.206 26 27V8H32V5C32 2.794 30.206 1 28 1Z" - fill="#535766" - /> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_22953)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M0 24H8V32H0V24ZM2 26V30H6V26H2Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M24 24H32V32H24V24ZM26 26V30H30V26H26Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M12 24H20V32H12V24ZM14 26V30H18V26H14Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M4 17H28V22H26V19H6V22H4V17Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M17 14V22H15V14H17Z" fill="#00BFB3" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M10 12.1698C10 8.79382 12.6553 6 16 6C19.3447 6 22 8.79382 22 12.1698V13H20V12.1698C20 9.83501 18.1778 8 16 8C13.8222 8 12 9.83501 12 12.1698V13H10V12.1698Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M16 2C14.8955 2 14 2.8955 14 4C14 5.1045 14.8955 6 16 6C17.1045 6 18 5.1045 18 4C18 2.8955 17.1045 2 16 2ZM12 4C12 1.79093 13.7909 0 16 0C18.2091 0 20 1.79093 20 4C20 6.20907 18.2091 8 16 8C13.7909 8 12 6.20907 12 4Z" + fill="#535966" + /> + </g> + <defs> + <clipPath id="clip0_4044_22953"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4246_67063)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M26 0.408508V28.581L10.014 21H6.44576C2.88586 21 0 18.1141 0 14.5542C0 10.9943 2.88586 8.10848 6.44576 8.10848H10.0109L26 0.408508ZM24 3.59149L10.4674 10.1085H6.44576C3.99043 10.1085 2 12.0989 2 14.5542C2 17.0096 3.99043 19 6.44576 19H10.4642L24 25.419V3.59149Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M8.3214 30L5.9747 19.7763L4.02539 20.2237L6.72846 32H15.3155L14.0842 27.5653L12.2335 26.5106L10.8668 19.8005L8.90704 20.1996L10.4548 27.799L12.3777 28.8948L12.6845 30H8.3214Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M8 17V12H10V17H8Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M18 21V8H20V21H18Z" fill="#00BFB3" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M28 19.8922C30.3504 19.3757 32 17.0722 32 14.5C32 11.9278 30.3504 9.62432 28 9.10779V11.2044C29.1207 11.6726 30 12.9063 30 14.5C30 16.0937 29.1207 17.3274 28 17.7956V19.8922Z" + fill="#00BFB3" + /> + </g> + <defs> + <clipPath id="clip0_4246_67063"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g clipPath="url(#clip0_4_11)"> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M8.2632 22.5957C6.1692 20.2217 5.0152 17.1687 5.0152 13.9997C5.0152 10.8337 6.1672 7.7827 8.2582 5.4097L9.7592 6.7327C7.9902 8.7407 7.0152 11.3217 7.0152 13.9997C7.0152 16.6817 7.9912 19.2647 9.7632 21.2737L8.2632 22.5957Z" - fill="#535766" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M4.8604 26.8652C1.7264 23.3102 0.000396729 18.7412 0.000396729 13.9982C0.000396729 9.2592 1.7234 4.6922 4.8524 1.1402L6.3774 2.4842C3.5744 5.6642 2.0314 9.7532 2.0314 13.9982C2.0314 18.2462 3.5774 22.3392 6.3834 25.5212L4.8604 26.8652Z" - fill="#535766" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M23.7681 22.5957L22.2681 21.2737C24.0401 19.2647 25.0161 16.6817 25.0161 13.9997C25.0161 11.3217 24.0411 8.7407 22.2721 6.7327L23.7731 5.4097C25.8641 7.7827 27.0161 10.8337 27.0161 13.9997C27.0161 17.1687 25.8621 20.2217 23.7681 22.5957Z" - fill="#535766" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M27.1709 26.8652L25.6479 25.5212C28.4539 22.3392 29.9999 18.2462 29.9999 13.9982C29.9999 9.7532 28.4569 5.6642 25.6539 2.4842L27.1789 1.1402C30.3079 4.6922 32.0309 9.2592 32.0309 13.9982C32.0309 18.7412 30.3049 23.3102 27.1709 26.8652Z" - fill="#535766" - /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M16.0156 17C14.3616 17 13.0156 15.654 13.0156 14C13.0156 12.346 14.3616 11 16.0156 11C17.6696 11 19.0156 12.346 19.0156 14C19.0156 15.654 17.6696 17 16.0156 17ZM21.0156 14C21.0156 11.243 18.7726 9 16.0156 9C13.2586 9 11.0156 11.243 11.0156 14C11.0156 16.414 12.7366 18.435 15.0156 18.898V30H17.0156V18.898C19.2946 18.435 21.0156 16.414 21.0156 14Z" - fill="#00BFB3" - /> - </g> - <defs> - <clipPath id="clip0_4_11"> - <rect width="32" height="32" fill="white" /> - </clipPath> - </defs> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = (props) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + fillRule="evenodd" + clipRule="evenodd" + d="M3.5 2.5V26.5C3.5 27.6044 4.3953 28.5 5.5 28.5H29.5V30H5.5C3.5667 30 2 28.4326 2 26.5V2.5H3.5Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M8 25.5V18.5H9.5V25.5H8Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M14 25.5V12H15.5V25.5H14Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M20 25.5V16.5H21.5V25.5H20Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M26 25.5V19H27.5V25.5H26Z" fill="#535966" /> + <path fillRule="evenodd" clipRule="evenodd" d="M8 16.4974V12H9.5V16.4974H8Z" fill="#00BFB3" /> + <path fillRule="evenodd" clipRule="evenodd" d="M14 9.5V5H15.5V9.5H14Z" fill="#00BFB3" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M20 13.9827V8.5H21.5V13.9827H20Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M26 16.4827V13H27.5V16.4827H26Z" + fill="#00BFB3" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_23007)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M0 0H14V10.0035L8.70081 16H0V0ZM2 2V14H7.79919L12 9.24646V2H2Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M6 8H12V10H8V14H6V8Z" fill="#535966" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M18 16H32V26.0035L26.7008 32H18V16ZM20 18V30H25.7992L30 25.2465V18H20Z" + fill="#535966" + /> + <path fillRule="evenodd" clipRule="evenodd" d="M24 24H30V26H26V30H24V24Z" fill="#535966" /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M14 29C7.92465 29 3 24.0742 3 18H5C5 22.9698 9.02935 27 14 27H16V29H14Z" + fill="#00BFB3" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M18 5H16V3H18C24.0753 3 29 7.92578 29 14H27C27 9.03022 22.9706 5 18 5Z" + fill="#00BFB3" + /> + </g> + <defs> + <clipPath id="clip0_4044_23007"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + id="Stroke 1" + d="M20.833 7V5H21C22.6563 5 24 6.34372 24 8V28C24 29.6563 22.6563 31 21 31H3C1.34372 31 0 29.6563 0 28V8C0 6.34372 1.34372 5 3 5H3.167V7H3C2.44828 7 2 7.44828 2 8V28C2 28.5517 2.44828 29 3 29H21C21.5517 29 22 28.5517 22 28V8C22 7.44828 21.5517 7 21 7H20.833Z" + fill="#535766" + /> + <path + id="Stroke 3" + fillRule="evenodd" + clipRule="evenodd" + d="M19 9V3H15.874C15.4299 1.27477 13.8638 0 12 0C10.1362 0 8.57006 1.27477 8.12602 3H5V9H19ZM14 5H17V7H7V5H10V4C10 2.89543 10.8954 2 12 2C13.1046 2 14 2.89543 14 4V5Z" + fill="#535766" + /> + <path id="Stroke 5" d="M6 15V13H18V15H6Z" fill="#00BFB3" /> + <path id="Stroke 7" d="M6 20V18H18V20H6Z" fill="#00BFB3" /> + <path id="Stroke 9" d="M6 25V23H18V25H6Z" fill="#00BFB3" /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g> - <path - id="Ellipse 57 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M5.04205 4C5.09852 4.0623 5.21554 4.16719 5.45185 4.30687C5.94037 4.59561 6.71383 4.89032 7.75725 5.15118C9.82872 5.66905 12.7434 6 16 6C19.2566 6 22.1713 5.66905 24.2427 5.15118C25.2862 4.89032 26.0596 4.59561 26.5482 4.30687C26.7845 4.1672 26.9015 4.06229 26.9579 4C26.9015 3.9377 26.7845 3.8328 26.5482 3.69313C26.0596 3.40439 25.2862 3.10968 24.2427 2.84882C22.1713 2.33095 19.2566 2 16 2C12.7434 2 9.82872 2.33095 7.75725 2.84882C6.71383 3.10968 5.94037 3.40439 5.45185 3.69313C5.21554 3.83281 5.09852 3.9377 5.04205 4ZM7.27218 0.908537C9.54386 0.340618 12.6292 0 16 0C19.3708 0 22.4561 0.340618 24.7278 0.908537C25.856 1.19057 26.8399 1.54231 27.5658 1.9714C28.2248 2.36091 29 3.01396 29 4C29 4.98604 28.2248 5.63909 27.5658 6.0286C26.8399 6.45769 25.856 6.80943 24.7278 7.09146C22.4561 7.65938 19.3708 8 16 8C12.6292 8 9.54386 7.65938 7.27218 7.09146C6.14404 6.80943 5.16014 6.45769 4.43419 6.0286C3.77518 5.63909 3 4.98604 3 4C3 3.01396 3.77518 2.36091 4.43419 1.9714C5.16014 1.54231 6.14404 1.19057 7.27218 0.908537Z" - fill="#00BFB3" - /> - <path - id="Rectangle (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M12.4563 12C12.1632 12 11.8848 12.1286 11.6948 12.3518L9.81185 14.5641C9.24186 15.2337 8.40675 15.6196 7.52736 15.6196H4C3.44772 15.6196 3 16.0673 3 16.6196V26C3 26.5523 3.44772 27 4 27H7.85455V29H4C2.34315 29 1 27.6569 1 26V16.6196C1 14.9627 2.34315 13.6196 4 13.6196H7.52736C7.82049 13.6196 8.09886 13.491 8.28885 13.2677L10.1718 11.0555C10.7418 10.3858 11.577 10 12.4563 10H19.3418C20.2212 10 21.0563 10.3858 21.6263 11.0555L23.5093 13.2677C23.6993 13.491 23.9776 13.6196 24.2708 13.6196H28C29.6569 13.6196 31 14.9627 31 16.6196V26C31 27.6569 29.6569 29 28 29H24.6545V27H28C28.5523 27 29 26.5523 29 26V16.6196C29 16.0673 28.5523 15.6196 28 15.6196H24.2708C23.3914 15.6196 22.5563 15.2337 21.9863 14.5641L20.1033 12.3518C19.9133 12.1286 19.6349 12 19.3418 12H12.4563Z" - fill="#535766" - /> - <path - id="Stroke 14 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M12.4643 26.5353C10.5119 24.5824 10.5119 21.4171 12.4643 19.4647C14.4172 17.5118 17.5824 17.5118 19.5353 19.4647C21.4882 21.4171 21.4882 24.5824 19.5353 26.5353C17.5824 28.4882 14.4172 28.4882 12.4643 26.5353ZM20.9495 18.0505C20.9495 18.0504 20.9494 18.0504 20.9493 18.0503L20.9495 18.0505ZM20.9495 18.0505C23.6837 20.7841 23.6833 25.2157 20.9495 27.9495C18.2156 30.6835 13.784 30.6835 11.05 27.9495L11.0498 27.9493C8.31683 25.2155 8.31654 20.784 11.05 18.0505C13.7839 15.3166 18.2154 15.3165 20.9493 18.0503" - fill="#535766" - /> - <path - id="Stroke 18 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M13.8075 20.8077C14.8845 19.7308 16.6302 19.7308 17.7071 20.8077L16.2929 22.2219C15.997 21.926 15.5177 21.926 15.2218 22.2219C14.9261 22.5176 14.926 22.997 15.2219 23.293L13.8074 24.707C12.7309 23.6301 12.7308 21.8845 13.8075 20.8077Z" - fill="#00BFB3" - /> - <path - id="Stroke 16 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M23.293 31.7071L19.293 27.7071L20.7072 26.2929L24.7072 30.2929L23.293 31.7071Z" - fill="#535766" - /> - <path - id="Stroke 2 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M27 12V4H29V12H27Z" - fill="#00BFB3" - /> - <path - id="Stroke 17 (Stroke)" - fillRule="evenodd" - clipRule="evenodd" - d="M3 12V4H5V12H3Z" - fill="#00BFB3" - /> - </g> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - xmlns="http://www.w3.org/2000/svg" - width={16} - height={16} - fill="none" - viewBox="0 0 32 32" - {...props} - > - <path - fillRule="evenodd" - clipRule="evenodd" - d="M4 6.81635V12.0713C4 19.9353 8.697 26.8694 16 29.8403C23.303 26.8694 28 19.9353 28 12.0713V6.81635L16 2.20135L4 6.81635ZM16 31.9874L15.641 31.8493C7.354 28.6623 2 20.8983 2 12.0713V5.44335L16 0.0583496L30 5.44335V12.0713C30 20.8983 24.646 28.6623 16.359 31.8493L16 31.9874Z" - fill="#535766" - /> - <path fillRule="evenodd" clipRule="evenodd" d="M11 23H13V18H11V23Z" fill="#00BFB3" /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M12 14C11.448 14 11 13.552 11 13C11 12.448 11.448 12 12 12C12.552 12 13 12.448 13 13C13 13.552 12.552 14 12 14ZM13 10.185V7H11V10.185C9.839 10.599 9 11.698 9 13C9 14.654 10.346 16 12 16C13.654 16 15 14.654 15 13C15 11.698 14.161 10.599 13 10.185Z" - fill="#00BFB3" - /> - <path fillRule="evenodd" clipRule="evenodd" d="M19 12H21V7H19V12Z" fill="#00BFB3" /> - <path - fillRule="evenodd" - clipRule="evenodd" - d="M20 18C19.448 18 19 17.552 19 17C19 16.448 19.448 16 20 16C20.552 16 21 16.448 21 17C21 17.552 20.552 18 20 18ZM23 17C23 15.346 21.654 14 20 14C18.346 14 17 15.346 17 17C17 18.302 17.839 19.401 19 19.815V23H21V19.815C22.161 19.401 23 18.302 23 17Z" - fill="#00BFB3" - /> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <g clipPath="url(#clip0_4044_22923)"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M26.8384 20.479C27.1552 19.7077 27.9008 19.2 28.736 19.2H32V12.8H28.736C27.9008 12.8 27.1552 12.2923 26.8384 11.5211C26.8352 11.5125 26.832 11.504 26.8277 11.4955C26.5109 10.7264 26.6795 9.84533 27.2683 9.2576L29.5765 6.94933L25.0507 2.42347L22.7424 4.73173C22.1547 5.31947 21.2736 5.48907 20.5045 5.17227C20.5008 5.17088 20.4974 5.1693 20.4938 5.16769C20.4891 5.16558 20.4844 5.16342 20.4789 5.1616C19.7077 4.8448 19.2 4.0992 19.2 3.26507V0H12.8V3.26507C12.8 4.0992 12.2923 4.8448 11.5211 5.1616C11.5156 5.16342 11.5109 5.16558 11.5062 5.16769C11.5027 5.1693 11.4992 5.17088 11.4955 5.17227C10.7264 5.48907 9.84533 5.31947 9.2576 4.73173L6.94933 2.42347L2.42347 6.94933L4.73173 9.2576C5.32053 9.84533 5.48907 10.7264 5.17227 11.4955C5.168 11.504 5.1648 11.5125 5.1616 11.5211C4.8448 12.2923 4.0992 12.8 3.264 12.8H0V19.2H3.264C4.0992 19.2 4.8448 19.7077 5.1616 20.4789C5.1648 20.4875 5.168 20.496 5.17227 20.5045C5.48907 21.2736 5.32053 22.1547 4.73173 22.7424L2.42347 25.0507L6.94933 29.5765L9.2576 27.2683C9.84533 26.6805 10.7264 26.5109 11.4955 26.8277C11.4992 26.8291 11.5027 26.8307 11.5062 26.8323C11.5109 26.8344 11.5156 26.8366 11.5211 26.8384C12.2923 27.1552 12.8 27.9008 12.8 28.7349V32H19.2V28.7349C19.2 27.9008 19.7077 27.1552 20.4789 26.8384C20.4844 26.8366 20.4891 26.8344 20.4938 26.8323C20.4974 26.8307 20.5008 26.8291 20.5045 26.8277C21.2736 26.5109 22.1547 26.6805 22.7424 27.2683L25.0507 29.5765L29.5765 25.0507L27.2683 22.7424C26.6795 22.1547 26.5109 21.2736 26.8277 20.5045C26.832 20.496 26.8352 20.4875 26.8384 20.479ZM25.7611 24.2523C24.5504 23.0437 24.2165 21.2425 24.8552 19.692L24.8848 19.6201L24.8877 19.6144C25.5407 18.0852 27.0422 17.0667 28.736 17.0667H29.8667V14.9333H28.736C27.0422 14.9333 25.5407 13.9148 24.8877 12.3856L24.8848 12.3799L24.8552 12.308C24.2166 10.7578 24.5502 8.95696 25.7605 7.74837C25.7607 7.74816 25.7603 7.74859 25.7605 7.74837L26.5595 6.94933L25.0507 5.44046L24.2509 6.24023C23.0557 7.43543 21.2788 7.77771 19.7367 7.16293L19.7355 7.1625L19.7277 7.15931C19.7205 7.15643 19.7133 7.15353 19.7062 7.15061C19.6901 7.14415 19.6759 7.1382 19.6639 7.13309C18.1078 6.49182 17.0667 4.9766 17.0667 3.26507V2.13333H14.9333V3.26507C14.9333 4.97661 13.8922 6.49182 12.3361 7.13309C12.3242 7.1382 12.31 7.14412 12.2939 7.15057C12.2867 7.15352 12.2795 7.15645 12.2722 7.15936L12.2645 7.1625L12.2633 7.16292C10.7212 7.77771 8.94431 7.43544 7.74911 6.24023L6.94933 5.44046L5.44046 6.94933L6.23886 7.74774C6.23921 7.74809 6.23956 7.74843 6.2399 7.74878C6.24001 7.74889 6.23979 7.74867 6.2399 7.74878C7.44957 8.95736 7.78325 10.7581 7.1448 12.308L7.11517 12.3799L7.11234 12.3856C6.45935 13.9148 4.95778 14.9333 3.264 14.9333H2.13333V17.0667H3.264C4.95778 17.0667 6.45935 18.0852 7.11235 19.6144L7.11517 19.6201L7.1448 19.692C7.78325 21.2419 7.4499 23.0423 6.24023 24.2509C6.24012 24.251 6.24034 24.2508 6.24023 24.2509C6.23988 24.2512 6.23921 24.2519 6.23886 24.2523L5.44046 25.0507L6.94933 26.5595L7.74911 25.7598C8.94432 24.5646 10.7212 24.2223 12.2633 24.8371L12.2645 24.8375L12.2721 24.8406C12.2795 24.8436 12.2868 24.8465 12.2942 24.8495C12.3101 24.8559 12.3243 24.8618 12.3362 24.8669C13.8922 25.5082 14.9333 27.0234 14.9333 28.7349V29.8667H17.0667V28.7349C17.0667 27.0234 18.1078 25.5082 19.6638 24.8669C19.6758 24.8618 19.6899 24.8559 19.7058 24.8495C19.7131 24.8466 19.7204 24.8436 19.7277 24.8407L19.7355 24.8375L19.7367 24.8371C21.2788 24.2223 23.0557 24.5646 24.2509 25.7598L25.0507 26.5595L26.5595 25.0507L25.7611 24.2523ZM7.1591 19.7299L7.15841 19.728ZM7.1591 12.2701C7.16029 12.267 7.15989 12.2681 7.15836 12.2721L7.1591 12.2701ZM24.8409 12.2701L24.8417 12.2722ZM24.8409 19.7299C24.8397 19.733 24.8401 19.7319 24.8416 19.7279L24.8409 19.7299Z" + fill="#535966" + /> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M16 13C14.3433 13 13 14.3433 13 16C13 17.6567 14.3433 19 16 19C17.6567 19 19 17.6567 19 16C19 14.3433 17.6567 13 16 13ZM11 16C11 13.2387 13.2387 11 16 11C18.7613 11 21 13.2387 21 16C21 18.7613 18.7613 21 16 21C13.2387 21 11 18.7613 11 16Z" + fill="#00BFB3" + /> + </g> + <defs> + <clipPath id="clip0_4044_22923"> + <rect width="32" height="32" fill="white" /> + </clipPath> + </defs> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g clipPath="url(#clip0_2634_421176)"> - <path - id="Shape" - fillRule="evenodd" - clipRule="evenodd" - d="M10 12C15.4292 12 19.8479 16.3267 19.9962 21.7201L20 22V23H11V32H10C4.47715 32 0 27.5228 0 22C0 16.4772 4.47715 12 10 12ZM9 21L9.00005 14.0619C5.05371 14.554 2 17.9204 2 22C2 25.9928 4.92513 29.3024 8.74934 29.9028L9 29.9381V21ZM11 21L11.0009 14.062L11.258 14.0983C14.7544 14.6506 17.4976 17.4677 17.9381 21H11Z" - fill="#535766" - /> - <path - id="Path" - d="M26 22C26 13.1634 18.8366 6 10 6V8C17.732 8 24 14.268 24 22H26Z" - fill="#00BFB3" - /> - <path - id="Path_2" - d="M32 22C32 9.84974 22.1503 0 10 0V2C21.0457 2 30 10.9543 30 22H32Z" - fill="#00BFB3" - /> - </g> - <defs> - <clipPath id="clip0_2634_421176"> - <rect width="32" height="32" fill="white" /> - </clipPath> - </defs> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( - <svg - width="32" - height="32" - viewBox="0 0 32 32" - fill="none" - xmlns="http://www.w3.org/2000/svg" - {...props} - > - <g id="Group"> - <path - id="Stroke 1" - fillRule="evenodd" - clipRule="evenodd" - d="M1 1V15H15V1H1ZM13 13H3V3H13V13Z" - fill="#535766" - /> - <path id="Stroke 3" d="M5 7V5H11V7H5Z" fill="#00BFB3" /> - <path - id="Stroke 4" - fillRule="evenodd" - clipRule="evenodd" - d="M17 1V15H31V1H17ZM29 13H19V3H29V13Z" - fill="#535766" - /> - <path id="Stroke 6" d="M21 7V5H27V7H21Z" fill="#00BFB3" /> - <path - id="Stroke 7" - fillRule="evenodd" - clipRule="evenodd" - d="M1 17V31H15V17H1ZM13 29H3V19H13V29Z" - fill="#535766" - /> - <path id="Stroke 9" d="M5 23V21H11V23H5Z" fill="#00BFB3" /> - <path - id="Stroke 10" - fillRule="evenodd" - clipRule="evenodd" - d="M17 17V31H31V17H17ZM29 29H19V19H29V29Z" - fill="#535766" - /> - <path id="Stroke 12" d="M21 23V21H27V23H21Z" fill="#00BFB3" /> - </g> - </svg> -); - -// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + id="Fill 1" + fillRule="evenodd" + clipRule="evenodd" + d="M16 4C15.448 4 15 3.552 15 3C15 2.448 15.448 2 16 2C16.552 2 17 2.448 17 3C17 3.552 16.552 4 16 4ZM18.911 2.308C18.597 0.987 17.415 0 16 0C14.346 0 13 1.346 13 3C13 4.654 14.346 6 16 6C17.176 6 18.186 5.313 18.677 4.326C22.501 5.203 25.711 7.91 27.166 11.597L29.027 10.862C27.302 6.491 23.47 3.274 18.911 2.308Z" + fill="#535766" + /> + <path + id="Fill 3" + fillRule="evenodd" + clipRule="evenodd" + d="M3 17C2.448 17 2 16.552 2 16C2 15.448 2.448 15 3 15C3.552 15 4 15.448 4 16C4 16.552 3.552 17 3 17ZM11.597 4.83402L10.862 2.97302C6.491 4.69802 3.274 8.53002 2.308 13.089C0.987 13.403 0 14.585 0 16C0 17.654 1.346 19 3 19C4.654 19 6 17.654 6 16C6 14.824 5.313 13.814 4.326 13.323C5.203 9.49902 7.91 6.28902 11.597 4.83402Z" + fill="#535766" + /> + <path + id="Fill 5" + fillRule="evenodd" + clipRule="evenodd" + d="M16.0001 30C15.4481 30 15.0001 29.552 15.0001 29C15.0001 28.448 15.4481 28 16.0001 28C16.5521 28 17.0001 28.448 17.0001 29C17.0001 29.552 16.5521 30 16.0001 30ZM16.0001 26C14.8241 26 13.8141 26.687 13.3231 27.674C9.49915 26.797 6.28914 24.09 4.83414 20.403L2.97314 21.138C4.69814 25.509 8.53014 28.726 13.0891 29.692C13.4031 31.013 14.5851 32 16.0001 32C17.6541 32 19.0001 30.654 19.0001 29C19.0001 27.346 17.6541 26 16.0001 26Z" + fill="#535766" + /> + <path + id="Fill 7" + fillRule="evenodd" + clipRule="evenodd" + d="M28.9998 17C28.4478 17 27.9998 16.552 27.9998 16C27.9998 15.448 28.4478 15 28.9998 15C29.5518 15 29.9998 15.448 29.9998 16C29.9998 16.552 29.5518 17 28.9998 17ZM31.9998 16C31.9998 14.346 30.6538 13 28.9998 13C27.3458 13 25.9998 14.346 25.9998 16C25.9998 17.176 26.6868 18.186 27.6738 18.677C26.7978 22.501 24.0898 25.711 20.4028 27.166L21.1378 29.027C25.5088 27.302 28.7258 23.47 29.6918 18.911C31.0128 18.597 31.9998 17.415 31.9998 16Z" + fill="#535766" + /> + <path + id="Fill 9" + fillRule="evenodd" + clipRule="evenodd" + d="M13 20C13 18.346 14.346 17 16 17C17.654 17 19 18.346 19 20H13ZM14 13C14 11.897 14.897 11 16 11C17.103 11 18 11.897 18 13C18 14.103 17.103 15 16 15C14.897 15 14 14.103 14 13ZM18.794 15.855C19.536 15.129 20 14.119 20 13C20 10.794 18.206 9 16 9C13.794 9 12 10.794 12 13C12 14.119 12.464 15.129 13.206 15.855C11.876 16.755 11 18.277 11 20V22H21V20C21 18.277 20.124 16.755 18.794 15.855Z" + fill="#00BFB3" + /> + </svg> +); + +// 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<SVGProps<SVGSVGElement>> = ({ ...props }) => ( + <svg + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + xmlns="http://www.w3.org/2000/svg" + {...props} + > + <path + id="Path" + fillRule="evenodd" + clipRule="evenodd" + d="M30 30H4C1.79086 30 0 28.2091 0 26V0H2V26C2 27.1046 2.89543 28 4 28H30V30Z" + fill="#535766" + /> + <rect id="Rectangle" x="6" y="19" width="2" height="7" fill="#535766" /> + <rect id="Rectangle_2" x="16" y="11" width="2" height="15" fill="#535766" /> + <rect id="Rectangle_3" x="26" y="16" width="2" height="10" fill="#535766" /> + <path + id="Shape" + fillRule="evenodd" + clipRule="evenodd" + d="M24.92 5.84C25.4786 5.30157 26.2241 5.0005 27 5C28.6569 5 30 6.34315 30 8C30 9.65685 28.6569 11 27 11C25.3431 11 24 9.65685 24 8C24.0165 7.87797 24.0433 7.75755 24.08 7.64L19.08 5.16C18.5214 5.69843 17.7759 5.9995 17 6C16.4388 5.99095 15.8914 5.82465 15.42 5.52L9.82 10C9.93778 10.3203 9.9987 10.6587 10 11C10 12.6569 8.65685 14 7 14C5.34315 14 4 12.6569 4 11C4 9.34315 5.34315 8 7 8C7.55925 8.00307 8.1065 8.16239 8.58 8.46L14.18 4C14.0622 3.67969 14.0013 3.34127 14 3C14 1.34315 15.3431 0 17 0C18.6569 0 20 1.34315 20 3C20.0098 3.1198 20.0098 3.2402 20 3.36L24.92 5.84ZM6 11C6 11.5523 6.44772 12 7 12C7.55228 12 8 11.5523 8 11C8 10.4477 7.55228 10 7 10C6.44772 10 6 10.4477 6 11ZM17 4C16.4477 4 16 3.55228 16 3C16 2.44772 16.4477 2 17 2C17.5523 2 18 2.44772 18 3C18 3.26522 17.8946 3.51957 17.7071 3.70711C17.5196 3.89464 17.2652 4 17 4ZM26 8C26 8.55229 26.4477 9 27 9C27.5523 9 28 8.55229 28 8C28 7.44772 27.5523 7 27 7C26.4477 7 26 7.44772 26 8Z" + fill="#00BFB3" + /> + </svg> +); + +// 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 = <T extends object = {}>(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<UsageRecord[]> => { 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(() => ( + <EuiBetaBadge + size="s" + label={i18n.translate('xpack.stackAlerts.esQuery.ui.selectQueryFormType.experimentalLabel', { + defaultMessage: 'Technical preview', + })} + tooltipContent={i18n.translate( + 'xpack.stackAlerts.esQuery.ui.selectQueryFormType.experimentalDescription', + { + 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.', + } + )} + tooltipPosition="bottom" + /> +)); +ExperimentalBadge.displayName = 'ExperimentalBadge'; + export interface QueryFormTypeProps { searchType: SearchType | null; onFormTypeSelect: (formType: SearchType | null) => void; @@ -94,9 +113,18 @@ export const QueryFormTypeChooser: React.FC<QueryFormTypeProps> = ({ <> <EuiFlexGroup alignItems="center" gutterSize="s" responsive={false}> <EuiFlexItem> - <EuiTitle size="xs" data-test-subj="selectedRuleFormTypeTitle"> - <h5>{activeFormTypeItem?.label}</h5> - </EuiTitle> + <EuiFlexGroup alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}> + <EuiTitle size="xs" data-test-subj="selectedRuleFormTypeTitle"> + <h5>{activeFormTypeItem?.label}</h5> + </EuiTitle> + </EuiFlexItem> + {activeFormTypeItem?.formType === SearchType.esqlQuery && ( + <EuiFlexItem> + <ExperimentalBadge /> + </EuiFlexItem> + )} + </EuiFlexGroup> </EuiFlexItem> <EuiFlexItem grow={false}> <EuiButtonIcon @@ -140,7 +168,16 @@ export const QueryFormTypeChooser: React.FC<QueryFormTypeProps> = ({ color="primary" label={ <span> - <strong>{item.label}</strong> + <EuiFlexGroup alignItems="center" gutterSize="s"> + <EuiFlexItem grow={false}> + <strong>{item.label}</strong> + </EuiFlexItem> + {item.formType === SearchType.esqlQuery && ( + <EuiFlexItem> + <ExperimentalBadge /> + </EuiFlexItem> + )} + </EuiFlexGroup> <EuiText color="subdued" size="s"> <p>{item.description}</p> </EuiText> 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<typeof MonitorLocationType>; - -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<typeof MonitorLocationsType>; 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<typeof MonitorLocationsCodec>; + // 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 ( <EuiToolTip content={disabledMessage}> @@ -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} <EuiSpacer /> - <ActionBar readOnly={readOnly} /> + <ActionBar readOnly={readOnly} canUsePublicLocations={canUsePublicLocations} /> </EuiForm> <Disclaimer /> </FormProvider> 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 = () => { <EuiButton data-test-subj="syntheticsRunTestBtn" color="success" - disabled={isDisabled} + disabled={isDisabled || !canUsePublicLocations} aria-label={TEST_NOW_ARIA_LABEL} iconType="play" onClick={handleSubmit(handleTestNow)} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/submit.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/submit.tsx index 749b9b041519a..4a8cca5410baa 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/submit.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/submit.tsx @@ -21,7 +21,13 @@ import { format } from './formatter'; import { MONITORS_ROUTE } from '../../../../../../common/constants'; -export const ActionBar = ({ readOnly = false }: { readOnly: boolean }) => { +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} </EuiButton> @@ -75,16 +82,19 @@ export const ActionBar = ({ readOnly = false }: { readOnly: boolean }) => { </EuiLink> </EuiFlexItem> <EuiFlexItem grow={false}> - <RunTestButton /> + <RunTestButton canUsePublicLocations={canUsePublicLocations} /> </EuiFlexItem> <EuiFlexItem grow={false} css={{ marginLeft: 'auto' }}> - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={canUsePublicLocations} + > <EuiButton fill isLoading={loading} onClick={handleSubmit(formSubmitter)} data-test-subj="syntheticsMonitorConfigSubmitButton" - disabled={!canEditSynthetics} + disabled={!canEditSynthetics || !canUsePublicLocations} > {isEdit ? UPDATE_MONITOR_LABEL : CREATE_MONITOR_LABEL} </EuiButton> 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 <EditMonitorNotFound />; } - 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 ? ( <> <AlertingCallout isAlertingEnabled={data[ConfigKey.ALERT_CONFIG]?.status?.enabled} /> - <MonitorForm defaultValues={data} readOnly={isReadOnly}> + <MonitorForm + defaultValues={data} + readOnly={isReadOnly} + canUsePublicLocations={canUsePublicLocations} + > <MonitorSteps + canUsePublicLocations={canUsePublicLocations} stepMap={EDIT_MONITOR_STEPS(isReadOnly)} isEditFlow={true} readOnly={isReadOnly} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx index ecfd00b23d76e..94f681f0fd411 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/steps/index.tsx @@ -16,6 +16,7 @@ import { MonitorTypePortal } from './monitor_type_portal'; import { ReadOnlyCallout } from './read_only_callout'; export const MonitorSteps = ({ + canUsePublicLocations, stepMap, projectId, isEditFlow = false, @@ -23,6 +24,7 @@ export const MonitorSteps = ({ }: { stepMap: StepMap; readOnly?: boolean; + canUsePublicLocations?: boolean; isEditFlow?: boolean; projectId?: string; }) => { @@ -32,12 +34,9 @@ export const MonitorSteps = ({ return ( <> - {readOnly ? ( - <> - <ReadOnlyCallout projectId={projectId} /> - <EuiSpacer size="m" /> - </> - ) : null} + {isEditFlow && ( + <ReadOnlyCallout projectId={projectId} canUsePublicLocations={canUsePublicLocations} /> + )} {isEditFlow ? ( steps.map((step) => ( <div key={step.title}> 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 ( - <EuiCallOut - title={ - <FormattedMessage - id="xpack.synthetics.project.readOnly.callout.title" - defaultMessage="This configuration is read-only" - /> - } - iconType="document" - > - <p> - <FormattedMessage - id="xpack.synthetics.project.readOnly.callout.content" - defaultMessage="This monitor was added from an external project: {projectId}. From this page, you can only enable and disable the monitor and its alerts, or remove it. To make configuration changes, you have to edit its source file and push it again from that project." - values={{ projectId: <strong>{projectId}</strong> }} - /> - </p> - </EuiCallOut> - ); +export const ReadOnlyCallout = ({ + projectId, + canUsePublicLocations, +}: { + projectId?: string; + canUsePublicLocations?: boolean; +}) => { + if (projectId) { + return ( + <> + <EuiCallOut + title={ + <FormattedMessage + id="xpack.synthetics.project.readOnly.callout.title" + defaultMessage="This configuration is read-only" + /> + } + iconType="document" + > + <p> + <FormattedMessage + id="xpack.synthetics.project.readOnly.callout.content" + defaultMessage="This monitor was added from an external project: {projectId}. From this page, you can only enable and disable the monitor and its alerts, or remove it. To make configuration changes, you have to edit its source file and push it again from that project." + values={{ projectId: <strong>{projectId}</strong> }} + /> + </p> + </EuiCallOut> + <EuiSpacer size="m" /> + </> + ); + } + + if (!canUsePublicLocations) { + return ( + <> + <EuiCallOut + color="warning" + title={ + <FormattedMessage + id="xpack.synthetics.publicLocations.readOnly.callout.title" + defaultMessage="You do not have permission to use Elastic managed locations" + /> + } + iconType="alert" + > + <p> + <FormattedMessage + id="xpack.synthetics.publicLocations.readOnly.callout.content" + defaultMessage="This monitor contains a Elastic managed location. To edit this monitor, you need to have permission to use Elastic managed locations." + /> + </p> + </EuiCallOut> + <EuiSpacer size="m" /> + </> + ); + } + + 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 ( <EuiToolTip content={content} key={content}> @@ -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<EuiBasicTableColumn<EncryptedSyntheticsSavedMonitor>> = [ { align: 'left' as const, @@ -166,14 +176,18 @@ export function useMonitorListColumns({ 'data-test-subj': 'syntheticsMonitorEditAction', isPrimary: true, name: (fields) => ( - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={isPublicLocationsAllowed(fields)} + > {labels.EDIT_LABEL} </NoPermissionsTooltip> ), 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) => ( - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={isPublicLocationsAllowed(fields)} + > {labels.DELETE_LABEL} </NoPermissionsTooltip> ), @@ -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 ? ( <EuiLoadingSpinner size="m" /> ) : ( - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={canUsePublicLocations} + > <SwitchWithCursor compressed={true} checked={enabled} - disabled={isLoading || !canEditSynthetics} + disabled={isLoading || !canEditSynthetics || !canUsePublicLocations} showLabel={false} label={enabledDisableLabel} title={enabledDisableLabel} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_locations.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_locations.tsx index 421385b04da2b..5495a763e9ff7 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_locations.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_locations.tsx @@ -23,12 +23,19 @@ export const MonitorLocations = ({ locations, monitorId, status }: Props) => { 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<typeof useTheme>, - 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 ? ( + <EuiToolTip content={TEST_SCHEDULED_LABEL}> + <span>{runTestManually}</span> + </EuiToolTip> + ) : ( + <NoPermissionsTooltip canUsePublicLocations={canUsePublicLocations}> + {runTestManually} + </NoPermissionsTooltip> + ), 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: ( - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={canUsePublicLocations} + > {enableLabel} </NoPermissionsTooltip> ), icon: 'invert', - disabled: !canEditSynthetics, + disabled: !canEditSynthetics || !canUsePublicLocations, onClick: () => { if (status !== FETCH_STATUS.LOADING) { updateMonitorEnabledState(!monitor.isEnabled); @@ -207,11 +221,14 @@ export function ActionsPopover({ }, { name: ( - <NoPermissionsTooltip canEditSynthetics={canEditSynthetics}> + <NoPermissionsTooltip + canEditSynthetics={canEditSynthetics} + canUsePublicLocations={canUsePublicLocations} + > {monitor.isStatusAlertEnabled ? disableAlertLabel : enableMonitorAlertLabel} </NoPermissionsTooltip> ), - disabled: !canEditSynthetics, + disabled: !canEditSynthetics || !canUsePublicLocations, icon: alertLoading ? ( <EuiLoadingSpinner size="s" /> ) : 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<any> => { 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<SyntheticsMonitorWithSecretsAttributes>( - 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<any> => { - const { throttling, allLocations } = await getAllLocations({ - server, - syntheticsMonitorClient, - savedObjectsClient, - }); + handler: async ({ + request, + server, + savedObjectsClient, + syntheticsMonitorClient, + }): Promise<any> => { + 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<SyntheticsParams>({ 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<RuleAggregationFormattedResult> { +}: LoadRuleAggregationsProps): Promise<AggregateRulesResponse> { const filters = mapFiltersToKql({ typesFilter, actionTypesFilter, @@ -51,7 +52,7 @@ export async function loadRuleAggregations({ ruleStatusesFilter, tagsFilter, }); - const res = await http.post<AsApiContract<RuleAggregationFormattedResult>>( + const res = await http.post<AggregateRulesResponseBody>( `${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<RuleAggregationFormattedResult> = ({ +export interface AggregateRulesResponse { + ruleExecutionStatus: Record<string, number>; + ruleLastRunOutcome: Record<string, number>; + 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<RuleAggregationFormattedResult> { +}: LoadRuleAggregationsProps): Promise<AggregateRulesResponse> { const filtersKueryNode = mapFiltersToKueryNode({ typesFilter, actionTypesFilter, @@ -28,7 +31,7 @@ export async function loadRuleAggregationsWithKueryFilter({ searchText, }); - const res = await http.post<AsApiContract<RuleAggregationFormattedResult>>( + const res = await http.post<AggregateRulesResponseBody>( `${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<SearchResponse> { - 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<T>({ ruleId: string; num: number; }): Promise<SearchResponse<T, Record<string, AggregationsAggregate>>> { - return pRetry( + return await pRetry( async () => { const response = await esClient.search<T>({ index: indexName, @@ -115,7 +115,7 @@ export async function waitForAllTasksIdle({ esClient: Client; filter: Date; }): Promise<SearchResponse> { - 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<SearchResponse> { - 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<SearchResponse> { - 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<SearchResponse> { - 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"