diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 4f9090be73d70d..6aefc304111416 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -91,9 +91,6 @@ disabled: - x-pack/test_serverless/api_integration/test_suites/security/config.feature_flags.ts - x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts - # Failing: See https://github.com/elastic/kibana/issues/174020 - - x-pack/test/api_integration/apis/asset_manager/config_when_enabled.ts - defaultQueue: 'n2-4-spot' enabled: - test/accessibility/config.ts @@ -188,6 +185,7 @@ enabled: - x-pack/test/api_integration/config_security_trial.ts - x-pack/test/api_integration/apis/aiops/config.ts - x-pack/test/api_integration/apis/asset_manager/config_when_disabled.ts + - x-pack/test/api_integration/apis/asset_manager/config_when_enabled.ts - x-pack/test/api_integration/apis/cases/config.ts - x-pack/test/api_integration/apis/cloud_security_posture/config.ts - x-pack/test/api_integration/apis/console/config.ts diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml index 7cdc07ec861f21..a1de7f41a2100b 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-production.yaml @@ -27,6 +27,11 @@ steps: - label: ":cookie: 24h bake time before continuing promotion" if: build.env("ENVIRONMENT") == "production-canary" command: "sleep 86400" + soft_fail: + # A manual cancel of that step produces return code 255. + # We're treating this case as a soft fail to allow manual bake time skipping. + # To stop the promotion entirely, instead click the "Cancel" button at the top of the page + - exit_status: 255 agents: # How long can this agent live for in minutes - 25 hours instanceMaxAge: 1500 diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 168a1aeeb6f832..ef15d64e1daa5b 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-01-15 +date: 2024-01-16 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 8bceffc7b8bf1a..bce59ddcbe809f 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index 39688e7e427a49..45f6c19de1412d 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index c73ca549904d2a..30bf53e64a6cf4 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 8df1a0d2a2b4ea..bdbfc23ffb2601 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 94686050fa7320..5b6ba7327d94b7 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3553,14 +3553,6 @@ "plugin": "infra", "path": "x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts" }, - { - "plugin": "monitoring", - "path": "x-pack/plugins/monitoring/server/alerts/base_rule.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index eb7881894e4c34..c954d70b231479 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-01-15 +date: 2024-01-16 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 cc33b314d21ba4..05d8dc1ac48ccc 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-01-15 +date: 2024-01-16 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 0434b3b2ccbedd..acfcca07b11808 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-01-15 +date: 2024-01-16 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 5ecacc65cb0c36..42f46aa3e5fb2e 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-01-15 +date: 2024-01-16 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 d0fe0b35846dfc..0a587611207ba9 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-01-15 +date: 2024-01-16 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 c8838a37364be2..da1d0bc3b8be42 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-01-15 +date: 2024-01-16 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 fa7078e72b0bcc..adb0cb75683435 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-01-15 +date: 2024-01-16 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 e5731a272d3c11..2f020ef71aabbc 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-01-15 +date: 2024-01-16 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 4a2a2763af3096..cead91ffa90a01 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 7e281b6d70276f..00d0ee108c1cf5 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index cafa0ebab7d47a..df3c9d261eba54 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-01-15 +date: 2024-01-16 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 537deaf562f07a..bf8cffca75b54b 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-01-15 +date: 2024-01-16 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 89168c24894217..5a8cf1363af06f 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-01-15 +date: 2024-01-16 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 062cbce9c37436..7a0a3ee24bb73c 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-01-15 +date: 2024-01-16 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 e3380cbf9c3e00..2a22f048b8dd13 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-01-15 +date: 2024-01-16 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 90dfbda860a2b2..1ebc44e6856fa6 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-01-15 +date: 2024-01-16 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 d15065871b9bcb..112130541349a3 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-01-15 +date: 2024-01-16 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 0209f15d37544e..8921bc1d206c81 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-01-15 +date: 2024-01-16 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 1a989d69480fcf..2f25b4cf22646d 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-01-15 +date: 2024-01-16 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 964ca2a137b727..7c22a93bb39779 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-01-15 +date: 2024-01-16 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 a1bb897ebee3a2..5c3bff8715f592 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -5310,6 +5310,51 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-public.AggFunctionsMapping.aggIpPrefix", + "type": "Object", + "tags": [], + "label": "aggIpPrefix", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"aggIpPrefix\", any, Arguments, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggExpressionType", + "text": "AggExpressionType" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ">>" + ], + "path": "src/plugins/data/common/search/aggs/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-public.AggFunctionsMapping.aggIpRange", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 969345bf3a8842..bb501ccbfcf923 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-01-15 +date: 2024-01-16 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 | |-------------------|-----------|------------------------|-----------------| -| 3188 | 31 | 2537 | 22 | +| 3220 | 31 | 2569 | 23 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 8396d756b26d5d..3265719a90495c 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-01-15 +date: 2024-01-16 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 | |-------------------|-----------|------------------------|-----------------| -| 3188 | 31 | 2537 | 22 | +| 3220 | 31 | 2569 | 23 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index cfa083d446c5cb..539ec9594e1185 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -11686,6 +11686,23 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.aggIpPrefix", + "type": "Function", + "tags": [], + "label": "aggIpPrefix", + "description": [], + "signature": [ + "() => FunctionDefinition" + ], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix_fn.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.aggIpRange", @@ -14064,6 +14081,39 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.getIpPrefixBucketAgg", + "type": "Function", + "tags": [], + "label": "getIpPrefixBucketAgg", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.BucketAggType", + "text": "BucketAggType" + }, + "<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IBucketAggConfig", + "text": "IBucketAggConfig" + }, + ">" + ], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.getIpRangeBucketAgg", @@ -15499,6 +15549,60 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixToAst", + "type": "Function", + "tags": [], + "label": "ipPrefixToAst", + "description": [], + "signature": [ + "(ipPrefix: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + }, + ") => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionAstExpression", + "text": "ExpressionAstExpression" + } + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix_to_ast.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixToAst.$1", + "type": "Object", + "tags": [], + "label": "ipPrefix", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + } + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix_to_ast.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.ipRangeToAst", @@ -17362,6 +17466,51 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-common.AggFunctionsMapping.aggIpPrefix", + "type": "Object", + "tags": [], + "label": "aggIpPrefix", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"aggIpPrefix\", any, Arguments, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggExpressionType", + "text": "AggExpressionType" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ">>" + ], + "path": "src/plugins/data/common/search/aggs/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-common.AggFunctionsMapping.aggIpRange", @@ -21051,6 +21200,69 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.AggParamsIpPrefix", + "type": "Interface", + "tags": [], + "label": "AggParamsIpPrefix", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggParamsIpPrefix", + "text": "AggParamsIpPrefix" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.BaseAggParams", + "text": "BaseAggParams" + } + ], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.AggParamsIpPrefix.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.AggParamsIpPrefix.ipPrefix", + "type": "Object", + "tags": [], + "label": "ipPrefix", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + }, + " | undefined" + ], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.AggParamsIpRange", @@ -21175,6 +21387,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-common.AggParamsMapping.BUCKET_TYPES.IP_PREFIX", + "type": "Object", + "tags": [], + "label": "[BUCKET_TYPES.IP_PREFIX]", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggParamsIpPrefix", + "text": "AggParamsIpPrefix" + } + ], + "path": "src/plugins/data/common/search/aggs/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-common.AggParamsMapping.BUCKET_TYPES.IP_RANGE", @@ -27547,6 +27779,48 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.IpPrefix", + "type": "Interface", + "tags": [], + "label": "IpPrefix", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.IpPrefix.prefixLength", + "type": "number", + "tags": [], + "label": "prefixLength", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.IpPrefix.isIpv6", + "type": "CompoundType", + "tags": [], + "label": "isIpv6", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.IpRange", @@ -30689,6 +30963,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.aggIpPrefixFnName", + "type": "string", + "tags": [], + "label": "aggIpPrefixFnName", + "description": [], + "signature": [ + "\"aggIpPrefix\"" + ], + "path": "src/plugins/data/common/search/aggs/buckets/ip_prefix_fn.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.aggIpRangeFnName", @@ -32099,6 +32388,60 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.ExpressionFunctionIpPrefix", + "type": "Type", + "tags": [], + "label": "ExpressionFunctionIpPrefix", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"ipPrefix\", null, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefixOutput", + "text": "IpPrefixOutput" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ">>" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.ExpressionFunctionIpRange", @@ -33215,6 +33558,43 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.IpPrefixKey", + "type": "Type", + "tags": [], + "label": "IpPrefixKey", + "description": [], + "signature": [ + "IpPrefixAggKey" + ], + "path": "src/plugins/data/common/search/aggs/buckets/lib/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "data", + "id": "def-common.IpPrefixOutput", + "type": "Type", + "tags": [], + "label": "IpPrefixOutput", + "description": [], + "signature": [ + "{ type: \"ip_prefix\"; } & ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + } + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.IpRangeKey", @@ -36509,6 +36889,223 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction", + "type": "Object", + "tags": [], + "label": "ipPrefixFunction", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "\"ipPrefix\"" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"ip_prefix\"" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.inputTypes", + "type": "Array", + "tags": [], + "label": "inputTypes", + "description": [], + "signature": [ + "\"null\"[]" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.prefixLength", + "type": "Object", + "tags": [], + "label": "prefixLength", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.prefixLength.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"number\"[]" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.prefixLength.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.isIpv6", + "type": "Object", + "tags": [], + "label": "isIpv6", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.isIpv6.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"boolean\"[]" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.args.isIpv6.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.fn", + "type": "Function", + "tags": [], + "label": "fn", + "description": [], + "signature": [ + "(input: null, { prefixLength, isIpv6 }: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + }, + ") => { type: \"ip_prefix\"; prefixLength: number | undefined; isIpv6: boolean | undefined; }" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.fn.$1", + "type": "Uncategorized", + "tags": [], + "label": "input", + "description": [], + "signature": [ + "null" + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "data", + "id": "def-common.ipPrefixFunction.fn.$2", + "type": "Object", + "tags": [], + "label": "{ prefixLength, isIpv6 }", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IpPrefix", + "text": "IpPrefix" + } + ], + "path": "src/plugins/data/common/search/expressions/ip_prefix.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.ipRangeFunction", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index bbad0024a04d7e..fdae1425a8a7a8 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3188 | 31 | 2537 | 22 | +| 3220 | 31 | 2569 | 23 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index f326ec83f1674c..e58b239c5bab78 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index d2ffcfc744e2bc..3708bf74874a86 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 7d44033fd262f9..88518c4396a257 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 1e05ada6b5db44..b7a69eaab7a977 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index b3b225fac43c36..457d5251cf5fc3 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index fe017fb7206070..dcd80a2909f6bb 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index c335c27c000a18..1e0b5f123480a3 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -29,9 +29,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | triggersActionsUi | - | | | inspector, data, savedObjects, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, advancedSettings, telemetry, maps, exploratoryView, fleet, timelines, banners, reporting, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, console, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | | | @kbn/core, visualizations, triggersActionsUi, advancedSettings | - | -| | ruleRegistry, observability, infra, monitoring, securitySolution, synthetics, uptime | - | +| | ruleRegistry, observability, infra, securitySolution, synthetics, uptime | - | | | observability, @kbn/securitysolution-data-table, securitySolution | - | -| | monitoring | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | @@ -63,6 +62,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, visualizations, fileUpload, dashboardEnhanced, transform, discover, dataVisualizer | - | | | @kbn/core-saved-objects-browser-mocks, discover, @kbn/core-saved-objects-browser-internal | - | | | @kbn/management-settings-field-definition, advancedSettings, discover | - | +| | monitoring | - | | | @kbn/core-saved-objects-api-browser, @kbn/core, savedObjects, savedObjectsManagement, visualizations, savedObjectsTagging, eventAnnotation, lens, graph, dashboard, savedObjectsTaggingOss, kibanaUtils, expressions, data, embeddable, controls, uiActionsEnhanced, maps, canvas, dashboardEnhanced, globalSearchProviders | - | | | @kbn/core-saved-objects-browser, @kbn/core-saved-objects-browser-internal, @kbn/core, home, savedObjects, visualizations, lens, visTypeTimeseries, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, savedObjects | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 1491d4187e6841..66f08b3a867c92 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1106,7 +1106,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [base_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/server/alerts/base_rule.ts#:~:text=alertFactory) | - | | | [url_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/url_state.ts#:~:text=syncQueryStateWithUrl), [url_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/url_state.ts#:~:text=syncQueryStateWithUrl) | - | | | [use_request_error_handler.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/hooks/use_request_error_handler.tsx#:~:text=toMountPoint), [use_request_error_handler.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/hooks/use_request_error_handler.tsx#:~:text=toMountPoint), [use_request_error_handler.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/hooks/use_request_error_handler.tsx#:~:text=toMountPoint), [alerts_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/lib/alerts_toast.tsx#:~:text=toMountPoint), [alerts_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/lib/alerts_toast.tsx#:~:text=toMountPoint), [ingest_pipeline_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ingest_pipeline_modal.tsx#:~:text=toMountPoint), [ingest_pipeline_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ingest_pipeline_modal.tsx#:~:text=toMountPoint), [listing.js](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/cluster/listing/listing.js#:~:text=toMountPoint), [listing.js](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/cluster/listing/listing.js#:~:text=toMountPoint), [listing.js](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/cluster/listing/listing.js#:~:text=toMountPoint) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/application/index.tsx#:~:text=KibanaThemeProvider) | - | @@ -1336,7 +1335,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [legacy_rules_notification_alert_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.ts#:~:text=alertFactory), [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=alertFactory) | - | +| | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=alertFactory) | - | | | [wrap_search_source_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.ts#:~:text=create) | - | | | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/wrap_search_source_client.test.ts#:~:text=fetch) | - | | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion)+ 12 more | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index b178f2d91f4385..131a66172341f0 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 200c623cd444f8..9479cda0b595e5 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-01-15 +date: 2024-01-16 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 a5c982cf640021..d92704d38b2e5e 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-01-15 +date: 2024-01-16 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 da7e25f44c3388..873544b6aec245 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-01-15 +date: 2024-01-16 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 415bfa021029fd..b9233d670575d8 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-01-15 +date: 2024-01-16 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 7dffd44f8ab153..4907c3a900cc6a 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-01-15 +date: 2024-01-16 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 320c6e9e9a6e80..3a379886e479d6 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-01-15 +date: 2024-01-16 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 a9d7b031a054e5..fada598b1587a3 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-01-15 +date: 2024-01-16 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 c65281c8a25220..325f70cfaa7ed6 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-01-15 +date: 2024-01-16 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 63235d709fa8ee..0a533c6b1621ac 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-01-15 +date: 2024-01-16 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 4edf2c57bc3912..15c8157020fbf7 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-01-15 +date: 2024-01-16 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 7ff53116d30247..46fe241c012482 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 4967032d30ea5f..f1fb16d30a348a 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a47ff520978796..268fa6ada77267 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-01-15 +date: 2024-01-16 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 908e139ebe019e..36aa72cc3f6fdc 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-01-15 +date: 2024-01-16 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 7606da1f6a7c6c..3f750c169d1957 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-01-15 +date: 2024-01-16 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 92ff007f6d20db..00bd74141b9c31 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-01-15 +date: 2024-01-16 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 94cd8e4577e795..def3779f2a3cd0 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-01-15 +date: 2024-01-16 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 85bd4c26e4c3d5..788ac35c0c10d8 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-01-15 +date: 2024-01-16 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 1f2d6eb97c92fa..259b77a4c89b5b 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-01-15 +date: 2024-01-16 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 7f71a31389d28a..ebdb389aeb189e 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-01-15 +date: 2024-01-16 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 856c70714b72a6..1de8571d9e0fb7 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-01-15 +date: 2024-01-16 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 0b85ee52b42a26..95d5ddc497b713 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-01-15 +date: 2024-01-16 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 fb2b0502c5d5b0..e776b5208f29a8 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-01-15 +date: 2024-01-16 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 5da754677ad9b5..33c00c2eefe8fd 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-01-15 +date: 2024-01-16 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 ab6caa2b44c236..f3b6e03c8d85bb 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-01-15 +date: 2024-01-16 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 473f6759e0cb39..f0c1ef429ce36a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-01-15 +date: 2024-01-16 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 8c75921c08a704..783d0221c0eb0f 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-01-15 +date: 2024-01-16 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 e7ec572118e195..05de08b6b0c373 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-01-15 +date: 2024-01-16 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 eca29779a2a4fd..7e5f598bdbf828 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-01-15 +date: 2024-01-16 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 f58c4fe25990e2..0364641ee15969 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-01-15 +date: 2024-01-16 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 8840d984cd27eb..9531000dce89f5 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-01-15 +date: 2024-01-16 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 4fa1dff8d1153b..465fde8007a491 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-01-15 +date: 2024-01-16 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 5fa04d75834b87..ad24c30e734d51 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-01-15 +date: 2024-01-16 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 6636e7c9aa97d9..60a897149589d9 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-01-15 +date: 2024-01-16 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 64e80b73b2944b..ac4435db92392d 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-01-15 +date: 2024-01-16 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 501c4d7aa123de..e3be4612c6bc5e 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-01-15 +date: 2024-01-16 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 0dcd6602cd58d4..ef4a4141fc63d2 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-01-15 +date: 2024-01-16 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 a36e3d563fe91e..92d679088f65b1 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-01-15 +date: 2024-01-16 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 6ca7e0132f8c76..263c495ae7fbc5 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-01-15 +date: 2024-01-16 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 ff25e6de883695..7ff8fd47609866 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index a2d329f89aa9ce..3b68fc7c85ab95 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 75c43043b0816a..27c1551d277588 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 292ca394c69bc5..a61b522c1ad91a 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-01-15 +date: 2024-01-16 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 131c79b365bd89..46b41c53b03e67 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-01-15 +date: 2024-01-16 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 488d0e968ecf2d..744ece524df375 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 26f8478d10b4a0..6f4ba99ae5d71f 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 4f019aefb69242..a6be03da04fae0 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-01-15 +date: 2024-01-16 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 d4ddf919af6fcf..28c66ab4862953 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: 2024-01-15 +date: 2024-01-16 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 aa365aa71eb677..f9f8b611f743e8 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-01-15 +date: 2024-01-16 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 0b3fb4e9d5b62a..135c229adb5249 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 1c1465dcb3f79b..6bd07193481064 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index dd61db3c2148e1..ebf82ed6583293 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 025a297932d64e..2159f3b5efcc3f 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-01-15 +date: 2024-01-16 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 5898eb6fc61043..df7ead3c3a5b71 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-01-15 +date: 2024-01-16 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 c2f69106e56aad..ac0eeae370fdfd 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index fe1be0b349fcdd..fa8ac5b2efd7bc 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 448003ed79b067..3157c2f84b2f18 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 8a4066452bbe13..4956970565cfa8 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-01-15 +date: 2024-01-16 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 55eb0a4faabeba..5a0c7cef8d8a24 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-01-15 +date: 2024-01-16 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 4c7da9a5b38da5..e26ccd8389f19e 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 1600449f5b4c99..dab6977c81566f 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-01-15 +date: 2024-01-16 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.devdocs.json b/api_docs/kbn_apm_synthtrace.devdocs.json index c591fc9fd2533c..2d3c49ff1a3417 100644 --- a/api_docs/kbn_apm_synthtrace.devdocs.json +++ b/api_docs/kbn_apm_synthtrace.devdocs.json @@ -430,6 +430,145 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient", + "type": "Class", + "tags": [], + "label": "InfraSynthtraceKibanaClient", + "description": [], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed.$1.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + "Logger" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed.$1.target", + "type": "string", + "tags": [], + "label": "target", + "description": [], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed.$1.username", + "type": "string", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.Unnamed.$1.password", + "type": "string", + "tags": [], + "label": "password", + "description": [], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.fetchLatestSystemPackageVersion", + "type": "Function", + "tags": [], + "label": "fetchLatestSystemPackageVersion", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.installSystemPackage", + "type": "Function", + "tags": [], + "label": "installSystemPackage", + "description": [], + "signature": [ + "(packageVersion: string) => Promise" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.InfraSynthtraceKibanaClient.installSystemPackage.$1", + "type": "string", + "tags": [], + "label": "packageVersion", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/infra/infra_synthtrace_kibana_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/apm-synthtrace", "id": "def-server.LogsSynthtraceEsClient", diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 326ccc2858d1b9..3519abcc89887f 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 34 | 0 | 34 | 8 | +| 44 | 0 | 44 | 8 | ## Server diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 94183c4a5568e3..3c0f67f711df45 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-01-15 +date: 2024-01-16 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 d1bfdfa3de9936..e0ba697ec64fd2 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 d98f7d7fa7ac12..3e8f5deb059c95 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 4f337812df7647..8b05f980dac230 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 0ca18e9569389a..1d60d7d63a6d2e 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 70ce2f2a7ff913..c026a22968047b 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index ff2cf84f2cf5b0..b7470273f0418f 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-01-15 +date: 2024-01-16 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 f394cc2713a951..2b59e7f9387c39 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-01-15 +date: 2024-01-16 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 a18ba64c25666e..b9e8c197aa1e0d 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-01-15 +date: 2024-01-16 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 231cb690426930..dc9e296c797db7 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-01-15 +date: 2024-01-16 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 239b3f7cb520d9..cff33d875a1a99 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-01-15 +date: 2024-01-16 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 f32c038d218f3e..9661f1475396ef 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-01-15 +date: 2024-01-16 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 8ee016ad842519..54741be6d366fe 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-01-15 +date: 2024-01-16 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 f3a31205728ee2..d9d15e5436cd57 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-01-15 +date: 2024-01-16 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 8db19787661300..d5b6a8325be145 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 01264b451f3da0..d4739d0e60b310 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 96d06a600ca145..2aafaea584252a 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index e6862fbf3008b3..6fb9aaeb0962f2 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-01-15 +date: 2024-01-16 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 55aad472e5a6f3..4c3b56bc292904 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-01-15 +date: 2024-01-16 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 bed171d83941c8..f008f7a00dca0d 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 4de39e080955ef..107c189c99a899 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-01-15 +date: 2024-01-16 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 bcdedf1510ca93..3a2cf3bf1a9265 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-01-15 +date: 2024-01-16 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 58c516207cfbb1..7ec9800b40fcf3 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-01-15 +date: 2024-01-16 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 460ad0c8e059ed..f4f1d562cb0d5b 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 2eadef387597e0..3a3fc1676a73a8 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 966a15c4199eb5..7712724a4260c0 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-01-15 +date: 2024-01-16 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 1d425bd0e03e0d..c7618154f37819 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 f6ebf8ea682155..54d2f0027b7e95 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 33e6cfb9fa685d..07f7b854cfff33 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 80a330b03a069f..c8ade1dbe64d8e 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 009920d4e2657c..b26906e9466bae 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-01-15 +date: 2024-01-16 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 9299dadfc4fe64..03b25ebdb8e4af 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 333c459bb0a82f..54b86737225e03 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 a74054b8a0a6e8..8f6b636caffc75 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 69f84e971c1c85..bef2f0ebb37881 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 00259393a311cb..bd3af71518ae19 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 1ba5c32f486b8f..25fe51a78c26aa 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-01-15 +date: 2024-01-16 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 f934c8110cd030..3d40732e991afa 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 f50c8a87c26fae..42dc35ba9fe902 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 7b2bf7856abcb6..e00bd975fb1ccc 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 f1573e33d59f35..113cbfd662a025 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 192f01e4dda60c..7bf799d64c1f50 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-01-15 +date: 2024-01-16 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 9f8dcd26172078..64944f87ac5adf 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 153dd6e77eff78..eaf6623d93cd29 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 1c02a450c27dcc..8893af4c4293bf 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 193efa317c49fd..939355982090fb 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-01-15 +date: 2024-01-16 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 f4a347444bffad..7f64da3e715062 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-01-15 +date: 2024-01-16 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 1b3ef4c8c94cc7..cbb6e8eb43dc35 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 d29ca0574cb59e..2afaffe6d6c690 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 20ea17e3eb86b7..8abfd9d9b4900e 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 54f52231fab867..6a21314e0687f5 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 93d43ac705d908..5d6d04a4cb9285 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 f501cc5725aa32..5b52234dfc68ae 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 1ca4288302cf44..dfcf1d1b0e6203 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 0a8acfd6002201..40f725b627d439 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-01-15 +date: 2024-01-16 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 4ab0317a6dc32d..d43d4ffd10cd73 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-01-15 +date: 2024-01-16 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 adc6fc0a94017b..79aba402794f26 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 92b183929c63c3..ca01038a1d2a4d 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 ad9108627fddfe..9205599531c7d6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 1866e43cff016e..bed9571157e3f0 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 8152be47de8894..98b5e5bffd96c7 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 c42c583f0ee862..36484078e6c7e7 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-01-15 +date: 2024-01-16 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 72e38e71ae87c6..1b2dacf8f1f04e 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-01-15 +date: 2024-01-16 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 2ca562d216eb49..77c511bca0efb6 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 55bbf234494192..2fddfd496b189b 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 b86a1b324cbe64..62375db8cf062e 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 46b9519883c482..58c3c43ad4709c 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 ac1f49fd8d15e8..0bc6b1b5347db4 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-01-15 +date: 2024-01-16 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 eb08a0914a036b..b6f024b0d3591c 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 b3a5525b0fdb17..1c899bf22de5da 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 2b60f007a24b37..120ed38b2c5fcb 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 a6a29ca4d6f7e8..431e5a57082478 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-01-15 +date: 2024-01-16 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 bb779aa04ff29a..1eac5f268f4f48 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 d8341876649a46..51f57d352bb91b 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 ea058188136a62..2da266f903f1b2 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 3ee6aedbade013..ea61ea37539438 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 3141cba66d7c3f..8fb792cb95dba2 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 1553bbe9661876..5716fe953f8a57 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 d3ac45a8772de8..5f6e5d60618c6f 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 cfcdaf479151cc..23a20f2c10dc74 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-01-15 +date: 2024-01-16 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 5b741d81c85de5..b7986bc7003d4b 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-01-15 +date: 2024-01-16 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 97f6c030119d47..12a14b4038d0a6 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 fc05d20c55c5bb..8181838c76de12 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 fc3e55f2bd80e7..4716941d989d31 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 19fb04a505fd8e..0d0200fa8f841d 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 db9bd0c28ea3e8..ad94fd7f81f9c4 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 8fd629bba2330d..e5554ec744ef2c 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 5a0ac993d8b662..f552c137950e3a 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 6450dfdd57c2d4..8df7eb2743288a 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-01-15 +date: 2024-01-16 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 27e589834b1319..9497efaf6bbb50 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 c884e1931bac19..05bc7a3f2e0b45 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-01-15 +date: 2024-01-16 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 f2cbe1f9f06620..e7314232fdfae5 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-01-15 +date: 2024-01-16 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 c79e964b2063bc..26582b8135ef14 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 a5ae9d935164a2..b28fe3155892d7 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 eb40e324ca3882..3c4449dce170aa 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 ed46a1d4d0aa90..02b8788acccf5d 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index ddff66de5fac64..daf45f9752c9ba 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-01-15 +date: 2024-01-16 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 822aab419e5594..4ff869de1a8fe0 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 315b58991d1241..17df1d4826e959 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e02d8351dd68e0..40b934b72ab85d 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 9cb671069860d4..651ea4dc6b5324 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 c1dce864a8677e..ebd8633c294b17 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-01-15 +date: 2024-01-16 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 6ba77388c66d6f..5813ba8298a0c3 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 a182c472b2cf0c..292793d9a9c320 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 7421f75b11336f..de0866466f6056 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 a4da7664d6870b..b56f4c11d08714 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 02c2a082234abe..95e6b6cc3d1d36 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 24b0540ff8e7d1..be55eaba1a2894 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 1248ae2b78935d..9e912597b9884b 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e7731b347ad7d9..e0c2b0f78bd387 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-01-15 +date: 2024-01-16 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 ef34bb9dcf3ca2..2e5a24b7313f00 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 4edd286ee7acde..b41cc17484b492 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 303deb3c3cbb81..ae8bc043da26fe 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 d3aa07b5f3c2ed..723a236357234a 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-01-15 +date: 2024-01-16 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 104bad6c7f9ae2..b56c9b16f6644a 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 ff6ec9cfd84e6c..b81c39f7640eeb 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 729f440cc7ba58..9254c2d44f6a3c 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 3568d4a4477c02..8f3e4dbd95ab9c 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 6145fa2c00728c..70cf88b75ef442 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-01-15 +date: 2024-01-16 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 2b230fac8622aa..b3ff0d81994857 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 c675f0b03ddf34..66e9207b46c3e7 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 6dedd9f04765e8..ca2d3f0f249bc1 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 40f91c0bbde396..0e5b61b5968a32 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-01-15 +date: 2024-01-16 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 053d2766a36e92..cd0874e762bc3b 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 29c2ca999b3bbd..449666461e899a 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 5c823d6d4ab4d2..86ad1376337a98 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 a04bf3df1edc1b..6eb73d4b0b710a 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 5216cf107605dc..c84bb456fce36b 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e680728a735e40..8b1572c8741fdc 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 09da0063945b57..13b085cd8b6ba3 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 575a4d05e327fb..bb51bb17437499 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 4389347b92f51a..518172f5f02521 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 4df3122f8e8a81..2f87f8e7858747 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index e09030e60101a1..2cc4c3552f94b9 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index da621c005770ba..236c8a9dfe5ba0 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index e77bf791805289..a33a4f6f8b9e68 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-01-15 +date: 2024-01-16 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 5c4862a224f758..24755c1a87d961 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 66183e2b002436..985b45591b6cda 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-01-15 +date: 2024-01-16 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 f302b1da953a47..b01bb8a0374632 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 3981c167e037d7..addfd32a871c13 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e82ee14fab4784..edec5c83547604 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 2a595b3fe9d156..aa863d5d622185 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 69cb326bea6bf7..8c0e2847737c27 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 c596dc8691e170..e2a1f0c02dfbf6 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 b3bcffdec1efd3..3cecf90de03447 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-01-15 +date: 2024-01-16 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 6c05034dc3823a..0814e2c6fe891d 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e2c0c5775979e5..07b2c88c02dc7c 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 bd5303fc850f0a..4162ad449f2909 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 d9c3d3c6f09cb1..24ab499d5fd935 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 b9b064316b1200..dbe1e32259ba43 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 1c9493e81e957f..a0cca9ea1f4a63 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 7e7cabab63505c..2d595e5e2d2e8a 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-01-15 +date: 2024-01-16 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 5672680d43cc21..e05d16622252bf 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 ccbe88b0d84299..8530527b2b9d42 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 95d64af94c4b8c..2bcb4fbcd662c8 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 bdbd52e0e0147d..73bef880b16c87 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 7c3af730684c69..5634a372392423 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-01-15 +date: 2024-01-16 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 05c33102e46cfc..f83a4d5cbc4f00 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 d94d805b4e9902..bb41c2ff623bdc 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 0649addf9eabaa..ababb7449c59b5 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-01-15 +date: 2024-01-16 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 436470509e9822..639ac8065542ba 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-01-15 +date: 2024-01-16 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 7b3e5572cb582a..06ea35e382682b 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 29c930e42c4ef7..e79aa4dcee905f 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-01-15 +date: 2024-01-16 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 5eda2091dcef8a..bd8d2678f35445 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 d06071b56d019a..edd5f0268b77db 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 e9b72583e27f01..cc2c9d90d2753d 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-01-15 +date: 2024-01-16 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 b7fef0e4ed6b7a..52ae4e5caff1c9 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 5ba9035047f649..7946523def66e0 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 3dd0238273a81c..7f9ed2396ba8be 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 8c4e278f30308e..456e84d86b2015 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-01-15 +date: 2024-01-16 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 f6ec1219cb138a..4e2ca7fc29c10b 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 cea94dffee1a9e..1407ddb62da02f 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 f8b4d71f00d330..2af4b154ebd19c 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 274356fe03f599..2063565c2fad02 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 48683648f4ef6d..f5141022a0b8c3 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 58b6b901692883..5ba6713235b48a 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 fa40b6dae56102..49c0a0ecd3f4c9 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-01-15 +date: 2024-01-16 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 9b264e94f23c37..df47926fe87ab0 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-01-15 +date: 2024-01-16 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 384efa423f4826..1a70236d63fca3 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 5d6828825b28da..2598cbe434a7e1 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 f2fe227cca39bd..f8c395ecebe53a 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-01-15 +date: 2024-01-16 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 0d002cc489aa3e..009c7f6f4c4959 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-01-15 +date: 2024-01-16 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 90afcba88fc61d..4ca93d1148a3c1 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 77a4a3d1ba06cf..ba791e3e0b00b7 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-01-15 +date: 2024-01-16 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 15bc7cda644894..c427cacf7a131a 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: 2024-01-15 +date: 2024-01-16 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 5929c92f31c3ad..0ecd8df4e8f588 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 7aaf12d39b3bc9..88d1074ab1eb87 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-01-15 +date: 2024-01-16 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 0cc2fffb044a67..8901317dc2f551 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 3097ae9be0dfcc..44eaf0aa1c0cb5 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index f7cf24920de76d..3ab1442889d32e 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-01-15 +date: 2024-01-16 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 a78606d2168c13..718291c230b1b6 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-01-15 +date: 2024-01-16 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 92e501d9341c40..4a31e9333d173b 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-01-15 +date: 2024-01-16 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 d703c1214d077f..e01550c6ae64b6 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-01-15 +date: 2024-01-16 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 6317e9ed4f7b0b..948c8673c7e8a3 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-01-15 +date: 2024-01-16 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 a84aa6947c1f0f..f4a62024811a8e 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-01-15 +date: 2024-01-16 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 9345943177de62..6c4226c5c2ed91 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-01-15 +date: 2024-01-16 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 b3a9c9bf50b3b5..5d204bbfef8354 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-01-15 +date: 2024-01-16 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 5e122a7594451b..8d06c25b23ab85 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-01-15 +date: 2024-01-16 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 1822fbbe390d0e..e69aaaa01fff2a 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-01-15 +date: 2024-01-16 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 851b37ba24727b..4446f32ab16b6b 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-01-15 +date: 2024-01-16 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 79b884e5a5edaf..b6e98c4116768a 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-01-15 +date: 2024-01-16 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 f9104e8d9594fb..bbee5dbf49951f 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-01-15 +date: 2024-01-16 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 3cbe8dfbd0413a..1555ad90ec8ded 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-01-15 +date: 2024-01-16 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 736dab60f1de8a..2c4b28a48feb64 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-01-15 +date: 2024-01-16 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 5de531a523a384..25031426624ec9 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-01-15 +date: 2024-01-16 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 a88e618176ef46..640b7d56e4a15c 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-01-15 +date: 2024-01-16 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 c4246df631e1d0..a7155c8354c7d4 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 16c1c5a7536a3f..842422e73665e8 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 4560642091fcea..0048a0620b7607 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-01-15 +date: 2024-01-16 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 8ea6a3909f0cb4..edc4d2d2f6f898 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 991f1d6a1745b7..6fbd68f212e3e2 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-01-15 +date: 2024-01-16 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 3e754b5cef859e..d9b857afd18c4d 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-01-15 +date: 2024-01-16 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 86d0515655c43e..9e8c0adf746f22 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: 2024-01-15 +date: 2024-01-16 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 c4ca24df9ee9f4..437ab75018e3b9 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 342192c1d3d10b..74bb6402575b41 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 1f1f4005bbdf35..af86b22618154b 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index f5b7fd0c8816fd..9aa798875aaf03 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index dcf29b87a3d79f..a3e3d57d78eb11 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-01-15 +date: 2024-01-16 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 8231a6654a3724..0f8bff3d960296 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-01-15 +date: 2024-01-16 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 28e143686121b3..61635cfc5e6523 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-01-15 +date: 2024-01-16 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 c4d4818da95503..0c8b903f16d777 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 9db38631639f2d..46d26d4b44b4e6 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index fe2dbab3184728..62750e076939c3 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-01-15 +date: 2024-01-16 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 501ec5c7770fac..f24faabf61b28f 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-01-15 +date: 2024-01-16 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 e9c7f0c2a05a13..c2b1fc3666d139 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-01-15 +date: 2024-01-16 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 ab5cd61153771a..7a3dd342af76a1 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-01-15 +date: 2024-01-16 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 f3d0ee28ba60b0..e9fe23c1eac86b 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 423a7dbb6c6c39..1720fdc4aa01e9 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 958ab5c3c36e3b..b89c32f9af52e9 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-01-15 +date: 2024-01-16 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 fe22c2a05b1777..8e93d456b3ee88 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 15b8666c821d95..46258a339d597a 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index f01a31770ebad7..f6e26bd9e838a4 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-01-15 +date: 2024-01-16 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 b0e0d23090eaf3..5828fef0dab747 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-01-15 +date: 2024-01-16 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 5e7c23e10d577c..351f6689673b36 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 778dfb4bdeaaad..2452e855755edc 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-01-15 +date: 2024-01-16 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 52e8cb1dd3e6b7..282dde58b8fad9 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-01-15 +date: 2024-01-16 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 a13d83cf06e979..02cf074c3fb0a0 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 52ff35d29c104c..640a7edee0cf21 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-01-15 +date: 2024-01-16 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 74d96f67fc9ccc..77554dc2cdc488 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-01-15 +date: 2024-01-16 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 956fcfac1cba0d..6a9afb085b7dbb 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-01-15 +date: 2024-01-16 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 ca458ccbec17c7..5153f057570e92 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-01-15 +date: 2024-01-16 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 3db81e4e51c788..ed044ff9d42914 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-01-15 +date: 2024-01-16 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 2513d2f1547a68..d9432bedfceb2a 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-01-15 +date: 2024-01-16 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 0288ff17a7325d..4fd1bc796fc8dd 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-01-15 +date: 2024-01-16 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 21d9b0e55e5d6f..0bcbdd3049cd65 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-01-15 +date: 2024-01-16 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 61b0e5e512f746..41b5467390a0f2 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 43cdc7e4ad8a1b..b5d63f0935f3c0 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-01-15 +date: 2024-01-16 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 a6549bbd8c0804..72116ac0c1f4a4 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-01-15 +date: 2024-01-16 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 e552d1db97d237..86a404056e0757 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-01-15 +date: 2024-01-16 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 495b247ed5b11b..d3677259618210 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-01-15 +date: 2024-01-16 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 f1c7850ff6c9c3..d6067a1b7ab265 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-01-15 +date: 2024-01-16 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 fff57c140cde0a..e1873de3f6eaf4 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 2691916c4481d2..3cfc1fb71baeec 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 0cd6b021b71be1..0c6e9fc45cd625 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-01-15 +date: 2024-01-16 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 31957da6afcdc8..e8d222cf5f2e2f 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 d64d0193ce1e56..6355323af812d8 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-01-15 +date: 2024-01-16 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 cbbb62ee52cec9..774c5adbe22a61 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 72ca36ad5cc8b9..c31cf1905dfc5d 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index a19de96d226321..3218c6992f30fa 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 60bffcff5f1f6a..fe91a2aab8d8fe 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-01-15 +date: 2024-01-16 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 4f8c0bbbbdc7b8..857f67726737e7 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 13267bbe31cb41..4c96f9f06ad86e 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index a401e9e945d29e..6481cfc232e3b5 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-01-15 +date: 2024-01-16 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 f1a1073e59b0a2..e593b7ac12c0be 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-01-15 +date: 2024-01-16 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 d72bafbcef933f..2117bd74498339 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-01-15 +date: 2024-01-16 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 68a0b064a323c9..44776f64768acf 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-01-15 +date: 2024-01-16 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 c261ff6a6b6d1e..75fe25651c974f 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-01-15 +date: 2024-01-16 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 f1ea640e8cd8a9..b579a9c551abdd 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-01-15 +date: 2024-01-16 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 cdc659009d0579..ab586e6c676099 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-01-15 +date: 2024-01-16 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 cf579739282e47..e74a616a44a745 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 fb28b26799787e..5a739b128c83a3 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 a091590593d049..b16664a213e991 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 aea86778655665..13c905d353de7d 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 14d27173ce197c..bde774c8b57849 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 8e7251ac1ff1b6..766d7392c500b7 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 0fdcb8f6402563..abb25a85ed4add 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-01-15 +date: 2024-01-16 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 552d46a472bad5..821347f8cf10bb 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-01-15 +date: 2024-01-16 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 f9dbc80f44b258..71f0badbf1fe9f 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 742c1861ac1541..20b98254a61de1 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-01-15 +date: 2024-01-16 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.devdocs.json b/api_docs/kbn_ml_in_memory_table.devdocs.json index 4f21249865b518..6d72e5a158c23e 100644 --- a/api_docs/kbn_ml_in_memory_table.devdocs.json +++ b/api_docs/kbn_ml_in_memory_table.devdocs.json @@ -29,7 +29,9 @@ "\nHook to help with managing the pagination and sorting for EuiInMemoryTable" ], "signature": [ - "(items: T[], initialSortField: string, initialSortDirection: \"asc\" | \"desc\") => { onTableChange: ({ page, sort }: ", + "(items: T[], initialSortField: string, initialSortDirection: \"asc\" | \"desc\", initialPagionation: Partial<", + "Pagination", + "> | undefined) => { onTableChange: ({ page, sort }: ", "Criteria", ") => void; pagination: ", "Pagination", @@ -91,6 +93,23 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/ml-in-memory-table", + "id": "def-common.useTableState.$4", + "type": "Object", + "tags": [], + "label": "initialPagionation", + "description": [], + "signature": [ + "Partial<", + "Pagination", + "> | undefined" + ], + "path": "x-pack/packages/ml/in_memory_table/hooks/use_table_state.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [], diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 477e1c502f9286..3fff58bba44a88 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 11 | 0 | 0 | 0 | +| 12 | 0 | 1 | 0 | ## Common diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 468afac68c30c6..11125e28021c0d 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-01-15 +date: 2024-01-16 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 60b64ab39036c6..caf34c7643ef53 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-01-15 +date: 2024-01-16 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 9dc07bd5cfcc47..1ae4b7fa80e143 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-01-15 +date: 2024-01-16 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 2a38ccbc79fd8d..28ddb3c8fe9fbd 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-01-15 +date: 2024-01-16 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 e85c5b7e3d9fa8..e6e3f8ac7ce6fb 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-01-15 +date: 2024-01-16 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 7a3c54ec9f0470..3718d23cca5926 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 e935db6f91f779..c6e45c496663bf 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 eaccadf7cc4055..45741e00c79352 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 95a782df5169a9..6d02327c8a09f4 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 270da76b0d6fe2..153d4d07869da6 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 9306893c14969f..0f596c4bd3a83f 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-01-15 +date: 2024-01-16 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 7e4012b49d1c65..25475146958170 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index d26dde8770eb52..6ec48444b5c2c2 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 73dcfc4a015741..3a8348ecccb04c 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index b1c1f7ebc5b203..7b077dfe667147 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index da7da3eeb6252f..7d192e8ffeb811 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-01-15 +date: 2024-01-16 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 ded113186d94aa..328ee38356dbec 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-01-15 +date: 2024-01-16 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 b539deb882e5ac..a5980eaa0a80ab 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index ef9bbff418f2a6..ffc62c14684aab 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index ac72ddb751307e..324adb788b92f0 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index b7b14e2c749ff4..513e9611a91a7d 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index a8e87b545af48a..6c8c5a64487ec6 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 8a1b4c3bd01b59..c90503239435e1 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-01-15 +date: 2024-01-16 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 b2d8e1ff0f85e3..6597b17e7f796c 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-01-15 +date: 2024-01-16 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 28dd14ce0a704a..4a467ad810c8ca 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 6a49352183358f..dbe4082fcd87ff 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 5348af0a07647b..a16995deb18b25 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-01-15 +date: 2024-01-16 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 b1efdb18a45e0c..7f34ea6fd5e04e 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-01-15 +date: 2024-01-16 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 9aae6122d665a3..913cddd71221d7 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-01-15 +date: 2024-01-16 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 e9bbc7c647e3ae..5fc9077dad8999 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 50f357b98296d0..dc8001b6da57b9 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-01-15 +date: 2024-01-16 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 ab2d569c37f25e..df1fb9a7a4daee 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-01-15 +date: 2024-01-16 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 a5f47ef243dfef..d03b8bf43fd766 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-01-15 +date: 2024-01-16 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 028d22c2f79e98..60b6ea7dc696c9 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-01-15 +date: 2024-01-16 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 d6953439810562..3723231f1b60bb 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-01-15 +date: 2024-01-16 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 e48beaa507f52e..376409ca25c8ee 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-01-15 +date: 2024-01-16 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 b26d543fc5ecb8..d543c5bce5f914 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-01-15 +date: 2024-01-16 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 a276e09fbfe156..47c2eb8a3fd3f4 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-01-15 +date: 2024-01-16 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 c37e1d42a2dc0f..720606161c8c37 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-01-15 +date: 2024-01-16 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 8b2c977338a6f9..efd53288912c81 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-01-15 +date: 2024-01-16 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 adc4c421ba31b1..acd2686b2f7b08 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-01-15 +date: 2024-01-16 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 c7b6a86571b7f7..946cd1a97a27db 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-01-15 +date: 2024-01-16 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 80537f7ce8f37e..44d73b8c1fda6f 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2f161ea89b9f9b..3999771a4298bb 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 34ed1bed29f8b8..0a4ce5bbb50687 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index e8ebf1330d8e13..c2ff704ea50e29 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 1aa5ffcb563a89..24d0f9dcf94b27 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index fdf71a733bda15..7c7cd7d35fa944 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index c7b3e6f0fe3bbb..8a18e0f08598b2 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index fcf5613632b2e6..6c40fa8adf126a 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 1abef49fb9a21b..a07d07d6f61c05 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index bab1bd487f51ce..6fadd760f19380 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 3e9d033fa9974b..6ef9af01f9a241 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 96a98b1b1cc3e6..73ea9ed4746034 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index a775744edfc957..497c266e7e4922 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 5306c503aa0f28..db1e7806d6c897 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-01-15 +date: 2024-01-16 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 cf40c45e1688fe..863a00da7e580e 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 b62696eb85bcb3..a0bf6d93af6f8f 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-01-15 +date: 2024-01-16 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 52081096eee35c..e6d5aaccdcee08 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-01-15 +date: 2024-01-16 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 47c3b726ea9493..a82ee73b97da33 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index fb78e8fb374132..837695f1d1c2c2 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 826cab9ae82f44..101317585d439d 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index edc99913407890..c45539c54f8206 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 4d9acca13e12d1..bdd4c36e40184f 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 1b7c1a4d92ef96..bb81ba4e2023b0 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 9c7f4920c6bf1d..25f761fdb0a7b8 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 2d3e6c5cc33286..637f2826552e1a 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-01-15 +date: 2024-01-16 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 0847774e71f961..8baef6b220ad66 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-01-15 +date: 2024-01-16 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 61a4373d85c1ba..b6f90c48f143c8 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-01-15 +date: 2024-01-16 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 1e39574a69f7a9..0dfd17f2cfef68 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-01-15 +date: 2024-01-16 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 ace271828b8aa7..ee0eaf9c7d30df 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-01-15 +date: 2024-01-16 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 a6cd8b647a2072..1a06d4bf8fa775 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-01-15 +date: 2024-01-16 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 277b0d894b855e..4ac91cce6174bd 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-01-15 +date: 2024-01-16 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 c0566e35b5b9fc..da28cfffddb3db 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 561ff3dd85867c..ac77af1bcb0c43 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-01-15 +date: 2024-01-16 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 45a9a93164180f..8a0c535e40d0b8 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: 2024-01-15 +date: 2024-01-16 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 427239167f9adb..22762f35d235fb 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 0a261468ea64c0..6772533df4163b 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-01-15 +date: 2024-01-16 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 38005df5f0cb3a..0c2daa6517d049 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-01-15 +date: 2024-01-16 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 5673ed1e789ed9..30ac8197711552 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-01-15 +date: 2024-01-16 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 874e3cc84377a8..cfcbae417820b4 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 484cb64b6d1b06..396d2665cee8f7 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-01-15 +date: 2024-01-16 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 bc702b7390d19d..87ee63945dd1bc 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-01-15 +date: 2024-01-16 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 1f423367ac5093..7ab52bb381bbb7 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-01-15 +date: 2024-01-16 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 3165d2ae8a34a9..1889f065c9d581 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 14429cde8c8dcc..43c4b3d933ffe7 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-01-15 +date: 2024-01-16 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 aa087d19723508..7d525cf5b3d6c2 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-01-15 +date: 2024-01-16 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 747e96e315d22c..2111733c7f8612 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 e9fce49aa79bca..aeed93c8fefb61 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-01-15 +date: 2024-01-16 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 0a039fadbc0f76..5858da39a3b95e 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-01-15 +date: 2024-01-16 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 2278dad8d4f780..259eb5cda193da 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-01-15 +date: 2024-01-16 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 c2e3d2e7761c50..6276f33bccb121 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-01-15 +date: 2024-01-16 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 f41058bd884f69..acd1c606df4556 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-01-15 +date: 2024-01-16 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 7670c5cee40146..a509f94f7a99a4 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-01-15 +date: 2024-01-16 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 5fe3301a47d7d2..d5be722a0c795c 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-01-15 +date: 2024-01-16 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 f688b0d414a930..68e80a321166ee 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-01-15 +date: 2024-01-16 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 4d0e59a71f01bf..913e6cf1d07d06 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-01-15 +date: 2024-01-16 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 a78ffc8fc070dc..128a83059bf386 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 1e741074d37c4b..96430b82d45e98 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index db618fe446da41..6a511afc5884ee 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-01-15 +date: 2024-01-16 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 fb948097a732e6..afbb9a093725e8 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-01-15 +date: 2024-01-16 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 c6bc3708c9f622..1e7fcc28245755 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 aaf3f2d6c831eb..4faa2cb1426ad8 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index a49925be7b1b71..078ad20536ad4e 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 563baaa4d22a26..bcc2dc1c7c1788 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-01-15 +date: 2024-01-16 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 793b6158965167..0e1108a16e9b13 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-01-15 +date: 2024-01-16 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 c895ea6b63395f..fd6534b5d1b8d2 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 56e582dbe79b92..2646632c6fd995 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 935ce431499f5b..dd63bdcf5124fb 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-01-15 +date: 2024-01-16 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 16809615961187..52c1f39eda2e6e 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-01-15 +date: 2024-01-16 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 9fe31500a220e1..6931644afa4e0f 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-01-15 +date: 2024-01-16 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 89a8c5a34f4d5e..31c8f64be4c4b4 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-01-15 +date: 2024-01-16 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 faa5ef281a30ed..9993a1ddd789d6 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-01-15 +date: 2024-01-16 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 e4d3b53308d887..5f85c44674b1f0 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 863e722b74e701..4cae4743e02517 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-01-15 +date: 2024-01-16 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 a2daf70dafc728..b539a5392fea33 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 7c2aecd62f3979..dfd08881fd78ee 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-01-15 +date: 2024-01-16 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 c7aab6f048287a..28725b6891e108 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 3ee2c573f60f95..9332414f24a492 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-01-15 +date: 2024-01-16 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 55f4405120e080..51453742c80d13 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 35c304278c015e..12a9d365bfaf77 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-01-15 +date: 2024-01-16 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 8f9208154a7662..bbd4501efc62aa 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 8f023979e654b7..c7ba640d1ec93f 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-01-15 +date: 2024-01-16 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 227efd952a9d6c..d5205eff918d22 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-01-15 +date: 2024-01-16 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 1b7c53b86d714a..bbffc266e93083 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 2f837229712f6a..345e2856028c8f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 a6cc929cdd7bc1..c9b2c1803ce2d8 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-01-15 +date: 2024-01-16 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 4f5da4bc20c1d3..22a440c73e9381 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-01-15 +date: 2024-01-16 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 3fcf988ae7581b..27fdbf063c8cf9 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 f4a14855a579f0..9b6d3380938ea1 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-01-15 +date: 2024-01-16 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 6e9cd06de98b8c..1276e6eaa34b48 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-01-15 +date: 2024-01-16 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 435898d43859fa..6cde2047ee863d 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-01-15 +date: 2024-01-16 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 d78905393b9119..63ee372b6297c7 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-01-15 +date: 2024-01-16 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 c639cd36a5ad3f..5877795e1dcf83 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-01-15 +date: 2024-01-16 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 973339942ae064..39dbfc2c538cb0 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-01-15 +date: 2024-01-16 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 102110a9c9537e..83538d7689e169 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-01-15 +date: 2024-01-16 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 bbc9fd233948fc..691291f4b21f24 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-01-15 +date: 2024-01-16 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 98d3d274e74e5b..292497286f872b 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-01-15 +date: 2024-01-16 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 3890f43f31bcf2..06df3130ac4f40 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-01-15 +date: 2024-01-16 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 8ccfba7ea7d490..47f0d52f5eaa6b 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-01-15 +date: 2024-01-16 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 716fe34835301d..1c16f4766a2051 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-01-15 +date: 2024-01-16 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 00c156cd84e4dd..0578a1af4f5d19 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 1764b3000eeb6a..661f84d3afe7ac 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index e601c480127ffb..8587cbfce3d704 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-01-15 +date: 2024-01-16 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 dfea9a9dc7a307..be2f1872e0c06c 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-01-15 +date: 2024-01-16 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 ee86253a4bfd75..d584d47f8e92a7 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-01-15 +date: 2024-01-16 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 0b64bc910710d7..c91b34cf03183f 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 7201da25b4c04a..ee33131bea7c47 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index ca5b70465810ef..bd74278992303d 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-01-15 +date: 2024-01-16 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 43d7bb1b429c89..1f95dd18c0c89c 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-01-15 +date: 2024-01-16 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 9636503c0f2ea8..cf947dda613e43 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-01-15 +date: 2024-01-16 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 f5bea1a20f7675..bccd65ae034f00 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-01-15 +date: 2024-01-16 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 2e59fbad9ccf28..433fa1d7a0a4e2 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-01-15 +date: 2024-01-16 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 d278d9c555f31e..00efa7ab17ac76 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-01-15 +date: 2024-01-16 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 fbf7e54e246f5a..0fdc9a34411aec 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-01-15 +date: 2024-01-16 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 b86a24fd621c11..8279a5b968d821 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 10ef34ba231c34..0cbdc049b4716c 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 972c5c9f4d267c..9bcb1f277ef8ab 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: 2024-01-15 +date: 2024-01-16 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 ce6db53fd4d021..415dd95d390292 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-01-15 +date: 2024-01-16 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 b4d05e4eb1c29e..75126105e39a46 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-01-15 +date: 2024-01-16 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 acac7880a4412a..4302a69f1c375e 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-01-15 +date: 2024-01-16 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 b0e99baaae3c83..af5057a7e47265 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-01-15 +date: 2024-01-16 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 b2184700333beb..c171fcf22c3cc0 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-01-15 +date: 2024-01-16 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 9d53e9cfdd390d..a6efb574da65b5 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 1dcf2d3f7c86e4..19b58ba0649694 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 1437118d12333d..0a70ee3d996451 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-01-15 +date: 2024-01-16 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 be58c576dd74c3..f480feeb6621a0 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index abf10edd7597e0..527997dfd5c12d 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 5ff7485c6eb375..cc0697604af710 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index f5cfba25bab54b..f448e22bc2faff 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-01-15 +date: 2024-01-16 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 a4a2e516b8a9aa..2db5fb4ad16fbe 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-01-15 +date: 2024-01-16 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 b2d924553beb5d..6e6aacb00f1726 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-01-15 +date: 2024-01-16 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 b6a2553cf11495..9b99764cf44aff 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-01-15 +date: 2024-01-16 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 4e5c03561c7824..9d49c301b81a8e 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-01-15 +date: 2024-01-16 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 cfe4a6fc652980..f38aaeae7cad1c 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-01-15 +date: 2024-01-16 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 200f4d29a07800..feb537b00defc4 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 59592e9bbdd661..bdd3aad9ea793a 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 09e19d7ba7b10a..843b3b81f56ac0 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-01-15 +date: 2024-01-16 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 a25afaa9b87086..d63f69e02bcce5 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: 2024-01-15 +date: 2024-01-16 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 71aae8dbc07c39..52c11c5f382c18 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-01-15 +date: 2024-01-16 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 61f5fe658b3455..117c8fc15e3db2 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-01-15 +date: 2024-01-16 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 273367891320b4..7b0e0631f88066 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-01-15 +date: 2024-01-16 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 1077b2c873d699..fbdbd2b3b1e6a6 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index c2b604d596b421..dc325a53d9759e 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 07c71a75b6d2d9..18f2a4a9eeb2c1 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 48c241631ae0cb..7a08b5fc30a78b 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 96dd20f391ca7c..ed455232b960ae 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-01-15 +date: 2024-01-16 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 52271af4e95a26..0ef4e0c867c253 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-01-15 +date: 2024-01-16 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 1a34b348258cb1..7ad757bf750bd6 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-01-15 +date: 2024-01-16 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 39015aa639766b..810cbcddff38ed 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-01-15 +date: 2024-01-16 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 db9a8def51f7ea..24e4d1a66c7bad 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-01-15 +date: 2024-01-16 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 083fff7a473441..0d87d50aed7cb7 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-01-15 +date: 2024-01-16 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 39e0cd8c5e09b7..b8520a0515540e 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-01-15 +date: 2024-01-16 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 9007247628319a..e46bf9cabe7682 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 80098efc7669d2..8fcdda5ec9a751 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 58a36884be33bf..6771bd1bad0739 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index e68d728dd40ac0..6f31481743603c 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-01-15 +date: 2024-01-16 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 c93ec28c4df629..be093d0103c2ae 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-01-15 +date: 2024-01-16 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 967a7e03952d80..5262f6c28d38f8 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-01-15 +date: 2024-01-16 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 725ad433b62640..11987a95c78535 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 78808 | 240 | 67475 | 1701 | +| 78851 | 240 | 67518 | 1702 | ## 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 | 109 | 0 | 106 | 11 | | | [@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. | 3188 | 31 | 2537 | 22 | +| | [@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. | 3220 | 31 | 2569 | 23 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -237,7 +237,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 34 | 0 | 34 | 8 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 44 | 0 | 44 | 8 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 188 | 0 | 188 | 28 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | @@ -517,7 +517,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 48 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 11 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 36 | 4 | 8 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 11 | 0 | 0 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 12 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 5 | 0 | 3 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 3d9903b5128e29..c890ad8e3cf639 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-01-15 +date: 2024-01-16 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 28a25d3eccb85c..ddb631a1b98786 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-01-15 +date: 2024-01-16 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 d86c545ef30023..9adb71e7151074 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-01-15 +date: 2024-01-16 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 7aad596b1859bd..a1ec8508df6338 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-01-15 +date: 2024-01-16 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 6ad14d8353d3ff..03d0f2252c9ea2 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-01-15 +date: 2024-01-16 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 eee57ec6f2a871..ac5d5e91b75bd8 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-01-15 +date: 2024-01-16 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 337b2dbd731ee7..1fe6dbb13279c7 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-01-15 +date: 2024-01-16 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 b20439c39ffa95..af372f38dac0c8 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-01-15 +date: 2024-01-16 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 51a57162fd9640..70f5207f1f2b3b 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-01-15 +date: 2024-01-16 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 fdc483de84d2d3..0885542ea71d9e 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-01-15 +date: 2024-01-16 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 fe39342ef1d26e..1acd8a227c6e6b 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-01-15 +date: 2024-01-16 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 043713d08a36e1..16cd81cb24ea59 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-01-15 +date: 2024-01-16 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 ad8cb0c67bae4f..c283dde9575045 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-01-15 +date: 2024-01-16 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 06342dbf5ae1cc..033fbd00937acd 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-01-15 +date: 2024-01-16 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 69102f68409bfa..57a2adbbff3b57 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-01-15 +date: 2024-01-16 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 fa96416329ed46..87f40cdc501b3a 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-01-15 +date: 2024-01-16 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 a0c708ca372ed0..0f7f31d17a0600 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 3b6fb15c827846..aa8a4abeccd8be 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -114,7 +114,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false, @@ -568,7 +568,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" + "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -648,7 +648,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" + "\"assistantModelEvaluation\" | \"assistantStreamingEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1913,7 +1913,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3018,7 +3018,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3194,7 +3194,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3243,7 +3243,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index bd56f8ccb4be65..bf137d734a014b 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-01-15 +date: 2024-01-16 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 f02aa545add052..6e6e5d8ad57bab 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-01-15 +date: 2024-01-16 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 7f393a00e04795..973ae77528bdac 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-01-15 +date: 2024-01-16 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 c3996af084a95b..b5d8130b223768 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-01-15 +date: 2024-01-16 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 38881a6e4e67a7..310e9bb0b101a5 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-01-15 +date: 2024-01-16 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 d2b2e866619359..2eb484e9faf83c 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-01-15 +date: 2024-01-16 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 2e499d356fd525..20c881bd38101e 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-01-15 +date: 2024-01-16 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 ec00aa883a51bc..abefa1da21aa99 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-01-15 +date: 2024-01-16 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 22b33fa0516661..7aaaf810b0fd3b 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index f52ada76722942..f3b0e95a6c9d89 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 043a111ce9b4d0..df50a30360d67a 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-01-15 +date: 2024-01-16 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 a73cac5f5bd602..40efd539d3491e 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-01-15 +date: 2024-01-16 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 7987f21f3ea736..9a21be19608839 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-01-15 +date: 2024-01-16 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 ccdd5834283acc..23ac47e1f021ea 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-01-15 +date: 2024-01-16 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 5eed854edc99fc..f19ee99f8459ff 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-01-15 +date: 2024-01-16 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 b2cc123f9022d6..5c2eddc799feaf 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-01-15 +date: 2024-01-16 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 30de79bafdb393..f2cb169f302f27 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-01-15 +date: 2024-01-16 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 01cc6dfb6e39cb..fd7f6654c4adba 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-01-15 +date: 2024-01-16 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 5ffbb3f1621b2f..9c53778382f93a 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-01-15 +date: 2024-01-16 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 457c9b1189dac7..27e097bc61c7c5 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-01-15 +date: 2024-01-16 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 46ddbcbdbd0504..844bafafd1aa29 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-01-15 +date: 2024-01-16 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 16f10dba2d051f..d723c422fbe062 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-01-15 +date: 2024-01-16 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 d1086bb470f82d..78d58cba5c4c60 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-01-15 +date: 2024-01-16 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 a9e2315bf9d70d..1d7baa3745e16c 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-01-15 +date: 2024-01-16 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 f7a7a766e82a5a..447cdf99988ca7 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index effbb47b9d5c3e..b9166917e32a53 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-01-15 +date: 2024-01-16 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 c989ef1aaafb9a..22845b8d661973 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-01-15 +date: 2024-01-16 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 03853135b5c3e6..e803d6bb209adc 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-01-15 +date: 2024-01-16 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 a847fdf6533d7f..26ab7917cd8790 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-01-15 +date: 2024-01-16 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 e2bac0b6361fe1..2b93ed71a15783 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-01-15 +date: 2024-01-16 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 f9d7cda12eea1d..7aa36df387b3cb 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-01-15 +date: 2024-01-16 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 e35f68bba45a29..0b9b4f7cc3b217 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-01-15 +date: 2024-01-16 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 55e8580d8bf02f..b9d3137a298173 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-01-15 +date: 2024-01-16 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 ddf2ed12e39a34..c37d13e4c6c58f 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-01-15 +date: 2024-01-16 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 7246063ecc5418..4900e6fd373511 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-01-15 +date: 2024-01-16 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 8ace07e0fd15a8..47d658e2553b84 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-01-15 +date: 2024-01-16 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 d716543c1b3166..382aa1fb53c9fa 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-01-15 +date: 2024-01-16 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 e43b6ddbd2f09b..3d9c6c44565ce8 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-01-15 +date: 2024-01-16 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 b1f3e1ea7ce635..453e5685cdd279 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-01-15 +date: 2024-01-16 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 c1ad0b059a1a83..a760a43b9aaf5a 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-01-15 +date: 2024-01-16 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 356c5e1bc18641..ad87d73ec3e143 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-01-15 +date: 2024-01-16 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 9d183232772636..b69aa9902ced53 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-01-15 +date: 2024-01-16 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 fc841660121a08..baa870f59a587f 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-01-15 +date: 2024-01-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/docs/management/maintenance-windows/images/create-maintenance-window-filter.png b/docs/management/maintenance-windows/images/create-maintenance-window-filter.png new file mode 100644 index 00000000000000..23877293e426f3 Binary files /dev/null and b/docs/management/maintenance-windows/images/create-maintenance-window-filter.png differ diff --git a/docs/management/maintenance-windows/images/create-maintenance-window.png b/docs/management/maintenance-windows/images/create-maintenance-window.png index c6953d4e48693e..b48c52ae9448d1 100644 Binary files a/docs/management/maintenance-windows/images/create-maintenance-window.png and b/docs/management/maintenance-windows/images/create-maintenance-window.png differ diff --git a/docs/management/maintenance-windows/maintenance-windows.asciidoc b/docs/management/maintenance-windows/maintenance-windows.asciidoc index 9f7ffbae80edd1..4bbdfb745022b9 100644 --- a/docs/management/maintenance-windows/maintenance-windows.asciidoc +++ b/docs/management/maintenance-windows/maintenance-windows.asciidoc @@ -25,7 +25,7 @@ When the alert recovers, there are no notifications--even if the recovery occurs To use maintenance windows, you must have the appropriate {subscriptions}[subscription] and {kib} feature privileges. - To have full access to maintenance windows, you must have `All` privileges for the *Management > Maintenance Windows* feature. -- To have view-only access to maintenance windows, you must have `Read` privileges for the **Management > Maintenance Windows* feature. +- To have view-only access to maintenance windows, you must have `Read` privileges for the *Management > Maintenance Windows* feature. For more details, refer to <>. @@ -46,6 +46,18 @@ By default, maintenance windows affect all categories of rules. The category-specific maintenance window options alter this behavior. For the definitive list of rule types in each category, refer to the <>. +If you turn on *Filter alerts*, you can use KQL to filter the alerts affected by the maintenance window: + +[role="screenshot"] +image::images/create-maintenance-window-filter.png[The Create Maintenance Window user interface in {kib} with alert filters turned on] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[NOTE] +==== +* You can select only a single category when you turn on filters. +* Some rules are not affected by maintenance window filters because their alerts do not contain requisite data. In particular, <>, <>, {ml-docs}/ml-configuring-alerts.html[{anomaly-jobs} health], and {ref}/transform-alerts.html[transform health] rules are not affected by the filters. +==== + A maintenance window can have any one of the following statuses: - `Upcoming`: It will run at the scheduled date and time. diff --git a/fleet_packages.json b/fleet_packages.json index 1d70d88ee783f2..fac968262d64b2 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -24,7 +24,7 @@ [ { "name": "apm", - "version": "8.13.0-preview-1705022233", + "version": "8.13.0-preview-1705349439", "forceAlignStackVersion": true, "allowSyncToPrerelease": true }, diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.mocks.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.mocks.ts new file mode 100644 index 00000000000000..be92b3fc91ef12 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.mocks.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const getSavedObjectFromSourceMock = jest.fn(); +export const rawDocExistsInNamespaceMock = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + getSavedObjectFromSource: getSavedObjectFromSourceMock, + rawDocExistsInNamespace: rawDocExistsInNamespaceMock, + }; +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.ts new file mode 100644 index 00000000000000..f76747fdfab8c9 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.isolated.test.ts @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { + getSavedObjectFromSourceMock, + rawDocExistsInNamespaceMock, +} from './bulk_get.isolated.test.mocks'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { SavedObject, CheckAuthorizationResult } from '@kbn/core-saved-objects-server'; +import { apiContextMock, ApiExecutionContextMock } from '../../mocks'; +import { performBulkGet } from './bulk_get'; + +interface ObjectInfo { + id: string; + type: string; + attributes: Record; +} + +const mgetResultToSavedObject = (hit: estypes.GetGetResult): SavedObject => { + const type = hit._source.type; + return { + type, + id: hit._id, + references: [], + attributes: hit._source[type], + }; +}; + +const createMgetResult = (object: ObjectInfo): estypes.GetGetResult => { + return { + _index: '.kibana', + found: true, + _id: object.id, + _source: { + type: object.type, + [object.type]: object.attributes, + }, + }; +}; + +const createMgetResponse = (objects: ObjectInfo[]): estypes.MgetResponse => { + return { + docs: objects.map(createMgetResult), + }; +}; + +describe('performBulkGet', () => { + let apiContext: ApiExecutionContextMock; + + beforeEach(() => { + apiContext = apiContextMock.create({ + allowedTypes: ['type'], + }); + + apiContext.helpers.common.getCurrentNamespace.mockReturnValue('default'); + apiContext.extensions.spacesExtension.getSearchableNamespaces.mockResolvedValue(['default']); + + getSavedObjectFromSourceMock.mockReset(); + rawDocExistsInNamespaceMock.mockReset().mockResolvedValue(true); + }); + + it('calls migrationHelper.migrateAndDecryptStorageDocument with the correct parameters', async () => { + const type = 'type'; + + apiContext.client.mget.mockResponse( + createMgetResponse([ + { + type, + id: 'id1', + attributes: { foo: '1' }, + }, + { + type, + id: 'id2', + attributes: { foo: '2' }, + }, + ]) + ); + + getSavedObjectFromSourceMock.mockImplementation((_registry, _type, _id, doc) => + mgetResultToSavedObject(doc) + ); + + const checkResult: CheckAuthorizationResult = { + status: 'fully_authorized', + typeMap: new Map(), + }; + apiContext.extensions.securityExtension.authorizeBulkGet.mockResolvedValue(checkResult); + + await performBulkGet( + { + objects: [ + { + type, + id: 'id1', + }, + { + type, + id: 'id2', + }, + ], + options: {}, + }, + apiContext + ); + + const results = getSavedObjectFromSourceMock.mock.results; + + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledTimes( + results.length + ); + results.forEach((result) => { + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledWith({ + document: result.value, + typeMap: checkResult.typeMap, + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.ts index 3a135d4b73ce84..76d07d8e8f705d 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_get.ts @@ -46,20 +46,11 @@ type ExpectedBulkGetResult = Either< export const performBulkGet = async ( { objects, options }: PerformBulkGetParams, - { - helpers, - allowedTypes, - client, - migrator, - serializer, - registry, - extensions = {}, - }: ApiExecutionContext + { helpers, allowedTypes, client, serializer, registry, extensions = {} }: ApiExecutionContext ): Promise> => { const { common: commonHelper, validation: validationHelper, - encryption: encryptionHelper, migration: migrationHelper, } = helpers; const { securityExtension, spacesExtension } = extensions; @@ -162,61 +153,67 @@ export const performBulkGet = async ( } const authObjects: AuthorizeBulkGetObject[] = []; - const result = { - saved_objects: expectedBulkGetResults.map((expectedResult) => { - if (isLeft(expectedResult)) { - const { type, id } = expectedResult.value; - authObjects.push({ type, id, existingNamespaces: [], error: true }); - return expectedResult.value as any; - } + const documents = expectedBulkGetResults.map>((expectedResult) => { + if (isLeft(expectedResult)) { + const { type, id } = expectedResult.value; + authObjects.push({ type, id, existingNamespaces: [], error: true }); + return expectedResult.value as any; + } - const { - type, - id, - // set to default namespaces value for `rawDocExistsInNamespaces` check below - namespaces = [SavedObjectsUtils.namespaceIdToString(namespace)], - esRequestIndex, - } = expectedResult.value; + const { + type, + id, + // set to default namespaces value for `rawDocExistsInNamespaces` check below + namespaces = [SavedObjectsUtils.namespaceIdToString(namespace)], + esRequestIndex, + } = expectedResult.value; + + const doc = bulkGetResponse?.body.docs[esRequestIndex]; - const doc = bulkGetResponse?.body.docs[esRequestIndex]; + // @ts-expect-error MultiGetHit._source is optional + const docNotFound = !doc?.found || !rawDocExistsInNamespaces(registry, doc, namespaces); + authObjects.push({ + type, + id, + objectNamespaces: namespaces, // @ts-expect-error MultiGetHit._source is optional - const docNotFound = !doc?.found || !rawDocExistsInNamespaces(registry, doc, namespaces); + existingNamespaces: doc?._source?.namespaces ?? [], + error: docNotFound, + }); - authObjects.push({ - type, + if (docNotFound) { + return { id, - objectNamespaces: namespaces, - // @ts-expect-error MultiGetHit._source is optional - existingNamespaces: doc?._source?.namespaces ?? [], - error: docNotFound, - }); - - if (docNotFound) { - return { - id, - type, - error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), - } as any as SavedObject; - } - - // @ts-expect-error MultiGetHit._source is optional - const document = getSavedObjectFromSource(registry, type, id, doc, { - migrationVersionCompatibility, - }); - const migrated = migrationHelper.migrateStorageDocument(document); + type, + error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), + } as any as SavedObject; + } - return migrated; - }), - }; + // @ts-expect-error MultiGetHit._source is optional + return getSavedObjectFromSource(registry, type, id, doc, { + migrationVersionCompatibility, + }); + }); const authorizationResult = await securityExtension?.authorizeBulkGet({ namespace, objects: authObjects, }); - return encryptionHelper.optionallyDecryptAndRedactBulkResult( - result, - authorizationResult?.typeMap - ); + const results: Array> = []; + for (const doc of documents) { + results.push( + doc.error + ? doc + : await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap: authorizationResult?.typeMap, + }) + ); + } + + return { + saved_objects: results, + }; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts index a71f8e27ccb983..77545f73f6bfa8 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.test.ts @@ -114,7 +114,10 @@ describe('#bulkResolve', () => { ], }); expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); - expect(mockInternalBulkResolve).toHaveBeenCalledWith(expect.objectContaining({ objects })); + expect(mockInternalBulkResolve).toHaveBeenCalledWith( + expect.objectContaining({ objects }), + expect.any(Object) + ); }); it('throws when internalBulkResolve throws', async () => { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.ts index a18b69ec29bf6b..40d0931808e9ce 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_resolve.ts @@ -27,33 +27,19 @@ export const performBulkResolve = async ( { objects, options }: PerformCreateParams, apiExecutionContext: ApiExecutionContext ): Promise> => { - const { - registry, - helpers, - allowedTypes, - client, - migrator, - serializer, - extensions = {}, - } = apiExecutionContext; - const { common: commonHelper } = helpers; - const { securityExtension, encryptionExtension } = extensions; + const { common: commonHelper } = apiExecutionContext.helpers; const namespace = commonHelper.getCurrentNamespace(options.namespace); - const { resolved_objects: bulkResults } = await internalBulkResolve({ - registry, - allowedTypes, - client, - migrator, - serializer, - getIndexForType: commonHelper.getIndexForType.bind(commonHelper), - incrementCounterInternal: (type, id, counterFields, opts = {}) => - incrementCounterInternal({ type, id, counterFields, options: opts }, apiExecutionContext), - encryptionExtension, - securityExtension, - objects, - options: { ...options, namespace }, - }); + const { resolved_objects: bulkResults } = await internalBulkResolve( + { + objects, + options: { ...options, namespace }, + incrementCounterInternal: (type, id, counterFields, opts = {}) => + incrementCounterInternal({ type, id, counterFields, options: opts }, apiExecutionContext), + }, + apiExecutionContext + ); + const resolvedObjects = bulkResults.map>((result) => { // extract payloads from saved object errors if (isBulkResolveError(result)) { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.mocks.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.mocks.ts new file mode 100644 index 00000000000000..ec5154bcd38c1b --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.mocks.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const isSupportedEsServerMock = jest.fn(); + +jest.doMock('@kbn/core-elasticsearch-server-internal', () => { + const actual = jest.requireActual('@kbn/core-elasticsearch-server-internal'); + return { + ...actual, + isSupportedEsServer: isSupportedEsServerMock, + }; +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts new file mode 100644 index 00000000000000..b2a30d24a7bee7 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.isolated.test.ts @@ -0,0 +1,113 @@ +/* + * Copyright 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 { isSupportedEsServerMock } from './find.isolated.test.mocks'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { SavedObject, AuthorizationTypeMap } from '@kbn/core-saved-objects-server'; +import { apiContextMock, ApiExecutionContextMock } from '../../mocks'; +import { performFind } from './find'; + +interface ObjectInfo { + id: string; + type: string; + attributes: Record; +} + +const hitToSavedObject = (hit: estypes.SearchHit): SavedObject => { + const type = hit._source.type; + return { + type, + id: hit._id, + references: [], + attributes: hit._source[type], + }; +}; + +const createHit = ({ type, id, attributes }: ObjectInfo): estypes.SearchHit => { + return { + _index: '.kibana', + _id: id, + _score: 1, + _seq_no: 1, + _primary_term: 1, + _source: { + type, + references: [], + [type]: attributes, + }, + }; +}; + +const createSuccessSearchResponse = (objects: ObjectInfo[]): estypes.SearchResponse => { + return { + took: 1, + timed_out: false, + _shards: {} as any, + hits: { + total: objects.length, + hits: objects.map(createHit), + }, + }; +}; + +describe('performFind', () => { + let apiContext: ApiExecutionContextMock; + + beforeEach(() => { + apiContext = apiContextMock.create({ + allowedTypes: ['type'], + }); + + isSupportedEsServerMock.mockReturnValue(true); + + apiContext.helpers.serializer.rawToSavedObject.mockImplementation(hitToSavedObject as any); + apiContext.extensions.spacesExtension.getSearchableNamespaces.mockResolvedValue(['default']); + }); + + it('calls migrationHelper.migrateAndDecryptStorageDocument with the correct parameters', async () => { + const type = 'type'; + + apiContext.client.search.mockResponse( + createSuccessSearchResponse([ + { + type, + id: 'id1', + attributes: { foo: '1' }, + }, + { + type, + id: 'id2', + attributes: { foo: '2' }, + }, + ]) + ); + + const authzTypeMap: AuthorizationTypeMap = new Map(); + apiContext.extensions.securityExtension.getFindRedactTypeMap.mockResolvedValue(authzTypeMap); + + await performFind( + { + options: { type }, + internalOptions: { + disableExtensions: false, + }, + }, + apiContext + ); + + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledTimes(2); + + const results = apiContext.helpers.serializer.rawToSavedObject.mock.results; + results.forEach((result) => { + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledWith({ + document: result.value, + typeMap: authzTypeMap, + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts index 6a16b71b1d9af4..9e6f03d2beac87 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts @@ -266,6 +266,7 @@ describe('find', () => { ...mockTimestampFields, version: mockVersion, score: doc._score, + sort: doc.sort, attributes: doc._source![doc._source!.type], references: [], namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : ['default'], @@ -296,6 +297,7 @@ describe('find', () => { ...mockTimestampFields, version: mockVersion, score: doc._score, + sort: doc.sort, attributes: doc._source![doc._source!.type], references: [], namespaces: doc._source!.type === NAMESPACE_AGNOSTIC_TYPE ? undefined : [namespace], diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.ts index 3346e6552646af..62b5ccb82d68dd 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.ts @@ -13,8 +13,8 @@ import { SavedObjectsErrorHelpers, type SavedObjectsRawDoc, CheckAuthorizationResult, - type SavedObject, SavedObjectsRawDocSource, + GetFindRedactTypeMapParams, } from '@kbn/core-saved-objects-server'; import { DEFAULT_NAMESPACE_STRING, @@ -49,13 +49,11 @@ export const performFind = async ( allowedTypes: rawAllowedTypes, mappings, client, - migrator, extensions = {}, }: ApiExecutionContext ): Promise> => { const { common: commonHelper, - encryption: encryptionHelper, serializer: serializerHelper, migration: migrationHelper, } = helpers; @@ -230,31 +228,52 @@ export const performFind = async ( return SavedObjectsUtils.createEmptyFindResponse(options); } - let result: SavedObjectsFindResponse; + // if extensions are enabled, we need to build an updated authorization type map + // to pass on to the redact method + const redactTypeMapParams: GetFindRedactTypeMapParams | undefined = disableExtensions + ? undefined + : { + previouslyCheckedNamespaces: spacesToAuthorize, + objects: [], + }; + const savedObjects: SavedObjectsFindResult[] = []; + + body.hits.hits.forEach((hit: estypes.SearchHit) => { + const obj = serializerHelper.rawToSavedObject(hit as SavedObjectsRawDoc, { + migrationVersionCompatibility, + }); + + if (redactTypeMapParams) { + redactTypeMapParams.objects.push({ + type: obj.type, + id: obj.id, + existingNamespaces: obj.namespaces ?? [], + }); + } + + savedObjects.push({ + ...obj, + score: hit._score!, + sort: hit.sort, + }); + }); + + const redactTypeMap = redactTypeMapParams + ? await securityExtension?.getFindRedactTypeMap(redactTypeMapParams) + : undefined; + + const migratedDocuments: Array> = []; try { - result = { - ...(body.aggregations ? { aggregations: body.aggregations as unknown as A } : {}), - page, - per_page: perPage, - total: body.hits.total, - saved_objects: body.hits.hits.map( - (hit: estypes.SearchHit): SavedObjectsFindResult => { - let savedObject = serializerHelper.rawToSavedObject(hit as SavedObjectsRawDoc, { - migrationVersionCompatibility, + for (const savedObject of savedObjects) { + const { sort, score, ...rawObject } = savedObject; + const migrated = disableExtensions + ? migrationHelper.migrateStorageDocument(rawObject) + : await migrationHelper.migrateAndDecryptStorageDocument({ + document: rawObject, + typeMap: redactTypeMap, }); - // can't migrate a document with partial attributes - if (!fields) { - savedObject = migrationHelper.migrateStorageDocument(savedObject) as SavedObject; - } - return { - ...savedObject, - score: hit._score!, - sort: hit.sort, - }; - } - ), - pit_id: body.pit_id, - } as typeof result; + migratedDocuments.push({ ...migrated, sort, score } as SavedObjectsFindResult); + } } catch (error) { throw SavedObjectsErrorHelpers.decorateGeneralError( error, @@ -262,25 +281,14 @@ export const performFind = async ( ); } - if (disableExtensions) { - return result; - } - - // Now that we have a full set of results with all existing namespaces for each object, - // we need an updated authorization type map to pass on to the redact method - const redactTypeMap = await securityExtension?.getFindRedactTypeMap({ - previouslyCheckedNamespaces: spacesToAuthorize, - objects: result.saved_objects.map((obj) => { - return { - type: obj.type, - id: obj.id, - existingNamespaces: obj.namespaces ?? [], - }; - }), - }); + const result: SavedObjectsFindResponse = { + ...(body.aggregations ? { aggregations: body.aggregations as unknown as A } : {}), + page, + per_page: perPage, + total: body.hits.total as number, + saved_objects: migratedDocuments, + pit_id: body.pit_id, + }; - return encryptionHelper.optionallyDecryptAndRedactBulkResult( - result, - redactTypeMap ?? authorizationResult?.typeMap // If the redact type map is valid, use that one; otherwise, fall back to the authorization check - ); + return result; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.mocks.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.mocks.ts new file mode 100644 index 00000000000000..e4a205e888132a --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.mocks.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const getSavedObjectFromSourceMock = jest.fn(); +export const isFoundGetResponseMock = jest.fn(); +export const rawDocExistsInNamespaceMock = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + isFoundGetResponse: isFoundGetResponseMock, + getSavedObjectFromSource: getSavedObjectFromSourceMock, + rawDocExistsInNamespace: rawDocExistsInNamespaceMock, + }; +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.ts new file mode 100644 index 00000000000000..b07f573594fece --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.isolated.test.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 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 { + getSavedObjectFromSourceMock, + isFoundGetResponseMock, + rawDocExistsInNamespaceMock, +} from './get.isolated.test.mocks'; +import { SavedObject, CheckAuthorizationResult } from '@kbn/core-saved-objects-server'; +import { apiContextMock, ApiExecutionContextMock } from '../../mocks'; +import { performGet } from './get'; + +const createSavedObject = (id = 'foo'): SavedObject => { + return { + id, + type: 'bar', + attributes: {}, + references: [], + }; +}; + +describe('performGet', () => { + let apiContext: ApiExecutionContextMock; + + beforeEach(() => { + apiContext = apiContextMock.create({ + allowedTypes: ['type'], + }); + + getSavedObjectFromSourceMock.mockReset(); + isFoundGetResponseMock.mockReset().mockReturnValue(true); + rawDocExistsInNamespaceMock.mockReset().mockResolvedValue(true); + + apiContext.client.get.mockResponse({ _index: '.kibana', found: true, _id: '_id' }); + }); + + it('calls migrationHelper.migrateAndDecryptStorageDocument with the correct parameters', async () => { + const savedObject = createSavedObject(); + getSavedObjectFromSourceMock.mockReturnValue(savedObject); + + const checkResult: CheckAuthorizationResult = { + status: 'fully_authorized', + typeMap: new Map(), + }; + apiContext.extensions.securityExtension!.authorizeGet.mockResolvedValue(checkResult); + + const type = 'type'; + const id = 'id'; + + await performGet({ type, id, options: {} }, apiContext); + + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledTimes(1); + expect(apiContext.helpers.migration.migrateAndDecryptStorageDocument).toHaveBeenCalledWith({ + document: savedObject, + typeMap: checkResult.typeMap, + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.ts index 215036f29583cd..602498c3f4293a 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/get.ts @@ -24,21 +24,9 @@ export interface PerformGetParams { export const performGet = async ( { type, id, options }: PerformGetParams, - { - registry, - helpers, - allowedTypes, - client, - migrator, - serializer, - extensions = {}, - }: ApiExecutionContext + { registry, helpers, allowedTypes, client, serializer, extensions = {} }: ApiExecutionContext ): Promise> => { - const { - common: commonHelper, - encryption: encryptionHelper, - migration: migrationHelper, - } = helpers; + const { common: commonHelper, migration: migrationHelper } = helpers; const { securityExtension } = extensions; const namespace = commonHelper.getCurrentNamespace(options.namespace); @@ -84,18 +72,8 @@ export const performGet = async ( migrationVersionCompatibility, }); - let migrated: SavedObject; - try { - migrated = migrationHelper.migrateStorageDocument(document) as SavedObject; - } catch (error) { - throw SavedObjectsErrorHelpers.decorateGeneralError( - error, - 'Failed to migrate document to the latest version.' - ); - } - - return encryptionHelper.optionallyDecryptAndRedactSingleResult( - migrated, - authorizationResult?.typeMap - ); + return await migrationHelper.migrateAndDecryptStorageDocument({ + document, + typeMap: authorizationResult?.typeMap, + }); }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.test.ts new file mode 100644 index 00000000000000..d252f2f2b38e56 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.test.ts @@ -0,0 +1,158 @@ +/* + * Copyright 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 { SavedObject, AuthorizationTypeMap } from '@kbn/core-saved-objects-server'; +import { + createMigratorMock, + createDocumentMigratorMock, + createEncryptionHelperMock, +} from '../../../mocks'; +import { MigrationHelper } from './migration'; + +const createSavedObject = (id = 'foo'): SavedObject => { + return { + id, + type: 'bar', + attributes: {}, + references: [], + }; +}; + +const createTypeMap = (): AuthorizationTypeMap => { + return new Map(); +}; + +describe('MigrationHelper', () => { + let documentMigrator: ReturnType; + let migrator: ReturnType; + let encryptionHelper: ReturnType; + + let migrationHelper: MigrationHelper; + + beforeEach(() => { + documentMigrator = createDocumentMigratorMock(); + migrator = createMigratorMock(); + migrator.getDocumentMigrator.mockReturnValue(documentMigrator); + encryptionHelper = createEncryptionHelperMock(); + + migrator.migrateDocument.mockImplementation((doc: unknown) => doc as any); + encryptionHelper.optionallyDecryptAndRedactSingleResult.mockImplementation( + (doc: unknown) => doc as any + ); + + migrationHelper = new MigrationHelper({ + encryptionHelper, + migrator, + }); + }); + + describe('migrateAndDecryptStorageDocument', () => { + it('calls documentMigrator.isDowngradeRequired with the correct parameters', async () => { + const doc = createSavedObject(); + + await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap: undefined, + }); + + expect(documentMigrator.isDowngradeRequired).toHaveBeenCalledTimes(1); + expect(documentMigrator.isDowngradeRequired).toHaveBeenCalledWith(doc); + }); + + it('calls migrator.migrateDocument with the correct parameters', async () => { + const doc = createSavedObject(); + + await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap: undefined, + }); + + expect(migrator.migrateDocument).toHaveBeenCalledTimes(1); + expect(migrator.migrateDocument).toHaveBeenCalledWith(doc, { allowDowngrade: true }); + }); + + it('calls encryptionHelper.optionallyDecryptAndRedactSingleResult with the correct parameters', async () => { + const doc = createSavedObject(); + const typeMap = createTypeMap(); + const originalAttributes = { unknown: true }; + + await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap, + originalAttributes, + }); + + expect(encryptionHelper.optionallyDecryptAndRedactSingleResult).toHaveBeenCalledTimes(1); + expect(encryptionHelper.optionallyDecryptAndRedactSingleResult).toHaveBeenCalledWith( + doc, + typeMap, + originalAttributes + ); + }); + + it('performs the calls in the correct order when isDowngradeRequired returns false', async () => { + documentMigrator.isDowngradeRequired.mockReturnValue(false); + + const doc = createSavedObject(); + const typeMap = createTypeMap(); + const originalAttributes = { unknown: true }; + + const migratedDoc = createSavedObject('another_id'); + migrator.migrateDocument.mockReturnValue(migratedDoc); + + await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap, + originalAttributes, + }); + + expect(migrator.migrateDocument).toHaveBeenCalledTimes(1); + expect(encryptionHelper.optionallyDecryptAndRedactSingleResult).toHaveBeenCalledTimes(1); + + const migrateCallOrder = migrator.migrateDocument.mock.invocationCallOrder[0]; + const encryptionCallOrder = + encryptionHelper.optionallyDecryptAndRedactSingleResult.mock.invocationCallOrder[0]; + + expect(migrateCallOrder).toBeLessThan(encryptionCallOrder); + + expect(encryptionHelper.optionallyDecryptAndRedactSingleResult).toHaveBeenCalledWith( + migratedDoc, + typeMap, + originalAttributes + ); + }); + + it('performs the calls in the correct order when isDowngradeRequired returns true', async () => { + documentMigrator.isDowngradeRequired.mockReturnValue(true); + + const doc = createSavedObject(); + const typeMap = createTypeMap(); + const originalAttributes = { unknown: true }; + + const decryptedDoc = createSavedObject('another_id'); + encryptionHelper.optionallyDecryptAndRedactSingleResult.mockReturnValue(decryptedDoc as any); + + await migrationHelper.migrateAndDecryptStorageDocument({ + document: doc, + typeMap, + originalAttributes, + }); + + expect(migrator.migrateDocument).toHaveBeenCalledTimes(1); + expect(encryptionHelper.optionallyDecryptAndRedactSingleResult).toHaveBeenCalledTimes(1); + + const migrateCallOrder = migrator.migrateDocument.mock.invocationCallOrder[0]; + const encryptionCallOrder = + encryptionHelper.optionallyDecryptAndRedactSingleResult.mock.invocationCallOrder[0]; + + expect(encryptionCallOrder).toBeLessThan(migrateCallOrder); + + expect(migrator.migrateDocument).toHaveBeenCalledWith(decryptedDoc, { allowDowngrade: true }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.ts index c7ae86b1019844..2530d60ad6608e 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/migration.ts @@ -7,8 +7,14 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import type { SavedObjectUnsanitizedDoc } from '@kbn/core-saved-objects-server'; +import { + SavedObjectsErrorHelpers, + type SavedObjectUnsanitizedDoc, + type AuthorizationTypeMap, + type SavedObject, +} from '@kbn/core-saved-objects-server'; import type { IKibanaMigrator } from '@kbn/core-saved-objects-base-server-internal'; +import type { IEncryptionHelper } from './encryption'; export type IMigrationHelper = PublicMethodsOf; @@ -17,9 +23,17 @@ export type IMigrationHelper = PublicMethodsOf; */ export class MigrationHelper { private migrator: IKibanaMigrator; + private encryptionHelper: IEncryptionHelper; - constructor({ migrator }: { migrator: IKibanaMigrator }) { + constructor({ + migrator, + encryptionHelper, + }: { + migrator: IKibanaMigrator; + encryptionHelper: IEncryptionHelper; + }) { this.migrator = migrator; + this.encryptionHelper = encryptionHelper; } /** @@ -39,4 +53,41 @@ export class MigrationHelper { migrateStorageDocument(document: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc { return this.migrator.migrateDocument(document, { allowDowngrade: true }); } + + async migrateAndDecryptStorageDocument({ + document, + typeMap, + originalAttributes, + }: { + document: SavedObjectUnsanitizedDoc | SavedObject; + typeMap: AuthorizationTypeMap | undefined; + originalAttributes?: T; + }): Promise> { + const downgrade = this.migrator.getDocumentMigrator().isDowngradeRequired(document); + + const migrate = (doc: SavedObjectUnsanitizedDoc | SavedObject) => { + try { + return this.migrator.migrateDocument(doc, { allowDowngrade: true }) as SavedObject; + } catch (error) { + throw SavedObjectsErrorHelpers.decorateGeneralError( + error, + 'Failed to migrate document to the latest version.' + ); + } + }; + + const decrypt = (doc: SavedObjectUnsanitizedDoc | SavedObject) => { + return this.encryptionHelper.optionallyDecryptAndRedactSingleResult( + doc as SavedObject, + typeMap, + originalAttributes + ); + }; + + if (downgrade) { + return migrate(await decrypt(document)); + } else { + return await decrypt(migrate(document)); + } + } } diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts index 6abb1b6acf55fe..0997e9d1328ff7 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/increment_counter_internal.ts @@ -30,7 +30,7 @@ export interface PerformIncrementCounterInternalParams { export const incrementCounterInternal = async ( { type, id, counterFields, options }: PerformIncrementCounterInternalParams, - { registry, helpers, client, serializer, migrator }: ApiExecutionContext + { registry, helpers, client, serializer }: ApiExecutionContext ): Promise> => { const { common: commonHelper, preflight: preflightHelper, migration: migrationHelper } = helpers; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.test.ts index d1fb50a1bc08a8..b195423f46f5d2 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.test.ts @@ -26,12 +26,9 @@ import { typeRegistryMock } from '@kbn/core-saved-objects-base-server-mocks'; import { internalBulkResolve, type InternalBulkResolveParams } from './internal_bulk_resolve'; import { normalizeNamespace } from '../utils'; import { - type ISavedObjectsEncryptionExtension, type ISavedObjectsSecurityExtension, - type ISavedObjectTypeRegistry, type SavedObject, SavedObjectsErrorHelpers, - type SavedObjectUnsanitizedDoc, } from '@kbn/core-saved-objects-server'; import { enforceError, @@ -39,7 +36,7 @@ import { setupAuthorizeAndRedactInternalBulkResolveSuccess, } from '../../../test_helpers/repository.test.common'; import { savedObjectsExtensionsMock } from '../../../mocks/saved_objects_extensions.mock'; -import { kibanaMigratorMock } from '../../../mocks'; +import { apiContextMock, type ApiExecutionContextMock } from '../../../mocks'; const VERSION_PROPS = { _seq_no: 1, _primary_term: 1 }; const OBJ_TYPE = 'obj-type'; @@ -59,35 +56,38 @@ beforeEach(() => { describe('internalBulkResolve', () => { let client: ReturnType; - let migrator: ReturnType; - let serializer: SavedObjectsSerializer; let incrementCounterInternal: jest.Mock; - let registry: jest.Mocked; + let serializer: SavedObjectsSerializer; + let apiContext: ApiExecutionContextMock; + + beforeEach(() => { + apiContext = apiContextMock.create({ allowedTypes: [OBJ_TYPE, ENCRYPTED_TYPE] }); + + apiContext.helpers.common.getIndexForType.mockImplementation( + (type: string) => `index-for-${type}` + ); + + apiContext.helpers.migration.migrateAndDecryptStorageDocument.mockImplementation( + ({ document }) => Promise.resolve(document as SavedObject) + ); + + apiContext.extensions = {} as unknown as typeof apiContext.extensions; + + client = apiContext.client; + + const registry = typeRegistryMock.create(); + serializer = new SavedObjectsSerializer(registry); + apiContext.serializer = serializer as unknown as typeof apiContext.serializer; + }); /** Sets up the type registry, saved objects client, etc. and return the full parameters object to be passed to `internalBulkResolve` */ function setup( objects: SavedObjectsBulkResolveObject[], - options: SavedObjectsBaseOptions = {}, - extensions?: { - encryptionExt?: ISavedObjectsEncryptionExtension; - securityExt?: ISavedObjectsSecurityExtension; - } + options: SavedObjectsBaseOptions = {} ): InternalBulkResolveParams { - registry = typeRegistryMock.create(); - client = elasticsearchClientMock.createElasticsearchClient(); - migrator = kibanaMigratorMock.create(); - serializer = new SavedObjectsSerializer(registry); incrementCounterInternal = jest.fn().mockRejectedValue(new Error('increment error')); // mock error to implicitly test that it is caught and swallowed return { - registry, - allowedTypes: [OBJ_TYPE, ENCRYPTED_TYPE], - migrator, - client, - serializer, - getIndexForType: (type: string) => `index-for-${type}`, incrementCounterInternal, - encryptionExtension: extensions?.encryptionExt, - securityExtension: extensions?.securityExt, objects, options, }; @@ -242,7 +242,7 @@ describe('internalBulkResolve', () => { ); mockIsNotFoundFromUnsupportedServer.mockReturnValue(true); - await expect(() => internalBulkResolve(params)).rejects.toThrow( + await expect(() => internalBulkResolve(params, apiContext)).rejects.toThrow( SavedObjectsErrorHelpers.createGenericNotFoundEsUnavailableError() ); expect(client.bulk).toHaveBeenCalledTimes(1); @@ -252,7 +252,7 @@ describe('internalBulkResolve', () => { it('returns an empty array if no object args are passed in', async () => { const params = setup([], { namespace }); - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); expect(client.bulk).not.toHaveBeenCalled(); expect(client.mget).not.toHaveBeenCalled(); expect(result.resolved_objects).toEqual([]); @@ -262,7 +262,7 @@ describe('internalBulkResolve', () => { const objects = [{ type: UNSUPPORTED_TYPE, id: '1' }]; const params = setup(objects, { namespace }); - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); expect(client.bulk).not.toHaveBeenCalled(); expect(client.mget).not.toHaveBeenCalled(); expect(result.resolved_objects).toEqual([expectUnsupportedTypeError({ id: '1' })]); @@ -289,7 +289,7 @@ describe('internalBulkResolve', () => { ); mockRawDocExistsInNamespace.mockReturnValue(false); // for objs 3 and 3-newId - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); expectBulkArgs(expectedNamespaceString, ['1', '2', '3']); expectMgetArgs(namespace, ['1', '2', '2-newId', '3', '3-newId']); expect(mockRawDocExistsInNamespace).toHaveBeenCalledTimes(2); // for objs 3 and 3-newId @@ -311,7 +311,7 @@ describe('internalBulkResolve', () => { // does not attempt to fetch obj 1-newId, because that alias is disabled ); - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); expectBulkArgs(expectedNamespaceString, ['1']); expectMgetArgs(namespace, ['1']); expect(result.resolved_objects).toEqual([ @@ -352,7 +352,7 @@ describe('internalBulkResolve', () => { { found: true } // fetch obj 7-newId ); - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); const bulkIds = ['2', '3', '4', '5', '6', '7']; expectBulkArgs(expectedNamespaceString, bulkIds); const mgetIds = ['2', '3', '4', '4-newId', '5', '5-newId', '6', '6-newId', '7', '7-newId']; @@ -368,7 +368,7 @@ describe('internalBulkResolve', () => { ]); }); - it('migrates the resolved objects', async () => { + it('migrates and decrypts the resolved objects', async () => { const objects = [ { type: OBJ_TYPE, id: '1' }, { type: OBJ_TYPE, id: '2' }, @@ -376,81 +376,28 @@ describe('internalBulkResolve', () => { const params = setup(objects, { namespace }); mockBulkResults({ found: false }, { found: false }); mockMgetResults({ found: true }, { found: true }); - migrator.migrateDocument.mockImplementation( - (doc) => `migrated-${doc}` as unknown as SavedObjectUnsanitizedDoc + const migrationHelper = apiContext.helpers.migration; + migrationHelper.migrateAndDecryptStorageDocument.mockImplementation(({ document }) => + Promise.resolve(`migrated-${document}` as unknown as SavedObject) ); - await expect(internalBulkResolve(params)).resolves.toHaveProperty('resolved_objects', [ - expect.objectContaining({ saved_object: 'migrated-mock-obj-for-1' }), - expect.objectContaining({ saved_object: 'migrated-mock-obj-for-2' }), - ]); - - expect(migrator.migrateDocument).toHaveBeenCalledTimes(2); - expect(migrator.migrateDocument).nthCalledWith( - 1, - 'mock-obj-for-1', - expect.objectContaining({ allowDowngrade: expect.any(Boolean) }) + await expect(internalBulkResolve(params, apiContext)).resolves.toHaveProperty( + 'resolved_objects', + [ + expect.objectContaining({ saved_object: 'migrated-mock-obj-for-1' }), + expect.objectContaining({ saved_object: 'migrated-mock-obj-for-2' }), + ] ); - expect(migrator.migrateDocument).nthCalledWith(2, 'mock-obj-for-2', { - allowDowngrade: expect.any(Boolean), - }); - }); - }); - - describe('with encryption extension', () => { - const namespace = 'foo'; - - const attributes = { - attrNotSoSecret: '*not-so-secret*', - attrOne: 'one', - attrSecret: '*secret*', - attrThree: 'three', - title: 'Testing', - }; - beforeEach(() => { - mockGetSavedObjectFromSource.mockImplementation((_registry, type, id) => { - return { - id, - type, - namespaces: [namespace], - attributes, - references: [], - } as SavedObject; + expect(migrationHelper.migrateAndDecryptStorageDocument).toHaveBeenCalledTimes(2); + expect(migrationHelper.migrateAndDecryptStorageDocument).nthCalledWith(1, { + document: 'mock-obj-for-1', + typeMap: undefined, + }); + expect(migrationHelper.migrateAndDecryptStorageDocument).nthCalledWith(2, { + document: 'mock-obj-for-2', + typeMap: undefined, }); - }); - - it('only attempts to decrypt and strip attributes for types that are encryptable', async () => { - const objects = [ - { type: OBJ_TYPE, id: '11' }, // non encryptable type - { type: ENCRYPTED_TYPE, id: '12' }, // encryptable type - ]; - const mockEncryptionExt = savedObjectsExtensionsMock.createEncryptionExtension(); - const params = setup(objects, { namespace }, { encryptionExt: mockEncryptionExt }); - mockBulkResults( - // No alias matches - { found: false }, - { found: false } - ); - mockMgetResults( - // exact matches - { found: true }, - { found: true } - ); - - mockEncryptionExt.isEncryptableType.mockReturnValueOnce(false); - mockEncryptionExt.isEncryptableType.mockReturnValueOnce(true); - - await internalBulkResolve(params); - - expect(mockEncryptionExt.isEncryptableType).toBeCalledTimes(2); - expect(mockEncryptionExt.isEncryptableType).toBeCalledWith(OBJ_TYPE); - expect(mockEncryptionExt.isEncryptableType).toBeCalledWith(ENCRYPTED_TYPE); - - expect(mockEncryptionExt.decryptOrStripResponseAttributes).toBeCalledTimes(1); - expect(mockEncryptionExt.decryptOrStripResponseAttributes).toBeCalledWith( - expect.objectContaining({ type: ENCRYPTED_TYPE, id: '12', attributes }) - ); }); }); @@ -487,7 +434,8 @@ describe('internalBulkResolve', () => { }); mockSecurityExt = savedObjectsExtensionsMock.createSecurityExtension(); - params = setup(objects, { namespace }, { securityExt: mockSecurityExt }); + apiContext.extensions.securityExtension = mockSecurityExt; + params = setup(objects, { namespace }); mockBulkResults( // No alias matches @@ -503,14 +451,14 @@ describe('internalBulkResolve', () => { test(`propagates decorated error when unauthorized`, async () => { setupAuthorizeAndRedactInternalBulkResolveFailure(mockSecurityExt); - await expect(internalBulkResolve(params)).rejects.toThrow(enforceError); + await expect(internalBulkResolve(params, apiContext)).rejects.toThrow(enforceError); expect(mockSecurityExt.authorizeAndRedactInternalBulkResolve).toHaveBeenCalledTimes(1); }); test(`returns result when successful`, async () => { setupAuthorizeAndRedactInternalBulkResolveSuccess(mockSecurityExt); - const result = await internalBulkResolve(params); + const result = await internalBulkResolve(params, apiContext); expect(mockSecurityExt.authorizeAndRedactInternalBulkResolve).toHaveBeenCalledTimes(1); const bulkIds = objects.map((obj) => obj.id); @@ -524,7 +472,7 @@ describe('internalBulkResolve', () => { test(`returns empty array when no objects are provided`, async () => { setupAuthorizeAndRedactInternalBulkResolveSuccess(mockSecurityExt); - const result = await internalBulkResolve({ ...params, objects: [] }); + const result = await internalBulkResolve({ ...params, objects: [] }, apiContext); expect(result).toEqual({ resolved_objects: [] }); expect(mockSecurityExt.authorizeAndRedactInternalBulkResolve).not.toHaveBeenCalled(); }); @@ -536,7 +484,7 @@ describe('internalBulkResolve', () => { test(`in the default space`, async () => { await expect( - internalBulkResolve({ ...params, options: { namespace: 'default' } }) + internalBulkResolve({ ...params, options: { namespace: 'default' } }, apiContext) ).rejects.toThrow(enforceError); expect(mockSecurityExt.authorizeAndRedactInternalBulkResolve).toHaveBeenCalledTimes(1); @@ -547,7 +495,7 @@ describe('internalBulkResolve', () => { }); test(`in a non-default space`, async () => { - await expect(internalBulkResolve(params)).rejects.toThrow(enforceError); + await expect(internalBulkResolve(params, apiContext)).rejects.toThrow(enforceError); expect(mockSecurityExt.authorizeAndRedactInternalBulkResolve).toHaveBeenCalledTimes(1); const { namespace: actualNamespace, objects: actualObjects } = diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.ts index 53cb04453555c4..ef2afc5b8a95fc 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/internals/internal_bulk_resolve.ts @@ -17,9 +17,6 @@ import type { SavedObjectsIncrementCounterOptions, } from '@kbn/core-saved-objects-api-server'; import { - type ISavedObjectsEncryptionExtension, - type ISavedObjectsSecurityExtension, - type ISavedObjectTypeRegistry, type SavedObjectsRawDocSource, type SavedObject, type BulkResolveError, @@ -27,7 +24,6 @@ import { SavedObjectsErrorHelpers, } from '@kbn/core-saved-objects-server'; import { - type IKibanaMigrator, LEGACY_URL_ALIAS_TYPE, type LegacyUrlAlias, } from '@kbn/core-saved-objects-base-server-internal'; @@ -49,6 +45,7 @@ import { left, right, } from '../utils'; +import type { ApiExecutionContext } from '../types'; import type { RepositoryEsClient } from '../../repository_es_client'; const MAX_CONCURRENT_RESOLVE = 10; @@ -59,22 +56,14 @@ const MAX_CONCURRENT_RESOLVE = 10; * @internal */ export interface InternalBulkResolveParams { - registry: ISavedObjectTypeRegistry; - migrator: IKibanaMigrator; - allowedTypes: string[]; - client: RepositoryEsClient; - serializer: ISavedObjectsSerializer; - getIndexForType: (type: string) => string; + objects: SavedObjectsBulkResolveObject[]; + options?: SavedObjectsResolveOptions; incrementCounterInternal: ( type: string, id: string, counterFields: Array, options?: SavedObjectsIncrementCounterOptions ) => Promise>; - encryptionExtension: ISavedObjectsEncryptionExtension | undefined; - securityExtension: ISavedObjectsSecurityExtension | undefined; - objects: SavedObjectsBulkResolveObject[]; - options?: SavedObjectsResolveOptions; } /** @@ -96,21 +85,14 @@ export function isBulkResolveError( type AliasInfo = Pick; export async function internalBulkResolve( - params: InternalBulkResolveParams + params: InternalBulkResolveParams, + apiExecutionContext: ApiExecutionContext ): Promise> { - const { - registry, - migrator, - allowedTypes, - client, - serializer, - getIndexForType, - incrementCounterInternal, - encryptionExtension, - securityExtension, - objects, - options = {}, - } = params; + const { incrementCounterInternal, objects, options = {} } = params; + + const { registry, allowedTypes, client, serializer } = apiExecutionContext; + const { common: commonHelper, migration: migrationHelper } = apiExecutionContext.helpers; + const { securityExtension } = apiExecutionContext.extensions; if (objects.length === 0) { return { resolved_objects: [] }; @@ -126,14 +108,14 @@ export async function internalBulkResolve( validObjects, client, serializer, - getIndexForType, + commonHelper.getIndexForType.bind(commonHelper), namespace ); const docsToBulkGet: Array<{ _id: string; _index: string }> = []; const aliasInfoArray: Array = []; validObjects.forEach(({ value: { type, id } }, i) => { - const objectIndex = getIndexForType(type); + const objectIndex = commonHelper.getIndexForType(type); docsToBulkGet.push({ // attempt to find an exact match for the given ID _id: serializer.generateRawId(namespace, type, id), @@ -182,17 +164,15 @@ export async function internalBulkResolve( objectId: string, doc: MgetResponseItem ) { - // Encryption // @ts-expect-error MultiGetHit._source is optional const object = getSavedObjectFromSource(registry, objectType, objectId, doc, { migrationVersionCompatibility, }); - const migrated = migrator.migrateDocument(object, { allowDowngrade: true }) as SavedObject; - - if (!encryptionExtension?.isEncryptableType(migrated.type)) { - return migrated; - } - return encryptionExtension.decryptOrStripResponseAttributes(migrated); + // migrate and decrypt document + return await migrationHelper.migrateAndDecryptStorageDocument({ + document: object, + typeMap: undefined, + }); } // map function for pMap below @@ -275,9 +255,11 @@ export async function internalBulkResolve( { refresh: false } ).catch(() => {}); // if the call fails for some reason, intentionally swallow the error - if (!securityExtension) return { resolved_objects: resolvedObjects }; + if (!securityExtension) { + return { resolved_objects: resolvedObjects }; + } - const redactedObjects = await securityExtension?.authorizeAndRedactInternalBulkResolve({ + const redactedObjects = await securityExtension.authorizeAndRedactInternalBulkResolve({ namespace, objects: resolvedObjects, }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts index 25acc55cc77c24..957dd69af06eef 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.test.ts @@ -86,7 +86,8 @@ describe('SavedObjectsRepository', () => { await expect(repository.resolve('obj-type', 'obj-id')).resolves.toEqual(expectedResult); expect(mockInternalBulkResolve).toHaveBeenCalledTimes(1); expect(mockInternalBulkResolve).toHaveBeenCalledWith( - expect.objectContaining({ objects: [{ type: 'obj-type', id: 'obj-id' }] }) + expect.objectContaining({ objects: [{ type: 'obj-type', id: 'obj-id' }] }), + expect.any(Object) ); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.ts index 50de4725463443..6e940dac047bbf 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/resolve.ts @@ -24,35 +24,21 @@ export const performResolve = async ( { type, id, options }: PerformCreateParams, apiExecutionContext: ApiExecutionContext ): Promise> => { - const { - registry, - helpers, - allowedTypes, - client, - migrator, - serializer, - extensions = {}, - } = apiExecutionContext; - const { common: commonHelper } = helpers; - const { securityExtension, encryptionExtension } = extensions; + const { common: commonHelper } = apiExecutionContext.helpers; const namespace = commonHelper.getCurrentNamespace(options.namespace); - const { resolved_objects: bulkResults } = await internalBulkResolve({ - registry, - allowedTypes, - client, - migrator, - serializer, - getIndexForType: commonHelper.getIndexForType.bind(commonHelper), - incrementCounterInternal: (t, i, counterFields, opts = {}) => - incrementCounterInternal( - { type: t, id: i, counterFields, options: opts }, - apiExecutionContext - ), - encryptionExtension, - securityExtension, - objects: [{ type, id }], - options: { ...options, namespace }, - }); + const { resolved_objects: bulkResults } = await internalBulkResolve( + { + objects: [{ type, id }], + options: { ...options, namespace }, + incrementCounterInternal: (t, i, counterFields, opts = {}) => + incrementCounterInternal( + { type: t, id: i, counterFields, options: opts }, + apiExecutionContext + ), + }, + apiExecutionContext + ); + const [result] = bulkResults; if (isBulkResolveError(result)) { throw result.error; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts index 82a7d2930f8d53..ec5fe1d4b25de8 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.spaces_extension.test.ts @@ -518,7 +518,8 @@ describe('SavedObjectsRepository Spaces Extension', () => { ? currentSpace.expectedNamespace : undefined, }, - }) + }), + expect.any(Object) ); }); }); @@ -764,7 +765,8 @@ describe('SavedObjectsRepository Spaces Extension', () => { ? `${currentSpace.expectedNamespace}` : undefined, }, - }) + }), + expect.any(Object) ); }); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts index 17a17be1229166..087f3690886b10 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts @@ -78,6 +78,7 @@ export const createRepositoryHelpers = ({ }); const migrationHelper = new MigrationHelper({ migrator, + encryptionHelper, }); const helpers: RepositoryHelpers = { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_context.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_context.mock.ts index 3b4da315868fa3..22caaaa56a7140 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_context.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_context.mock.ts @@ -28,7 +28,11 @@ export type ApiExecutionContextMock = Pick { +const createApiExecutionContextMock = ({ + allowedTypes = ['foo', 'bar'], +}: { + allowedTypes?: string[]; +} = {}): ApiExecutionContextMock => { return { registry: new SavedObjectTypeRegistry(), helpers: apiHelperMocks.create(), @@ -37,7 +41,7 @@ const createApiExecutionContextMock = (): ApiExecutionContextMock => { serializer: serializerMock.create(), migrator: createMigratorMock(), logger: loggerMock.create(), - allowedTypes: ['foo', 'bar'], + allowedTypes, mappings: { properties: { mockMappings: { type: 'text' } } }, }; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts index e50cc4d1036ebb..d284bddd5c060f 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { SavedObject } from '@kbn/core-saved-objects-server'; import type { PublicMethodsOf } from '@kbn/utility-types'; import type { CommonHelper, @@ -22,10 +23,14 @@ const createMigrationHelperMock = (): MigrationHelperMock => { const mock: MigrationHelperMock = { migrateInputDocument: jest.fn(), migrateStorageDocument: jest.fn(), + migrateAndDecryptStorageDocument: jest.fn(), }; mock.migrateInputDocument.mockImplementation((doc) => doc); mock.migrateStorageDocument.mockImplementation((doc) => doc); + mock.migrateAndDecryptStorageDocument.mockImplementation(({ document }) => + Promise.resolve(document as SavedObject) + ); return mock; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/helpers.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/helpers.ts new file mode 100644 index 00000000000000..5d05cd65b9e273 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/helpers.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 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 { IEncryptionHelper } from '../lib/apis/helpers/encryption'; + +export type IEncryptionHelperMock = jest.Mocked; + +export const createEncryptionHelperMock = (): IEncryptionHelperMock => { + const mock: IEncryptionHelperMock = { + optionallyEncryptAttributes: jest.fn(), + optionallyDecryptAndRedactSingleResult: jest.fn(), + optionallyDecryptAndRedactBulkResult: jest.fn(), + }; + + return mock; +}; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/index.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/index.ts index 22569e9437895d..852e7a2f9dd52d 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/index.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/index.ts @@ -19,3 +19,5 @@ export { type PreflightCheckHelperMock, } from './api_helpers.mocks'; export { apiContextMock, type ApiExecutionContextMock } from './api_context.mock'; +export { createDocumentMigratorMock, createMigratorMock } from './migrator.mock'; +export { createEncryptionHelperMock } from './helpers'; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/kibana_migrator.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/kibana_migrator.mock.ts index e2c7107ca380c7..a896f0934901d3 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/kibana_migrator.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/kibana_migrator.mock.ts @@ -8,6 +8,7 @@ import type { SavedObjectsType } from '@kbn/core-saved-objects-server'; import type { IKibanaMigrator } from '@kbn/core-saved-objects-base-server-internal'; +import { createDocumentMigratorMock } from './migrator.mock'; // mock duplicated from `@kbn/core/saved-objects-migration-server-mocks` to avoid cyclic dependencies @@ -39,6 +40,7 @@ const createMigratorMock = ( migrateDocument: jest.fn(), prepareMigrations: jest.fn(), getStatus$: jest.fn(), + getDocumentMigrator: jest.fn().mockReturnValue(createDocumentMigratorMock()), }; // mockMigrator.getActiveMappings.mockReturnValue(buildActiveMappings(mergeTypes(types))); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/migrator.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/migrator.mock.ts index 94f221e7cfbc83..898259312628ab 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/migrator.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/migrator.mock.ts @@ -6,7 +6,10 @@ * Side Public License, v 1. */ -import type { IKibanaMigrator } from '@kbn/core-saved-objects-base-server-internal'; +import type { + IKibanaMigrator, + IDocumentMigrator, +} from '@kbn/core-saved-objects-base-server-internal'; export type KibanaMigratorMock = jest.Mocked; @@ -18,5 +21,16 @@ export const createMigratorMock = (kibanaVersion: string = '8.0.0'): KibanaMigra getStatus$: jest.fn(), getActiveMappings: jest.fn(), migrateDocument: jest.fn(), + getDocumentMigrator: jest.fn().mockReturnValue(createDocumentMigratorMock()), + }; +}; + +export type DocumentMigratorMock = jest.Mocked; + +export const createDocumentMigratorMock = (): DocumentMigratorMock => { + return { + migrate: jest.fn().mockImplementation((doc: unknown) => doc), + migrateAndConvert: jest.fn().mockImplementation((doc: unknown) => doc), + isDowngradeRequired: jest.fn().mockReturnValue(false), }; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts index 6f7fb8299291e7..3d9c3f91efa096 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts @@ -10,7 +10,6 @@ import type { ISavedObjectsEncryptionExtension, ISavedObjectsSecurityExtension, ISavedObjectsSpacesExtension, - SavedObjectsExtensions, } from '@kbn/core-saved-objects-server'; const createEncryptionExtension = (): jest.Mocked => ({ @@ -47,7 +46,7 @@ const createSpacesExtension = (): jest.Mocked => ( getSearchableNamespaces: jest.fn(), }); -const create = (): jest.Mocked => ({ +const create = () => ({ encryptionExtension: createEncryptionExtension(), securityExtension: createSecurityExtension(), spacesExtension: createSpacesExtension(), diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/index.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/index.ts index 2a3535f19207c9..6eef9105198bff 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/index.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/index.ts @@ -41,6 +41,9 @@ export type { MigrationResult, MigrationStatus, MigrateDocumentOptions, + IDocumentMigrator, + DocumentMigrateOptions, + IsDowngradeRequiredOptions, } from './src/migration'; export { parseObjectKey, diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/document_migrator.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/document_migrator.ts new file mode 100644 index 00000000000000..bdbd78e717520a --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/document_migrator.ts @@ -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 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 { SavedObjectUnsanitizedDoc } from '@kbn/core-saved-objects-server'; + +/** + * Manages transformations of individual documents. + */ +export interface IDocumentMigrator { + /** + * Migrates a document to its latest version. + */ + migrate( + doc: SavedObjectUnsanitizedDoc, + options?: DocumentMigrateOptions + ): SavedObjectUnsanitizedDoc; + + /** + * Migrates a document to the latest version and applies type conversions if applicable. + * Also returns any additional document(s) that may have been created during the transformation process. + * + * @remark This only be used by the savedObject migration during upgrade. For all other scenarios, + * {@link IDocumentMigrator#migrate} should be used instead. + */ + migrateAndConvert(doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc[]; + + /** + * Returns true if the provided document has a higher version that the `targetTypeVersion` + * (defaulting to the last known version), false otherwise. + */ + isDowngradeRequired( + doc: SavedObjectUnsanitizedDoc, + options?: IsDowngradeRequiredOptions + ): boolean; +} + +/** + * Options for {@link IDocumentMigrator.migrate} + */ +export interface DocumentMigrateOptions { + /** + * Defines whether it is allowed to convert documents from an higher version or not. + * - If `true`, documents from higher versions will go though the downgrade pipeline. + * - If `false`, an error will be thrown when trying to process a document with an higher type version. + * Defaults to `false`. + */ + allowDowngrade?: boolean; + /** + * If specified, will migrate to the given version instead of the latest known version. + */ + targetTypeVersion?: string; +} + +/** + * Options for {@link IDocumentMigrator.isDowngradeRequired} + */ +export interface IsDowngradeRequiredOptions { + /** + * If specified, will migrate to the given version instead of the latest known version. + */ + targetTypeVersion?: string; +} diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/index.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/index.ts index aa54e37f0d91a7..0c4c87a3d3fbb0 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/index.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/index.ts @@ -13,3 +13,8 @@ export type { MigrationResult, MigrateDocumentOptions, } from './kibana_migrator'; +export type { + IDocumentMigrator, + DocumentMigrateOptions, + IsDowngradeRequiredOptions, +} from './document_migrator'; diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/kibana_migrator.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/kibana_migrator.ts index 18a03a7fcbf544..723d5724024fc0 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/kibana_migrator.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/migration/kibana_migrator.ts @@ -9,6 +9,7 @@ import { Observable } from 'rxjs'; import type { SavedObjectUnsanitizedDoc } from '@kbn/core-saved-objects-server'; import type { IndexMapping } from '../mappings'; +import type { IDocumentMigrator } from './document_migrator'; /** @internal */ export interface IKibanaMigrator { @@ -53,6 +54,11 @@ export interface IKibanaMigrator { doc: SavedObjectUnsanitizedDoc, options?: MigrateDocumentOptions ): SavedObjectUnsanitizedDoc; + + /** + * Returns the document migrator bound to this kibana migrator. + */ + getDocumentMigrator(): IDocumentMigrator; } /** diff --git a/packages/core/saved-objects/core-saved-objects-base-server-mocks/index.ts b/packages/core/saved-objects/core-saved-objects-base-server-mocks/index.ts index 9700eb0f0f3cbd..51ad9cfa5e4d5b 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-mocks/index.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-mocks/index.ts @@ -8,3 +8,4 @@ export { typeRegistryMock } from './src/saved_objects_type_registry.mock'; export { serializerMock } from './src/serializer.mock'; +export { createDocumentMigratorMock } from './src/document_migrator.mock'; diff --git a/packages/core/saved-objects/core-saved-objects-base-server-mocks/src/document_migrator.mock.ts b/packages/core/saved-objects/core-saved-objects-base-server-mocks/src/document_migrator.mock.ts new file mode 100644 index 00000000000000..e293fb30b22849 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-base-server-mocks/src/document_migrator.mock.ts @@ -0,0 +1,17 @@ +/* + * Copyright 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 { IDocumentMigrator } from '@kbn/core-saved-objects-base-server-internal'; + +export const createDocumentMigratorMock = (): jest.Mocked => { + return { + migrate: jest.fn().mockImplementation((doc: unknown) => doc), + migrateAndConvert: jest.fn().mockImplementation((doc: unknown) => doc), + isDowngradeRequired: jest.fn().mockReturnValue(false), + }; +}; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/migrate_raw_docs.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/migrate_raw_docs.ts index 26e843ad994126..0b30ea2b0fe2d5 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/migrate_raw_docs.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/migrate_raw_docs.ts @@ -17,10 +17,10 @@ import type { SavedObjectUnsanitizedDoc, ISavedObjectsSerializer, } from '@kbn/core-saved-objects-server'; -import type { VersionedTransformer } from '../document_migrator'; +import type { IDocumentMigrator } from '@kbn/core-saved-objects-base-server-internal'; import { TransformSavedObjectDocumentError } from '.'; -type MigrateAndConvertFn = VersionedTransformer['migrateAndConvert']; +type MigrateAndConvertFn = IDocumentMigrator['migrateAndConvert']; export interface DocumentsTransformFailed { readonly type: string; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/document_migrator.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/document_migrator.ts index 540f8e39b46715..d2dff051a5f53d 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/document_migrator.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/document_migrator.ts @@ -13,6 +13,11 @@ import type { SavedObjectUnsanitizedDoc, ISavedObjectTypeRegistry, } from '@kbn/core-saved-objects-server'; +import type { + IDocumentMigrator, + DocumentMigrateOptions, + IsDowngradeRequiredOptions, +} from '@kbn/core-saved-objects-base-server-internal'; import type { ActiveMigrations } from './types'; import { maxVersion } from './pipelines/utils'; import { buildActiveMigrations } from './build_active_migrations'; @@ -20,23 +25,6 @@ import { DocumentUpgradePipeline, DocumentDowngradePipeline } from './pipelines' import { downgradeRequired } from './utils'; import { TransformType } from './types'; -/** - * Options for {@link VersionedTransformer.migrate} - */ -export interface DocumentMigrateOptions { - /** - * Defines whether it is allowed to convert documents from an higher version or not. - * - If `true`, documents from higher versions will go though the downgrade pipeline. - * - If `false`, an error will be thrown when trying to process a document with an higher type version. - * Defaults to `false`. - */ - allowDowngrade?: boolean; - /** - * If specified, will migrate to the given version instead of the latest known version. - */ - targetTypeVersion?: string; -} - interface TransformOptions { convertNamespaceTypes?: boolean; allowDowngrade?: boolean; @@ -65,31 +53,9 @@ interface MigrationVersionParams { } /** - * Manages transformations of individual documents. + * A concrete implementation of the {@link IDocumentMigrator} interface. */ -export interface VersionedTransformer { - /** - * Migrates a document to its latest version. - */ - migrate( - doc: SavedObjectUnsanitizedDoc, - options?: DocumentMigrateOptions - ): SavedObjectUnsanitizedDoc; - - /** - * Migrates a document to the latest version and applies type conversions if applicable. - * Also returns any additional document(s) that may have been created during the transformation process. - * - * @remark This only be used by the savedObject migration during upgrade. For all other scenarios, - * {@link VersionedTransformer#migrate} should be used instead. - */ - migrateAndConvert(doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc[]; -} - -/** - * A concrete implementation of the {@link VersionedTransformer} interface. - */ -export class DocumentMigrator implements VersionedTransformer { +export class DocumentMigrator implements IDocumentMigrator { private options: DocumentMigratorOptions; private migrations?: ActiveMigrations; @@ -175,6 +141,21 @@ export class DocumentMigrator implements VersionedTransformer { return [document, ...additionalDocs]; } + /** + * Returns true if the provided document has a higher version that the `targetTypeVersion` + * (defaulting to the last known version), false otherwise. + */ + public isDowngradeRequired( + doc: SavedObjectUnsanitizedDoc, + { targetTypeVersion }: IsDowngradeRequiredOptions = {} + ): boolean { + if (!this.migrations) { + throw new Error('Migrations are not ready. Make sure prepareMigrations is called first.'); + } + const typeMigrations = this.migrations[doc.type]; + return downgradeRequired(doc, typeMigrations?.latestVersion ?? {}, targetTypeVersion); + } + private transform( doc: SavedObjectUnsanitizedDoc, { diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/index.ts index f34053388d7649..daaffc617f6119 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/document_migrator/index.ts @@ -6,4 +6,4 @@ * Side Public License, v 1. */ -export { DocumentMigrator, type VersionedTransformer } from './document_migrator'; +export { DocumentMigrator } from './document_migrator'; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts index c06461da8fb439..a07d810ee75ab6 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts @@ -119,6 +119,10 @@ export class KibanaMigrator implements IKibanaMigrator { this.esCapabilities = esCapabilities; } + public getDocumentMigrator() { + return this.documentMigrator; + } + public runMigrations({ rerun = false }: { rerun?: boolean } = {}): Promise { if (this.migrationResult === undefined || rerun) { // Reruns are only used by CI / EsArchiver. Publishing status updates on reruns results in slowing down CI diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/types.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/types.ts index 3515d8a01a5a0e..060bd0ebdde517 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/types.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/types.ts @@ -18,9 +18,9 @@ import type { import type { VirtualVersionMap, SavedObjectsMigrationConfigType, + IDocumentMigrator, } from '@kbn/core-saved-objects-base-server-internal'; import type { DocLinks } from '@kbn/doc-links'; -import { VersionedTransformer } from '../../document_migrator'; /** * The set of static, precomputed values and services used by the ZDT migration @@ -45,7 +45,7 @@ export interface MigratorContext { /** SO serializer to use for migration */ readonly serializer: ISavedObjectsSerializer; /** The doc migrator to use */ - readonly documentMigrator: VersionedTransformer; + readonly documentMigrator: IDocumentMigrator; /** The SO type registry to use for the migration */ readonly typeRegistry: ISavedObjectTypeRegistry; /** List of types that are no longer registered */ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts index 1ee07de5e0395e..d2d9c699566d33 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts @@ -10,9 +10,10 @@ import type { ElasticsearchClient, ElasticsearchCapabilities, } from '@kbn/core-elasticsearch-server'; -import { - type SavedObjectsMigrationConfigType, - type MigrationResult, +import type { + SavedObjectsMigrationConfigType, + MigrationResult, + IDocumentMigrator, } from '@kbn/core-saved-objects-base-server-internal'; import type { ISavedObjectTypeRegistry, @@ -22,7 +23,6 @@ import type { Logger } from '@kbn/logging'; import type { DocLinksServiceStart } from '@kbn/core-doc-links-server'; import { NodeRoles } from '@kbn/core-node-server'; import { migrationStateActionMachine } from './migration_state_action_machine'; -import type { VersionedTransformer } from '../document_migrator'; import { createContext } from './context'; import { next } from './next'; import { model } from './model'; @@ -37,7 +37,7 @@ export interface MigrateIndexOptions { /** Logger to use for migration output */ logger: Logger; /** The document migrator to use to convert the document */ - documentMigrator: VersionedTransformer; + documentMigrator: IDocumentMigrator; /** The migration config to use for the migration */ migrationConfig: SavedObjectsMigrationConfigType; /** docLinks contract to use to link to documentation */ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts index e8309f8d4d5398..cb9d1656707c70 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts @@ -17,11 +17,11 @@ import type { ISavedObjectTypeRegistry, ISavedObjectsSerializer, } from '@kbn/core-saved-objects-server'; -import { - type SavedObjectsMigrationConfigType, - type MigrationResult, +import type { + SavedObjectsMigrationConfigType, + MigrationResult, + IDocumentMigrator, } from '@kbn/core-saved-objects-base-server-internal'; -import type { VersionedTransformer } from '../document_migrator'; import { buildMigratorConfigs } from './utils'; import { migrateIndex } from './migrate_index'; @@ -35,7 +35,7 @@ export interface RunZeroDowntimeMigrationOpts { /** Logger to use for migration output */ logger: Logger; /** The document migrator to use to convert the document */ - documentMigrator: VersionedTransformer; + documentMigrator: IDocumentMigrator; /** The migration config to use for the migration */ migrationConfig: SavedObjectsMigrationConfigType; /** docLinks contract to use to link to documentation */ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/test_helpers/document_migrator.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/test_helpers/document_migrator.ts index 3dbe48ab2d4e9f..dba89f2aacb1b0 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/test_helpers/document_migrator.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/test_helpers/document_migrator.ts @@ -6,11 +6,12 @@ * Side Public License, v 1. */ -import type { VersionedTransformer } from '../../document_migrator'; +import type { IDocumentMigrator } from '@kbn/core-saved-objects-base-server-internal'; -export const createDocumentMigrator = (): jest.Mocked => { +export const createDocumentMigrator = (): jest.Mocked => { return { migrate: jest.fn().mockImplementation((doc: unknown) => doc), migrateAndConvert: jest.fn().mockImplementation((doc: unknown) => [doc]), + isDowngradeRequired: jest.fn().mockReturnValue(false), }; }; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/transform_raw_docs.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/transform_raw_docs.ts index 1af1cee9d3b842..11df2574f1e944 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/transform_raw_docs.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/transform_raw_docs.ts @@ -7,13 +7,13 @@ */ import type { ISavedObjectsSerializer, SavedObjectsRawDoc } from '@kbn/core-saved-objects-server'; -import { VersionedTransformer } from '../../document_migrator'; +import type { IDocumentMigrator } from '@kbn/core-saved-objects-base-server-internal'; import { TransformRawDocs } from '../../types'; import { migrateRawDocsSafely } from '../../core/migrate_raw_docs'; export interface CreateDocumentTransformFnOpts { serializer: ISavedObjectsSerializer; - documentMigrator: VersionedTransformer; + documentMigrator: IDocumentMigrator; } export const createDocumentTransformFn = ({ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/src/kibana_migrator.mock.ts b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/src/kibana_migrator.mock.ts index a0d7ac83fe74a9..7801f715039315 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/src/kibana_migrator.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/src/kibana_migrator.mock.ts @@ -16,6 +16,7 @@ import { buildActiveMappings, buildTypesMappings, } from '@kbn/core-saved-objects-migration-server-internal'; +import { createDocumentMigratorMock } from '@kbn/core-saved-objects-base-server-mocks'; const defaultSavedObjectTypes: SavedObjectsType[] = [ { @@ -58,10 +59,13 @@ const createMigrator = ( ], }) ), + getDocumentMigrator: jest.fn(), }; mockMigrator.getActiveMappings.mockReturnValue(buildActiveMappings(buildTypesMappings(types))); mockMigrator.migrateDocument.mockImplementation((doc) => doc); + mockMigrator.getDocumentMigrator.mockReturnValue(createDocumentMigratorMock()); + return mockMigrator; }; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/tsconfig.json b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/tsconfig.json index b228481a3207a0..8d075d0a9e0b30 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-mocks/tsconfig.json +++ b/packages/core/saved-objects/core-saved-objects-migration-server-mocks/tsconfig.json @@ -13,7 +13,8 @@ "kbn_references": [ "@kbn/core-saved-objects-server", "@kbn/core-saved-objects-base-server-internal", - "@kbn/core-saved-objects-migration-server-internal" + "@kbn/core-saved-objects-migration-server-internal", + "@kbn/core-saved-objects-base-server-mocks" ], "exclude": [ "target/**/*", diff --git a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_kibana_client.ts b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_kibana_client.ts index 76faaac0c942c9..13b4ee07aad24c 100644 --- a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_kibana_client.ts +++ b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_kibana_client.ts @@ -45,13 +45,31 @@ export class ApmSynthtraceKibanaClient { this.logger.debug(`Installing APM package ${packageVersion}`); const url = `${this.target}/api/fleet/epm/packages/apm/${packageVersion}`; - const response = await pRetry(() => { - return fetch(url, { - method: 'POST', - headers: kibanaHeaders(), - body: '{"force":true}', - }); - }); + const response = await pRetry( + async () => { + const res = await fetch(url, { + method: 'POST', + headers: kibanaHeaders(), + body: '{"force":true}', + }); + + if (res.status >= 400) { + const errorJson = await res.json(); + throw new Error( + `APM package installation returned ${res.status} status code\nError: ${errorJson}` + ); + } + return res; + }, + { + retries: 5, + onFailedAttempt: (error) => { + this.logger.debug( + `APM package installation failure. ${error.retriesLeft >= 1 ? 'Retrying' : 'Aborting'}` + ); + }, + } + ); const responseJson = await response.json(); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts new file mode 100644 index 00000000000000..37999bff114c2a --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ApmFields, apm } from '@kbn/apm-synthtrace-client'; +import { random } from 'lodash'; +import { pipeline, Readable } from 'stream'; +import semver from 'semver'; +import { Scenario } from '../cli/scenario'; +import { + addObserverVersionTransform, + deleteSummaryFieldTransform, +} from '../lib/utils/transform_helpers'; +import { withClient } from '../lib/utils/with_client'; + +const scenario: Scenario = async ({ logger, versionOverride }) => { + const version = versionOverride as string; + const isLegacy = versionOverride && semver.lt(version, '8.7.0'); + return { + bootstrap: async ({ apmEsClient }) => { + if (isLegacy) { + apmEsClient.pipeline((base: Readable) => { + const defaultPipeline = apmEsClient.getDefaultPipeline()( + base + ) as unknown as NodeJS.ReadableStream; + + return pipeline( + defaultPipeline, + addObserverVersionTransform(version), + deleteSummaryFieldTransform(), + (err) => { + if (err) { + logger.error(err); + } + } + ); + }); + } + }, + generate: ({ range, clients: { apmEsClient } }) => { + const successfulTimestamps = range.ratePerMinute(6); + const instance = apm + .service({ + name: `java${isLegacy ? '-legacy' : ''}`, + environment: 'production', + agentName: 'java', + }) + .instance(`instance`); + + return withClient( + apmEsClient, + successfulTimestamps.generator((timestamp) => { + const randomHigh = random(1000, 4000); + const randomLow = random(100, randomHigh / 5); + const duration = random(randomLow, randomHigh); + return instance + .transaction({ transactionName: 'GET /order/{id}' }) + .timestamp(timestamp) + .duration(duration) + .success(); + }) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/gauge.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/gauge.ts index def80346f6f5d4..ebb6f368611898 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/gauge.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/gauge.ts @@ -18,6 +18,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getFormulaColumn, getValueColumn } from '../columns'; @@ -66,14 +67,7 @@ function buildFormulaLayer( ): FormBasedPersistedState['layers'][0] { const layers = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, }; @@ -83,9 +77,7 @@ function buildFormulaLayer( const columnName = getAccessorName('goal'); const formulaColumn = getFormulaColumn( columnName, - { - value: layer.queryGoalValue, - }, + { formula: layer.queryGoalValue }, dataView, formulaAPI ); @@ -97,9 +89,7 @@ function buildFormulaLayer( const columnName = getAccessorName('min'); const formulaColumn = getFormulaColumn( columnName, - { - value: layer.queryMinValue, - }, + { formula: layer.queryMinValue }, dataView, formulaAPI ); @@ -111,9 +101,7 @@ function buildFormulaLayer( const columnName = getAccessorName('max'); const formulaColumn = getFormulaColumn( columnName, - { - value: layer.queryMaxValue, - }, + { formula: layer.queryMaxValue }, dataView, formulaAPI ); diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.test.ts index 91786a0b91e23b..9c3c2fa2bdb6b3 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.test.ts @@ -86,11 +86,11 @@ test('generates metric chart config', async () => { "layer_0": Object { "allColumns": Array [ Object { - "columnId": "metric_formula_accessor_y", + "columnId": "y_metric_formula_accessor", "fieldName": "category", }, Object { - "columnId": "metric_formula_accessor_x", + "columnId": "x_metric_formula_accessor", "fieldName": "@timestamp", }, Object { @@ -100,11 +100,11 @@ test('generates metric chart config', async () => { ], "columns": Array [ Object { - "columnId": "metric_formula_accessor_y", + "columnId": "y_metric_formula_accessor", "fieldName": "category", }, Object { - "columnId": "metric_formula_accessor_x", + "columnId": "x_metric_formula_accessor", "fieldName": "@timestamp", }, Object { @@ -144,8 +144,8 @@ test('generates metric chart config', async () => { }, "shape": "heatmap", "valueAccessor": "metric_formula_accessor", - "xAccessor": "metric_formula_accessor_x", - "yAccessor": "metric_formula_accessor_y", + "xAccessor": "x_metric_formula_accessor", + "yAccessor": "y_metric_formula_accessor", }, }, "title": "test", diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.ts index b06fecd6c37f63..73f1e04ceb047d 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/heatmap.ts @@ -18,13 +18,14 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getBreakdownColumn, getFormulaColumn, getValueColumn } from '../columns'; const ACCESSOR = 'metric_formula_accessor'; function getAccessorName(type: 'x' | 'y') { - return `${ACCESSOR}_${type}`; + return `${type}_${ACCESSOR}`; } function buildVisualizationState(config: LensHeatmapConfig): HeatmapVisualizationState { @@ -69,14 +70,7 @@ function buildFormulaLayer( formulaAPI: FormulaPublicApi ): FormBasedPersistedState['layers'][0] { const defaultLayer = { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }; if (layer.xAxis) { diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.test.ts index 86078332ebb420..d549f5bfa1f1b3 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.test.ts @@ -9,6 +9,10 @@ import type { DataView, DataViewField, DataViewsContract } from '@kbn/data-views-plugin/common'; import { buildMetric } from './metric'; +jest.mock('uuid', () => ({ + v4: jest.fn(() => '3feeaf26-927e-448e-968f-c7e970671564'), +})); + const dataViews: Record = { test: { id: 'test', @@ -114,6 +118,195 @@ test('generates metric chart config', async () => { "layerType": "data", "metricAccessor": "metric_formula_accessor", "showBar": false, + "subtitle": undefined, + }, + }, + "title": "test", + "visualizationType": "lnsMetric", + } + `); +}); + +test('generates metric chart config with trendline', async () => { + const result = await buildMetric( + { + chartType: 'metric', + title: 'test', + dataset: { + index: 'data-view-id', + }, + value: 'count()', + trendLine: true, + }, + { + dataViewsAPI: mockDataViewsService() as any, + formulaAPI: { + insertOrReplaceFormulaColumn: jest.fn(() => ({ + columnOrder: ['formula_accessor_0_0X0', 'formula_accessor_0_0'], + columns: { + ['formula_accessor_0_0X0']: { + label: 'Part of count()', + dataType: 'number', + operationType: 'count', + isBucketed: false, + scale: 'ratio', + sourceField: '___records___', + params: { + emptyAsNull: false, + }, + customLabel: true, + }, + ['formula_accessor_0_0']: { + label: 'count()', + customLabel: true, + operationType: 'formula', + dataType: 'number', + references: ['formula_accessor_0_0X0'], + isBucketed: false, + timeScale: 's', + params: { + formula: 'count()', + format: { + id: 'number', + params: { + decimals: 0, + }, + }, + isFormulaBroken: false, + }, + }, + }, + })), + }, + } + ); + + expect(result).toMatchInlineSnapshot(` + Object { + "references": Array [ + Object { + "id": undefined, + "name": "indexpattern-datasource-layer-layer_0", + "type": "index-pattern", + }, + Object { + "id": undefined, + "name": "indexpattern-datasource-layer-layer_0_trendline", + "type": "index-pattern", + }, + ], + "state": Object { + "adHocDataViews": Object { + "3feeaf26-927e-448e-968f-c7e970671564": Object {}, + }, + "datasourceStates": Object { + "formBased": Object { + "layers": Object { + "layer_0": Object { + "columnOrder": Array [ + "formula_accessor_0_0X0", + "formula_accessor_0_0", + ], + "columns": Object { + "formula_accessor_0_0": Object { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "count()", + "operationType": "formula", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "decimals": 0, + }, + }, + "formula": "count()", + "isFormulaBroken": false, + }, + "references": Array [ + "formula_accessor_0_0X0", + ], + "timeScale": "s", + }, + "formula_accessor_0_0X0": Object { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Part of count()", + "operationType": "count", + "params": Object { + "emptyAsNull": false, + }, + "scale": "ratio", + "sourceField": "___records___", + }, + }, + }, + "layer_0_trendline": Object { + "columnOrder": Array [ + "formula_accessor_0_0X0", + "formula_accessor_0_0", + ], + "columns": Object { + "formula_accessor_0_0": Object { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "count()", + "operationType": "formula", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "decimals": 0, + }, + }, + "formula": "count()", + "isFormulaBroken": false, + }, + "references": Array [ + "formula_accessor_0_0X0", + ], + "timeScale": "s", + }, + "formula_accessor_0_0X0": Object { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Part of count()", + "operationType": "count", + "params": Object { + "emptyAsNull": false, + }, + "scale": "ratio", + "sourceField": "___records___", + }, + }, + "linkToLayers": Array [ + "layer_0", + ], + }, + }, + }, + }, + "filters": Array [], + "internalReferences": Array [], + "query": Object { + "language": "kuery", + "query": "", + }, + "visualization": Object { + "color": undefined, + "layerId": "layer_0", + "layerType": "data", + "metricAccessor": "metric_formula_accessor", + "showBar": false, + "subtitle": undefined, + "trendlineLayerId": "layer_0_trendline", + "trendlineLayerType": "metricTrendline", + "trendlineMetricAccessor": "metric_formula_accessor_trendline", + "trendlineTimeAccessor": "x_date_histogram", }, }, "title": "test", diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.ts index ab2bc68e6fafee..632f96557a27e9 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/metric.ts @@ -20,6 +20,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getBreakdownColumn, @@ -30,7 +31,7 @@ import { const ACCESSOR = 'metric_formula_accessor'; const HISTOGRAM_COLUMN_NAME = 'x_date_histogram'; -const TRENDLINE_LAYER_ID = `layer_trendline`; +const TRENDLINE_LAYER_ID = 'layer_0_trendline'; function getAccessorName(type: 'max' | 'breakdown' | 'secondary') { return `${ACCESSOR}_${type}`; @@ -43,7 +44,7 @@ function buildVisualizationState(config: LensMetricConfig): MetricVisualizationS layerType: 'data', metricAccessor: ACCESSOR, color: layer.seriesColor, - // subtitle: layer.subtitle, + subtitle: layer.subtitle, showBar: false, ...(layer.querySecondaryMetric @@ -98,7 +99,7 @@ function buildFormulaLayer( i: number, dataView: DataView, formulaAPI: FormulaPublicApi -): FormBasedPersistedState['layers'][0] { +): FormBasedPersistedState['layers'] { const baseLayer: PersistedIndexPatternLayer = { columnOrder: [ACCESSOR, HISTOGRAM_COLUMN_NAME], columns: { @@ -117,17 +118,10 @@ function buildFormulaLayer( const layers: { layer_0: PersistedIndexPatternLayer; - layer_trendline?: PersistedIndexPatternLayer; + layer_0_trendline?: PersistedIndexPatternLayer; } = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, ...(layer.trendLine ? { @@ -135,7 +129,7 @@ function buildFormulaLayer( linkToLayers: [DEFAULT_LAYER_ID], ...getFormulaColumn( `${ACCESSOR}_trendline`, - { value: layer.value }, + mapToFormula(layer), dataView, formulaAPI, baseLayer @@ -165,9 +159,7 @@ function buildFormulaLayer( const columnName = getAccessorName('secondary'); const formulaColumn = getFormulaColumn( columnName, - { - value: layer.querySecondaryMetric, - }, + { formula: layer.querySecondaryMetric }, dataView, formulaAPI ); @@ -182,9 +174,7 @@ function buildFormulaLayer( const columnName = getAccessorName('max'); const formulaColumn = getFormulaColumn( columnName, - { - value: layer.queryMaxValue, - }, + { formula: layer.queryMaxValue }, dataView, formulaAPI ); @@ -195,7 +185,7 @@ function buildFormulaLayer( } } - return layers[DEFAULT_LAYER_ID]; + return layers; } function getValueColumns(layer: LensMetricConfig) { diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/partition.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/partition.ts index a6c32db059f9be..8283d6e9985514 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/partition.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/partition.ts @@ -26,6 +26,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getBreakdownColumn, getFormulaColumn, getValueColumn } from '../columns'; @@ -73,14 +74,7 @@ function buildFormulaLayer( ): FormBasedPersistedState['layers'][0] { const layers = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, }; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.test.ts index 4fd97797b69dd1..dc1f37a393fd23 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.test.ts @@ -50,7 +50,7 @@ function mockDataViewsService() { } as unknown as Pick; } -test('generates metric chart config', async () => { +test('generates region map chart config', async () => { const result = await buildRegionMap( { chartType: 'regionmap', diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.ts index 2ed9e0dac9d8aa..b2a48ab8c2a85f 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/region_map.ts @@ -21,6 +21,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getBreakdownColumn, getFormulaColumn, getValueColumn } from '../columns'; @@ -54,14 +55,7 @@ function buildFormulaLayer( ): FormBasedPersistedState['layers'][0] { const layers = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, }; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/table.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/table.test.ts index dbe67d15416c4e..90c07d4af46b72 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/table.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/table.test.ts @@ -50,7 +50,7 @@ function mockDataViewsService() { } as unknown as Pick; } -test('generates metric chart config', async () => { +test('generates table config', async () => { const result = await buildTable( { chartType: 'table', diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/table.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/table.ts index a14934dca57a00..e74230afbac2a1 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/table.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/table.ts @@ -18,6 +18,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { getBreakdownColumn, getFormulaColumn, getValueColumn } from '../columns'; @@ -45,14 +46,7 @@ function buildFormulaLayer( ): FormBasedPersistedState['layers'][0] { const layers = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, }; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.test.ts index fe94e8f789d43b..d7db572bb286a2 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.test.ts @@ -50,7 +50,7 @@ function mockDataViewsService() { } as unknown as Pick; } -test('generates metric chart config', async () => { +test('generates tag cloud chart config', async () => { const result = await buildTagCloud( { chartType: 'tagcloud', diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.ts index 31ea43af1dd6b8..a986098aca5a94 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/tag_cloud.ts @@ -19,6 +19,7 @@ import { buildReferences, getAdhocDataviews, isFormulaDataset, + mapToFormula, } from '../utils'; import { getBreakdownColumn, getFormulaColumn, getValueColumn } from '../columns'; @@ -31,6 +32,7 @@ function getAccessorName(type: 'breakdown') { function buildVisualizationState(config: LensTagCloudConfig): TagcloudState { const layer = config; const isFormula = isFormulaDataset(config.dataset) || isFormulaDataset(layer.dataset); + return { layerId: DEFAULT_LAYER_ID, valueAccessor: !isFormula ? layer.value : ACCESSOR, @@ -54,14 +56,7 @@ function buildFormulaLayer( ): FormBasedPersistedState['layers'][0] { const layers = { [DEFAULT_LAYER_ID]: { - ...getFormulaColumn( - ACCESSOR, - { - value: layer.value, - }, - dataView, - formulaAPI - ), + ...getFormulaColumn(ACCESSOR, mapToFormula(layer), dataView, formulaAPI), }, }; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts index 42dc00dc2ba268..562c5b0948a486 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts @@ -50,7 +50,7 @@ function mockDataViewsService() { } as unknown as Pick; } -test('generates metric chart config', async () => { +test('generates xy chart config', async () => { const result = await buildXY( { chartType: 'xy', @@ -62,9 +62,13 @@ test('generates metric chart config', async () => { { type: 'series', seriesType: 'bar', - label: 'test', - value: 'count', xAxis: '@timestamp', + yAxis: [ + { + label: 'test', + value: 'count', + }, + ], }, ], }, @@ -73,6 +77,7 @@ test('generates metric chart config', async () => { formulaAPI: {} as any, } ); + expect(result).toMatchInlineSnapshot(` Object { "references": Array [ @@ -92,11 +97,11 @@ test('generates metric chart config', async () => { "layer_0": Object { "allColumns": Array [ Object { - "columnId": "metric_formula_accessor0_x", + "columnId": "x_metric_formula_accessor0", "fieldName": "@timestamp", }, Object { - "columnId": "metric_formula_accessor0", + "columnId": "metric_formula_accessor0_0", "fieldName": "count", "meta": Object { "type": "number", @@ -105,11 +110,11 @@ test('generates metric chart config', async () => { ], "columns": Array [ Object { - "columnId": "metric_formula_accessor0_x", + "columnId": "x_metric_formula_accessor0", "fieldName": "@timestamp", }, Object { - "columnId": "metric_formula_accessor0", + "columnId": "metric_formula_accessor0_0", "fieldName": "count", "meta": Object { "type": "number", @@ -136,12 +141,14 @@ test('generates metric chart config', async () => { "yLeft": true, "yRight": true, }, + "emphasizeFitting": false, "fittingFunction": "None", "gridlinesVisibilitySettings": Object { "x": true, "yLeft": true, "yRight": true, }, + "hideEndzones": true, "labelsOrientation": Object { "x": 0, "yLeft": 0, @@ -150,12 +157,12 @@ test('generates metric chart config', async () => { "layers": Array [ Object { "accessors": Array [ - "metric_formula_accessor0", + "metric_formula_accessor0_0", ], "layerId": "layer_0", "layerType": "data", "seriesType": "bar", - "xAccessor": "metric_formula_accessor0_x", + "xAccessor": "x_metric_formula_accessor0", }, ], "legend": Object { @@ -169,6 +176,11 @@ test('generates metric chart config', async () => { "yRight": true, }, "valueLabels": "hide", + "yLeftExtent": Object { + "lowerBound": undefined, + "mode": "full", + "upperBound": undefined, + }, }, }, "title": "test", diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts index 1b9171d0f6d251..31b39c47b1b11f 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts @@ -12,6 +12,7 @@ import type { XYState, XYReferenceLineLayerConfig, XYDataLayerConfig, + PersistedIndexPatternLayer, } from '@kbn/lens-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { XYByValueAnnotationLayerConfig } from '@kbn/lens-plugin/public/visualizations/xy/types'; @@ -22,6 +23,7 @@ import { buildDatasourceStates, buildReferences, getAdhocDataviews, + mapToFormula, } from '../utils'; import { BuildDependencies, @@ -36,17 +38,24 @@ const ACCESSOR = 'metric_formula_accessor'; function buildVisualizationState(config: LensXYConfig): XYState { return { + axisTitlesVisibilitySettings: { + x: config.axisTitleVisibility?.showXAxisTitle ?? true, + yLeft: config.axisTitleVisibility?.showYAxisTitle ?? true, + yRight: true, + }, legend: { - isVisible: config.legend?.show || true, - position: config.legend?.position || 'left', + isVisible: config.legend?.show ?? true, + position: config.legend?.position ?? 'left', }, + hideEndzones: true, preferredSeriesType: 'line', valueLabels: 'hide', - fittingFunction: 'None', - axisTitlesVisibilitySettings: { - x: true, - yLeft: true, - yRight: true, + emphasizeFitting: config?.emphasizeFitting ?? false, + fittingFunction: config?.fittingFunction ?? 'None', + yLeftExtent: { + mode: config.yBounds?.mode ?? 'full', + lowerBound: config.yBounds?.lowerBound, + upperBound: config.yBounds?.upperBound, }, tickLabelsVisibilitySettings: { x: true, @@ -107,25 +116,24 @@ function buildVisualizationState(config: LensXYConfig): XYState { return { layerId: `layer_${i}`, layerType: 'referenceLine', - accessors: [`${ACCESSOR}${i}`], - yConfig: [ - { - forAccessor: `${ACCESSOR}${i}`, - axisMode: 'left', - }, - ], + accessors: layer.yAxis.map((_, index) => `${ACCESSOR}${i}_${index}`), + yConfig: layer.yAxis.map((yAxis, index) => ({ + forAccessor: `${ACCESSOR}${i}_${index}`, + axisMode: 'left', + color: yAxis.seriesColor, + })), } as XYReferenceLineLayerConfig; case 'series': return { layerId: `layer_${i}`, layerType: 'data', - xAccessor: `${ACCESSOR}${i}_x`, + xAccessor: `x_${ACCESSOR}${i}`, ...(layer.breakdown ? { - splitAccessor: `${ACCESSOR}${i}_y}`, + splitAccessor: `y_${ACCESSOR}${i}`, } : {}), - accessors: [`${ACCESSOR}${i}`], + accessors: layer.yAxis.map((_, index) => `${ACCESSOR}${i}_${index}`), seriesType: layer.seriesType || 'line', } as XYDataLayerConfig; } @@ -144,11 +152,31 @@ function getValueColumns(layer: LensSeriesLayer, i: number) { ...(layer.breakdown ? [getValueColumn(`${ACCESSOR}${i}_breakdown`, layer.breakdown as string)] : []), - getValueColumn(`${ACCESSOR}${i}_x`, layer.xAxis as string), - getValueColumn(`${ACCESSOR}${i}`, layer.value, 'number'), + getValueColumn(`x_${ACCESSOR}${i}`, layer.xAxis as string), + ...layer.yAxis.map((yAxis, index) => ({ + ...getValueColumn(`${ACCESSOR}${i}_${index}`, yAxis.value, 'number'), + })), ]; } +function buildAllFormulasInLayer( + layer: LensSeriesLayer | LensAnnotationLayer | LensReferenceLineLayer, + i: number, + dataView: DataView, + formulaAPI: FormulaPublicApi +): PersistedIndexPatternLayer { + return layer.yAxis.reduce((acc, curr, valueIndex) => { + const formulaColumn = getFormulaColumn( + `${ACCESSOR}${i}_${valueIndex}`, + mapToFormula(curr), + dataView, + formulaAPI, + valueIndex > 0 ? acc : undefined + ); + return { ...acc, ...formulaColumn }; + }, {} as PersistedIndexPatternLayer); +} + function buildFormulaLayer( layer: LensSeriesLayer | LensAnnotationLayer | LensReferenceLineLayer, i: number, @@ -156,19 +184,10 @@ function buildFormulaLayer( formulaAPI: FormulaPublicApi ): FormBasedPersistedState['layers'][0] { if (layer.type === 'series') { - const resultLayer = { - ...getFormulaColumn( - `${ACCESSOR}${i}`, - { - value: layer.value, - }, - dataView, - formulaAPI - ), - }; + const resultLayer = buildAllFormulasInLayer(layer, i, dataView, formulaAPI); if (layer.xAxis) { - const columnName = `${ACCESSOR}${i}_x`; + const columnName = `x_${ACCESSOR}${i}`; const breakdownColumn = getBreakdownColumn({ options: layer.xAxis, dataView, @@ -177,7 +196,7 @@ function buildFormulaLayer( } if (layer.breakdown) { - const columnName = `${ACCESSOR}${i}_y`; + const columnName = `y_${ACCESSOR}${i}`; const breakdownColumn = getBreakdownColumn({ options: layer.breakdown, dataView, @@ -189,16 +208,7 @@ function buildFormulaLayer( } else if (layer.type === 'annotation') { // nothing ? } else if (layer.type === 'reference') { - return { - ...getFormulaColumn( - `${ACCESSOR}${i}`, - { - value: layer.value, - }, - dataView, - formulaAPI - ), - }; + return buildAllFormulasInLayer(layer, i, dataView, formulaAPI); } return { diff --git a/packages/kbn-lens-embeddable-utils/config_builder/columns/date_histogram.ts b/packages/kbn-lens-embeddable-utils/config_builder/columns/date_histogram.ts index 59098f7e18f16d..21e51f317da61d 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/columns/date_histogram.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/columns/date_histogram.ts @@ -26,8 +26,7 @@ export const getHistogramColumn = ({ label: '@timestamp', operationType: 'date_histogram', scale: 'interval', - sourceField: '@timestamp', - ...options, + sourceField: options?.sourceField ?? '@timestamp', params: { interval, ...rest }, }; }; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/columns/formula.ts b/packages/kbn-lens-embeddable-utils/config_builder/columns/formula.ts index 1a28bc917cb837..37c9c3343185bc 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/columns/formula.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/columns/formula.ts @@ -8,13 +8,8 @@ import type { FormulaPublicApi, PersistedIndexPatternLayer } from '@kbn/lens-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; +import { FormulaValueConfig } from '../types'; -type LensFormula = Parameters[1]; - -export type FormulaValueConfig = Omit & { - color?: string; - value: string; -}; export function getFormulaColumn( id: string, config: FormulaValueConfig, @@ -22,10 +17,10 @@ export function getFormulaColumn( formulaAPI: FormulaPublicApi, baseLayer?: PersistedIndexPatternLayer ): PersistedIndexPatternLayer { - const { value, ...rest } = config; + const { formula, ...rest } = config; const formulaLayer = formulaAPI.insertOrReplaceFormulaColumn( id, - { formula: value, ...rest }, + { formula, ...rest }, baseLayer || { columnOrder: [], columns: {} }, dataView ); diff --git a/packages/kbn-lens-embeddable-utils/config_builder/types.ts b/packages/kbn-lens-embeddable-utils/config_builder/types.ts index c537ee5bfe23f0..eaf35082f6426d 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/types.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/types.ts @@ -62,14 +62,21 @@ export interface LensBaseConfig { export interface LensBaseLayer { label?: string; filter?: string; - format?: 'bytes' | 'currency' | 'duration' | 'number' | 'percent' | 'string'; + format?: 'bits' | 'bytes' | 'currency' | 'duration' | 'number' | 'percent' | 'string'; + decimals?: number; + normalizeByUnit?: 's' | 'm' | 'h' | 'd'; + compactValues?: boolean; randomSampling?: number; useGlobalFilter?: boolean; seriesColor?: string; - dataset?: LensDataset; value: LensLayerQuery; } +export interface LensBaseXYLayer { + dataset?: LensDataset; + yAxis: LensBaseLayer[]; +} + export type LensConfig = | LensMetricConfig | LensGaugeConfig @@ -91,6 +98,16 @@ export interface LensConfigOptions { query?: Query; } +export interface LensAxisTitleVisibilityConfig { + showXAxisTitle?: boolean; + showYAxisTitle?: boolean; +} + +export interface LensYBoundsConfig { + mode: 'full' | 'custom' | 'dataBounds'; + lowerBound?: number; + upperBound?: number; +} export interface LensLegendConfig { show?: boolean; position?: 'top' | 'left' | 'bottom' | 'right'; @@ -140,6 +157,7 @@ export interface LensMetricConfigBase { /** field name to apply breakdown based on field type or full breakdown configuration */ breakdown?: LensBreakdownConfig; trendLine?: boolean; + subtitle?: string; } export type LensMetricConfig = Identity; @@ -222,10 +240,10 @@ export interface LensReferenceLineLayerBase { lineThickness?: number; color?: string; fill?: 'none' | 'above' | 'below'; - value?: number; + value?: string; } -export type LensReferenceLineLayer = LensReferenceLineLayerBase & LensBaseLayer; +export type LensReferenceLineLayer = LensReferenceLineLayerBase & LensBaseXYLayer; export interface LensAnnotationLayerBaseProps { name: string; @@ -234,7 +252,7 @@ export interface LensAnnotationLayerBaseProps { } export type LensAnnotationLayer = Identity< - LensBaseLayer & { + LensBaseXYLayer & { type: 'annotation'; events: Array< | Identity< @@ -253,7 +271,7 @@ export type LensAnnotationLayer = Identity< >; export type LensSeriesLayer = Identity< - LensBaseLayer & { + LensBaseXYLayer & { type: 'series'; breakdown?: LensBreakdownConfig; xAxis: LensBreakdownConfig; @@ -265,6 +283,10 @@ export interface LensXYConfigBase { chartType: 'xy'; layers: Array; legend?: Identity; + axisTitleVisibility?: Identity; + emphasizeFitting?: boolean; + fittingFunction?: 'None' | 'Zero' | 'Linear' | 'Carry' | 'Lookahead' | 'Average' | 'Nearest'; + yBounds?: LensYBoundsConfig; } export interface BuildDependencies { dataViewsAPI: DataViewsPublicPluginStart; @@ -272,3 +294,27 @@ export interface BuildDependencies { } export type LensXYConfig = Identity; + +type LensFormula = Parameters[1]; + +export type FormulaValueConfig = LensFormula & { + color?: string; +}; + +interface ChartTypeLensMap { + gauge: LensGaugeConfig; + metric: LensMetricConfig; + pie: LensPieConfig; + donut: LensPieConfig; + treemap: LensTreeMapConfig; + tagcloud: LensTagCloudConfig; + regionmap: LensRegionMapConfig; + mosaic: LensMosaicConfig; + table: LensTableConfig; + heatmap: LensHeatmapConfig; + xy: LensXYConfig; +} + +export type ChartTypeLensConfig = T extends keyof ChartTypeLensMap + ? ChartTypeLensMap[T] + : never; diff --git a/packages/kbn-lens-embeddable-utils/config_builder/utils.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/utils.test.ts index b4b7c7ddc4842f..d7559b7121ae87 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/utils.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/utils.test.ts @@ -13,6 +13,7 @@ import { getDatasetIndex, addLayerColumn, isFormulaDataset, + mapToFormula, } from './utils'; import type { DataView } from '@kbn/data-views-plugin/common'; import type { @@ -185,8 +186,7 @@ describe('buildDatasourceStates', () => { dataset: { esql: 'from test | limit 10', }, - label: 'test', - value: 'test', + yAxis: [{ label: 'test', value: 'test' }], }, ], }, @@ -215,3 +215,41 @@ describe('buildDatasourceStates', () => { `); }); }); + +describe('mapToFormula', () => { + test('map LensBaseLayer to FormulaConfigValue', () => { + const formulaConfig = mapToFormula({ + label: 'iowait', + value: 'average(system.cpu.iowait.pct) / max(system.cpu.cores)', + }); + expect(formulaConfig).toMatchInlineSnapshot(` + Object { + "format": undefined, + "formula": "average(system.cpu.iowait.pct) / max(system.cpu.cores)", + "label": "iowait", + "timeScale": undefined, + } + `); + }); + test('map LensBaseLayer to FormulaConfigValue with format', () => { + const formulaConfig = mapToFormula({ + label: 'iowait', + value: 'average(system.cpu.iowait.pct) / max(system.cpu.cores)', + format: 'percent', + decimals: 1, + }); + expect(formulaConfig).toMatchInlineSnapshot(` + Object { + "format": Object { + "id": "percent", + "params": Object { + "decimals": 1, + }, + }, + "formula": "average(system.cpu.iowait.pct) / max(system.cpu.cores)", + "label": "iowait", + "timeScale": undefined, + } + `); + }); +}); diff --git a/packages/kbn-lens-embeddable-utils/config_builder/utils.ts b/packages/kbn-lens-embeddable-utils/config_builder/utils.ts index 78434f8dbb10f4..44e3fdd31d2b45 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/utils.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/utils.ts @@ -14,6 +14,7 @@ import type { DataViewsPublicPluginStart, } from '@kbn/data-views-plugin/public'; import type { + FormBasedPersistedState, GenericIndexPatternColumn, PersistedIndexPatternLayer, } from '@kbn/lens-plugin/public'; @@ -23,15 +24,22 @@ import type { } from '@kbn/lens-plugin/public/datasources/text_based/types'; import { AggregateQuery, getIndexPatternFromESQLQuery } from '@kbn/es-query'; import { + FormulaValueConfig, LensAnnotationLayer, LensAttributes, LensBaseConfig, LensBaseLayer, + LensBaseXYLayer, LensDataset, LensDatatableDataset, LensESQLDataset, } from './types'; +type DataSourceStateLayer = + | FormBasedPersistedState['layers'] // metric chart can return 2 layers (one for the metric and one for the trendline) + | PersistedIndexPatternLayer + | TextBasedPersistedState['layers'][0]; + export const getDefaultReferences = ( index: string, dataLayerId: string @@ -45,6 +53,27 @@ export const getDefaultReferences = ( ]; }; +export function mapToFormula(layer: LensBaseLayer): FormulaValueConfig { + const { label, decimals, format, compactValues: compact, normalizeByUnit, value } = layer; + + const formulaFormat: FormulaValueConfig['format'] | undefined = format + ? { + id: format, + params: { + decimals: decimals ?? 2, + ...(!!compact ? { compact } : undefined), + }, + } + : undefined; + + return { + formula: value, + label, + timeScale: normalizeByUnit, + format: formulaFormat, + }; +} + export function buildReferences(dataviews: Record) { const references = []; for (const layerid in dataviews) { @@ -75,6 +104,12 @@ export const getAdhocDataviews = (dataviews: Record) => { return adHocDataViews; }; +export function isSingleLayer( + layer: DataSourceStateLayer +): layer is PersistedIndexPatternLayer | TextBasedPersistedState['layers'][0] { + return layer && typeof layer === 'object' && ('columnOrder' in layer || 'columns' in layer); +} + export function isFormulaDataset(dataset?: LensDataset) { if (dataset && 'index' in dataset) { return true; @@ -126,7 +161,7 @@ export function getDatasetIndex(dataset?: LensDataset) { } function buildDatasourceStatesLayer( - layer: LensBaseLayer, + layer: LensBaseLayer | LensBaseXYLayer, i: number, dataset: LensDataset, dataView: DataView | undefined, @@ -134,13 +169,12 @@ function buildDatasourceStatesLayer( config: unknown, i: number, dataView: DataView - ) => PersistedIndexPatternLayer | undefined, + ) => FormBasedPersistedState['layers'] | PersistedIndexPatternLayer | undefined, getValueColumns: (config: unknown, i: number) => TextBasedLayerColumn[] // ValueBasedLayerColumn[] -): [ - 'textBased' | 'formBased', - PersistedIndexPatternLayer | TextBasedPersistedState['layers'][0] | undefined -] { - function buildValueLayer(config: LensBaseLayer): TextBasedPersistedState['layers'][0] { +): ['textBased' | 'formBased', DataSourceStateLayer | undefined] { + function buildValueLayer( + config: LensBaseLayer | LensBaseXYLayer + ): TextBasedPersistedState['layers'][0] { const table = dataset as LensDatatableDataset; const newLayer = { table, @@ -160,7 +194,9 @@ function buildDatasourceStatesLayer( return newLayer; } - function buildESQLLayer(config: LensBaseLayer): TextBasedPersistedState['layers'][0] { + function buildESQLLayer( + config: LensBaseLayer | LensBaseXYLayer + ): TextBasedPersistedState['layers'][0] { const columns = getValueColumns(layer, i); const newLayer = { @@ -181,13 +217,13 @@ function buildDatasourceStatesLayer( return ['formBased', buildFormulaLayers(layer, i, dataView!)]; } export const buildDatasourceStates = async ( - config: (LensBaseConfig & { layers: LensBaseLayer[] }) | (LensBaseLayer & LensBaseConfig), + config: (LensBaseConfig & { layers: LensBaseXYLayer[] }) | (LensBaseLayer & LensBaseConfig), dataviews: Record, buildFormulaLayers: ( config: unknown, i: number, dataView: DataView - ) => PersistedIndexPatternLayer | undefined, + ) => PersistedIndexPatternLayer | FormBasedPersistedState['layers'] | undefined, getValueColumns: (config: any, i: number) => TextBasedLayerColumn[], dataViewsAPI: DataViewsPublicPluginStart ) => { @@ -209,10 +245,6 @@ export const buildDatasourceStates = async ( ? await getDataView(index.index, dataViewsAPI, index.timeFieldName) : undefined; - if (dataView) { - dataviews[layerId] = dataView; - } - if (dataset) { const [type, layerConfig] = buildDatasourceStatesLayer( layer, @@ -226,17 +258,25 @@ export const buildDatasourceStates = async ( layers = { ...layers, [type]: { - layers: { - [layerId]: layerConfig, - }, + layers: isSingleLayer(layerConfig) + ? { ...layers[type]?.layers, [layerId]: layerConfig } + : // metric chart can return 2 layers (one for the metric and one for the trendline) + { ...layerConfig }, }, }; } + + if (dataView) { + Object.keys(layers[type]?.layers ?? []).forEach((id) => { + dataviews[id] = dataView; + }); + } } } return layers; }; + export const addLayerColumn = ( layer: PersistedIndexPatternLayer, columnName: string, diff --git a/src/dev/performance/run_performance_cli.ts b/src/dev/performance/run_performance_cli.ts index 3c5807e1c208b9..687a6460d5a3dc 100644 --- a/src/dev/performance/run_performance_cli.ts +++ b/src/dev/performance/run_performance_cli.ts @@ -11,7 +11,6 @@ import { run } from '@kbn/dev-cli-runner'; import { REPO_ROOT } from '@kbn/repo-info'; import fs from 'fs'; import path from 'path'; -import { JOURNEY_APM_CONFIG } from '@kbn/journeys'; const JOURNEY_BASE_PATH = 'x-pack/performance/journeys'; @@ -108,20 +107,21 @@ run( 'scripts/es', 'snapshot', '--license=trial', - ...(JOURNEY_APM_CONFIG.active - ? [ - '-E', - 'tracing.apm.enabled=true', - '-E', - 'tracing.apm.agent.transaction_sample_rate=1.0', - '-E', - `tracing.apm.agent.server_url=${JOURNEY_APM_CONFIG.serverUrl}`, - '-E', - `tracing.apm.agent.secret_token=${JOURNEY_APM_CONFIG.secretToken}`, - '-E', - `tracing.apm.agent.environment=${JOURNEY_APM_CONFIG.environment}`, - ] - : []), + // Temporarily disabling APM + // ...(JOURNEY_APM_CONFIG.active + // ? [ + // '-E', + // 'tracing.apm.enabled=true', + // '-E', + // 'tracing.apm.agent.transaction_sample_rate=1.0', + // '-E', + // `tracing.apm.agent.server_url=${JOURNEY_APM_CONFIG.serverUrl}`, + // '-E', + // `tracing.apm.agent.secret_token=${JOURNEY_APM_CONFIG.secretToken}`, + // '-E', + // `tracing.apm.agent.environment=${JOURNEY_APM_CONFIG.environment}`, + // ] + // : []), ], cwd: REPO_ROOT, wait: /kbn\/es setup complete/, diff --git a/src/dev/tsconfig.json b/src/dev/tsconfig.json index 806af4b68384f6..a3ebcf6dda1ba2 100644 --- a/src/dev/tsconfig.json +++ b/src/dev/tsconfig.json @@ -39,7 +39,6 @@ "@kbn/get-repo-files", "@kbn/import-locator", "@kbn/config-schema", - "@kbn/journeys", "@kbn/core-test-helpers-so-type-serializer", "@kbn/core-test-helpers-kbn-server", ] diff --git a/src/plugins/chart_expressions/expression_xy/public/components/annotations.scss b/src/plugins/chart_expressions/expression_xy/public/components/annotations.scss index 644eec1749e975..f2211dfdf8e217 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/annotations.scss +++ b/src/plugins/chart_expressions/expression_xy/public/components/annotations.scss @@ -44,13 +44,13 @@ } .xyAnnotationTooltip__extraFieldsKey { - overflow-wrap: break-word; + overflow-wrap: anywhere; hyphens: auto; } .xyAnnotationTooltip__extraFieldsValue { text-align: right; - overflow-wrap: break-word; + overflow-wrap: anywhere; hyphens: auto; } diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_page.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_page.tsx index b556132d9c18b9..792e50fd585c87 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_page.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_page.tsx @@ -20,12 +20,13 @@ import { EuiSkeletonText, } from '@elastic/eui'; -import { Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { usePageUrlState, useUrlState } from '@kbn/ml-url-state'; import type { FieldValidationResults } from '@kbn/ml-category-validator'; import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { stringHash } from '@kbn/ml-string-hash'; import { AIOPS_TELEMETRY_ID } from '../../../common/constants'; import type { Category } from '../../../common/api/log_categorization/types'; @@ -50,6 +51,7 @@ import { InformationText } from './information_text'; import { SamplingMenu } from './sampling_menu'; import { useValidateFieldRequest } from './use_validate_category_field'; import { FieldValidationCallout } from './category_validation_callout'; +import type { DocumentStats } from '../../hooks/use_document_count_stats'; const BAR_TARGET = 20; const DEFAULT_SELECTED_FIELD = 'message'; @@ -80,6 +82,7 @@ export const LogCategorizationPage: FC = ({ embeddin const [selectedField, setSelectedField] = useState(); const [selectedCategory, setSelectedCategory] = useState(null); const [selectedSavedSearch, setSelectedSavedSearch] = useState(savedSearch); + const [previousDocumentStatsHash, setPreviousDocumentStatsHash] = useState(0); const [loading, setLoading] = useState(false); const [totalCount, setTotalCount] = useState(0); const [eventRate, setEventRate] = useState([]); @@ -157,14 +160,13 @@ export const LogCategorizationPage: FC = ({ embeddin to: globalState.time.to, }); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(globalState?.time), timefilter]); + }, [globalState?.time, timefilter]); const fields = useMemo( () => dataView.fields .filter( - ({ displayName, esTypes, count }) => + ({ displayName, esTypes }) => esTypes && esTypes.includes('text') && !['_id', '_index'].includes(displayName) ) .map(({ displayName }) => ({ @@ -173,29 +175,6 @@ export const LogCategorizationPage: FC = ({ embeddin [dataView] ); - useEffect(() => { - if (documentStats.documentCountStats?.buckets) { - randomSampler.setDocCount(documentStats.totalCount); - setEventRate( - Object.entries(documentStats.documentCountStats.buckets).map(([key, docCount]) => ({ - key: +key, - docCount, - })) - ); - setData(null); - setFieldValidationResult(null); - setTotalCount(documentStats.totalCount); - } - }, [ - documentStats, - earliest, - latest, - searchQueryLanguage, - searchString, - searchQuery, - randomSampler, - ]); - const loadCategories = useCallback(async () => { setLoading(true); setData(null); @@ -257,6 +236,43 @@ export const LogCategorizationPage: FC = ({ embeddin embeddingOrigin, ]); + useEffect(() => { + const buckets = documentStats.documentCountStats?.buckets; + if (buckets === undefined) { + return; + } + + const hash = createDocumentStatsHash(documentStats); + if (hash !== previousDocumentStatsHash) { + randomSampler.setDocCount(documentStats.totalCount); + setEventRate( + Object.entries(buckets).map(([key, docCount]) => ({ + key: +key, + docCount, + })) + ); + setData(null); + setFieldValidationResult(null); + setTotalCount(documentStats.totalCount); + if (fieldValidationResult !== null) { + loadCategories(); + } + } + setPreviousDocumentStatsHash(hash); + }, [ + documentStats, + earliest, + latest, + searchQueryLanguage, + searchString, + searchQuery, + randomSampler, + totalCount, + previousDocumentStatsHash, + fieldValidationResult, + loadCategories, + ]); + useEffect( function autoSelectField() { if (selectedField !== undefined) { @@ -390,3 +406,15 @@ export const LogCategorizationPage: FC = ({ embeddin ); }; + +/** + * Creates a hash from the document stats to determine if the document stats have changed. + */ +function createDocumentStatsHash(documentStats: DocumentStats) { + const lastTimeStampMs = documentStats.documentCountStats?.lastDocTimeStampMs; + const totalCount = documentStats.documentCountStats?.totalCount; + const times = Object.keys(documentStats.documentCountStats?.buckets ?? {}); + const firstBucketTimeStamp = times.length ? times[0] : undefined; + const lastBucketTimeStamp = times.length ? times[times.length - 1] : undefined; + return stringHash(`${lastTimeStampMs}${totalCount}${firstBucketTimeStamp}${lastBucketTimeStamp}`); +} diff --git a/x-pack/plugins/aiops/public/get_document_stats.ts b/x-pack/plugins/aiops/public/get_document_stats.ts index d4933d103eb7e0..1f79b232cd6c66 100644 --- a/x-pack/plugins/aiops/public/get_document_stats.ts +++ b/x-pack/plugins/aiops/public/get_document_stats.ts @@ -5,9 +5,10 @@ * 2.0. */ -import { each, get } from 'lodash'; +import { get } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import dateMath from '@kbn/datemath'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import type { SignificantItem } from '@kbn/ml-agg-utils'; @@ -23,6 +24,7 @@ export interface DocumentCountStats { timeRangeEarliest?: number; timeRangeLatest?: number; totalCount: number; + lastDocTimeStampMs?: number; } export interface DocumentStatsSearchStrategyParams { @@ -60,7 +62,6 @@ export const getDocumentCountStatsRequest = ( trackTotalHits, } = params; - const size = 0; const filterCriteria = buildExtendedBaseFilterCriteria( timeFieldName, earliestMs, @@ -91,23 +92,33 @@ export const getDocumentCountStatsRequest = ( const aggs = randomSamplerWrapper ? randomSamplerWrapper.wrap(rawAggs) : rawAggs; - const searchBody = { + const searchBody: estypes.MsearchMultisearchBody = { query: { bool: { filter: filterCriteria, }, }, - ...(!fieldsToFetch && + track_total_hits: trackTotalHits === true, + size: 0, + }; + + if (isPopulatedObject(runtimeFieldMap)) { + searchBody.runtime_mappings = runtimeFieldMap; + } + + if ( + !fieldsToFetch && !skipAggs && timeFieldName !== undefined && intervalMs !== undefined && intervalMs > 0 - ? { aggs } - : {}), - ...(isPopulatedObject(runtimeFieldMap) ? { runtime_mappings: runtimeFieldMap } : {}), - track_total_hits: trackTotalHits === true, - size, - }; + ) { + searchBody.aggs = aggs; + searchBody.sort = { [timeFieldName]: 'desc' }; + searchBody.fields = [timeFieldName]; + searchBody.size = 1; + } + return { index, body: searchBody, @@ -132,7 +143,7 @@ export const processDocumentCountStats = ( totalCount, }; } - const buckets: { [key: string]: number } = {}; + const dataByTimeBucket: Array<{ key: string; doc_count: number }> = get( randomSamplerWrapper && body.aggregations !== undefined ? randomSamplerWrapper.unwrap(body.aggregations) @@ -140,10 +151,15 @@ export const processDocumentCountStats = ( ['eventRate', 'buckets'], [] ); - each(dataByTimeBucket, (dataForTime) => { - const time = dataForTime.key; - buckets[time] = dataForTime.doc_count; - }); + + const buckets = dataByTimeBucket.reduce>((acc, cur) => { + acc[cur.key] = cur.doc_count; + return acc; + }, {}); + + const lastDocTimeStamp: string = Object.values(body.hits.hits[0]?.fields ?? [[]])[0][0]; + const lastDocTimeStampMs = + lastDocTimeStamp === undefined ? undefined : dateMath.parse(lastDocTimeStamp)?.valueOf(); return { interval: params.intervalMs, @@ -151,5 +167,6 @@ export const processDocumentCountStats = ( timeRangeEarliest: params.earliest, timeRangeLatest: params.latest, totalCount, + lastDocTimeStampMs, }; }; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts index d230f18f7ea60e..81c4dc8562bf35 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/aggregate/aggregate_rules.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -61,6 +62,7 @@ const rulesClientParams: jest.Mocked = { alertsService: null, maxScheduledPerMinute: 1000, internalSavedObjectsRepository, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts index c3cbfd340984c0..6fec4e8a636dab 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts @@ -6,7 +6,11 @@ */ import { RulesClient, ConstructorOptions } from '../../../../rules_client/rules_client'; -import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + savedObjectsRepositoryMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { schema } from '@kbn/config-schema'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; @@ -82,6 +86,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const getBulkOperationStatusErrorResponse = (statusCode: number) => ({ diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.test.ts index 2b7c72fd4c51bc..81a8466e23a222 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.test.ts @@ -6,7 +6,11 @@ */ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../../../../rules_client/rules_client'; -import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + savedObjectsRepositoryMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import type { SavedObject } from '@kbn/core-saved-objects-server'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -96,6 +100,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts index dbd056bb1df30c..7faa85b3ef0cdc 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts @@ -14,6 +14,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -105,6 +106,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: getAuthenticationApiKeyMock, getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const paramsModifier = jest.fn(); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts index d9ff12bf9d3f3c..1a4898418a8c44 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts @@ -638,7 +638,7 @@ async function getUpdatedAttributesFromOperations({ case 'actions': { const updatedOperation = { ...operation, - value: addGeneratedActionValues(operation.value), + value: await addGeneratedActionValues(operation.value, context), }; try { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_untrack/bulk_untrack_alerts.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_untrack/bulk_untrack_alerts.test.ts index 4a79e0a07b5809..f8e8b1288634a9 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_untrack/bulk_untrack_alerts.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_untrack/bulk_untrack_alerts.test.ts @@ -5,7 +5,11 @@ * 2.0. */ import { RulesClient, ConstructorOptions } from '../../../../rules_client/rules_client'; -import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + savedObjectsRepositoryMock, + uiSettingsServiceMock, +} from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks'; @@ -56,6 +60,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService, + uiSettings: uiSettingsServiceMock.createStartContract(), }; describe('bulkUntrackAlerts()', () => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts index ca2ccc98ea2923..21a7b170e28717 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.test.ts @@ -12,6 +12,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -85,6 +86,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts index bdd11da2483f74..11cd4d5f9e3284 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts @@ -59,7 +59,10 @@ export async function createRule( // TODO (http-versioning): Remove this cast when we fix addGeneratedActionValues const data = { ...initialData, - actions: addGeneratedActionValues(initialData.actions as NormalizedAlertAction[]), + actions: await addGeneratedActionValues( + initialData.actions as NormalizedAlertAction[], + context + ), }; const id = options?.id || SavedObjectsUtils.generateId(); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts index c9c890b2ff6ad3..03f23256041b6a 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/get_schedule_frequency/get_schedule_frequency.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -55,6 +56,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const getMockAggregationResult = ( diff --git a/x-pack/plugins/alerting/server/application/rule/methods/tags/get_rule_tags.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/tags/get_rule_tags.test.ts index 28e9fc08c3b8a4..6ae8285d7fa307 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/tags/get_rule_tags.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/tags/get_rule_tags.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; @@ -57,6 +58,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const listedTypes = new Set([ diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap index 95f1fca184d560..c23428b0f15a40 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap @@ -546,33 +546,89 @@ Object { } `; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_cluster_health 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_cluster_health 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_cpu_usage 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_cpu_usage 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_disk_usage 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_disk_usage 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_elasticsearch_version_mismatch 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_elasticsearch_version_mismatch 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_jvm_memory_usage 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_jvm_memory_usage 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_kibana_version_mismatch 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_kibana_version_mismatch 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_license_expiration 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_license_expiration 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_logstash_version_mismatch 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_logstash_version_mismatch 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_missing_monitoring_data 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_missing_monitoring_data 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_nodes_changed 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_nodes_changed 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_thread_pool_search_rejections 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_thread_pool_search_rejections 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_thread_pool_write_rejections 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_alert_thread_pool_write_rejections 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_ccr_read_exceptions 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_ccr_read_exceptions 1`] = ` +Object { + "fieldMap": Object {}, +} +`; -exports[`Alert as data fields checks detect AAD fields changes for: monitoring_shard_size 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: monitoring_shard_size 1`] = ` +Object { + "fieldMap": Object {}, +} +`; exports[`Alert as data fields checks detect AAD fields changes for: observability.rules.custom_threshold 1`] = ` Object { @@ -5802,7 +5858,11 @@ Object { } `; -exports[`Alert as data fields checks detect AAD fields changes for: siem.notifications 1`] = `undefined`; +exports[`Alert as data fields checks detect AAD fields changes for: siem.notifications 1`] = ` +Object { + "fieldMap": Object {}, +} +`; exports[`Alert as data fields checks detect AAD fields changes for: siem.queryRule 1`] = ` Object { diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index 87f6e4c3a3979e..34472ed6066d96 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -459,7 +459,6 @@ export class AlertingPlugin { security, licenseState, } = this; - licenseState?.setNotifyUsage(plugins.licensing.featureUsage.notifyUsage); const encryptedSavedObjectsClient = plugins.encryptedSavedObjects.getClient({ @@ -508,6 +507,7 @@ export class AlertingPlugin { maxScheduledPerMinute: this.config.rules.maxScheduledPerMinute, getAlertIndicesAlias: createGetAlertIndicesAliasFn(this.ruleTypeRegistry!), alertsService: this.alertsService, + uiSettings: core.uiSettings, }); rulesSettingsClientFactory.initialize({ diff --git a/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap b/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap new file mode 100644 index 00000000000000..bfb8efef248961 --- /dev/null +++ b/x-pack/plugins/alerting/server/rules_client/lib/__snapshots__/add_generated_action_values.test.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`addGeneratedActionValues() throws error if KQL is not valid: "Error creating DSL query: invalid KQL" 1`] = `"Error creating DSL query: invalid KQL"`; diff --git a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts index 6605d9c22a72bd..1c04ca38bf6559 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.test.ts @@ -7,12 +7,63 @@ import { addGeneratedActionValues } from './add_generated_action_values'; import { RuleAction } from '../../../common'; +import { ActionsAuthorization } from '@kbn/actions-plugin/server'; +import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { + savedObjectsClientMock, + savedObjectsRepositoryMock, +} from '@kbn/core-saved-objects-api-server-mocks'; +import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; +import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; +import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; +import { AlertingAuthorization } from '../../authorization'; +import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; +import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; +import { ConstructorOptions } from '../rules_client'; jest.mock('uuid', () => ({ v4: () => '111-222', })); describe('addGeneratedActionValues()', () => { + const taskManager = taskManagerMock.createStart(); + const ruleTypeRegistry = ruleTypeRegistryMock.create(); + const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + + const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); + const authorization = alertingAuthorizationMock.create(); + const actionsAuthorization = actionsAuthorizationMock.create(); + const internalSavedObjectsRepository = savedObjectsRepositoryMock.create(); + + const kibanaVersion = 'v7.10.0'; + const logger = loggingSystemMock.create().get(); + + const rulesClientParams: jest.Mocked = { + taskManager, + ruleTypeRegistry, + unsecuredSavedObjectsClient, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + logger, + internalSavedObjectsRepository, + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, + maxScheduledPerMinute: 10000, + minimumScheduleInterval: { value: '1m', enforce: false }, + isAuthenticationTypeAPIKey: jest.fn(), + getAuthenticationAPIKey: jest.fn(), + getAlertIndicesAlias: jest.fn(), + alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), + }; + const mockAction: RuleAction = { id: '1', group: 'default', @@ -42,25 +93,40 @@ describe('addGeneratedActionValues()', () => { }; test('adds uuid', async () => { - const actionWithGeneratedValues = addGeneratedActionValues([mockAction]); + const actionWithGeneratedValues = await addGeneratedActionValues([mockAction], { + ...rulesClientParams, + fieldsToExcludeFromPublicApi: [], + minimumScheduleIntervalInMs: 0, + }); expect(actionWithGeneratedValues[0].uuid).toBe('111-222'); }); test('adds DSL', async () => { - const actionWithGeneratedValues = addGeneratedActionValues([mockAction]); + const actionWithGeneratedValues = await addGeneratedActionValues([mockAction], { + ...rulesClientParams, + fieldsToExcludeFromPublicApi: [], + minimumScheduleIntervalInMs: 0, + }); expect(actionWithGeneratedValues[0].alertsFilter?.query?.dsl).toBe( '{"bool":{"must":[],"filter":[{"bool":{"should":[{"match":{"test":"testValue"}}],"minimum_should_match":1}},{"match_phrase":{"foo":"bar "}}],"should":[],"must_not":[]}}' ); }); test('throws error if KQL is not valid', async () => { - expect(() => - addGeneratedActionValues([ + expect(async () => + addGeneratedActionValues( + [ + { + ...mockAction, + alertsFilter: { query: { kql: 'foo:bar:1', filters: [] } }, + }, + ], { - ...mockAction, - alertsFilter: { query: { kql: 'foo:bar:1', filters: [] } }, - }, - ]) - ).toThrowErrorMatchingInlineSnapshot('"Error creating DSL query: invalid KQL"'); + ...rulesClientParams, + fieldsToExcludeFromPublicApi: [], + minimumScheduleIntervalInMs: 0, + } + ) + ).rejects.toThrowErrorMatchingSnapshot('"Error creating DSL query: invalid KQL"'); }); }); diff --git a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts index 71cbf01ea1a4e6..551c1ab1d28194 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/add_generated_action_values.ts @@ -8,16 +8,34 @@ import { v4 } from 'uuid'; import { buildEsQuery, Filter } from '@kbn/es-query'; import Boom from '@hapi/boom'; -import { NormalizedAlertAction, NormalizedAlertActionWithGeneratedValues } from '..'; +import { UI_SETTINGS } from '@kbn/data-plugin/common'; +import { + NormalizedAlertAction, + NormalizedAlertActionWithGeneratedValues, + RulesClientContext, +} from '..'; -export function addGeneratedActionValues( - actions: NormalizedAlertAction[] = [] -): NormalizedAlertActionWithGeneratedValues[] { +export async function addGeneratedActionValues( + actions: NormalizedAlertAction[] = [], + context: RulesClientContext +): Promise { + const uiSettingClient = context.uiSettings.asScopedToClient(context.unsecuredSavedObjectsClient); + const [allowLeadingWildcards, queryStringOptions, ignoreFilterIfFieldNotInIndex] = + await Promise.all([ + uiSettingClient.get(UI_SETTINGS.QUERY_ALLOW_LEADING_WILDCARDS), + uiSettingClient.get(UI_SETTINGS.QUERY_STRING_OPTIONS), + uiSettingClient.get(UI_SETTINGS.COURIER_IGNORE_FILTER_IF_FIELD_NOT_IN_INDEX), + ]); + const esQueryConfig = { + allowLeadingWildcards, + queryStringOptions, + ignoreFilterIfFieldNotInIndex, + }; return actions.map(({ uuid, alertsFilter, ...action }) => { const generateDSL = (kql: string, filters: Filter[]) => { try { return JSON.stringify( - buildEsQuery(undefined, [{ query: kql, language: 'kuery' }], filters) + buildEsQuery(undefined, [{ query: kql, language: 'kuery' }], filters, esQueryConfig) ); } catch (e) { throw Boom.badRequest(`Error creating DSL query: invalid KQL`); diff --git a/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts index ae5bf3f759194c..44fb6d2e73c36e 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/create_new_api_key_set.test.ts @@ -9,6 +9,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const username = 'test'; diff --git a/x-pack/plugins/alerting/server/rules_client/methods/update.ts b/x-pack/plugins/alerting/server/rules_client/methods/update.ts index 8fb0de5f3519ca..33afee4c20d26f 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/update.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/update.ts @@ -218,7 +218,10 @@ async function updateAlert( currentRule: SavedObject ): Promise> { const { attributes, version } = currentRule; - const data = { ...initialData, actions: addGeneratedActionValues(initialData.actions) }; + const data = { + ...initialData, + actions: await addGeneratedActionValues(initialData.actions, context), + }; const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts index e9317972474cd7..b9904055c8c0c3 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/bulk_enable.test.ts @@ -6,7 +6,11 @@ */ import { AlertConsumers } from '@kbn/rule-data-utils'; import { RulesClient, ConstructorOptions } from '../rules_client'; -import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; +import { + savedObjectsClientMock, + savedObjectsRepositoryMock, + uiSettingsServiceMock, +} 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'; @@ -85,6 +89,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts index 59dbfd8c87998a..a9673c8aa0f965 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/clear_expired_snoozes.test.ts @@ -12,6 +12,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -72,6 +73,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; describe('clearExpiredSnoozes()', () => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts index dbdfea132e2ef9..c7988b7644fcd8 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts @@ -12,6 +12,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -74,6 +75,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts index 01b9d551174cfa..4f539f5a9f7b1d 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -76,6 +77,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts index aa587dfb99bfa8..580e557e7fdf44 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -73,6 +74,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; setGlobalDate(); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts index a6fa7514696257..2281264adaf351 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -66,6 +67,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts index c8eaa3eb319eca..e377c334d0b1f1 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -63,6 +64,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts index d6c8f0a0df3ec6..761aca1972dd5c 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { fromKueryExpression } from '@kbn/es-query'; @@ -62,6 +63,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts index 671dcc59c886f2..63d86843512c00 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts index ba0e2d7a1a4856..0dcc87889b8c45 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_summary.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -60,6 +61,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts index 1d00d74d1ddf8f..82e07adea061a4 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -63,6 +64,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/lib.ts b/x-pack/plugins/alerting/server/rules_client/tests/lib.ts index 20c0759e1d628b..994d87320b0b62 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/lib.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/lib.ts @@ -10,6 +10,7 @@ import { IEventLogClient } from '@kbn/event-log-plugin/server'; import { actionsClientMock } from '@kbn/actions-plugin/server/mocks'; import { eventLogClientMock } from '@kbn/event-log-plugin/server/mocks'; import { TaskStatus } from '@kbn/task-manager-plugin/server'; +import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { ConstructorOptions } from '../rules_client'; import { RuleTypeRegistry } from '../../rule_type_registry'; import { RecoveredActionGroup } from '../../../common'; @@ -50,6 +51,8 @@ export function getBeforeSetup( eventLogClient?: jest.Mocked ) { jest.resetAllMocks(); + rulesClientParams.uiSettings.asScopedToClient = + uiSettingsServiceMock.createStartContract().asScopedToClient; rulesClientParams.createAPIKey.mockResolvedValue({ apiKeysEnabled: false }); rulesClientParams.getUserName.mockResolvedValue('elastic'); taskManager.runSoon.mockResolvedValue({ id: '' }); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts index ef9e864ad0ecaf..a9dd69f1a0e9f3 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/list_rule_types.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -57,6 +58,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts index cf585cc67a417d..fcafeea9a640c3 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts index 3aae21df3133dd..9c06960ee91ca4 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts index 13ab4778f82bc7..dcf28f3d03290d 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts @@ -11,6 +11,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -63,6 +64,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts index b156838704e0bd..2874759f98d1e6 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/run_soon.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -56,6 +57,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; setGlobalDate(); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts index f8329f20fc432e..d999a7604e9b9b 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts index 8d9232c4381c3a..35ba9b37bfff11 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -54,6 +55,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts index aa03a71d93e141..be3221c8ed2f17 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts @@ -13,6 +13,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -93,6 +94,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts index de54ab9f8d5f1d..b0b943cd78f686 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts @@ -10,6 +10,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; @@ -61,6 +62,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; beforeEach(() => { diff --git a/x-pack/plugins/alerting/server/rules_client/types.ts b/x-pack/plugins/alerting/server/rules_client/types.ts index 7428f81529f20a..6b3abf6fe3a383 100644 --- a/x-pack/plugins/alerting/server/rules_client/types.ts +++ b/x-pack/plugins/alerting/server/rules_client/types.ts @@ -11,6 +11,7 @@ import { SavedObjectsClientContract, PluginInitializerContext, ISavedObjectsRepository, + UiSettingsServiceStart, } from '@kbn/core/server'; import { ActionsClient, ActionsAuthorization } from '@kbn/actions-plugin/server'; import { @@ -78,6 +79,7 @@ export interface RulesClientContext { readonly getAuthenticationAPIKey: (name: string) => CreateAPIKeyResult; readonly getAlertIndicesAlias: GetAlertIndicesAlias; readonly alertsService: AlertsService | null; + readonly uiSettings: UiSettingsServiceStart; } export type NormalizedAlertAction = Omit; diff --git a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts index 821a04601c62de..579eacdca377b8 100644 --- a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts @@ -12,6 +12,7 @@ import { savedObjectsClientMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; import { ruleTypeRegistryMock } from './rule_type_registry.mock'; @@ -69,6 +70,7 @@ const rulesClientParams: jest.Mocked = { getAuthenticationAPIKey: jest.fn(), getAlertIndicesAlias: jest.fn(), alertsService: null, + uiSettings: uiSettingsServiceMock.createStartContract(), }; // this suite consists of two suites running tests against mutable RulesClient APIs: @@ -115,6 +117,8 @@ describe('rules_client_conflict_retries', () => { async function update(success: boolean) { try { + rulesClientParams.uiSettings.asScopedToClient = + uiSettingsServiceMock.createStartContract().asScopedToClient; await rulesClient.update({ id: MockAlertId, data: { diff --git a/x-pack/plugins/alerting/server/rules_client_factory.test.ts b/x-pack/plugins/alerting/server/rules_client_factory.test.ts index 76f4943172a4b8..a0b83ca344688e 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.test.ts @@ -13,6 +13,7 @@ import { savedObjectsServiceMock, loggingSystemMock, savedObjectsRepositoryMock, + uiSettingsServiceMock, } from '@kbn/core/server/mocks'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { AuthenticatedUser } from '@kbn/security-plugin/common'; @@ -58,6 +59,7 @@ const rulesClientFactoryParams: jest.Mocked = { kibanaVersion: '7.10.0', authorization: alertingAuthorizationClientFactory as unknown as AlertingAuthorizationClientFactory, + uiSettings: uiSettingsServiceMock.createStartContract(), }; const actionsAuthorization = actionsAuthorizationMock.create(); @@ -70,6 +72,8 @@ beforeEach(() => { ).getActionsAuthorizationWithRequest.mockReturnValue(actionsAuthorization); rulesClientFactoryParams.getSpaceId.mockReturnValue('default'); rulesClientFactoryParams.spaceIdToNamespace.mockReturnValue('default'); + rulesClientFactoryParams.uiSettings.asScopedToClient = + uiSettingsServiceMock.createStartContract().asScopedToClient; }); test('creates a rules client with proper constructor arguments when security is enabled', async () => { @@ -117,6 +121,7 @@ test('creates a rules client with proper constructor arguments when security is getAuthenticationAPIKey: expect.any(Function), getAlertIndicesAlias: expect.any(Function), alertsService: null, + uiSettings: rulesClientFactoryParams.uiSettings, }); }); @@ -161,6 +166,7 @@ test('creates a rules client with proper constructor arguments', async () => { getAuthenticationAPIKey: expect.any(Function), getAlertIndicesAlias: expect.any(Function), alertsService: null, + uiSettings: rulesClientFactoryParams.uiSettings, }); }); diff --git a/x-pack/plugins/alerting/server/rules_client_factory.ts b/x-pack/plugins/alerting/server/rules_client_factory.ts index 6b637eed5cd1fb..66ee93a1f4aeb7 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.ts @@ -11,6 +11,7 @@ import { SavedObjectsServiceStart, PluginInitializerContext, ISavedObjectsRepository, + CoreStart, } from '@kbn/core/server'; import { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; import { @@ -48,6 +49,7 @@ export interface RulesClientFactoryOpts { maxScheduledPerMinute: AlertingRulesConfig['maxScheduledPerMinute']; getAlertIndicesAlias: GetAlertIndicesAlias; alertsService: AlertsService | null; + uiSettings: CoreStart['uiSettings']; } export class RulesClientFactory { @@ -70,6 +72,7 @@ export class RulesClientFactory { private maxScheduledPerMinute!: AlertingRulesConfig['maxScheduledPerMinute']; private getAlertIndicesAlias!: GetAlertIndicesAlias; private alertsService!: AlertsService | null; + private uiSettings!: CoreStart['uiSettings']; public initialize(options: RulesClientFactoryOpts) { if (this.isInitialized) { @@ -94,6 +97,7 @@ export class RulesClientFactory { this.maxScheduledPerMinute = options.maxScheduledPerMinute; this.getAlertIndicesAlias = options.getAlertIndicesAlias; this.alertsService = options.alertsService; + this.uiSettings = options.uiSettings; } public create(request: KibanaRequest, savedObjects: SavedObjectsServiceStart): RulesClient { @@ -124,6 +128,8 @@ export class RulesClientFactory { auditLogger: securityPluginSetup?.audit.asScoped(request), getAlertIndicesAlias: this.getAlertIndicesAlias, alertsService: this.alertsService, + uiSettings: this.uiSettings, + async getUserName() { if (!securityPluginStart) { return null; diff --git a/x-pack/plugins/alerting/tsconfig.json b/x-pack/plugins/alerting/tsconfig.json index fa409e3286b6d0..ada91163937484 100644 --- a/x-pack/plugins/alerting/tsconfig.json +++ b/x-pack/plugins/alerting/tsconfig.json @@ -64,7 +64,11 @@ "@kbn/core-saved-objects-api-server", "@kbn/alerts-ui-shared", "@kbn/core-http-browser", + "@kbn/core-saved-objects-api-server-mocks", + "@kbn/core-ui-settings-server-mocks", "@kbn/core-test-helpers-kbn-server" ], - "exclude": ["target/**/*"] + "exclude": [ + "target/**/*" + ] } diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx index 82bbd07ba85887..43d7c755739449 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.test.tsx @@ -6,6 +6,7 @@ */ import { render } from '@testing-library/react'; +import { DataView } from '@kbn/data-views-plugin/common'; import React from 'react'; import { EmbeddedMap } from './embedded_map'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -37,6 +38,17 @@ describe('Embedded Map', () => { .mockImplementation(() => ({ id: 'mockSpaceId' })), }; + const mockDataView = { + id: 'mock-id', + title: 'mock-title', + timeFieldName: '@timestamp', + isPersisted: () => false, + getName: () => 'mock-data-view', + toSpec: () => ({}), + fields: [], + metaFields: [], + } as unknown as DataView; + const { findByTestId } = render( { filters={[]} start="2022-12-20T10:00:00.000Z" end="2022-12-20T10:15:00.000Z" + dataView={mockDataView} /> diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx index 80aa35b297bb29..9b9a42f3720223 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx @@ -130,11 +130,11 @@ function EmbeddedMapComponent({ useEffect(() => { const setLayerList = async () => { - if (embeddable && !isErrorEmbeddable(embeddable)) { + if (embeddable && !isErrorEmbeddable(embeddable) && dataView?.id) { const layerList = await getLayerList({ selectedMap, maps, - dataViewId: dataView?.id ?? '', + dataViewId: dataView.id, }); await Promise.all([ embeddable.setLayerList(layerList), diff --git a/x-pack/plugins/apm/server/lib/helpers/get_document_sources.ts b/x-pack/plugins/apm/server/lib/helpers/get_document_sources.ts index 02258283ac554a..97b8f17b3712b2 100644 --- a/x-pack/plugins/apm/server/lib/helpers/get_document_sources.ts +++ b/x-pack/plugins/apm/server/lib/helpers/get_document_sources.ts @@ -10,8 +10,22 @@ import { ApmDocumentType } from '../../../common/document_type'; import { RollupInterval } from '../../../common/rollup'; import { APMEventClient } from './create_es_client/create_apm_event_client'; import { getConfigForDocumentType } from './create_es_client/document_type'; -import { TRANSACTION_DURATION_SUMMARY } from '../../../common/es_fields/apm'; import { TimeRangeMetadata } from '../../../common/time_range_metadata'; +import { getDurationLegacyFilter } from './transactions'; + +const QUERY_INDEX = { + BEFORE: 0, + CURRENT: 1, + DURATION_SUMMARY: 2, +} as const; + +interface DocumentTypeData { + documentType: ApmDocumentType; + rollupInterval: RollupInterval; + hasDocBefore: boolean; + hasDocAfter: boolean; + allHaveDurationSummary: boolean; +} const getRequest = ({ documentType, @@ -64,129 +78,156 @@ export async function getDocumentSources({ kuery: string; enableServiceTransactionMetrics: boolean; enableContinuousRollups: boolean; -}) { - const currentRange = rangeQuery(start, end); - const diff = end - start; - const kql = kqlQuery(kuery); - const beforeRange = rangeQuery(start - diff, end - diff); - - const sourcesToCheck = [ +}): Promise { + const documentTypesToCheck = [ ...(enableServiceTransactionMetrics ? [ApmDocumentType.ServiceTransactionMetric as const] : []), ApmDocumentType.TransactionMetric as const, - ].flatMap((documentType) => { - const docTypeConfig = getConfigForDocumentType(documentType); - - return ( - enableContinuousRollups - ? docTypeConfig.rollupIntervals - : [RollupInterval.OneMinute] - ).flatMap((rollupInterval) => { - return { - documentType, - rollupInterval, - meta: { - checkSummaryFieldExists: false, - }, - before: getRequest({ - documentType, - rollupInterval, - filters: [...kql, ...beforeRange], - }), - current: getRequest({ - documentType, - rollupInterval, - filters: [...kql, ...currentRange], - }), - }; - }); + ]; + + const documentTypesInfo = await getDocumentTypesInfo({ + apmEventClient, + start, + end, + kuery, + enableContinuousRollups, + documentTypesToCheck, }); - const sourcesToCheckWithSummary = [ - ApmDocumentType.TransactionMetric as const, - ].flatMap((documentType) => { - const docTypeConfig = getConfigForDocumentType(documentType); - - return ( - enableContinuousRollups - ? docTypeConfig.rollupIntervals - : [RollupInterval.OneMinute] - ).flatMap((rollupInterval) => { - const summaryExistsFilter = { - bool: { - filter: [ - { - exists: { - field: TRANSACTION_DURATION_SUMMARY, - }, - }, - ], - }, - }; + const hasAnySourceDocBefore = documentTypesInfo.some( + (source) => source.hasDocBefore + ); - return { - documentType, - rollupInterval, - meta: { - checkSummaryFieldExists: true, - }, - before: getRequest({ - documentType, - rollupInterval, - filters: [...kql, ...beforeRange, summaryExistsFilter], - }), - current: getRequest({ - documentType, - rollupInterval, - filters: [...kql, ...currentRange, summaryExistsFilter], - }), - }; - }); + return [ + ...mapToSources(documentTypesInfo, hasAnySourceDocBefore), + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + hasDocs: true, + hasDurationSummaryField: false, + }, + ]; +} + +const getDocumentTypesInfo = async ({ + apmEventClient, + start, + end, + kuery, + enableContinuousRollups, + documentTypesToCheck, +}: { + apmEventClient: APMEventClient; + start: number; + end: number; + kuery: string; + enableContinuousRollups: boolean; + documentTypesToCheck: ApmDocumentType[]; +}) => { + const getRequests = getDocumentTypeRequestsFn({ + enableContinuousRollups, + start, + end, + kuery, }); - const allSourcesToCheck = [...sourcesToCheck, ...sourcesToCheckWithSummary]; + const sourceRequests = documentTypesToCheck.flatMap(getRequests); - const allSearches = allSourcesToCheck.flatMap(({ before, current }) => [ - before, - current, - ]); + const allSearches = sourceRequests + .flatMap(({ before, current, durationSummaryCheck }) => [ + before, + current, + durationSummaryCheck, + ]) + .filter( + (request): request is ReturnType => + request !== undefined + ); const allResponses = ( await apmEventClient.msearch('get_document_availability', ...allSearches) ).responses; - const checkedSources = allSourcesToCheck.map((source, index) => { - const { documentType, rollupInterval } = source; - const responseBefore = allResponses[index * 2]; - const responseAfter = allResponses[index * 2 + 1]; - - const hasDocBefore = responseBefore.hits.total.value > 0; - const hasDocAfter = responseAfter.hits.total.value > 0; + return sourceRequests.map(({ documentType, rollupInterval, ...queries }) => { + const numberOfQueries = Object.values(queries).filter(Boolean).length; + // allResponses is sorted by the order of the requests in sourceRequests + const docTypeResponses = allResponses.splice(0, numberOfQueries); return { documentType, rollupInterval, - hasDocBefore, - hasDocAfter, - checkSummaryFieldExists: source.meta.checkSummaryFieldExists, + hasDocBefore: docTypeResponses[QUERY_INDEX.BEFORE].hits.total.value > 0, + hasDocAfter: docTypeResponses[QUERY_INDEX.CURRENT].hits.total.value > 0, + allHaveDurationSummary: docTypeResponses[QUERY_INDEX.DURATION_SUMMARY] + ? docTypeResponses[QUERY_INDEX.DURATION_SUMMARY].hits.total.value === 0 + : true, }; }); +}; - const hasAnySourceDocBefore = checkedSources.some( - (source) => source.hasDocBefore - ); +const getDocumentTypeRequestsFn = + ({ + enableContinuousRollups, + start, + end, + kuery, + }: { + enableContinuousRollups: boolean; + start: number; + end: number; + kuery: string; + }) => + (documentType: ApmDocumentType) => { + const currentRange = rangeQuery(start, end); + const diff = end - start; + const kql = kqlQuery(kuery); + const beforeRange = rangeQuery(start - diff, end - diff); + + const rollupIntervals = enableContinuousRollups + ? getConfigForDocumentType(documentType).rollupIntervals + : [RollupInterval.OneMinute]; + + return rollupIntervals.map((rollupInterval) => ({ + documentType, + rollupInterval, + before: getRequest({ + documentType, + rollupInterval, + filters: [...kql, ...beforeRange], + }), + current: getRequest({ + documentType, + rollupInterval, + filters: [...kql, ...currentRange], + }), + ...(documentType !== ApmDocumentType.ServiceTransactionMetric + ? { + durationSummaryCheck: getRequest({ + documentType, + rollupInterval, + filters: [...kql, ...currentRange, getDurationLegacyFilter()], + }), + } + : {}), + })); + }; - const sourcesWithHasDocs = checkedSources.map((checkedSource) => { +const mapToSources = ( + sources: DocumentTypeData[], + hasAnySourceDocBefore: boolean +) => { + return sources.map((source) => { const { documentType, hasDocAfter, hasDocBefore, rollupInterval, - checkSummaryFieldExists, - } = checkedSource; + allHaveDurationSummary, + } = source; const hasDocBeforeOrAfter = hasDocBefore || hasDocAfter; + // If there is any data before, we require that data is available before // this time range to mark this source as available. If we don't do that, // users that upgrade to a version that starts generating service tx metrics @@ -194,40 +235,12 @@ export async function getDocumentSources({ // If we only check before, users with a new deployment will use raw transaction // events. const hasDocs = hasAnySourceDocBefore ? hasDocBefore : hasDocBeforeOrAfter; + return { documentType, rollupInterval, - checkSummaryFieldExists, hasDocs, + hasDurationSummaryField: allHaveDurationSummary, }; }); - - const sources: TimeRangeMetadata['sources'] = sourcesWithHasDocs - .filter((source) => !source.checkSummaryFieldExists) - .map((checkedSource) => { - const { documentType, hasDocs, rollupInterval } = checkedSource; - return { - documentType, - rollupInterval, - hasDocs, - hasDurationSummaryField: - documentType === ApmDocumentType.ServiceTransactionMetric || - Boolean( - sourcesWithHasDocs.find((eSource) => { - return ( - eSource.documentType === documentType && - eSource.rollupInterval === rollupInterval && - eSource.checkSummaryFieldExists - ); - })?.hasDocs - ), - }; - }); - - return sources.concat({ - documentType: ApmDocumentType.TransactionEvent, - rollupInterval: RollupInterval.None, - hasDocs: true, - hasDurationSummaryField: false, - }); -} +}; diff --git a/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts b/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts index 182d2419c25434..dfe449e5fa635d 100644 --- a/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts @@ -7,6 +7,7 @@ import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { SearchAggregatedTransactionSetting } from '../../../../common/aggregated_transactions'; import { TRANSACTION_DURATION, @@ -90,13 +91,12 @@ export async function getSearchTransactionsEvents({ } } -export function getDurationFieldForTransactions( +export function isSummaryFieldSupportedByDocType( typeOrSearchAgggregatedTransactions: | ApmDocumentType.ServiceTransactionMetric | ApmDocumentType.TransactionMetric | ApmDocumentType.TransactionEvent - | boolean, - useDurationSummaryField?: boolean + | boolean ) { let type: ApmDocumentType; @@ -108,10 +108,20 @@ export function getDurationFieldForTransactions( type = typeOrSearchAgggregatedTransactions; } - if ( + return ( type === ApmDocumentType.ServiceTransactionMetric || type === ApmDocumentType.TransactionMetric - ) { + ); +} +export function getDurationFieldForTransactions( + typeOrSearchAgggregatedTransactions: + | ApmDocumentType.ServiceTransactionMetric + | ApmDocumentType.TransactionMetric + | ApmDocumentType.TransactionEvent + | boolean, + useDurationSummaryField?: boolean +) { + if (isSummaryFieldSupportedByDocType(typeOrSearchAgggregatedTransactions)) { if (useDurationSummaryField) { return TRANSACTION_DURATION_SUMMARY; } @@ -163,3 +173,18 @@ export function isRootTransaction(searchAggregatedTransactions: boolean) { }, }; } + +export function getDurationLegacyFilter(): QueryDslQueryContainer { + return { + bool: { + must: [ + { + bool: { + filter: [{ exists: { field: TRANSACTION_DURATION_HISTOGRAM } }], + must_not: [{ exists: { field: TRANSACTION_DURATION_SUMMARY } }], + }, + }, + ], + }, + }; +} diff --git a/x-pack/plugins/apm/server/routes/services/annotations/index.test.ts b/x-pack/plugins/apm/server/routes/services/annotations/index.test.ts deleted file mode 100644 index c33ff0881dbe6f..00000000000000 --- a/x-pack/plugins/apm/server/routes/services/annotations/index.test.ts +++ /dev/null @@ -1,250 +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 { - ScopedAnnotationsClient, - WrappedElasticsearchClientError, -} from '@kbn/observability-plugin/server'; -import { ElasticsearchClient, Logger } from '@kbn/core/server'; -import { getServiceAnnotations } from '.'; -import * as GetDerivedServiceAnnotations from './get_derived_service_annotations'; -import * as GetStoredAnnotations from './get_stored_annotations'; -import { Annotation, AnnotationType } from '../../../../common/annotations'; -import { errors } from '@elastic/elasticsearch'; -import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; - -// FLAKY: https://github.com/elastic/kibana/issues/169106 -describe.skip('getServiceAnnotations', () => { - const storedAnnotations = [ - { - type: AnnotationType.VERSION, - id: '1', - '@timestamp': Date.now(), - text: 'foo', - }, - ] as Annotation[]; - - afterEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); - }); - - it('returns stored annotarions even though derived annotations throws an error', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - setTimeout(() => { - reject(new Error('BOOM')); - }, 20); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - setTimeout(() => { - resolve(storedAnnotations); - }, 10); - }) - ); - - const annotations = await getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }); - expect(annotations).toEqual({ - annotations: storedAnnotations, - }); - }); - - it('returns stored annotarions even when derived annotations throws an error first', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - setTimeout(() => { - reject(new Error('BOOM')); - }, 10); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - setTimeout(() => { - resolve(storedAnnotations); - }, 20); - }) - ); - - const annotations = await getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }); - expect(annotations).toEqual({ - annotations: storedAnnotations, - }); - }); - - it('Throws an exception when derived annotations fires an error before stored annotations is completed and return an empty array', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - setTimeout(() => { - reject(new Error('BOOM')); - }, 10); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - setTimeout(() => { - resolve([] as Annotation[]); - }, 20); - }) - ); - - expect( - getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }) - ).rejects.toThrow('BOOM'); - }); - - it('returns empty derived annotations when RequestAbortedError is thrown and stored annotations is empty', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - setTimeout(() => { - reject( - new WrappedElasticsearchClientError( - new errors.RequestAbortedError('foo') - ) - ); - }, 20); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - setTimeout(() => { - resolve([] as Annotation[]); - }, 10); - }) - ); - - const annotations = await getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }); - expect(annotations).toEqual({ annotations: [] }); - }); - - it('Throws an exception when derived annotations fires an error after stored annotations is completed and return an empty array', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - setTimeout(() => { - reject(new Error('BOOM')); - }, 20); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - setTimeout(() => { - resolve([] as Annotation[]); - }, 10); - }) - ); - - expect( - getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }) - ).rejects.toThrow('BOOM'); - }); - - it('returns stored annotations when derived annotations throws RequestAbortedError', async () => { - jest - .spyOn(GetDerivedServiceAnnotations, 'getDerivedServiceAnnotations') - .mockImplementation( - () => - new Promise((resolve, reject) => { - reject( - new WrappedElasticsearchClientError( - new errors.RequestAbortedError('foo') - ) - ); - }) - ); - jest.spyOn(GetStoredAnnotations, 'getStoredAnnotations').mockImplementation( - async () => - new Promise((resolve) => { - resolve(storedAnnotations); - }) - ); - - const annotations = await getServiceAnnotations({ - serviceName: 'foo', - environment: 'bar', - searchAggregatedTransactions: false, - start: Date.now(), - end: Date.now(), - client: {} as ElasticsearchClient, - logger: {} as Logger, - annotationsClient: {} as ScopedAnnotationsClient, - apmEventClient: {} as APMEventClient, - }); - expect(annotations).toEqual({ - annotations: storedAnnotations, - }); - }); -}); diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts index 6362b4a3c5e5a8..7fbeb1cc9d24cb 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts @@ -189,6 +189,6 @@ export async function getServiceTransactionStats({ }; }) ?? [], serviceOverflowCount: - response.aggregations?.sample?.overflowCount.value || 0, + response.aggregations?.sample?.overflowCount?.value || 0, }; } diff --git a/x-pack/plugins/cases/public/components/custom_fields/flyout.test.tsx b/x-pack/plugins/cases/public/components/custom_fields/flyout.test.tsx index ce7a9687b89ec0..63dc30d69c2e0c 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/flyout.test.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/flyout.test.tsx @@ -16,7 +16,12 @@ import { customFieldsConfigurationMock } from '../../containers/mock'; import { MAX_CUSTOM_FIELD_LABEL_LENGTH } from '../../../common/constants'; import * as i18n from './translations'; -describe('CustomFieldFlyout ', () => { +// FLAKY: https://github.com/elastic/kibana/issues/174285 +// FLAKY: https://github.com/elastic/kibana/issues/174286 +// FLAKY: https://github.com/elastic/kibana/issues/174287 +// FLAKY: https://github.com/elastic/kibana/issues/174288 +// FLAKY: https://github.com/elastic/kibana/issues/174289 +describe.skip('CustomFieldFlyout ', () => { let appMockRender: AppMockRenderer; const props = { diff --git a/x-pack/plugins/cases/public/components/description/index.test.tsx b/x-pack/plugins/cases/public/components/description/index.test.tsx index 8c801b8efae957..3c2f32437f4a07 100644 --- a/x-pack/plugins/cases/public/components/description/index.test.tsx +++ b/x-pack/plugins/cases/public/components/description/index.test.tsx @@ -27,7 +27,13 @@ const defaultProps = { isLoadingDescription: false, }; -describe('Description', () => { +// FLAKY: https://github.com/elastic/kibana/issues/174321 +// FLAKY: https://github.com/elastic/kibana/issues/174322 +// FLAKY: https://github.com/elastic/kibana/issues/174323 +// FLAKY: https://github.com/elastic/kibana/issues/164045 +// FLAKY: https://github.com/elastic/kibana/issues/164048 +// FLAKY: https://github.com/elastic/kibana/issues/164049 +describe.skip('Description', () => { const onUpdateField = jest.fn(); let appMockRender: AppMockRenderer; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts index d144343807a066..51b64b86648676 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/accounts_stats_collector.ts @@ -224,7 +224,6 @@ const getCspmAccountsStats = ( nodes_count: account.nodes_count.value, pods_count: account.resources.pods_count.value, })); - logger.info('CSPM telemetry: accounts stats was sent'); return cspmAccountsStats; }; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts index 82de2d010a35e1..fac84a5d8a7a2b 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/cloud_accounts_stats_collector.ts @@ -345,8 +345,6 @@ export const getCloudAccountsStats = ( }; }); - logger.info('Cloud Account Stats telemetry: accounts stats was sent'); - return cloudAccountsStats; }; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts new file mode 100644 index 00000000000000..63fc68caff47b6 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/muted_rules_stats_collector.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ISavedObjectsRepository, + SavedObjectsClientContract, +} from '@kbn/core-saved-objects-api-server'; +import type { Logger } from '@kbn/core/server'; +import { CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE } from '../../../../common/constants'; +import { CspBenchmarkRule } from '../../../../common/types/latest'; +import { getCspBenchmarkRulesStatesHandler } from '../../../routes/benchmark_rules/get_states/v1'; +import { MutedRulesStats } from './types'; + +export const getMutedRulesStats = async ( + soClient: SavedObjectsClientContract, + encryptedSoClient: ISavedObjectsRepository, + logger: Logger +): Promise => { + try { + const benchmarkRulesStates = await getCspBenchmarkRulesStatesHandler(encryptedSoClient); + const mutedBenchmarkRules = Object.fromEntries( + Object.entries(benchmarkRulesStates).filter(([_, value]) => value.muted === true) + ); + + const mutedRulesStats = await Promise.all( + Object.values(mutedBenchmarkRules).map(async (mutedBenchmarkRule) => { + const cspBenchmarkRulesSo = await soClient.get( + CSP_BENCHMARK_RULE_SAVED_OBJECT_TYPE, + mutedBenchmarkRule.rule_id + ); + const ruleMetadata = cspBenchmarkRulesSo.attributes.metadata; + if (ruleMetadata) { + return { + id: ruleMetadata.id, + name: ruleMetadata.name, + benchmark_id: ruleMetadata.benchmark.id, + benchmark_name: ruleMetadata.benchmark.name, + benchmark_version: mutedBenchmarkRule.benchmark_version, // The state object may include different benchmark version then the latest one. + rule_number: ruleMetadata.benchmark.rule_number, + posture_type: ruleMetadata.benchmark.posture_type, + section: ruleMetadata.section, + version: ruleMetadata.version, + }; + } + return null; + }) + ); + + return mutedRulesStats.filter( + (filteredMetadata) => filteredMetadata !== null + ) as MutedRulesStats[]; + } catch (e) { + logger.error(`Failed to get rules states stats ${e}`); + return []; + } +}; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts index 919adae18446cd..3d283eed418349 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/register.ts @@ -17,6 +17,8 @@ import { getRulesStats } from './rules_stats_collector'; import { getInstallationStats } from './installation_stats_collector'; import { getAlertsStats } from './alert_stats_collector'; import { getAllCloudAccountsStats } from './cloud_accounts_stats_collector'; +import { getMutedRulesStats } from './muted_rules_stats_collector'; +import { INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE } from '../../../../common/constants'; export function registerCspmUsageCollector( logger: Logger, @@ -42,6 +44,7 @@ export function registerCspmUsageCollector( ) => { try { const val = await promise; + logger.info(`Cloud Security telemetry: ${taskName} payload was sent successfully`); return val; } catch (error) { logger.error(`${taskName} task failed: ${error.message}`); @@ -52,6 +55,10 @@ export function registerCspmUsageCollector( const esClient = collectorFetchContext.esClient; const soClient = collectorFetchContext.soClient; + const encryptedSoClient = (await coreServices)[0].savedObjects.createInternalRepository([ + INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, + ]); + const [ indicesStats, accountsStats, @@ -60,6 +67,7 @@ export function registerCspmUsageCollector( installationStats, alertsStats, cloudAccountStats, + mutedRulesStats, ] = await Promise.all([ awaitPromiseSafe('Indices', getIndicesStats(esClient, soClient, coreServices, logger)), awaitPromiseSafe('Accounts', getAccountsStats(esClient, logger)), @@ -71,6 +79,7 @@ export function registerCspmUsageCollector( ), awaitPromiseSafe('Alerts', getAlertsStats(esClient, logger)), awaitPromiseSafe('Cloud Accounts', getAllCloudAccountsStats(esClient, logger)), + awaitPromiseSafe('Muted Rules', getMutedRulesStats(soClient, encryptedSoClient, logger)), ]); return { indices: indicesStats, @@ -80,6 +89,7 @@ export function registerCspmUsageCollector( installation_stats: installationStats, alerts_stats: alertsStats, cloud_account_stats: cloudAccountStats, + muted_rules_stats: mutedRulesStats, }; }, schema: cspmUsageSchema, diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts index bccb92035a3bb5..9dce3468c81141 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/resources_stats_collector.ts @@ -134,7 +134,6 @@ const getCspmResourcesStats = ( }); }); }); - logger.info('CSPM telemetry: resources stats was sent'); return resourcesStats.flat(2); }; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts index 498566b7cb0824..0b0be13ba3a1ff 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/schema.ts @@ -193,4 +193,18 @@ export const cspmUsageSchema: MakeSchemaFrom = { }, }, }, + muted_rules_stats: { + type: 'array', + items: { + id: { type: 'keyword' }, + name: { type: 'keyword' }, + section: { type: 'keyword' }, + benchmark_id: { type: 'keyword' }, + benchmark_name: { type: 'keyword' }, + benchmark_version: { type: 'keyword' }, + rule_number: { type: 'keyword' }, + posture_type: { type: 'keyword' }, + version: { type: 'keyword' }, + }, + }, }; diff --git a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts index f9eb6094277a4b..f078b35e25ee6d 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/telemetry/collectors/types.ts @@ -15,7 +15,8 @@ export type CloudSecurityUsageCollectorType = | 'Rules' | 'Installation' | 'Alerts' - | 'Cloud Accounts'; + | 'Cloud Accounts' + | 'Muted Rules'; export type CloudProviderKey = 'cis_eks' | 'cis_gke' | 'cis_k8s' | 'cis_ake'; export type CloudbeatConfigKeyType = @@ -32,6 +33,7 @@ export interface CspmUsage { installation_stats: CloudSecurityInstallationStats[]; alerts_stats: CloudSecurityAlertsStats[]; cloud_account_stats: CloudSecurityAccountsStats[]; + muted_rules_stats: MutedRulesStats[]; } export interface PackageSetupStatus { @@ -214,3 +216,15 @@ export interface AccountEntity { pods_count: Value; }; } + +export interface MutedRulesStats { + id: string; + name: string; + section: string; + version: string; + benchmark_id: string; + benchmark_name: string; + benchmark_version: string; + posture_type: string; + rule_number: string; +} diff --git a/x-pack/plugins/fleet/server/services/epm/archive/parse.ts b/x-pack/plugins/fleet/server/services/epm/archive/parse.ts index eac5c2ac43db1d..b7a2b8a26400cb 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/parse.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/parse.ts @@ -201,7 +201,10 @@ export function parseAndVerifyArchive( ): ArchivePackage { // The top-level directory must match pkgName-pkgVersion, and no other top-level files or directories may be present const logger = appContextService.getLogger(); - const toplevelDir = topLevelDirOverride || paths[0].split('/')[0]; + let toplevelDir = topLevelDirOverride || ''; + if (paths.length > 0) { + toplevelDir = topLevelDirOverride || paths[0].split('/')[0]; + } paths.forEach((filePath) => { if (!filePath.startsWith(toplevelDir)) { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts index 670ba36ed6a8d9..375770028488db 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts @@ -1611,7 +1611,14 @@ describe('EPM template', () => { }, ]); - expect(esClient.indices.rollover).toHaveBeenCalled(); + expect(esClient.transport.request).toHaveBeenCalledWith( + expect.objectContaining({ + path: '/test.prefix1-default/_rollover', + querystring: { + lazy: true, + }, + }) + ); }); it('should skip rollover on expected error when flag is on', async () => { const esClient = elasticsearchServiceMock.createElasticsearchClient(); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index a60e9dc0c7ced8..750a8ef8604918 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -933,8 +933,12 @@ const getDataStreams = async ( const rolloverDataStream = (dataStreamName: string, esClient: ElasticsearchClient) => { try { // Do no wrap rollovers in retryTransientEsErrors since it is not idempotent - return esClient.indices.rollover({ - alias: dataStreamName, + return esClient.transport.request({ + method: 'POST', + path: `/${dataStreamName}/_rollover`, + querystring: { + lazy: true, + }, }); } catch (error) { throw new PackageESError( diff --git a/x-pack/plugins/fleet/server/services/setup.ts b/x-pack/plugins/fleet/server/services/setup.ts index cc4be9bab0bcc5..a9af93e70f7abc 100644 --- a/x-pack/plugins/fleet/server/services/setup.ts +++ b/x-pack/plugins/fleet/server/services/setup.ts @@ -369,6 +369,7 @@ export async function ensureFleetDirectories() { try { await fs.stat(bundledPackageLocation); + logger.debug(`Bundled package directory ${bundledPackageLocation} exists`); } catch (error) { logger.warn( `Bundled package directory ${bundledPackageLocation} does not exist. All packages will be sourced from ${registryUrl}.` diff --git a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.test.ts deleted file mode 100644 index 6887f3051d7278..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.test.ts +++ /dev/null @@ -1,202 +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 { CCRReadExceptionsRule } from './ccr_read_exceptions_rule'; -import { RULE_CCR_READ_EXCEPTIONS } from '../../common/constants'; -import { fetchCCRReadExceptions } from '../lib/alerts/fetch_ccr_read_exceptions'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -type ICCRReadExceptionsRuleMock = CCRReadExceptionsRule & { - defaultParams: { - duration: string; - }; -} & { - actionVariables: Array<{ - name: string; - description: string; - }>; -}; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_ccr_read_exceptions', () => ({ - fetchCCRReadExceptions: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('CCRReadExceptionsRule', () => { - it('should have defaults', () => { - const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; - expect(rule.ruleOptions.id).toBe(RULE_CCR_READ_EXCEPTIONS); - expect(rule.ruleOptions.name).toBe('CCR read exceptions'); - expect(rule.ruleOptions.throttle).toBe('6h'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ - duration: '1h', - }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { - name: 'remoteCluster', - description: 'The remote cluster experiencing CCR read exceptions.', - }, - { - name: 'followerIndex', - description: 'The follower index reporting CCR read exceptions.', - }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - describe('execute', () => { - const FakeDate = function () {}; - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'myNodeId'; - const nodeName = 'myNodeName'; - const remoteCluster = 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1'; - const followerIndex = '.follower_index_1'; - const leaderIndex = '.leader_index_1'; - const readExceptions = [ - { - exception: { - type: 'read_exceptions_type_1', - reason: 'read_exceptions_reason_1', - }, - }, - ]; - const stat = { - remoteCluster, - followerIndex, - leaderIndex, - read_exceptions: readExceptions, - clusterUuid, - nodeId, - nodeName, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - Date = FakeDate as DateConstructor; - (fetchCCRReadExceptions as jest.Mock).mockImplementation(() => { - return [stat]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, - action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: - 'Verify follower and leader index relationships on the affected remote cluster.', - clusterName, - state: 'firing', - remoteCluster, - remoteClusters: remoteCluster, - followerIndex, - followerIndices: followerIndex, - }); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchCCRReadExceptions as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - ccs, - }, - ]; - }); - const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, - action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - actionPlain: - 'Verify follower and leader index relationships on the affected remote cluster.', - clusterName, - state: 'firing', - remoteCluster, - remoteClusters: remoteCluster, - followerIndex, - followerIndices: followerIndex, - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.test.ts deleted file mode 100644 index 6c5858d48e94e4..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.test.ts +++ /dev/null @@ -1,257 +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 { CpuUsageRule } from './cpu_usage_rule'; -import { RULE_CPU_USAGE } from '../../common/constants'; -import { fetchCpuUsageNodeStats } from '../lib/alerts/fetch_cpu_usage_node_stats'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_cpu_usage_node_stats', () => ({ - fetchCpuUsageNodeStats: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('CpuUsageRule', () => { - it('should have defaults', () => { - const rule = new CpuUsageRule(); - expect(rule.ruleOptions.id).toBe(RULE_CPU_USAGE); - expect(rule.ruleOptions.name).toBe('CPU Usage'); - expect(rule.ruleOptions.throttle).toBe('1d'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node reporting high cpu usage.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - - describe('execute', () => { - function FakeDate() {} - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'myNodeId'; - const nodeName = 'myNodeName'; - const cpuUsage = 91; - const stat = { - clusterUuid, - nodeId, - nodeName, - cpuUsage, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { - return [stat]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new CpuUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - ccs: undefined, - cluster: { clusterUuid, clusterName }, - cpuUsage, - itemLabel: undefined, - meta: { - clusterUuid, - cpuUsage, - nodeId, - nodeName, - }, - nodeId, - nodeName, - ui: { - isFiring: true, - message: { - text: `Node #start_link${nodeName}#end_link is reporting cpu usage of ${cpuUsage}% at #absolute`, - nextSteps: [ - { - text: '#start_linkCheck hot threads#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', - }, - ], - }, - { - text: '#start_linkCheck long running tasks#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', - }, - ], - }, - ], - tokens: [ - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 1, - }, - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/nodes/myNodeId', - }, - ], - }, - severity: 'danger', - triggeredMS: 1, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify CPU level of node.', - clusterName, - count, - nodes: `${nodeName}:${cpuUsage}`, - node: `${nodeName}:${cpuUsage}`, - state: 'firing', - }); - }); - - it('should not fire actions if under threshold', async () => { - (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - cpuUsage: 1, - }, - ]; - }); - const rule = new CpuUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [], - }); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - ccs, - }, - ]; - }); - const rule = new CpuUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - actionPlain: 'Verify CPU level of node.', - clusterName, - count, - nodes: `${nodeName}:${cpuUsage}`, - node: `${nodeName}:${cpuUsage}`, - state: 'firing', - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/disk_usage_rule.test.ts deleted file mode 100644 index c0b9720422e536..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_rule.test.ts +++ /dev/null @@ -1,180 +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 { DiskUsageRule } from './disk_usage_rule'; -import { RULE_DISK_USAGE } from '../../common/constants'; -import { fetchDiskUsageNodeStats } from '../lib/alerts/fetch_disk_usage_node_stats'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -type IDiskUsageAlertMock = DiskUsageRule & { - defaultParams: { - threshold: number; - duration: string; - }; -} & { - actionVariables: Array<{ - name: string; - description: string; - }>; -}; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_disk_usage_node_stats', () => ({ - fetchDiskUsageNodeStats: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('DiskUsageRule', () => { - it('should have defaults', () => { - const alert = new DiskUsageRule() as IDiskUsageAlertMock; - expect(alert.ruleOptions.id).toBe(RULE_DISK_USAGE); - expect(alert.ruleOptions.name).toBe('Disk Usage'); - expect(alert.ruleOptions.throttle).toBe('1d'); - expect(alert.ruleOptions.defaultParams).toStrictEqual({ threshold: 80, duration: '5m' }); - expect(alert.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node reporting high disk usage.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - - describe('execute', () => { - const FakeDate = function () {}; - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'myNodeId'; - const nodeName = 'myNodeName'; - const diskUsage = 91; - const stat = { - clusterUuid, - nodeId, - nodeName, - diskUsage, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - Date = FakeDate as DateConstructor; - (fetchDiskUsageNodeStats as jest.Mock).mockImplementation(() => { - return [stat]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new DiskUsageRule() as IDiskUsageAlertMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify disk usage level of node.', - clusterName, - count, - nodes: `${nodeName}:${diskUsage}`, - node: `${nodeName}:${diskUsage}`, - state: 'firing', - }); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchDiskUsageNodeStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - ccs, - }, - ]; - }); - const rule = new DiskUsageRule() as IDiskUsageAlertMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/myNodeId?_g=(cluster_uuid:abc123,ccs:testCluster))`, - actionPlain: 'Verify disk usage level of node.', - clusterName, - count, - nodes: `${nodeName}:${diskUsage}`, - node: `${nodeName}:${diskUsage}`, - state: 'firing', - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.test.ts deleted file mode 100644 index 1784ca8c0df716..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.test.ts +++ /dev/null @@ -1,176 +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 { LargeShardSizeRule } from './large_shard_size_rule'; -import { RULE_LARGE_SHARD_SIZE } from '../../common/constants'; -import { fetchIndexShardSize } from '../lib/alerts/fetch_index_shard_size'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -type ILargeShardSizeRuleMock = LargeShardSizeRule & { - defaultParams: { - threshold: number; - duration: string; - }; -} & { - actionVariables: Array<{ - name: string; - description: string; - }>; -}; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_index_shard_size', () => ({ - fetchIndexShardSize: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('LargeShardSizeRule', () => { - it('should have defaults', () => { - const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; - expect(rule.ruleOptions.id).toBe(RULE_LARGE_SHARD_SIZE); - expect(rule.ruleOptions.name).toBe('Shard size'); - expect(rule.ruleOptions.throttle).toBe('12h'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ - threshold: 55, - indexPattern: '-.*', - }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'shardIndex', description: 'The index experiencing large average shard size.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - describe('execute', () => { - const FakeDate = function () {}; - FakeDate.prototype.valueOf = () => 1; - - const shardIndex = 'apm-8.0.0-onboarding-2021.06.30'; - const shardSize = 0; - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const stat = { - shardIndex, - shardSize, - clusterUuid, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - Date = FakeDate as DateConstructor; - (fetchIndexShardSize as jest.Mock).mockImplementation(() => { - return [stat]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, - action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Investigate indices with large shard sizes.', - clusterName, - state: 'firing', - shardIndex, - shardIndices: shardIndex, - }); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchIndexShardSize as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - ccs, - }, - ]; - }); - const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, - action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - actionPlain: 'Investigate indices with large shard sizes.', - clusterName, - state: 'firing', - shardIndex, - shardIndices: shardIndex, - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/license_expiration_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/license_expiration_rule.test.ts deleted file mode 100644 index 7943e2dfca973c..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/license_expiration_rule.test.ts +++ /dev/null @@ -1,250 +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 { LicenseExpirationRule } from './license_expiration_rule'; -import { RULE_LICENSE_EXPIRATION } from '../../common/constants'; -import { AlertSeverity } from '../../common/enums'; -import { fetchLicenses } from '../lib/alerts/fetch_licenses'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_licenses', () => ({ - fetchLicenses: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - config: { - ui: { - show_license_expiration: true, - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('LicenseExpirationRule', () => { - it('should have defaults', () => { - const rule = new LicenseExpirationRule(); - expect(rule.ruleOptions.id).toBe(RULE_LICENSE_EXPIRATION); - expect(rule.ruleOptions.name).toBe('License expiration'); - expect(rule.ruleOptions.throttle).toBe('1d'); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'expiredDate', description: 'The date when the license expires.' }, - { name: 'clusterName', description: 'The cluster to which the license belong.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - - describe('execute', () => { - function FakeDate() {} - - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const license = { - status: 'expired', - type: 'gold', - expiryDateMS: 1000 * 60 * 60 * 24 * 59, - clusterUuid, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchLicenses as jest.Mock).mockImplementation(() => { - return [license]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - afterAll(() => { - jest.useRealTimers(); - }); - - it('should fire actions', async () => { - jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); - const alert = new LicenseExpirationRule(); - const type = alert.getRuleType(); - await type.executor({ - ...executorOptions, - params: alert.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid, clusterName }, - ccs: undefined, - itemLabel: undefined, - meta: { - clusterUuid: 'abc123', - expiryDateMS: 5097600000, - status: 'expired', - type: 'gold', - }, - nodeId: undefined, - nodeName: undefined, - ui: { - isFiring: true, - message: { - text: 'The license for this cluster expires in #relative at #absolute. #start_linkPlease update your license.#end_link', - tokens: [ - { - startToken: '#relative', - type: 'time', - isRelative: true, - isAbsolute: false, - timestamp: 5097600000, - }, - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 5097600000, - }, - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'license', - }, - ], - }, - severity: 'danger', - triggeredMS: 1680134400000, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: '[Please update your license.](elasticsearch/nodes)', - actionPlain: 'Please update your license.', - internalFullMessage: - 'License expiration alert is firing for testCluster. Your license expires in 53 years. [Please update your license.](elasticsearch/nodes)', - internalShortMessage: - 'License expiration alert is firing for testCluster. Your license expires in 53 years. Please update your license.', - clusterName, - expiredDate: '53 years', - state: 'firing', - }); - }); - - it('should not fire actions if the license is not expired', async () => { - (fetchLicenses as jest.Mock).mockImplementation(() => { - return [ - { - status: 'active', - type: 'gold', - expiryDateMS: 1000 * 60 * 60 * 24 * 61, - clusterUuid, - }, - ]; - }); - const rule = new LicenseExpirationRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should use danger severity for a license expiring soon', async () => { - (fetchLicenses as jest.Mock).mockImplementation(() => { - return [ - { - status: 'active', - type: 'gold', - expiryDateMS: 1000 * 60 * 60 * 24 * 2, - clusterUuid, - }, - ]; - }); - const rule = new LicenseExpirationRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState.mock.calls[0][0].alertStates[0].ui.severity).toBe(AlertSeverity.Danger); - }); - - it('should use warning severity for a license expiring in a bit', async () => { - (fetchLicenses as jest.Mock).mockImplementation(() => { - return [ - { - status: 'active', - type: 'gold', - expiryDateMS: 1000 * 60 * 60 * 24 * 31, - clusterUuid, - }, - ]; - }); - const rule = new LicenseExpirationRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState.mock.calls[0][0].alertStates[0].ui.severity).toBe(AlertSeverity.Warning); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/memory_usage_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/memory_usage_rule.test.ts deleted file mode 100644 index ad0cc98c51bb04..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/memory_usage_rule.test.ts +++ /dev/null @@ -1,291 +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 { MemoryUsageRule } from './memory_usage_rule'; -import { RULE_MEMORY_USAGE } from '../../common/constants'; -import { fetchMemoryUsageNodeStats } from '../lib/alerts/fetch_memory_usage_node_stats'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_memory_usage_node_stats', () => ({ - fetchMemoryUsageNodeStats: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('MemoryUsageRule', () => { - it('should have defaults', () => { - const rule = new MemoryUsageRule(); - expect(rule.ruleOptions.id).toBe(RULE_MEMORY_USAGE); - expect(rule.ruleOptions.name).toBe('Memory Usage (JVM)'); - expect(rule.ruleOptions.throttle).toBe('1d'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node reporting high memory usage.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - - describe('execute', () => { - function FakeDate() {} - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'myNodeId'; - const nodeName = 'myNodeName'; - const memoryUsage = 91; - const stat = { - clusterUuid, - nodeId, - nodeName, - memoryUsage, - }; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { - return [stat]; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new MemoryUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - ccs: undefined, - cluster: { clusterUuid, clusterName }, - memoryUsage, - itemLabel: undefined, - meta: { - clusterUuid, - memoryUsage, - nodeId, - nodeName, - }, - nodeId, - nodeName, - ui: { - isFiring: true, - message: { - text: `Node #start_link${nodeName}#end_link is reporting JVM memory usage of ${memoryUsage}% at #absolute`, - nextSteps: [ - { - text: '#start_linkTune thread pools#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', - }, - ], - }, - { - text: '#start_linkManaging ES Heap#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: '{elasticWebsiteUrl}blog/a-heap-of-trouble', - }, - ], - }, - { - text: '#start_linkIdentify large indices/shards#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/indices', - }, - ], - }, - { - text: '#start_linkAdd more data nodes#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', - }, - ], - }, - { - text: '#start_linkResize your deployment (ECE)#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', - }, - ], - }, - ], - tokens: [ - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 1, - }, - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/nodes/myNodeId', - }, - ], - }, - severity: 'danger', - triggeredMS: 1, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify memory usage level of node.', - clusterName, - count, - nodes: `${nodeName}:${memoryUsage}.00`, - node: `${nodeName}:${memoryUsage}.00`, - state: 'firing', - }); - }); - - it('should not fire actions if under threshold', async () => { - (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - memoryUsage: 1, - }, - ]; - }); - const rule = new MemoryUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [], - }); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat, - ccs, - }, - ]; - }); - const rule = new MemoryUsageRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, - actionPlain: 'Verify memory usage level of node.', - clusterName, - count, - nodes: `${nodeName}:${memoryUsage}.00`, - node: `${nodeName}:${memoryUsage}.00`, - state: 'firing', - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.test.ts deleted file mode 100644 index 4490e6c51e902a..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.test.ts +++ /dev/null @@ -1,248 +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 { MissingMonitoringDataRule } from './missing_monitoring_data_rule'; -import { RULE_MISSING_MONITORING_DATA } from '../../common/constants'; -import { fetchMissingMonitoringData } from '../lib/alerts/fetch_missing_monitoring_data'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_missing_monitoring_data', () => ({ - fetchMissingMonitoringData: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - show_license_expiration: true, - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('MissingMonitoringDataRule', () => { - it('should have defaults', () => { - const rule = new MissingMonitoringDataRule(); - expect(rule.ruleOptions.id).toBe(RULE_MISSING_MONITORING_DATA); - expect(rule.ruleOptions.name).toBe('Missing monitoring data'); - expect(rule.ruleOptions.throttle).toBe('6h'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ limit: '1d', duration: '15m' }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node missing monitoring data.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - - describe('execute', () => { - function FakeDate() {} - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'esNode1'; - const nodeName = 'esName1'; - const gapDuration = 3000001; - const missingData = [ - { - nodeId, - nodeName, - clusterUuid, - gapDuration, - }, - ]; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { - return missingData; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new MissingMonitoringDataRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - ccs: undefined, - cluster: { clusterUuid, clusterName }, - nodeId, - nodeName, - gapDuration, - itemLabel: undefined, - meta: { - clusterUuid, - gapDuration, - limit: 86400000, - nodeId, - nodeName, - }, - ui: { - isFiring: true, - message: { - text: 'For the past an hour, we have not detected any monitoring data from the Elasticsearch node: esName1, starting at #absolute', - nextSteps: [ - { - text: '#start_linkView all Elasticsearch nodes#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/nodes', - }, - ], - }, - { - text: 'Verify monitoring settings on the node', - }, - ], - tokens: [ - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 1, - }, - ], - }, - severity: 'danger', - triggeredMS: 1, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, - nodes: `node: ${nodeName}`, - node: `node: ${nodeName}`, - action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: - 'Verify the node is up and running, then double check the monitoring settings.', - clusterName, - count, - state: 'firing', - }); - }); - - it('should not fire actions if under threshold', async () => { - (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { - return [ - { - ...missingData[0], - gapDuration: 1, - }, - ]; - }); - const rule = new MissingMonitoringDataRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [], - }); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { - return [ - { - ...missingData[0], - ccs, - }, - ]; - }); - const rule = new MissingMonitoringDataRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, - nodes: `node: ${nodeName}`, - node: `node: ${nodeName}`, - action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - actionPlain: - 'Verify the node is up and running, then double check the monitoring settings.', - clusterName, - count, - state: 'firing', - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_rule.test.ts deleted file mode 100644 index ff0c917684e10c..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_rule.test.ts +++ /dev/null @@ -1,297 +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 { ThreadPoolSearchRejectionsRule } from './thread_pool_search_rejections_rule'; -import { RULE_THREAD_POOL_SEARCH_REJECTIONS } from '../../common/constants'; -import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ - fetchThreadPoolRejectionStats: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - show_license_expiration: true, - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('ThreadpoolSearchRejectionsRule', () => { - it('should have defaults', () => { - const rule = new ThreadPoolSearchRejectionsRule(); - expect(rule.ruleOptions.id).toBe(RULE_THREAD_POOL_SEARCH_REJECTIONS); - expect(rule.ruleOptions.name).toBe('Thread pool search rejections'); - expect(rule.ruleOptions.throttle).toBe('1d'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node reporting high thread pool search rejections.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - describe('execute', () => { - function FakeDate() {} - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'esNode1'; - const nodeName = 'esName1'; - const threadPoolType = 'search'; - const rejectionCount = 400; - const stat = [ - { - rejectionCount, - type: threadPoolType, - clusterUuid, - nodeId, - nodeName, - ccs: null, - }, - ]; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return stat; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new ThreadPoolSearchRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - ccs: null, - cluster: { clusterUuid, clusterName }, - nodeId, - nodeName, - itemLabel: undefined, - meta: { - rejectionCount, - clusterUuid, - type: threadPoolType, - nodeId, - nodeName, - ccs: null, - }, - ui: { - isFiring: true, - message: { - text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, - nextSteps: [ - { - text: '#start_linkMonitor this node#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/nodes/esNode1/advanced', - }, - ], - }, - { - text: '#start_linkOptimize complex queries#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', - }, - ], - }, - { - text: '#start_linkAdd more nodes#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', - }, - ], - }, - { - text: '#start_linkResize your deployment (ECE)#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', - }, - ], - }, - { - text: '#start_linkThread pool settings#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', - }, - ], - }, - ], - tokens: [ - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 1, - }, - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: `elasticsearch/nodes/${nodeId}`, - }, - ], - }, - severity: 'danger', - triggeredMS: 1, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, - node: `${nodeName}`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, - clusterName, - count: 1, - threadPoolType, - state: 'firing', - }); - }); - it('should not fire actions if under threshold', async () => { - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat[0], - rejectionCount: 1, - }, - ]; - }); - const rule = new ThreadPoolSearchRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [], - }); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat[0], - ccs, - }, - ]; - }); - const rule = new ThreadPoolSearchRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, - node: `${nodeName}`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, - actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, - clusterName, - count, - state: 'firing', - threadPoolType, - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_rule.test.ts b/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_rule.test.ts deleted file mode 100644 index b321f687e06723..00000000000000 --- a/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_rule.test.ts +++ /dev/null @@ -1,297 +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 { ThreadPoolWriteRejectionsRule } from './thread_pool_write_rejections_rule'; -import { RULE_THREAD_POOL_WRITE_REJECTIONS } from '../../common/constants'; -import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; -import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; - -const RealDate = Date; - -jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ - fetchThreadPoolRejectionStats: jest.fn(), -})); -jest.mock('../lib/alerts/fetch_clusters', () => ({ - fetchClusters: jest.fn(), -})); - -jest.mock('../static_globals', () => ({ - Globals: { - app: { - getLogger: () => ({ debug: jest.fn() }), - url: 'http://localhost:5601', - config: { - ui: { - show_license_expiration: true, - ccs: { enabled: true }, - container: { elasticsearch: { enabled: false } }, - }, - }, - }, - }, -})); - -describe('ThreadpoolWriteRejectionsAlert', () => { - it('should have defaults', () => { - const rule = new ThreadPoolWriteRejectionsRule(); - expect(rule.ruleOptions.id).toBe(RULE_THREAD_POOL_WRITE_REJECTIONS); - expect(rule.ruleOptions.name).toBe(`Thread pool write rejections`); - expect(rule.ruleOptions.throttle).toBe('1d'); - expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); - expect(rule.ruleOptions.actionVariables).toStrictEqual([ - { name: 'node', description: 'The node reporting high thread pool write rejections.' }, - { - name: 'internalShortMessage', - description: 'The short internal message generated by Elastic.', - }, - { - name: 'internalFullMessage', - description: 'The full internal message generated by Elastic.', - }, - { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, - { name: 'action', description: 'The recommended action for this alert.' }, - { - name: 'actionPlain', - description: 'The recommended action for this alert, without any markdown.', - }, - ]); - }); - describe('execute', () => { - function FakeDate() {} - FakeDate.prototype.valueOf = () => 1; - - const clusterUuid = 'abc123'; - const clusterName = 'testCluster'; - const nodeId = 'esNode1'; - const nodeName = 'esName1'; - const threadPoolType = 'write'; - const rejectionCount = 400; - const stat = [ - { - rejectionCount, - type: threadPoolType, - clusterUuid, - nodeId, - nodeName, - ccs: null, - }, - ]; - - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; - - beforeEach(() => { - // @ts-ignore - Date = FakeDate; - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return stat; - }); - (fetchClusters as jest.Mock).mockImplementation(() => { - return [{ clusterUuid, clusterName }]; - }); - }); - - afterEach(() => { - Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); - }); - - it('should fire actions', async () => { - const rule = new ThreadPoolWriteRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - ccs: null, - cluster: { clusterUuid, clusterName }, - nodeId, - nodeName, - itemLabel: undefined, - meta: { - rejectionCount, - clusterUuid, - type: threadPoolType, - nodeId, - nodeName, - ccs: null, - }, - ui: { - isFiring: true, - message: { - text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, - nextSteps: [ - { - text: '#start_linkMonitor this node#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/nodes/esNode1/advanced', - }, - ], - }, - { - text: '#start_linkOptimize complex queries#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', - }, - ], - }, - { - text: '#start_linkAdd more nodes#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', - }, - ], - }, - { - text: '#start_linkResize your deployment (ECE)#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', - }, - ], - }, - { - text: '#start_linkThread pool settings#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'docLink', - partialUrl: - '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', - }, - ], - }, - ], - tokens: [ - { - startToken: '#absolute', - type: 'time', - isAbsolute: true, - isRelative: false, - timestamp: 1, - }, - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: `elasticsearch/nodes/${nodeId}`, - }, - ], - }, - severity: 'danger', - triggeredMS: 1, - lastCheckedMS: 0, - }, - }, - ], - }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, - node: `${nodeName}`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, - clusterName, - count: 1, - threadPoolType, - state: 'firing', - }); - }); - it('should not fire actions if under threshold', async () => { - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat[0], - rejectionCount: 1, - }, - ]; - }); - const rule = new ThreadPoolWriteRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [], - }); - expect(scheduleActions).not.toHaveBeenCalled(); - }); - - it('should handle ccs', async () => { - const ccs = 'testCluster'; - (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { - return [ - { - ...stat[0], - ccs, - }, - ]; - }); - const rule = new ThreadPoolWriteRejectionsRule(); - const type = rule.getRuleType(); - await type.executor({ - ...executorOptions, - params: rule.ruleOptions.defaultParams, - } as any); - const count = 1; - expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, - internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, - node: `${nodeName}`, - action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, - actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, - clusterName, - count, - state: 'firing', - threadPoolType, - }); - }); - }); -}); diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts index 9a0830ab5a1a7d..9fca196cf8d986 100644 --- a/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts @@ -7,7 +7,7 @@ import { RulesClient } from '@kbn/alerting-plugin/server'; import { AlertInstanceState } from '../../../common/types/alerts'; -import { AlertsFactory } from '../../alerts'; +import { RulesFactory } from '../../rules'; import { CommonAlertState, CommonAlertFilter, RulesByType } from '../../../common/types/alerts'; import { RULES } from '../../../common/constants'; @@ -18,7 +18,7 @@ export async function fetchStatus( filters: CommonAlertFilter[] = [] ): Promise { const rulesByType = await Promise.all( - (alertTypes || RULES).map(async (type) => AlertsFactory.getByType(type, rulesClient)) + (alertTypes || RULES).map(async (type) => RulesFactory.getByType(type, rulesClient)) ); if (!rulesByType.length) return {}; diff --git a/x-pack/plugins/monitoring/server/plugin.test.ts b/x-pack/plugins/monitoring/server/plugin.test.ts index 188f1415e69fb9..92ea7cf3295d36 100644 --- a/x-pack/plugins/monitoring/server/plugin.test.ts +++ b/x-pack/plugins/monitoring/server/plugin.test.ts @@ -7,7 +7,7 @@ import { coreMock } from '@kbn/core/server/mocks'; import { MonitoringPlugin } from './plugin'; -import { AlertsFactory } from './alerts'; +import { RulesFactory } from './rules'; jest.mock('./es_client/instantiate_client', () => ({ instantiateClient: jest.fn().mockImplementation(() => ({ @@ -71,10 +71,10 @@ describe('Monitoring plugin', () => { expect(plugin['bulkUploader']).not.toBeUndefined(); }); - it('should register all alerts', async () => { - const alerts = AlertsFactory.getAll(); + it('should register all rules', async () => { + const rules = RulesFactory.getAll(); const plugin = new MonitoringPlugin(initializerContext as any); await plugin.setup(coreSetup as any, setupPlugins as any); - expect(setupPlugins.alerting.registerType).toHaveBeenCalledTimes(alerts.length); + expect(setupPlugins.alerting.registerType).toHaveBeenCalledTimes(rules.length); }); }); diff --git a/x-pack/plugins/monitoring/server/plugin.ts b/x-pack/plugins/monitoring/server/plugin.ts index 1747855112964b..99cc38e44c0e4b 100644 --- a/x-pack/plugins/monitoring/server/plugin.ts +++ b/x-pack/plugins/monitoring/server/plugin.ts @@ -30,7 +30,7 @@ import { LOGGING_TAG, SAVED_OBJECT_TELEMETRY, } from '../common/constants'; -import { AlertsFactory } from './alerts'; +import { RulesFactory } from './rules'; import { configSchema, createConfig, MonitoringConfig } from './config'; import { instantiateClient } from './es_client/instantiate_client'; import { initBulkUploader } from './kibana_monitoring'; @@ -123,9 +123,9 @@ export class MonitoringPlugin setupPlugins: this.setupPlugins!, }); - const alerts = AlertsFactory.getAll(); - for (const alert of alerts) { - plugins.alerting?.registerType(alert.getRuleType()); + const rules = RulesFactory.getAll(); + for (const rule of rules) { + plugins.alerting?.registerType(rule.getRuleType()); } const config = createConfig(this.initializerContext.config.get>()); diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts index dad3f7c16c010e..326033e61f1c05 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts +++ b/x-pack/plugins/monitoring/server/routes/api/v1/alerts/enable.ts @@ -8,7 +8,7 @@ import { ActionResult } from '@kbn/actions-plugin/server'; import { RuleTypeParams, SanitizedRule } from '@kbn/alerting-plugin/common'; import { ALERT_ACTION_TYPE_LOG } from '../../../../../common/constants'; -import { AlertsFactory } from '../../../../alerts'; +import { RulesFactory } from '../../../../rules'; import { handleError } from '../../../../lib/errors'; import { MonitoringCore, RouteDependencies } from '../../../../types'; @@ -26,7 +26,7 @@ export function enableAlertsRoute(server: MonitoringCore, npRoute: RouteDependen const infraContext = await context.infra; const actionContext = await context.actions; - const alerts = AlertsFactory.getAll(); + const alerts = RulesFactory.getAll(); if (alerts.length) { const { isSufficientlySecure, hasPermanentEncryptionKey } = npRoute.alerting ?.getSecurityHealth diff --git a/x-pack/plugins/monitoring/server/alerts/alert_helpers.ts b/x-pack/plugins/monitoring/server/rules/alert_helpers.ts similarity index 100% rename from x-pack/plugins/monitoring/server/alerts/alert_helpers.ts rename to x-pack/plugins/monitoring/server/rules/alert_helpers.ts diff --git a/x-pack/plugins/monitoring/server/alerts/base_rule.test.ts b/x-pack/plugins/monitoring/server/rules/base_rule.test.ts similarity index 100% rename from x-pack/plugins/monitoring/server/alerts/base_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/base_rule.test.ts diff --git a/x-pack/plugins/monitoring/server/alerts/base_rule.ts b/x-pack/plugins/monitoring/server/rules/base_rule.ts similarity index 84% rename from x-pack/plugins/monitoring/server/alerts/base_rule.ts rename to x-pack/plugins/monitoring/server/rules/base_rule.ts index 609d4a21821484..b457185704b769 100644 --- a/x-pack/plugins/monitoring/server/alerts/base_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/base_rule.ts @@ -7,15 +7,23 @@ import { Logger, ElasticsearchClient, DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; import { RuleType, RuleNotifyWhen, RuleExecutorOptions, - Alert, RulesClient, RuleExecutorServices, + DEFAULT_AAD_CONFIG, + AlertsClientError, } from '@kbn/alerting-plugin/server'; -import { Rule, RuleTypeParams, RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { + Rule, + RuleTypeParams, + RawAlertInstance, + SanitizedRule, + AlertInstanceContext, +} from '@kbn/alerting-plugin/common'; import { ActionsClient } from '@kbn/actions-plugin/server'; import { parseDuration } from '@kbn/alerting-plugin/common'; import { @@ -78,7 +86,16 @@ export class BaseRule { this.scopedLogger = Globals.app.getLogger(ruleOptions.id); } - public getRuleType(): RuleType { + public getRuleType(): RuleType< + never, + never, + ExecutedState, + AlertInstanceState, + AlertInstanceContext, + 'default', + never, + DefaultAlert + > { const { id, name, actionVariables } = this.ruleOptions; return { id, @@ -95,15 +112,21 @@ export class BaseRule { minimumLicenseRequired: 'basic', isExportable: false, executor: ( - options: RuleExecutorOptions & { - state: ExecutedState; - } + options: RuleExecutorOptions< + never, + ExecutedState, + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + > ): Promise => this.execute(options), category: DEFAULT_APP_CATEGORIES.management.id, producer: 'monitoring', actionVariables: { context: actionVariables, }, + alerts: DEFAULT_AAD_CONFIG, // As there is "[key: string]: unknown;" in CommonAlertParams, // we couldn't figure out a schema for validation and created a follow on issue: // https://github.com/elastic/kibana/issues/153754 @@ -230,13 +253,23 @@ export class BaseRule { services, params, state, - }: RuleExecutorOptions & { - state: ExecutedState; - }): Promise { + }: RuleExecutorOptions< + never, + ExecutedState, + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >): Promise { this.scopedLogger.debug( `Executing alert with params: ${JSON.stringify(params)} and state: ${JSON.stringify(state)}` ); + const { alertsClient } = services; + if (!alertsClient) { + throw new AlertsClientError(); + } + const esClient = services.scopedClusterClient.asCurrentUser; const clusters = await this.fetchClusters(esClient, params as CommonAlertParams); const data = await this.fetchData(params, esClient, clusters); @@ -270,7 +303,12 @@ export class BaseRule { protected async processData( data: AlertData[], clusters: AlertCluster[], - services: RuleExecutorServices, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, state: ExecutedState ) { const currentUTC = +new Date(); @@ -287,9 +325,6 @@ export class BaseRule { for (const node of nodes) { const newAlertStates: AlertNodeState[] = []; // quick fix for now so that non node level alerts will use the cluster id - const instance = services.alertFactory.create( - node.meta.nodeId || node.meta.instanceId || cluster.clusterUuid - ); if (node.shouldFire) { const { meta } = node; @@ -309,13 +344,19 @@ export class BaseRule { nodeState.ui.message = this.getUiMessage(nodeState, node); // store the state of each node in array. newAlertStates.push(nodeState); - } - const alertInstanceState = { alertStates: newAlertStates }; - // update the alert's state with the new node states - instance.replaceState(alertInstanceState); - if (newAlertStates.length) { - this.executeActions(instance, alertInstanceState, null, cluster); - state.lastExecutedAction = currentUTC; + + const alertInstanceState = { alertStates: newAlertStates }; + // update the alert's state with the new node states + if (newAlertStates.length) { + const alertId = node.meta.nodeId || node.meta.instanceId || cluster.clusterUuid; + services.alertsClient?.report({ + id: alertId, + actionGroup: 'default', + state: alertInstanceState, + }); + this.executeActions(services, alertId, alertInstanceState, null, cluster); + state.lastExecutedAction = currentUTC; + } } } } @@ -346,8 +387,14 @@ export class BaseRule { } protected executeActions( - instance: Alert, - instanceState: AlertInstanceState | AlertState | unknown, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, + alertState: AlertInstanceState | AlertState | unknown, item: AlertData | unknown, cluster?: AlertCluster | unknown ) { diff --git a/x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.test.ts b/x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.test.ts new file mode 100644 index 00000000000000..806c382cb37079 --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.test.ts @@ -0,0 +1,473 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CCRReadExceptionsRule } from './ccr_read_exceptions_rule'; +import { RULE_CCR_READ_EXCEPTIONS } from '../../common/constants'; +import { fetchCCRReadExceptions } from '../lib/alerts/fetch_ccr_read_exceptions'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +type ICCRReadExceptionsRuleMock = CCRReadExceptionsRule & { + defaultParams: { + duration: string; + }; +} & { + actionVariables: Array<{ + name: string; + description: string; + }>; +}; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_ccr_read_exceptions', () => ({ + fetchCCRReadExceptions: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('CCRReadExceptionsRule', () => { + it('should have defaults', () => { + const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; + expect(rule.ruleOptions.id).toBe(RULE_CCR_READ_EXCEPTIONS); + expect(rule.ruleOptions.name).toBe('CCR read exceptions'); + expect(rule.ruleOptions.throttle).toBe('6h'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ + duration: '1h', + }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { + name: 'remoteCluster', + description: 'The remote cluster experiencing CCR read exceptions.', + }, + { + name: 'followerIndex', + description: 'The follower index reporting CCR read exceptions.', + }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + const FakeDate = function () {}; + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'myNodeId'; + const nodeName = 'myNodeName'; + const remoteCluster = 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1'; + const followerIndex = '.follower_index_1'; + const leaderIndex = '.leader_index_1'; + const readExceptions = [ + { + exception: { + type: 'read_exceptions_type_1', + reason: 'read_exceptions_reason_1', + }, + }, + ]; + const stat = { + remoteCluster, + followerIndex, + leaderIndex, + read_exceptions: readExceptions, + clusterUuid, + nodeId, + nodeName, + }; + + const services = alertsMock.createRuleExecutorServices(); + + const executorOptions = { + services, + state: {}, + }; + + beforeEach(() => { + Date = FakeDate as DateConstructor; + (fetchCCRReadExceptions as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + actionGroup: 'default', + id: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { clusterName: 'testCluster', clusterUuid: 'abc123' }, + itemLabel: '.follower_index_1', + meta: { + followerIndex: '.follower_index_1', + instanceId: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + itemLabel: '.follower_index_1', + lastReadException: undefined, + leaderIndex: '.leader_index_1', + remoteCluster: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1', + shardId: undefined, + }, + nodeId: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + nodeName: '.follower_index_1', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + code: undefined, + nextSteps: [ + { + text: '#start_linkIdentify CCR usage/stats#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/ccr', + }, + ], + }, + { + text: '#start_linkManage CCR follower indices#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{basePath}management/data/cross_cluster_replication/follower_indices', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkCreate auto-follow patterns#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{basePath}management/data/cross_cluster_replication/auto_follow_patterns', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkAdd follower index API (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/ccr-put-follow.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkCross-cluster replication (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/xpack-ccr.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkBi-directional replication (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/bi-directional-replication-with-elasticsearch-cross-cluster-replication-ccr', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkFollow the Leader (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/follow-the-leader-an-introduction-to-cross-cluster-replication-in-elasticsearch', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'Follower index #start_link.follower_index_1#end_link is reporting CCR read exceptions on remote cluster: BcK-0pmsQniyPQfZuauuXw_remote_cluster_1 at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/ccr/.follower_index_1/shard/undefined', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + context: { + internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, + action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: + 'Verify follower and leader index relationships on the affected remote cluster.', + clusterName, + state: 'firing', + remoteCluster, + remoteClusters: remoteCluster, + followerIndex, + followerIndices: followerIndex, + }, + payload: { + [ALERT_REASON]: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, + }, + }); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchCCRReadExceptions as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const rule = new CCRReadExceptionsRule() as ICCRReadExceptionsRuleMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + actionGroup: 'default', + id: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterName: 'testCluster', clusterUuid: 'abc123' }, + itemLabel: '.follower_index_1', + meta: { + followerIndex: '.follower_index_1', + instanceId: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + itemLabel: '.follower_index_1', + lastReadException: undefined, + leaderIndex: '.leader_index_1', + remoteCluster: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1', + shardId: undefined, + }, + nodeId: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + nodeName: '.follower_index_1', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + code: undefined, + nextSteps: [ + { + text: '#start_linkIdentify CCR usage/stats#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/ccr', + }, + ], + }, + { + text: '#start_linkManage CCR follower indices#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{basePath}management/data/cross_cluster_replication/follower_indices', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkCreate auto-follow patterns#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{basePath}management/data/cross_cluster_replication/auto_follow_patterns', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkAdd follower index API (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/ccr-put-follow.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkCross-cluster replication (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/xpack-ccr.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkBi-directional replication (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/bi-directional-replication-with-elasticsearch-cross-cluster-replication-ccr', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkFollow the Leader (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/follow-the-leader-an-introduction-to-cross-cluster-replication-in-elasticsearch', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'Follower index #start_link.follower_index_1#end_link is reporting CCR read exceptions on remote cluster: BcK-0pmsQniyPQfZuauuXw_remote_cluster_1 at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/ccr/.follower_index_1/shard/undefined', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'BcK-0pmsQniyPQfZuauuXw_remote_cluster_1:.follower_index_1', + context: { + internalFullMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Current 'follower_index' index affected: ${followerIndex}. [View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + internalShortMessage: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, + action: `[View CCR stats](http://localhost:5601/app/monitoring#/elasticsearch/ccr?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: + 'Verify follower and leader index relationships on the affected remote cluster.', + clusterName, + state: 'firing', + remoteCluster, + remoteClusters: remoteCluster, + followerIndex, + followerIndices: followerIndex, + }, + payload: { + [ALERT_REASON]: `CCR read exceptions alert is firing for the following remote cluster: ${remoteCluster}. Verify follower and leader index relationships on the affected remote cluster.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.ts b/x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.ts similarity index 90% rename from x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.ts rename to x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.ts index 1c1bfe7bf30181..70ddc7a498fd27 100644 --- a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/ccr_read_exceptions_rule.ts @@ -7,9 +7,11 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; import { parseDuration } from '@kbn/alerting-plugin/common/parse_duration'; -import { SanitizedRule, RawAlertInstance } from '@kbn/alerting-plugin/common'; +import { SanitizedRule, RawAlertInstance, AlertInstanceContext } from '@kbn/alerting-plugin/common'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -209,7 +211,13 @@ export class CCRReadExceptionsRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -261,21 +269,27 @@ export class CCRReadExceptionsRule extends BaseRule { } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - remoteCluster, - followerIndex, - /* continue to send "remoteClusters" and "followerIndices" values for users still using it though + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + remoteCluster, + followerIndex, + /* continue to send "remoteClusters" and "followerIndices" values for users still using it though we have replaced it with "remoteCluster" and "followerIndex" in the template due to alerts per index instead of all indices see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - remoteClusters: remoteCluster, - followerIndices: followerIndex, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + remoteClusters: remoteCluster, + followerIndices: followerIndex, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/cluster_health_rule.test.ts b/x-pack/plugins/monitoring/server/rules/cluster_health_rule.test.ts similarity index 56% rename from x-pack/plugins/monitoring/server/alerts/cluster_health_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/cluster_health_rule.test.ts index d67f10613607a1..fe1d8562b7ed4a 100644 --- a/x-pack/plugins/monitoring/server/alerts/cluster_health_rule.test.ts +++ b/x-pack/plugins/monitoring/server/rules/cluster_health_rule.test.ts @@ -10,7 +10,8 @@ import { RULE_CLUSTER_HEALTH } from '../../common/constants'; import { AlertClusterHealthType, AlertSeverity } from '../../common/enums'; import { fetchClusterHealth } from '../lib/alerts/fetch_cluster_health'; import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; const RealDate = Date; @@ -75,24 +76,8 @@ describe('ClusterHealthRule', () => { }, ]; - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; beforeEach(() => { // @ts-ignore @@ -107,66 +92,77 @@ describe('ClusterHealthRule', () => { afterEach(() => { Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); + jest.resetAllMocks(); }); - it('should fire actions', async () => { + it('should fire action', async () => { const rule = new ClusterHealthRule(); const type = rule.getRuleType(); await type.executor({ ...executorOptions, params: {}, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, ccs, - clusterUuid, - health: AlertClusterHealthType.Yellow, - }, - ui: { - isFiring: true, - message: { - text: 'Elasticsearch cluster health is yellow.', - nextSteps: [ - { - text: 'Allocate missing replica shards. #start_linkView now#end_link', - tokens: [ - { - startToken: '#start_link', - endToken: '#end_link', - type: 'link', - url: 'elasticsearch/indices', - }, - ], - }, - ], + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + health: AlertClusterHealthType.Yellow, + }, + ui: { + isFiring: true, + message: { + text: 'Elasticsearch cluster health is yellow.', + nextSteps: [ + { + text: 'Allocate missing replica shards. #start_linkView now#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + ], + }, + severity: AlertSeverity.Warning, + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: AlertSeverity.Warning, - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: '[Allocate missing replica shards.](elasticsearch/indices)', - actionPlain: 'Allocate missing replica shards.', - internalFullMessage: - 'Cluster health alert is firing for testCluster. Current health is yellow. [Allocate missing replica shards.](elasticsearch/indices)', - internalShortMessage: - 'Cluster health alert is firing for testCluster. Current health is yellow. Allocate missing replica shards.', - clusterName, - clusterHealth: 'yellow', - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[Allocate missing replica shards.](elasticsearch/indices)', + actionPlain: 'Allocate missing replica shards.', + internalFullMessage: + 'Cluster health alert is firing for testCluster. Current health is yellow. [Allocate missing replica shards.](elasticsearch/indices)', + internalShortMessage: + 'Cluster health alert is firing for testCluster. Current health is yellow. Allocate missing replica shards.', + clusterName, + clusterHealth: 'yellow', + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Cluster health alert is firing for testCluster. Current health is yellow. Allocate missing replica shards.', + }, }); }); @@ -186,8 +182,8 @@ describe('ClusterHealthRule', () => { ...executorOptions, params: {}, } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/cluster_health_rule.ts b/x-pack/plugins/monitoring/server/rules/cluster_health_rule.ts similarity index 74% rename from x-pack/plugins/monitoring/server/alerts/cluster_health_rule.ts rename to x-pack/plugins/monitoring/server/rules/cluster_health_rule.ts index f93d1826845609..f603be7f3b6220 100644 --- a/x-pack/plugins/monitoring/server/alerts/cluster_health_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/cluster_health_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -115,8 +117,14 @@ export class ClusterHealthRule extends BaseRule { }; } - protected async executeActions( - instance: Alert, + protected executeActions( + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -139,34 +147,41 @@ export class ClusterHealthRule extends BaseRule { }); const action = `[${actionText}](elasticsearch/indices)`; - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.clusterHealth.firing.internalShortMessage', - { - defaultMessage: `Cluster health alert is firing for {clusterName}. Current health is {health}. {actionText}`, - values: { - clusterName: cluster.clusterName, - health, - actionText, - }, - } - ), - internalFullMessage: i18n.translate( - 'xpack.monitoring.alerts.clusterHealth.firing.internalFullMessage', - { - defaultMessage: `Cluster health alert is firing for {clusterName}. Current health is {health}. {action}`, - values: { - clusterName: cluster.clusterName, - health, - action, - }, - } - ), - state: AlertingDefaults.ALERT_STATE.firing, - clusterHealth: health, - clusterName: cluster.clusterName, - action, - actionPlain: actionText, + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.clusterHealth.firing.internalShortMessage', + { + defaultMessage: `Cluster health alert is firing for {clusterName}. Current health is {health}. {actionText}`, + values: { + clusterName: cluster.clusterName, + health, + actionText, + }, + } + ); + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.clusterHealth.firing.internalFullMessage', + { + defaultMessage: `Cluster health alert is firing for {clusterName}. Current health is {health}. {action}`, + values: { + clusterName: cluster.clusterName, + health, + action, + }, + } + ), + state: AlertingDefaults.ALERT_STATE.firing, + clusterHealth: health, + clusterName: cluster.clusterName, + action, + actionPlain: actionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/cpu_usage_rule.test.ts b/x-pack/plugins/monitoring/server/rules/cpu_usage_rule.test.ts new file mode 100644 index 00000000000000..1b107d40319819 --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/cpu_usage_rule.test.ts @@ -0,0 +1,334 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CpuUsageRule } from './cpu_usage_rule'; +import { RULE_CPU_USAGE } from '../../common/constants'; +import { fetchCpuUsageNodeStats } from '../lib/alerts/fetch_cpu_usage_node_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_cpu_usage_node_stats', () => ({ + fetchCpuUsageNodeStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('CpuUsageRule', () => { + it('should have defaults', () => { + const rule = new CpuUsageRule(); + expect(rule.ruleOptions.id).toBe(RULE_CPU_USAGE); + expect(rule.ruleOptions.name).toBe('CPU Usage'); + expect(rule.ruleOptions.throttle).toBe('1d'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high cpu usage.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'myNodeId'; + const nodeName = 'myNodeName'; + const cpuUsage = 91; + const stat = { + clusterUuid, + nodeId, + nodeName, + cpuUsage, + }; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { + services, + state: {}, + }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new CpuUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + actionGroup: 'default', + id: 'myNodeId', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + cpuUsage, + itemLabel: undefined, + meta: { + clusterUuid, + cpuUsage, + nodeId, + nodeName, + }, + nodeId, + nodeName, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting cpu usage of ${cpuUsage}% at #absolute`, + nextSteps: [ + { + text: '#start_linkCheck hot threads#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', + }, + ], + }, + { + text: '#start_linkCheck long running tasks#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify CPU level of node.', + clusterName, + count, + nodes: `${nodeName}:${cpuUsage}`, + node: `${nodeName}:${cpuUsage}`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + }, + }); + }); + + it('should not fire actions if under threshold', async () => { + (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + cpuUsage: 1, + }, + ]; + }); + const rule = new CpuUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchCpuUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const rule = new CpuUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + actionGroup: 'default', + id: 'myNodeId', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterUuid, clusterName }, + cpuUsage, + itemLabel: undefined, + meta: { + ccs: 'testCluster', + clusterUuid, + cpuUsage, + nodeId, + nodeName, + }, + nodeId, + nodeName, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting cpu usage of ${cpuUsage}% at #absolute`, + nextSteps: [ + { + text: '#start_linkCheck hot threads#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', + }, + ], + }, + { + text: '#start_linkCheck long running tasks#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: 'Verify CPU level of node.', + clusterName, + count, + nodes: `${nodeName}:${cpuUsage}`, + node: `${nodeName}:${cpuUsage}`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.ts b/x-pack/plugins/monitoring/server/rules/cpu_usage_rule.ts similarity index 83% rename from x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.ts rename to x-pack/plugins/monitoring/server/rules/cpu_usage_rule.ts index 92c45c9e61ae29..be8aad8bf01a4a 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/cpu_usage_rule.ts @@ -8,9 +8,11 @@ import { i18n } from '@kbn/i18n'; import numeral from '@elastic/numeral'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { AlertInstanceContext, RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; import { parseDuration } from '@kbn/alerting-plugin/common/parse_duration'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -144,7 +146,13 @@ export class CpuUsageRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -191,19 +199,25 @@ export class CpuUsageRule extends BaseRule { }, } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 - see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 - */ - nodes: `${firingNode.nodeName}:${firingNode.cpuUsage}`, - count: 1, - node: `${firingNode.nodeName}:${firingNode.cpuUsage}`, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + nodes: `${firingNode.nodeName}:${firingNode.cpuUsage}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.cpuUsage}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/disk_usage_rule.test.ts b/x-pack/plugins/monitoring/server/rules/disk_usage_rule.test.ts new file mode 100644 index 00000000000000..5e1c30dce78f62 --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/disk_usage_rule.test.ts @@ -0,0 +1,400 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DiskUsageRule } from './disk_usage_rule'; +import { RULE_DISK_USAGE } from '../../common/constants'; +import { fetchDiskUsageNodeStats } from '../lib/alerts/fetch_disk_usage_node_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +type IDiskUsageAlertMock = DiskUsageRule & { + defaultParams: { + threshold: number; + duration: string; + }; +} & { + actionVariables: Array<{ + name: string; + description: string; + }>; +}; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_disk_usage_node_stats', () => ({ + fetchDiskUsageNodeStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('DiskUsageRule', () => { + it('should have defaults', () => { + const alert = new DiskUsageRule() as IDiskUsageAlertMock; + expect(alert.ruleOptions.id).toBe(RULE_DISK_USAGE); + expect(alert.ruleOptions.name).toBe('Disk Usage'); + expect(alert.ruleOptions.throttle).toBe('1d'); + expect(alert.ruleOptions.defaultParams).toStrictEqual({ threshold: 80, duration: '5m' }); + expect(alert.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high disk usage.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + const FakeDate = function () {}; + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'myNodeId'; + const nodeName = 'myNodeName'; + const diskUsage = 91; + const stat = { + clusterUuid, + nodeId, + nodeName, + diskUsage, + }; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + Date = FakeDate as DateConstructor; + (fetchDiskUsageNodeStats as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new DiskUsageRule() as IDiskUsageAlertMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'myNodeId', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { + clusterName: 'testCluster', + clusterUuid: 'abc123', + }, + diskUsage: 91, + itemLabel: undefined, + meta: { + clusterUuid: 'abc123', + diskUsage: 91, + nodeId: 'myNodeId', + nodeName: 'myNodeName', + }, + nodeId: 'myNodeId', + nodeName: 'myNodeName', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + nextSteps: [ + { + text: '#start_linkTune for disk usage#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tune-for-disk-usage.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkIdentify large indices#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + { + text: '#start_linkImplement ILM policies#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/index-lifecycle-management.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkAdd more data nodes#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'Node #start_linkmyNodeName#end_link is reporting disk usage of 91% at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify disk usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${diskUsage}`, + node: `${nodeName}:${diskUsage}`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + }, + }); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchDiskUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const rule = new DiskUsageRule() as IDiskUsageAlertMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'myNodeId', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { + clusterName: 'testCluster', + clusterUuid: 'abc123', + }, + diskUsage: 91, + itemLabel: undefined, + meta: { + ccs: 'testCluster', + clusterUuid: 'abc123', + diskUsage: 91, + nodeId: 'myNodeId', + nodeName: 'myNodeName', + }, + nodeId: 'myNodeId', + nodeName: 'myNodeName', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + nextSteps: [ + { + text: '#start_linkTune for disk usage#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tune-for-disk-usage.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkIdentify large indices#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + { + text: '#start_linkImplement ILM policies#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/index-lifecycle-management.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkAdd more data nodes#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'Node #start_linkmyNodeName#end_link is reporting disk usage of 91% at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/myNodeId?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: 'Verify disk usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${diskUsage}`, + node: `${nodeName}:${diskUsage}`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_rule.ts b/x-pack/plugins/monitoring/server/rules/disk_usage_rule.ts similarity index 86% rename from x-pack/plugins/monitoring/server/alerts/disk_usage_rule.ts rename to x-pack/plugins/monitoring/server/rules/disk_usage_rule.ts index 77a5e0e8bd5bc7..a57de61e9bd66c 100644 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/disk_usage_rule.ts @@ -8,8 +8,10 @@ import { i18n } from '@kbn/i18n'; import numeral from '@elastic/numeral'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { AlertInstanceContext, RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -151,7 +153,13 @@ export class DiskUsageRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -200,19 +208,25 @@ export class DiskUsageRule extends BaseRule { } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - nodes: `${firingNode.nodeName}:${firingNode.diskUsage}`, - count: 1, - node: `${firingNode.nodeName}:${firingNode.diskUsage}`, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + nodes: `${firingNode.nodeName}:${firingNode.diskUsage}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.diskUsage}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.test.ts b/x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.test.ts similarity index 61% rename from x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.test.ts index 147f3435197a42..eafb51136fc734 100644 --- a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.test.ts +++ b/x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.test.ts @@ -9,7 +9,8 @@ import { ElasticsearchVersionMismatchRule } from './elasticsearch_version_mismat import { RULE_ELASTICSEARCH_VERSION_MISMATCH } from '../../common/constants'; import { fetchElasticsearchVersions } from '../lib/alerts/fetch_elasticsearch_versions'; import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; const RealDate = Date; @@ -79,24 +80,8 @@ describe('ElasticsearchVersionMismatchAlert', () => { }, ]; - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; beforeEach(() => { // @ts-ignore @@ -111,52 +96,63 @@ describe('ElasticsearchVersionMismatchAlert', () => { afterEach(() => { Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); + jest.resetAllMocks(); }); - it('should fire actions', async () => { + it('should fire action', async () => { const rule = new ElasticsearchVersionMismatchRule(); const type = rule.getRuleType(); await type.executor({ ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, ccs, - clusterUuid, - versions: ['8.0.0', '7.2.1'], - }, - ui: { - isFiring: true, - message: { - text: 'Multiple versions of Elasticsearch (8.0.0, 7.2.1) running in this cluster.', + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + versions: ['8.0.0', '7.2.1'], + }, + ui: { + isFiring: true, + message: { + text: 'Multiple versions of Elasticsearch (8.0.0, 7.2.1) running in this cluster.', + }, + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: 'warning', - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: `[View nodes](UNIT_TEST_URL/app/monitoring#/elasticsearch/nodes?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify you have the same version across all nodes.', - internalFullMessage: `Elasticsearch version mismatch alert is firing for testCluster. Elasticsearch is running 8.0.0, 7.2.1. [View nodes](UNIT_TEST_URL/app/monitoring#/elasticsearch/nodes?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: - 'Elasticsearch version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', - versionList: ['8.0.0', '7.2.1'], - clusterName, - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: `[View nodes](UNIT_TEST_URL/app/monitoring#/elasticsearch/nodes?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify you have the same version across all nodes.', + internalFullMessage: `Elasticsearch version mismatch alert is firing for testCluster. Elasticsearch is running 8.0.0, 7.2.1. [View nodes](UNIT_TEST_URL/app/monitoring#/elasticsearch/nodes?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: + 'Elasticsearch version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', + versionList: ['8.0.0', '7.2.1'], + clusterName, + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Elasticsearch version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', + }, }); }); @@ -176,8 +172,8 @@ describe('ElasticsearchVersionMismatchAlert', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.ts b/x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.ts similarity index 70% rename from x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.ts rename to x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.ts index 77ad2dc5f3aa20..a2c4f4aa6687f9 100644 --- a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/elasticsearch_version_mismatch_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -87,7 +89,13 @@ export class ElasticsearchVersionMismatchRule extends BaseRule { } protected async executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -118,33 +126,40 @@ export class ElasticsearchVersionMismatchRule extends BaseRule { state.ccs ); const action = `[${fullActionText}](${globalStateLink})`; - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.elasticsearchVersionMismatch.firing.internalShortMessage', - { - defaultMessage: `Elasticsearch version mismatch alert is firing for {clusterName}. {shortActionText}`, - values: { - clusterName: cluster.clusterName, - shortActionText, - }, - } - ), - internalFullMessage: i18n.translate( - 'xpack.monitoring.alerts.elasticsearchVersionMismatch.firing.internalFullMessage', - { - defaultMessage: `Elasticsearch version mismatch alert is firing for {clusterName}. Elasticsearch is running {versions}. {action}`, - values: { - clusterName: cluster.clusterName, - versions: versions.join(', '), - action, - }, - } - ), - state: AlertingDefaults.ALERT_STATE.firing, - clusterName: cluster.clusterName, - versionList: versions, - action, - actionPlain: shortActionText, + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.elasticsearchVersionMismatch.firing.internalShortMessage', + { + defaultMessage: `Elasticsearch version mismatch alert is firing for {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.elasticsearchVersionMismatch.firing.internalFullMessage', + { + defaultMessage: `Elasticsearch version mismatch alert is firing for {clusterName}. Elasticsearch is running {versions}. {action}`, + values: { + clusterName: cluster.clusterName, + versions: versions.join(', '), + action, + }, + } + ), + state: AlertingDefaults.ALERT_STATE.firing, + clusterName: cluster.clusterName, + versionList: versions, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/index.ts b/x-pack/plugins/monitoring/server/rules/index.ts similarity index 96% rename from x-pack/plugins/monitoring/server/alerts/index.ts rename to x-pack/plugins/monitoring/server/rules/index.ts index d5c59c802b681b..2be1e70d5f15e6 100644 --- a/x-pack/plugins/monitoring/server/alerts/index.ts +++ b/x-pack/plugins/monitoring/server/rules/index.ts @@ -20,4 +20,4 @@ export { NodesChangedRule } from './nodes_changed_rule'; export { ElasticsearchVersionMismatchRule } from './elasticsearch_version_mismatch_rule'; export { KibanaVersionMismatchRule } from './kibana_version_mismatch_rule'; export { LogstashVersionMismatchRule } from './logstash_version_mismatch_rule'; -export { AlertsFactory } from './alerts_factory'; +export { RulesFactory } from './rules_factory'; diff --git a/x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.test.ts b/x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.test.ts similarity index 60% rename from x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.test.ts index d7032597881a36..46b777dbee4a2e 100644 --- a/x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.test.ts +++ b/x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.test.ts @@ -9,7 +9,8 @@ import { KibanaVersionMismatchRule } from './kibana_version_mismatch_rule'; import { RULE_KIBANA_VERSION_MISMATCH } from '../../common/constants'; import { fetchKibanaVersions } from '../lib/alerts/fetch_kibana_versions'; import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; const RealDate = Date; @@ -82,24 +83,8 @@ describe('KibanaVersionMismatchRule', () => { }, ]; - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; beforeEach(() => { // @ts-ignore @@ -114,52 +99,63 @@ describe('KibanaVersionMismatchRule', () => { afterEach(() => { Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); + jest.resetAllMocks(); }); - it('should fire actions', async () => { + it('should fire action', async () => { const rule = new KibanaVersionMismatchRule(); const type = rule.getRuleType(); await type.executor({ ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, ccs, - clusterUuid, - versions: ['8.0.0', '7.2.1'], - }, - ui: { - isFiring: true, - message: { - text: 'Multiple versions of Kibana (8.0.0, 7.2.1) running in this cluster.', + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + versions: ['8.0.0', '7.2.1'], + }, + ui: { + isFiring: true, + message: { + text: 'Multiple versions of Kibana (8.0.0, 7.2.1) running in this cluster.', + }, + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: 'warning', - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: `[View instances](UNIT_TEST_URL/app/monitoring#/kibana/instances?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify you have the same version across all instances.', - internalFullMessage: `Kibana version mismatch alert is firing for testCluster. Kibana is running 8.0.0, 7.2.1. [View instances](UNIT_TEST_URL/app/monitoring#/kibana/instances?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: - 'Kibana version mismatch alert is firing for testCluster. Verify you have the same version across all instances.', - versionList: ['8.0.0', '7.2.1'], - clusterName, - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: `[View instances](UNIT_TEST_URL/app/monitoring#/kibana/instances?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify you have the same version across all instances.', + internalFullMessage: `Kibana version mismatch alert is firing for testCluster. Kibana is running 8.0.0, 7.2.1. [View instances](UNIT_TEST_URL/app/monitoring#/kibana/instances?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: + 'Kibana version mismatch alert is firing for testCluster. Verify you have the same version across all instances.', + versionList: ['8.0.0', '7.2.1'], + clusterName, + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Kibana version mismatch alert is firing for testCluster. Verify you have the same version across all instances.', + }, }); }); @@ -179,8 +175,8 @@ describe('KibanaVersionMismatchRule', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.ts b/x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.ts similarity index 79% rename from x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.ts rename to x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.ts index ff7653dc59e858..559c27f69d46f6 100644 --- a/x-pack/plugins/monitoring/server/alerts/kibana_version_mismatch_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/kibana_version_mismatch_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -97,7 +99,13 @@ export class KibanaVersionMismatchRule extends BaseRule { } protected async executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -128,6 +136,16 @@ export class KibanaVersionMismatchRule extends BaseRule { state.ccs ); const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.kibanaVersionMismatch.firing.internalShortMessage', + { + defaultMessage: `Kibana version mismatch alert is firing for {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); const internalFullMessage = i18n.translate( 'xpack.monitoring.alerts.kibanaVersionMismatch.firing.internalFullMessage', { @@ -139,23 +157,20 @@ export class KibanaVersionMismatchRule extends BaseRule { }, } ); - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.kibanaVersionMismatch.firing.internalShortMessage', - { - defaultMessage: `Kibana version mismatch alert is firing for {clusterName}. {shortActionText}`, - values: { - clusterName: cluster.clusterName, - shortActionText, - }, - } - ), - internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - clusterName: cluster.clusterName, - versionList: versions, - action, - actionPlain: shortActionText, + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + clusterName: cluster.clusterName, + versionList: versions, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/large_shard_size_rule.test.ts b/x-pack/plugins/monitoring/server/rules/large_shard_size_rule.test.ts new file mode 100644 index 00000000000000..0ad6c7687c203b --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/large_shard_size_rule.test.ts @@ -0,0 +1,345 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LargeShardSizeRule } from './large_shard_size_rule'; +import { RULE_LARGE_SHARD_SIZE } from '../../common/constants'; +import { fetchIndexShardSize } from '../lib/alerts/fetch_index_shard_size'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +type ILargeShardSizeRuleMock = LargeShardSizeRule & { + defaultParams: { + threshold: number; + duration: string; + }; +} & { + actionVariables: Array<{ + name: string; + description: string; + }>; +}; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_index_shard_size', () => ({ + fetchIndexShardSize: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('LargeShardSizeRule', () => { + it('should have defaults', () => { + const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; + expect(rule.ruleOptions.id).toBe(RULE_LARGE_SHARD_SIZE); + expect(rule.ruleOptions.name).toBe('Shard size'); + expect(rule.ruleOptions.throttle).toBe('12h'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ + threshold: 55, + indexPattern: '-.*', + }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'shardIndex', description: 'The index experiencing large average shard size.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + const FakeDate = function () {}; + FakeDate.prototype.valueOf = () => 1; + + const shardIndex = 'apm-8.0.0-onboarding-2021.06.30'; + const shardSize = 0; + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const stat = { + shardIndex, + shardSize, + clusterUuid, + }; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + Date = FakeDate as DateConstructor; + (fetchIndexShardSize as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123:apm-8.0.0-onboarding-2021.06.30', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { + clusterName: 'testCluster', + clusterUuid: 'abc123', + }, + itemLabel: 'apm-8.0.0-onboarding-2021.06.30', + meta: { + instanceId: 'abc123:apm-8.0.0-onboarding-2021.06.30', + itemLabel: 'apm-8.0.0-onboarding-2021.06.30', + shardIndex: 'apm-8.0.0-onboarding-2021.06.30', + shardSize: 0, + }, + nodeId: 'abc123:apm-8.0.0-onboarding-2021.06.30', + nodeName: 'apm-8.0.0-onboarding-2021.06.30', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + nextSteps: [ + { + text: '#start_linkInvestigate detailed index stats#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices/apm-8.0.0-onboarding-2021.06.30/advanced', + }, + ], + }, + { + text: '#start_linkHow to size your shards (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/current/size-your-shards.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkShard sizing tips (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'The following index: #start_linkapm-8.0.0-onboarding-2021.06.30#end_link has a large average shard size of: 0GB at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices/apm-8.0.0-onboarding-2021.06.30', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123:apm-8.0.0-onboarding-2021.06.30', + context: { + internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, + action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Investigate indices with large shard sizes.', + clusterName, + state: 'firing', + shardIndex, + shardIndices: shardIndex, + }, + payload: { + [ALERT_REASON]: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, + }, + }); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchIndexShardSize as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const rule = new LargeShardSizeRule() as ILargeShardSizeRuleMock; + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123:apm-8.0.0-onboarding-2021.06.30', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { + clusterName: 'testCluster', + clusterUuid: 'abc123', + }, + itemLabel: 'apm-8.0.0-onboarding-2021.06.30', + meta: { + instanceId: 'abc123:apm-8.0.0-onboarding-2021.06.30', + itemLabel: 'apm-8.0.0-onboarding-2021.06.30', + shardIndex: 'apm-8.0.0-onboarding-2021.06.30', + shardSize: 0, + }, + nodeId: 'abc123:apm-8.0.0-onboarding-2021.06.30', + nodeName: 'apm-8.0.0-onboarding-2021.06.30', + ui: { + isFiring: true, + lastCheckedMS: 0, + message: { + nextSteps: [ + { + text: '#start_linkInvestigate detailed index stats#end_link', + tokens: [ + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices/apm-8.0.0-onboarding-2021.06.30/advanced', + }, + ], + }, + { + text: '#start_linkHow to size your shards (Docs)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/current/size-your-shards.html', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + { + text: '#start_linkShard sizing tips (Blog)#end_link', + tokens: [ + { + endToken: '#end_link', + partialUrl: + '{elasticWebsiteUrl}blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster', + startToken: '#start_link', + type: 'docLink', + }, + ], + }, + ], + text: 'The following index: #start_linkapm-8.0.0-onboarding-2021.06.30#end_link has a large average shard size of: 0GB at #absolute', + tokens: [ + { + isAbsolute: true, + isRelative: false, + startToken: '#absolute', + timestamp: 1, + type: 'time', + }, + { + endToken: '#end_link', + startToken: '#start_link', + type: 'link', + url: 'elasticsearch/indices/apm-8.0.0-onboarding-2021.06.30', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123:apm-8.0.0-onboarding-2021.06.30', + context: { + internalFullMessage: `Large shard size alert is firing for the following index: ${shardIndex}. [View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + internalShortMessage: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, + action: `[View index shard size stats](http://localhost:5601/app/monitoring#/elasticsearch/indices/${shardIndex}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: 'Investigate indices with large shard sizes.', + clusterName, + state: 'firing', + shardIndex, + shardIndices: shardIndex, + }, + payload: { + [ALERT_REASON]: `Large shard size alert is firing for the following index: ${shardIndex}. Investigate indices with large shard sizes.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.ts b/x-pack/plugins/monitoring/server/rules/large_shard_size_rule.ts similarity index 87% rename from x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.ts rename to x-pack/plugins/monitoring/server/rules/large_shard_size_rule.ts index 528c757299f9c1..67664695fec87f 100644 --- a/x-pack/plugins/monitoring/server/alerts/large_shard_size_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/large_shard_size_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule, RawAlertInstance } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { SanitizedRule, RawAlertInstance, AlertInstanceContext } from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -149,7 +151,13 @@ export class LargeShardSizeRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -196,19 +204,25 @@ export class LargeShardSizeRule extends BaseRule { } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "shardIndices" values for users still using it though + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "shardIndices" values for users still using it though we have replaced it with shardIndex in the template due to alerts per index instead of all indices see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - shardIndices: shardIndex, - shardIndex, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + shardIndices: shardIndex, + shardIndex, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/license_expiration_rule.test.ts b/x-pack/plugins/monitoring/server/rules/license_expiration_rule.test.ts new file mode 100644 index 00000000000000..f1c193ce5f8eec --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/license_expiration_rule.test.ts @@ -0,0 +1,387 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LicenseExpirationRule } from './license_expiration_rule'; +import { RULE_LICENSE_EXPIRATION } from '../../common/constants'; +import { fetchLicenses } from '../lib/alerts/fetch_licenses'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_licenses', () => ({ + fetchLicenses: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('LicenseExpirationRule', () => { + it('should have defaults', () => { + const rule = new LicenseExpirationRule(); + expect(rule.ruleOptions.id).toBe(RULE_LICENSE_EXPIRATION); + expect(rule.ruleOptions.name).toBe('License expiration'); + expect(rule.ruleOptions.throttle).toBe('1d'); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'expiredDate', description: 'The date when the license expires.' }, + { name: 'clusterName', description: 'The cluster to which the license belong.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const license = { + status: 'expired', + type: 'gold', + expiryDateMS: 1000 * 60 * 60 * 24 * 59, + clusterUuid, + }; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchLicenses as jest.Mock).mockImplementation(() => { + return [license]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('should fire action', async () => { + jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); + const alert = new LicenseExpirationRule(); + const type = alert.getRuleType(); + await type.executor({ + ...executorOptions, + params: alert.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid, clusterName }, + ccs: undefined, + itemLabel: undefined, + meta: { + clusterUuid: 'abc123', + expiryDateMS: 5097600000, + status: 'expired', + type: 'gold', + }, + nodeId: undefined, + nodeName: undefined, + ui: { + isFiring: true, + message: { + text: 'The license for this cluster expires in #relative at #absolute. #start_linkPlease update your license.#end_link', + tokens: [ + { + startToken: '#relative', + type: 'time', + isRelative: true, + isAbsolute: false, + timestamp: 5097600000, + }, + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 5097600000, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'license', + }, + ], + }, + severity: 'danger', + triggeredMS: 1680134400000, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[Please update your license.](elasticsearch/nodes)', + actionPlain: 'Please update your license.', + internalFullMessage: + 'License expiration alert is firing for testCluster. Your license expires in 53 years. [Please update your license.](elasticsearch/nodes)', + internalShortMessage: + 'License expiration alert is firing for testCluster. Your license expires in 53 years. Please update your license.', + clusterName, + expiredDate: '53 years', + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'License expiration alert is firing for testCluster. Your license expires in 53 years. Please update your license.', + }, + }); + }); + + it('should not fire actions if the license is not expired', async () => { + (fetchLicenses as jest.Mock).mockImplementation(() => { + return [ + { + status: 'active', + type: 'gold', + expiryDateMS: 1000 * 60 * 60 * 24 * 61, + clusterUuid, + }, + ]; + }); + const rule = new LicenseExpirationRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should use danger severity for a license expiring soon', async () => { + (fetchLicenses as jest.Mock).mockImplementation(() => { + return [ + { + status: 'active', + type: 'gold', + expiryDateMS: 1000 * 60 * 60 * 24 * 2, + clusterUuid, + }, + ]; + }); + const rule = new LicenseExpirationRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid, clusterName }, + ccs: undefined, + itemLabel: undefined, + meta: { + clusterUuid: 'abc123', + expiryDateMS: 172800000, + status: 'active', + type: 'gold', + }, + nodeId: undefined, + nodeName: undefined, + ui: { + isFiring: true, + message: { + text: 'The license for this cluster expires in #relative at #absolute. #start_linkPlease update your license.#end_link', + tokens: [ + { + startToken: '#relative', + type: 'time', + isRelative: true, + isAbsolute: false, + timestamp: 172800000, + }, + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 172800000, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'license', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[Please update your license.](elasticsearch/nodes)', + actionPlain: 'Please update your license.', + internalFullMessage: + 'License expiration alert is firing for testCluster. Your license expires in 2 days. [Please update your license.](elasticsearch/nodes)', + internalShortMessage: + 'License expiration alert is firing for testCluster. Your license expires in 2 days. Please update your license.', + clusterName, + expiredDate: '2 days', + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'License expiration alert is firing for testCluster. Your license expires in 2 days. Please update your license.', + }, + }); + }); + + it('should use warning severity for a license expiring in a bit', async () => { + (fetchLicenses as jest.Mock).mockImplementation(() => { + return [ + { + status: 'active', + type: 'gold', + expiryDateMS: 1000 * 60 * 60 * 24 * 31, + clusterUuid, + }, + ]; + }); + const rule = new LicenseExpirationRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid, clusterName }, + ccs: undefined, + itemLabel: undefined, + meta: { + clusterUuid: 'abc123', + expiryDateMS: 2678400000, + status: 'active', + type: 'gold', + }, + nodeId: undefined, + nodeName: undefined, + ui: { + isFiring: true, + message: { + text: 'The license for this cluster expires in #relative at #absolute. #start_linkPlease update your license.#end_link', + tokens: [ + { + startToken: '#relative', + type: 'time', + isRelative: true, + isAbsolute: false, + timestamp: 2678400000, + }, + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 2678400000, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'license', + }, + ], + }, + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[Please update your license.](elasticsearch/nodes)', + actionPlain: 'Please update your license.', + internalFullMessage: + 'License expiration alert is firing for testCluster. Your license expires in a month. [Please update your license.](elasticsearch/nodes)', + internalShortMessage: + 'License expiration alert is firing for testCluster. Your license expires in a month. Please update your license.', + clusterName, + expiredDate: 'a month', + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'License expiration alert is firing for testCluster. Your license expires in a month. Please update your license.', + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/license_expiration_rule.ts b/x-pack/plugins/monitoring/server/rules/license_expiration_rule.ts similarity index 76% rename from x-pack/plugins/monitoring/server/alerts/license_expiration_rule.ts rename to x-pack/plugins/monitoring/server/rules/license_expiration_rule.ts index 6be4aa3edc1a82..b3ed188f33ee2d 100644 --- a/x-pack/plugins/monitoring/server/alerts/license_expiration_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/license_expiration_rule.ts @@ -7,8 +7,10 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { RuleExecutorOptions, Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { RuleExecutorOptions, RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -143,7 +145,13 @@ export class LicenseExpirationRule extends BaseRule { } protected async executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -161,34 +169,41 @@ export class LicenseExpirationRule extends BaseRule { }); const action = `[${actionText}](elasticsearch/nodes)`; const expiredDate = $duration.humanize(); - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.licenseExpiration.firing.internalShortMessage', - { - defaultMessage: `License expiration alert is firing for {clusterName}. Your license expires in {expiredDate}. {actionText}`, - values: { - clusterName: cluster.clusterName, - expiredDate, - actionText, - }, - } - ), - internalFullMessage: i18n.translate( - 'xpack.monitoring.alerts.licenseExpiration.firing.internalFullMessage', - { - defaultMessage: `License expiration alert is firing for {clusterName}. Your license expires in {expiredDate}. {action}`, - values: { - clusterName: cluster.clusterName, - expiredDate, - action, - }, - } - ), - state: AlertingDefaults.ALERT_STATE.firing, - expiredDate, - clusterName: cluster.clusterName, - action, - actionPlain: actionText, + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.licenseExpiration.firing.internalShortMessage', + { + defaultMessage: `License expiration alert is firing for {clusterName}. Your license expires in {expiredDate}. {actionText}`, + values: { + clusterName: cluster.clusterName, + expiredDate, + actionText, + }, + } + ); + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.licenseExpiration.firing.internalFullMessage', + { + defaultMessage: `License expiration alert is firing for {clusterName}. Your license expires in {expiredDate}. {action}`, + values: { + clusterName: cluster.clusterName, + expiredDate, + action, + }, + } + ), + state: AlertingDefaults.ALERT_STATE.firing, + expiredDate, + clusterName: cluster.clusterName, + action, + actionPlain: actionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.test.ts b/x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.test.ts similarity index 61% rename from x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.test.ts index aaa0260c1cee51..97cbbd2c619a64 100644 --- a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.test.ts +++ b/x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.test.ts @@ -9,7 +9,8 @@ import { LogstashVersionMismatchRule } from './logstash_version_mismatch_rule'; import { RULE_LOGSTASH_VERSION_MISMATCH } from '../../common/constants'; import { fetchLogstashVersions } from '../lib/alerts/fetch_logstash_versions'; import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; const RealDate = Date; @@ -80,24 +81,8 @@ describe('LogstashVersionMismatchRule', () => { }, ]; - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; beforeEach(() => { // @ts-ignore @@ -112,52 +97,63 @@ describe('LogstashVersionMismatchRule', () => { afterEach(() => { Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); + jest.resetAllMocks(); }); - it('should fire actions', async () => { + it('should fire action', async () => { const rule = new LogstashVersionMismatchRule(); const type = rule.getRuleType(); await type.executor({ ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid: 'abc123', clusterName: 'testCluster' }, ccs, - clusterUuid, - versions: ['8.0.0', '7.2.1'], - }, - ui: { - isFiring: true, - message: { - text: 'Multiple versions of Logstash (8.0.0, 7.2.1) running in this cluster.', + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + versions: ['8.0.0', '7.2.1'], + }, + ui: { + isFiring: true, + message: { + text: 'Multiple versions of Logstash (8.0.0, 7.2.1) running in this cluster.', + }, + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: 'warning', - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: `[View nodes](UNIT_TEST_URL/app/monitoring#/logstash/nodes?_g=(cluster_uuid:${clusterUuid}))`, - actionPlain: 'Verify you have the same version across all nodes.', - internalFullMessage: `Logstash version mismatch alert is firing for testCluster. Logstash is running 8.0.0, 7.2.1. [View nodes](UNIT_TEST_URL/app/monitoring#/logstash/nodes?_g=(cluster_uuid:${clusterUuid}))`, - internalShortMessage: - 'Logstash version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', - versionList: ['8.0.0', '7.2.1'], - clusterName, - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: `[View nodes](UNIT_TEST_URL/app/monitoring#/logstash/nodes?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify you have the same version across all nodes.', + internalFullMessage: `Logstash version mismatch alert is firing for testCluster. Logstash is running 8.0.0, 7.2.1. [View nodes](UNIT_TEST_URL/app/monitoring#/logstash/nodes?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: + 'Logstash version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', + versionList: ['8.0.0', '7.2.1'], + clusterName, + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Logstash version mismatch alert is firing for testCluster. Verify you have the same version across all nodes.', + }, }); }); @@ -177,8 +173,8 @@ describe('LogstashVersionMismatchRule', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.ts b/x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.ts similarity index 70% rename from x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.ts rename to x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.ts index a21e54c2b3c11e..100e33d2728443 100644 --- a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/logstash_version_mismatch_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -87,7 +89,13 @@ export class LogstashVersionMismatchRule extends BaseRule { } protected async executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -118,33 +126,40 @@ export class LogstashVersionMismatchRule extends BaseRule { state.ccs ); const action = `[${fullActionText}](${globalStateLink})`; - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.logstashVersionMismatch.firing.internalShortMessage', - { - defaultMessage: `Logstash version mismatch alert is firing for {clusterName}. {shortActionText}`, - values: { - clusterName: cluster.clusterName, - shortActionText, - }, - } - ), - internalFullMessage: i18n.translate( - 'xpack.monitoring.alerts.logstashVersionMismatch.firing.internalFullMessage', - { - defaultMessage: `Logstash version mismatch alert is firing for {clusterName}. Logstash is running {versions}. {action}`, - values: { - clusterName: cluster.clusterName, - versions: versions.join(', '), - action, - }, - } - ), - state: AlertingDefaults.ALERT_STATE.firing, - clusterName: cluster.clusterName, - versionList: versions, - action, - actionPlain: shortActionText, + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.logstashVersionMismatch.firing.internalShortMessage', + { + defaultMessage: `Logstash version mismatch alert is firing for {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.logstashVersionMismatch.firing.internalFullMessage', + { + defaultMessage: `Logstash version mismatch alert is firing for {clusterName}. Logstash is running {versions}. {action}`, + values: { + clusterName: cluster.clusterName, + versions: versions.join(', '), + action, + }, + } + ), + state: AlertingDefaults.ALERT_STATE.firing, + clusterName: cluster.clusterName, + versionList: versions, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/memory_usage_rule.test.ts b/x-pack/plugins/monitoring/server/rules/memory_usage_rule.test.ts new file mode 100644 index 00000000000000..c1a8836e293c1e --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/memory_usage_rule.test.ts @@ -0,0 +1,399 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MemoryUsageRule } from './memory_usage_rule'; +import { RULE_MEMORY_USAGE } from '../../common/constants'; +import { fetchMemoryUsageNodeStats } from '../lib/alerts/fetch_memory_usage_node_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_memory_usage_node_stats', () => ({ + fetchMemoryUsageNodeStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('MemoryUsageRule', () => { + it('should have defaults', () => { + const rule = new MemoryUsageRule(); + expect(rule.ruleOptions.id).toBe(RULE_MEMORY_USAGE); + expect(rule.ruleOptions.name).toBe('Memory Usage (JVM)'); + expect(rule.ruleOptions.throttle).toBe('1d'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high memory usage.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'myNodeId'; + const nodeName = 'myNodeName'; + const memoryUsage = 91; + const stat = { + clusterUuid, + nodeId, + nodeName, + memoryUsage, + }; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new MemoryUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'myNodeId', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + memoryUsage, + itemLabel: undefined, + meta: { + clusterUuid, + memoryUsage, + nodeId, + nodeName, + }, + nodeId, + nodeName, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting JVM memory usage of ${memoryUsage}% at #absolute`, + nextSteps: [ + { + text: '#start_linkTune thread pools#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + { + text: '#start_linkManaging ES Heap#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: '{elasticWebsiteUrl}blog/a-heap-of-trouble', + }, + ], + }, + { + text: '#start_linkIdentify large indices/shards#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + { + text: '#start_linkAdd more data nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify memory usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${memoryUsage}.00`, + node: `${nodeName}:${memoryUsage}.00`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + }, + }); + }); + + it('should not fire actions if under threshold', async () => { + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + memoryUsage: 1, + }, + ]; + }); + const rule = new MemoryUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const rule = new MemoryUsageRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'myNodeId', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterUuid, clusterName }, + memoryUsage, + itemLabel: undefined, + meta: { + ccs: 'testCluster', + clusterUuid, + memoryUsage, + nodeId, + nodeName, + }, + nodeId, + nodeName, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting JVM memory usage of ${memoryUsage}% at #absolute`, + nextSteps: [ + { + text: '#start_linkTune thread pools#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + { + text: '#start_linkManaging ES Heap#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: '{elasticWebsiteUrl}blog/a-heap-of-trouble', + }, + ], + }, + { + text: '#start_linkIdentify large indices/shards#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + { + text: '#start_linkAdd more data nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'myNodeId', + context: { + internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: 'Verify memory usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${memoryUsage}.00`, + node: `${nodeName}:${memoryUsage}.00`, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/memory_usage_rule.ts b/x-pack/plugins/monitoring/server/rules/memory_usage_rule.ts similarity index 86% rename from x-pack/plugins/monitoring/server/alerts/memory_usage_rule.ts rename to x-pack/plugins/monitoring/server/rules/memory_usage_rule.ts index fa94e7cb18b6e6..9b7f1f72a47f11 100644 --- a/x-pack/plugins/monitoring/server/alerts/memory_usage_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/memory_usage_rule.ts @@ -8,9 +8,11 @@ import { i18n } from '@kbn/i18n'; import numeral from '@elastic/numeral'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { AlertInstanceContext, RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; import { parseDuration } from '@kbn/alerting-plugin/common/parse_duration'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -157,7 +159,13 @@ export class MemoryUsageRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -207,19 +215,25 @@ export class MemoryUsageRule extends BaseRule { } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - nodes: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, - count: 1, - node: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + nodes: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.test.ts b/x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.test.ts new file mode 100644 index 00000000000000..8bf66a839d6dd1 --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.test.ts @@ -0,0 +1,307 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MissingMonitoringDataRule } from './missing_monitoring_data_rule'; +import { RULE_MISSING_MONITORING_DATA } from '../../common/constants'; +import { fetchMissingMonitoringData } from '../lib/alerts/fetch_missing_monitoring_data'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_missing_monitoring_data', () => ({ + fetchMissingMonitoringData: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('MissingMonitoringDataRule', () => { + it('should have defaults', () => { + const rule = new MissingMonitoringDataRule(); + expect(rule.ruleOptions.id).toBe(RULE_MISSING_MONITORING_DATA); + expect(rule.ruleOptions.name).toBe('Missing monitoring data'); + expect(rule.ruleOptions.throttle).toBe('6h'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ limit: '1d', duration: '15m' }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node missing monitoring data.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'esNode1'; + const nodeName = 'esName1'; + const gapDuration = 3000001; + const missingData = [ + { + nodeId, + nodeName, + clusterUuid, + gapDuration, + }, + ]; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return missingData; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new MissingMonitoringDataRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + gapDuration, + itemLabel: undefined, + meta: { + clusterUuid, + gapDuration, + limit: 86400000, + nodeId, + nodeName, + }, + ui: { + isFiring: true, + message: { + text: 'For the past an hour, we have not detected any monitoring data from the Elasticsearch node: esName1, starting at #absolute', + nextSteps: [ + { + text: '#start_linkView all Elasticsearch nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes', + }, + ], + }, + { + text: 'Verify monitoring settings on the node', + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + nodes: `node: ${nodeName}`, + node: `node: ${nodeName}`, + action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: + 'Verify the node is up and running, then double check the monitoring settings.', + clusterName, + count, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + }, + }); + }); + + it('should not fire actions if under threshold', async () => { + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return [ + { + ...missingData[0], + gapDuration: 1, + }, + ]; + }); + const rule = new MissingMonitoringDataRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchMissingMonitoringData as jest.Mock).mockImplementation(() => { + return [ + { + ...missingData[0], + ccs, + }, + ]; + }); + const rule = new MissingMonitoringDataRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + gapDuration, + itemLabel: undefined, + meta: { + ccs: 'testCluster', + clusterUuid, + gapDuration, + limit: 86400000, + nodeId, + nodeName, + }, + ui: { + isFiring: true, + message: { + text: 'For the past an hour, we have not detected any monitoring data from the Elasticsearch node: esName1, starting at #absolute', + nextSteps: [ + { + text: '#start_linkView all Elasticsearch nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes', + }, + ], + }, + { + text: 'Verify monitoring settings on the node', + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + nodes: `node: ${nodeName}`, + node: `node: ${nodeName}`, + action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + actionPlain: + 'Verify the node is up and running, then double check the monitoring settings.', + clusterName, + count, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.ts b/x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.ts similarity index 85% rename from x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.ts rename to x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.ts index 0afd06708767ab..a210d9ddf42092 100644 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/missing_monitoring_data_rule.ts @@ -8,9 +8,16 @@ import { i18n } from '@kbn/i18n'; import moment from 'moment'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { RawAlertInstance, SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { + AlertInstanceContext, + AlertInstanceState, + RawAlertInstance, + SanitizedRule, +} from '@kbn/alerting-plugin/common'; import { parseDuration } from '@kbn/alerting-plugin/common/parse_duration'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -137,7 +144,13 @@ export class MissingMonitoringDataRule extends BaseRule { } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: { alertStates: AlertState[] }, item: AlertData | null, cluster: AlertCluster @@ -187,19 +200,25 @@ export class MissingMonitoringDataRule extends BaseRule { }, } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - nodes: `node: ${firingNode.nodeName}`, - count: 1, - node: `node: ${firingNode.nodeName}`, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, + nodes: `node: ${firingNode.nodeName}`, + count: 1, + node: `node: ${firingNode.nodeName}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.test.ts b/x-pack/plugins/monitoring/server/rules/nodes_changed_rule.test.ts similarity index 50% rename from x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.test.ts rename to x-pack/plugins/monitoring/server/rules/nodes_changed_rule.test.ts index 02578102741da0..3abd163343e9ed 100644 --- a/x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.test.ts +++ b/x-pack/plugins/monitoring/server/rules/nodes_changed_rule.test.ts @@ -9,7 +9,8 @@ import { NodesChangedRule } from './nodes_changed_rule'; import { RULE_NODES_CHANGED } from '../../common/constants'; import { fetchNodesFromClusterStats } from '../lib/alerts/fetch_nodes_from_cluster_stats'; import { fetchClusters } from '../lib/alerts/fetch_clusters'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; const RealDate = Date; @@ -125,24 +126,8 @@ describe('NodesChangedAlert', () => { }, ]; - const replaceState = jest.fn(); - const scheduleActions = jest.fn(); - const getState = jest.fn(); - const executorOptions = { - services: { - scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), - alertFactory: { - create: jest.fn().mockImplementation(() => { - return { - replaceState, - scheduleActions, - getState, - }; - }), - }, - }, - state: {}, - }; + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; beforeEach(() => { // @ts-ignore @@ -154,12 +139,10 @@ describe('NodesChangedAlert', () => { afterEach(() => { Date = RealDate; - replaceState.mockReset(); - scheduleActions.mockReset(); - getState.mockReset(); + jest.resetAllMocks(); }); - it('should fire actions when nodes change', async () => { + it('should fire action when nodes change', async () => { (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { return nodesChanged; }); @@ -169,59 +152,72 @@ describe('NodesChangedAlert', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid, clusterName }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid, clusterName }, ccs, - clusterUuid, - recentNodes: [ - { - nodeUuid, - nodeEphemeralId: nodeEphemeralIdChanged, - nodeName, - }, - ], - priorNodes: [ - { - nodeUuid, - nodeEphemeralId, - nodeName, + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + recentNodes: [ + { + nodeUuid, + nodeEphemeralId: nodeEphemeralIdChanged, + nodeName, + }, + ], + priorNodes: [ + { + nodeUuid, + nodeEphemeralId, + nodeName, + }, + ], + }, + ui: { + isFiring: true, + message: { + text: "Elasticsearch nodes 'test' restarted in this cluster.", }, - ], - }, - ui: { - isFiring: true, - message: { - text: "Elasticsearch nodes 'test' restarted in this cluster.", + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: 'warning', - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: '[View nodes](elasticsearch/nodes)', - actionPlain: 'Verify that you added, removed, or restarted nodes.', - internalFullMessage: - 'Nodes changed alert is firing for testCluster. The following Elasticsearch nodes have been added: removed: restarted:test. [View nodes](elasticsearch/nodes)', - internalShortMessage: - 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', - added: '', - removed: '', - restarted: 'test', - clusterName, - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[View nodes](elasticsearch/nodes)', + actionPlain: 'Verify that you added, removed, or restarted nodes.', + internalFullMessage: + 'Nodes changed alert is firing for testCluster. The following Elasticsearch nodes have been added: removed: restarted:test. [View nodes](elasticsearch/nodes)', + internalShortMessage: + 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', + added: '', + removed: '', + restarted: 'test', + clusterName, + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', + }, }); }); - it('should fire actions when nodes added, changed, and removed', async () => { + it('should fire action when nodes added, changed, and removed', async () => { (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { return nodesAddedChangedRemoved; }); @@ -231,66 +227,79 @@ describe('NodesChangedAlert', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).toHaveBeenCalledWith({ - alertStates: [ - { - cluster: { clusterUuid, clusterName }, - ccs, - itemLabel: undefined, - nodeId: undefined, - nodeName: undefined, - meta: { + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'abc123', + actionGroup: 'default', + state: { + alertStates: [ + { + cluster: { clusterUuid, clusterName }, ccs, - clusterUuid, - recentNodes: [ - { - nodeUuid, - nodeEphemeralId: nodeEphemeralIdChanged, - nodeName, - }, - { - nodeUuid: 'newNodeId', - nodeEphemeralId: 'newNodeEmpheralId', - nodeName: 'newNodeName', - }, - ], - priorNodes: [ - { - nodeUuid, - nodeEphemeralId, - nodeName, - }, - { - nodeUuid: 'removedNodeId', - nodeEphemeralId: 'removedNodeEmpheralId', - nodeName: 'removedNodeName', + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + recentNodes: [ + { + nodeUuid, + nodeEphemeralId: nodeEphemeralIdChanged, + nodeName, + }, + { + nodeUuid: 'newNodeId', + nodeEphemeralId: 'newNodeEmpheralId', + nodeName: 'newNodeName', + }, + ], + priorNodes: [ + { + nodeUuid, + nodeEphemeralId, + nodeName, + }, + { + nodeUuid: 'removedNodeId', + nodeEphemeralId: 'removedNodeEmpheralId', + nodeName: 'removedNodeName', + }, + ], + }, + ui: { + isFiring: true, + message: { + text: "Elasticsearch nodes 'newNodeName' added to this cluster. Elasticsearch nodes 'removedNodeName' removed from this cluster. Elasticsearch nodes 'test' restarted in this cluster.", }, - ], - }, - ui: { - isFiring: true, - message: { - text: "Elasticsearch nodes 'newNodeName' added to this cluster. Elasticsearch nodes 'removedNodeName' removed from this cluster. Elasticsearch nodes 'test' restarted in this cluster.", + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, }, - severity: 'warning', - triggeredMS: 1, - lastCheckedMS: 0, }, - }, - ], + ], + }, }); - expect(scheduleActions).toHaveBeenCalledWith('default', { - action: '[View nodes](elasticsearch/nodes)', - actionPlain: 'Verify that you added, removed, or restarted nodes.', - internalFullMessage: - 'Nodes changed alert is firing for testCluster. The following Elasticsearch nodes have been added:newNodeName removed:removedNodeName restarted:test. [View nodes](elasticsearch/nodes)', - internalShortMessage: - 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', - added: 'newNodeName', - removed: 'removedNodeName', - restarted: 'test', - clusterName, - state: 'firing', + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'abc123', + context: { + action: '[View nodes](elasticsearch/nodes)', + actionPlain: 'Verify that you added, removed, or restarted nodes.', + internalFullMessage: + 'Nodes changed alert is firing for testCluster. The following Elasticsearch nodes have been added:newNodeName removed:removedNodeName restarted:test. [View nodes](elasticsearch/nodes)', + internalShortMessage: + 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', + added: 'newNodeName', + removed: 'removedNodeName', + restarted: 'test', + clusterName, + state: 'firing', + }, + payload: { + [ALERT_REASON]: + 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', + }, }); }); @@ -323,8 +332,8 @@ describe('NodesChangedAlert', () => { ...executorOptions, params: rule.ruleOptions.defaultParams, } as any); - expect(replaceState).not.toHaveBeenCalledWith({}); - expect(scheduleActions).not.toHaveBeenCalled(); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.ts b/x-pack/plugins/monitoring/server/rules/nodes_changed_rule.ts similarity index 80% rename from x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.ts rename to x-pack/plugins/monitoring/server/rules/nodes_changed_rule.ts index 6c20fe6326630b..b433be6ac1dd9f 100644 --- a/x-pack/plugins/monitoring/server/alerts/nodes_changed_rule.ts +++ b/x-pack/plugins/monitoring/server/rules/nodes_changed_rule.ts @@ -7,8 +7,10 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { SanitizedRule } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { AlertInstanceContext, SanitizedRule } from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -174,7 +176,13 @@ export class NodesChangedRule extends BaseRule { } protected async executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: AlertInstanceState, item: AlertData | null, cluster: AlertCluster @@ -198,37 +206,44 @@ export class NodesChangedRule extends BaseRule { const added = states.added.map((node) => node.nodeName).join(','); const removed = states.removed.map((node) => node.nodeName).join(','); const restarted = states.restarted.map((node) => node.nodeName).join(','); - instance.scheduleActions('default', { - internalShortMessage: i18n.translate( - 'xpack.monitoring.alerts.nodesChanged.firing.internalShortMessage', - { - defaultMessage: `Nodes changed alert is firing for {clusterName}. {shortActionText}`, - values: { - clusterName: cluster.clusterName, - shortActionText, - }, - } - ), - internalFullMessage: i18n.translate( - 'xpack.monitoring.alerts.nodesChanged.firing.internalFullMessage', - { - defaultMessage: `Nodes changed alert is firing for {clusterName}. The following Elasticsearch nodes have been added:{added} removed:{removed} restarted:{restarted}. {action}`, - values: { - clusterName: cluster.clusterName, - added, - removed, - restarted, - action, - }, - } - ), - state: AlertingDefaults.ALERT_STATE.firing, - clusterName: cluster.clusterName, - added, - removed, - restarted, - action, - actionPlain: shortActionText, + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.nodesChanged.firing.internalShortMessage', + { + defaultMessage: `Nodes changed alert is firing for {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: i18n.translate( + 'xpack.monitoring.alerts.nodesChanged.firing.internalFullMessage', + { + defaultMessage: `Nodes changed alert is firing for {clusterName}. The following Elasticsearch nodes have been added:{added} removed:{removed} restarted:{restarted}. {action}`, + values: { + clusterName: cluster.clusterName, + added, + removed, + restarted, + action, + }, + } + ), + state: AlertingDefaults.ALERT_STATE.firing, + clusterName: cluster.clusterName, + added, + removed, + restarted, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts b/x-pack/plugins/monitoring/server/rules/rules_factory.test.ts similarity index 84% rename from x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts rename to x-pack/plugins/monitoring/server/rules/rules_factory.test.ts index c86a5264b204bb..15fbc332cbb2f9 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts +++ b/x-pack/plugins/monitoring/server/rules/rules_factory.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { AlertsFactory } from './alerts_factory'; +import { RulesFactory } from './rules_factory'; import { RULE_CPU_USAGE } from '../../common/constants'; jest.mock('../static_globals', () => ({ @@ -16,7 +16,7 @@ jest.mock('../static_globals', () => ({ }, })); -describe('AlertsFactory', () => { +describe('RulesFactory', () => { const rulesClient = { find: jest.fn(), }; @@ -39,7 +39,7 @@ describe('AlertsFactory', () => { ], }; }); - const alerts = await AlertsFactory.getByType(RULE_CPU_USAGE, rulesClient as any); + const alerts = await RulesFactory.getByType(RULE_CPU_USAGE, rulesClient as any); expect(alerts).not.toBeNull(); expect(alerts.length).toBe(2); expect(alerts[0].getId()).toBe(1); @@ -54,7 +54,7 @@ describe('AlertsFactory', () => { total: 0, }; }); - await AlertsFactory.getByType(RULE_CPU_USAGE, rulesClient as any); + await RulesFactory.getByType(RULE_CPU_USAGE, rulesClient as any); expect(filter).toBe(`alert.attributes.alertTypeId:${RULE_CPU_USAGE}`); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts b/x-pack/plugins/monitoring/server/rules/rules_factory.ts similarity index 81% rename from x-pack/plugins/monitoring/server/alerts/alerts_factory.ts rename to x-pack/plugins/monitoring/server/rules/rules_factory.ts index 9cebe881936a37..72aea1b57ea6ee 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts +++ b/x-pack/plugins/monitoring/server/rules/rules_factory.ts @@ -40,7 +40,7 @@ import { RULE_CCR_READ_EXCEPTIONS, RULE_LARGE_SHARD_SIZE, } from '../../common/constants'; -import { CommonAlertParams } from '../../common/types/alerts'; +import { CommonAlertParams as CommonRuleParams } from '../../common/types/alerts'; const BY_TYPE = { [RULE_CLUSTER_HEALTH]: ClusterHealthRule, @@ -59,28 +59,28 @@ const BY_TYPE = { [RULE_LARGE_SHARD_SIZE]: LargeShardSizeRule, }; -export class AlertsFactory { +export class RulesFactory { public static async getByType( type: string, - alertsClient: RulesClient | undefined + rulesClient: RulesClient | undefined ): Promise { - const alertCls = BY_TYPE[type]; - if (!alertCls || !alertsClient) { + const ruleCls = BY_TYPE[type]; + if (!ruleCls || !rulesClient) { return []; } - const alertClientAlerts = await alertsClient.find({ + const rulesClientRules = await rulesClient.find({ options: { filter: `alert.attributes.alertTypeId:${type}`, }, }); - if (!alertClientAlerts.total || !alertClientAlerts.data?.length) { + if (!rulesClientRules.total || !rulesClientRules.data?.length) { return []; } - return alertClientAlerts.data.map((alert) => new alertCls(alert as Rule) as BaseRule); + return rulesClientRules.data.map((rule) => new ruleCls(rule as Rule) as BaseRule); } public static getAll() { - return Object.values(BY_TYPE).map((alert) => new alert()); + return Object.values(BY_TYPE).map((rule) => new rule()); } } diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_rule_base.ts b/x-pack/plugins/monitoring/server/rules/thread_pool_rejections_rule_base.ts similarity index 88% rename from x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_rule_base.ts rename to x-pack/plugins/monitoring/server/rules/thread_pool_rejections_rule_base.ts index e5b4b7d691a52e..ed453b0e208f7b 100644 --- a/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_rule_base.ts +++ b/x-pack/plugins/monitoring/server/rules/thread_pool_rejections_rule_base.ts @@ -7,8 +7,15 @@ import { i18n } from '@kbn/i18n'; import { ElasticsearchClient } from '@kbn/core/server'; -import { Alert } from '@kbn/alerting-plugin/server'; -import { Rule, RawAlertInstance } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; +import { + Rule, + RawAlertInstance, + AlertInstanceState, + AlertInstanceContext, +} from '@kbn/alerting-plugin/common'; +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; import { BaseRule } from './base_rule'; import { AlertData, @@ -176,7 +183,13 @@ export class ThreadPoolRejectionsRuleBase extends BaseRule { }; } protected executeActions( - instance: Alert, + services: RuleExecutorServices< + AlertInstanceState, + AlertInstanceContext, + 'default', + DefaultAlert + >, + alertId: string, { alertStates }: { alertStates: AlertState[] }, item: AlertData | null, cluster: AlertCluster @@ -243,19 +256,25 @@ export class ThreadPoolRejectionsRuleBase extends BaseRule { } ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - threadPoolType: type, - state: AlertingDefaults.ALERT_STATE.firing, - /* continue to send "count" value for users before https://github.com/elastic/kibana/pull/102544 + services.alertsClient?.setAlertData({ + id: alertId, + context: { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + threadPoolType: type, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "count" value for users before https://github.com/elastic/kibana/pull/102544 see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 */ - count: 1, - node: nodeName, - clusterName, - action, - actionPlain: shortActionText, + count: 1, + node: nodeName, + clusterName, + action, + actionPlain: shortActionText, + }, + payload: { + [ALERT_REASON]: internalShortMessage, + }, }); } } diff --git a/x-pack/plugins/monitoring/server/rules/thread_pool_search_rejections_rule.test.ts b/x-pack/plugins/monitoring/server/rules/thread_pool_search_rejections_rule.test.ts new file mode 100644 index 00000000000000..c6602f536a83ca --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/thread_pool_search_rejections_rule.test.ts @@ -0,0 +1,406 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ThreadPoolSearchRejectionsRule } from './thread_pool_search_rejections_rule'; +import { RULE_THREAD_POOL_SEARCH_REJECTIONS } from '../../common/constants'; +import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ + fetchThreadPoolRejectionStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('ThreadpoolSearchRejectionsRule', () => { + it('should have defaults', () => { + const rule = new ThreadPoolSearchRejectionsRule(); + expect(rule.ruleOptions.id).toBe(RULE_THREAD_POOL_SEARCH_REJECTIONS); + expect(rule.ruleOptions.name).toBe('Thread pool search rejections'); + expect(rule.ruleOptions.throttle).toBe('1d'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high thread pool search rejections.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'esNode1'; + const nodeName = 'esName1'; + const threadPoolType = 'search'; + const rejectionCount = 400; + const stat = [ + { + rejectionCount, + type: threadPoolType, + clusterUuid, + nodeId, + nodeName, + ccs: null, + }, + ]; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return stat; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new ThreadPoolSearchRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: null, + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: null, + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count: 1, + threadPoolType, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + }, + }); + }); + it('should not fire actions if under threshold', async () => { + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + rejectionCount: 1, + }, + ]; + }); + const rule = new ThreadPoolSearchRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + ccs, + }, + ]; + }); + const rule = new ThreadPoolSearchRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: 'testCluster', + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count, + state: 'firing', + threadPoolType, + }, + payload: { + [ALERT_REASON]: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_rule.ts b/x-pack/plugins/monitoring/server/rules/thread_pool_search_rejections_rule.ts similarity index 100% rename from x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_rule.ts rename to x-pack/plugins/monitoring/server/rules/thread_pool_search_rejections_rule.ts diff --git a/x-pack/plugins/monitoring/server/rules/thread_pool_write_rejections_rule.test.ts b/x-pack/plugins/monitoring/server/rules/thread_pool_write_rejections_rule.test.ts new file mode 100644 index 00000000000000..163dc2b1a677be --- /dev/null +++ b/x-pack/plugins/monitoring/server/rules/thread_pool_write_rejections_rule.test.ts @@ -0,0 +1,406 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ThreadPoolWriteRejectionsRule } from './thread_pool_write_rejections_rule'; +import { RULE_THREAD_POOL_WRITE_REJECTIONS } from '../../common/constants'; +import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { ALERT_REASON } from '@kbn/rule-data-utils'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ + fetchThreadPoolRejectionStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('ThreadpoolWriteRejectionsAlert', () => { + it('should have defaults', () => { + const rule = new ThreadPoolWriteRejectionsRule(); + expect(rule.ruleOptions.id).toBe(RULE_THREAD_POOL_WRITE_REJECTIONS); + expect(rule.ruleOptions.name).toBe(`Thread pool write rejections`); + expect(rule.ruleOptions.throttle).toBe('1d'); + expect(rule.ruleOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); + expect(rule.ruleOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high thread pool write rejections.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'esNode1'; + const nodeName = 'esName1'; + const threadPoolType = 'write'; + const rejectionCount = 400; + const stat = [ + { + rejectionCount, + type: threadPoolType, + clusterUuid, + nodeId, + nodeName, + ccs: null, + }, + ]; + + const services = alertsMock.createRuleExecutorServices(); + const executorOptions = { services, state: {} }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return stat; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + jest.resetAllMocks(); + }); + + it('should fire action', async () => { + const rule = new ThreadPoolWriteRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: null, + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: null, + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count: 1, + threadPoolType, + state: 'firing', + }, + payload: { + [ALERT_REASON]: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + }, + }); + }); + it('should not fire actions if under threshold', async () => { + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + rejectionCount: 1, + }, + ]; + }); + const rule = new ThreadPoolWriteRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + expect(services.alertsClient.report).not.toHaveBeenCalled(); + expect(services.alertsClient.setAlertData).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + ccs, + }, + ]; + }); + const rule = new ThreadPoolWriteRejectionsRule(); + const type = rule.getRuleType(); + await type.executor({ + ...executorOptions, + params: rule.ruleOptions.defaultParams, + } as any); + const count = 1; + expect(services.alertsClient.report).toHaveBeenCalledTimes(1); + expect(services.alertsClient.setAlertData).toHaveBeenCalledTimes(1); + expect(services.alertsClient.report).toHaveBeenCalledWith({ + id: 'esNode1', + actionGroup: 'default', + state: { + alertStates: [ + { + ccs: 'testCluster', + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: 'testCluster', + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }, + }); + expect(services.alertsClient.setAlertData).toHaveBeenCalledWith({ + id: 'esNode1', + context: { + internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count, + state: 'firing', + threadPoolType, + }, + payload: { + [ALERT_REASON]: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_rule.ts b/x-pack/plugins/monitoring/server/rules/thread_pool_write_rejections_rule.ts similarity index 100% rename from x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_rule.ts rename to x-pack/plugins/monitoring/server/rules/thread_pool_write_rejections_rule.ts diff --git a/x-pack/plugins/monitoring/tsconfig.json b/x-pack/plugins/monitoring/tsconfig.json index 00ca9625681410..112bf5f695b17c 100644 --- a/x-pack/plugins/monitoring/tsconfig.json +++ b/x-pack/plugins/monitoring/tsconfig.json @@ -42,6 +42,8 @@ "@kbn/observability-shared-plugin", "@kbn/shared-ux-link-redirect-app", "@kbn/logs-shared-plugin", + "@kbn/alerts-as-data-utils", + "@kbn/rule-data-utils", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts index 8acc2c98aa504d..4c9b724686c0fe 100644 --- a/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts +++ b/x-pack/plugins/observability_ai_assistant/scripts/evaluation/scenarios/esql/index.spec.ts @@ -7,48 +7,21 @@ /// -import { last } from 'lodash'; -import moment from 'moment'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; -import { MessageRole } from '../../../../common'; +import moment from 'moment'; import { chatClient, esClient, synthtraceEsClients } from '../../services'; -function extractEsqlQuery(response: string) { - return response.match(/```esql([\s\S]*?)```/)?.[1]; -} - async function evaluateEsqlQuery({ question, expected, criteria = [], - execute = true, }: { question: string; expected?: string; criteria?: string[]; - execute?: boolean; }): Promise { - let conversation = await chatClient.complete(question); - - const esqlQuery = extractEsqlQuery(last(conversation.messages)?.content || ''); - - if (esqlQuery && execute) { - conversation = await chatClient.complete( - conversation.conversationId!, - conversation.messages.concat({ - content: '', - role: MessageRole.Assistant, - function_call: { - name: 'execute_query', - arguments: JSON.stringify({ - query: esqlQuery, - }), - trigger: MessageRole.User, - }, - }) - ); - } + const conversation = await chatClient.complete(question); const evaluation = await chatClient.evaluate(conversation, [ ...(expected @@ -57,7 +30,7 @@ async function evaluateEsqlQuery({ ${expected}`, ] : []), - ...(execute && expected ? [`The query successfully executed without an error`] : []), + ...(expected ? [`The query successfully executed without an error`] : []), ...criteria, ]); @@ -146,7 +119,6 @@ describe('ES|QL query generation', () => { | SORT hire_date | KEEP emp_no, hire_date_formatted | LIMIT 5`, - execute: false, }); }); diff --git a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/format_esql_examples.ts b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/format_esql_examples.ts new file mode 100644 index 00000000000000..4bb578f91f6c17 --- /dev/null +++ b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/format_esql_examples.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function formatEsqlExamples(content: string) { + // Regular expression to match the queries + const queryRegex = /(\s*(FROM |ROW |SHOW ).*?)(?=\n[^|\s]|$)/gs; + + // Function to format a matched query + const formatQuery = (match: string) => { + return `\n\`\`\`esql\n${match.trim()}\n\`\`\`\n`; + }; + + // Replace all matches in the input string + return content.replace(queryRegex, formatQuery); +} diff --git a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts index 20bb43cd49d117..a3d1a07533956d 100644 --- a/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts +++ b/x-pack/plugins/observability_ai_assistant/scripts/load_esql_docs/load_esql_docs.ts @@ -15,6 +15,7 @@ import Path from 'path'; import git, { SimpleGitProgressEvent } from 'simple-git'; import yargs, { Argv } from 'yargs'; import { extractSections } from './extract_sections'; +import { formatEsqlExamples } from './format_esql_examples'; yargs(process.argv.slice(2)) .command( @@ -221,7 +222,19 @@ yargs(process.argv.slice(2)) outDir, `esql-${doc.title.replaceAll(' ', '-').toLowerCase()}.txt` ); - await Fs.writeFile(fileName, doc.content); + + // We ask the LLM to output queries wrapped in ```esql...```, + // so we try to format ES|QL examples in the docs in the same + // way. The hope is that this creates a stronger relation in the + // output. + const formattedContent = formatEsqlExamples(doc.content); + + log.debug({ + content: doc.content, + formattedContent, + }); + + await Fs.writeFile(fileName, formattedContent); }) ) ); diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-abs.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-abs.txt index f27b33d6d14730..add29ab4b88e68 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-abs.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-abs.txt @@ -1,8 +1,18 @@ ABS +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionReturns the absolute value.Supported types +Examples +```esql +ROW number = -1.0 +| EVAL abs_number = ABS(number) +``` -Returns the absolute value. +```esql FROM employees | KEEP first_name, last_name, height | EVAL abs_height = ABS(0.0 - height) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-acos.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-acos.txt index 0274cdfac205a5..5cccde6b4321d7 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-acos.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-acos.txt @@ -7,5 +7,7 @@ Numeric expression. If null, the function returns null. DescriptionReturns the arccosine of n as an angle, expressed in radians.Supported types Example +```esql ROW a=.9 | EVAL acos=ACOS(a) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-asin.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-asin.txt index 6e36b7d776cd0e..5210583fba7efc 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-asin.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-asin.txt @@ -1,7 +1,14 @@ ASIN - -Inverse sine trigonometric function. +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionReturns the +arcsine +of the input numeric expression as an angle, expressed in radians.Supported types +Example +```esql ROW a=.9 | EVAL asin=ASIN(a) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan.txt index 78a6c0b4a4f710..8360a44147a02b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan.txt @@ -1,7 +1,14 @@ ATAN - -Inverse tangent trigonometric function. +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionReturns the +arctangent of the +input numeric expression as an angle, expressed in radians.Supported types +Example +```esql ROW a=12.9 | EVAL atan=ATAN(a) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan2.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan2.txt index c194e8ee9f0a7d..7bf09faf50e419 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan2.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-atan2.txt @@ -1,8 +1,16 @@ ATAN2 - -The angle between the positive x-axis and the -ray from the origin to the point (x , y) in the Cartesian plane. +Syntax +Parameters +y +Numeric expression. If null, the function returns null. +x +Numeric expression. If null, the function returns null. +DescriptionThe angle between the positive x-axis and +the ray from the origin to the point (x , y) in the Cartesian plane, expressed +in radians.Supported types +Example +```esql ROW y=12.9, x=.6 | EVAL atan2=ATAN2(y, x) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-auto_bucket.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-auto_bucket.txt index 1263cccd6d5195..a4c81c732d35a1 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-auto_bucket.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-auto_bucket.txt @@ -1,27 +1,83 @@ AUTO_BUCKET -Creates human-friendly buckets and returns a datetime value for each row that -corresponds to the resulting bucket the row falls into. Combine AUTO_BUCKET -with STATS ... BY to create a date histogram.You provide a target number of buckets, a start date, and an end date, and it -picks an appropriate bucket size to generate the target number of buckets or -fewer. For example, this asks for at most 20 buckets over a whole year, which -picks monthly buckets: -ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z") -| EVAL bucket=AUTO_BUCKET(date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +Syntax +AUTO_BUCKET(field, buckets, from, to) +Parameters +field +Numeric or date column from which to derive buckets. +buckets +Target number of buckets. +from +Start of the range. Can be a number or a date expressed as a string. +to +End of the range. Can be a number or a date expressed as a string. +DescriptionCreates human-friendly buckets and returns a value for each row that corresponds +to the resulting bucket the row falls into.Using a target number of buckets, a start of a range, and an end of a range, +AUTO_BUCKET picks an appropriate bucket size to generate the target number of +buckets or fewer. For example, asking for at most 20 buckets over a year results +in monthly buckets: +```esql +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL month = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +| KEEP hire_date, month +| SORT hire_date +``` + The goal isn’t to provide exactly the target number of buckets, it’s to pick a -range that people are comfortable with that provides at most the target number of -buckets.If you ask for more buckets then AUTO_BUCKET can pick a smaller range. For example, -asking for at most 100 buckets in a year will get you week long buckets: -ROW date=TO_DATETIME("1985-07-09T00:00:00.000Z") -| EVAL bucket=AUTO_BUCKET(date, 100, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") -AUTO_BUCKET does not filter any rows. It only uses the provided time range to -pick a good bucket size. For rows with a date outside of the range, it returns a -datetime that corresponds to a bucket outside the range. Combine AUTO_BUCKET -with WHERE to filter rows.A more complete example might look like: +range that people are comfortable with that provides at most the target number +of buckets.Combine AUTO_BUCKET with +STATS ... BY to create a histogram: +```esql +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL month = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +| STATS hires_per_month = COUNT(*) BY month +| SORT month +``` + +AUTO_BUCKET does not create buckets that don’t match any documents. +That’s why this example is missing 1985-03-01 and other dates. +Asking for more buckets can result in a smaller range. For example, asking for +at most 100 buckets in a year results in weekly buckets: +```esql +FROM employees +| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" +| EVAL week = AUTO_BUCKET(hire_date, 100, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") +| STATS hires_per_week = COUNT(*) BY week +| SORT week +``` + +AUTO_BUCKET does not filter any rows. It only uses the provided range to +pick a good bucket size. For rows with a value outside of the range, it returns +a bucket value that corresponds to a bucket outside the range. Combine +AUTO_BUCKET with WHERE to filter rows. +AUTO_BUCKET can also operate on numeric fields. For example, to create a +salary histogram: +```esql +FROM employees +| EVAL bs = AUTO_BUCKET(salary, 20, 25324, 74999) +| STATS COUNT(*) by bs +| SORT bs +``` + +Unlike the earlier example that intentionally filters on a date range, you +rarely want to filter on a numeric range. You have to find the min and max +separately. ES|QL doesn’t yet have an easy way to do that automatically.ExamplesCreate hourly buckets for the last 24 hours, and calculate the number of events +per hour: +```esql +FROM sample_data +| WHERE @timestamp >= NOW() - 1 day and @timestamp < NOW() +| EVAL bucket = AUTO_BUCKET(@timestamp, 25, DATE_FORMAT(NOW() - 1 day), DATE_FORMAT(NOW())) +| STATS COUNT(*) BY bucket +``` + +Create monthly buckets for the year 1985, and calculate the average salary by +hiring month: +```esql FROM employees | WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" | EVAL bucket = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") | STATS AVG(salary) BY bucket | SORT bucket -AUTO_BUCKET does not create buckets that don’t match any documents. That’s -why the example above is missing 1985-03-01 and other dates. +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-avg.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-avg.txt index 40667a199cc1fe..ea5132bab11b42 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-avg.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-avg.txt @@ -1,6 +1,11 @@ AVG -The average of a numeric field. +Syntax +AVG(column) +column +Numeric column. If null, the function returns null. +DescriptionThe average of a numeric field.Supported typesThe result is always a double no matter the input type.Example +```esql FROM employees | STATS AVG(height) -The result is always a double not matter the input type. \ No newline at end of file +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-case.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-case.txt index 35c9278ba2fd5f..a8d2ca35fb1c8a 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-case.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-case.txt @@ -13,10 +13,32 @@ The default value that’s is returned when no condition matches. DescriptionAccepts pairs of conditions and values. The function returns the value that belongs to the first condition that evaluates to true.If the number of arguments is odd, the last argument is the default value which is returned when no condition matches. If the number of arguments is even, and -no condition matches, the function returns null.Example +no condition matches, the function returns null.ExampleDetermine whether employees are monolingual, bilingual, or polyglot: +```esql FROM employees | EVAL type = CASE( languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot") | KEEP emp_no, languages, type +``` + +Calculate the total connection success rate based on log messages: +```esql +FROM sample_data +| EVAL successful = CASE( + STARTS_WITH(message, "Connected to"), 1, + message == "Connection error", 0 + ) +| STATS success_rate = AVG(successful) +``` + +Calculate an hourly error rate as a percentage of the total number of log +messages: +```esql +FROM sample_data +| EVAL error = CASE(message LIKE "*error*", 1, 0) +| EVAL hour = DATE_TRUNC(1 hour, @timestamp) +| STATS error_rate = AVG(error) by hour +| SORT hour +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ceil.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ceil.txt index 685ec6690772d3..8fac3b0bddc2f9 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ceil.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ceil.txt @@ -1,10 +1,16 @@ CEIL - -Round a number up to the nearest integer. +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionRound a number up to the nearest integer. +This is a noop for long (including unsigned) and integer. + For double this picks the closest double value to the integer + similar to Math.ceil. +Supported types +Example +```esql ROW a=1.8 | EVAL a=CEIL(a) -This is a noop for long (including unsigned) and integer. - For double this picks the the closest double value to the integer ala - Math.ceil. -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-coalesce.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-coalesce.txt index 568f045de8d64f..b8d3d2498b57bd 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-coalesce.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-coalesce.txt @@ -1,5 +1,13 @@ COALESCE -Returns the first non-null value. +Syntax +COALESCE(expression1 [, ..., expressionN]) +Parameters +expressionX +Expression to evaluate. +DescriptionReturns the first of its arguments that is not null. If all arguments are null, +it returns null.Example +```esql ROW a=null, b="b" | EVAL COALESCE(a, b) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-concat.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-concat.txt index e92c691a7e5207..6e5c1ba1b69f62 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-concat.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-concat.txt @@ -1,6 +1,13 @@ CONCAT -Concatenates two or more strings. +Syntax +CONCAT(string1, string2[, ..., stringN]) +Parameters +stringX +Strings to concatenate. +DescriptionConcatenates two or more strings.Example +```esql FROM employees -| KEEP first_name, last_name, height +| KEEP first_name, last_name | EVAL fullname = CONCAT(first_name, " ", last_name) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cos.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cos.txt index db7252d5966c47..ebda0596fca8ac 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cos.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cos.txt @@ -1,7 +1,13 @@ COS - -Cosine trigonometric function. Input expected in radians. +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +DescriptionReturns the cosine of n. Input +expected in radians.Supported types +Example +```esql ROW a=1.8 | EVAL cos=COS(a) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cosh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cosh.txt index 22f221bbe18bbf..a8920bdf4e6944 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cosh.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-cosh.txt @@ -1,7 +1,13 @@ COSH - -Cosine hyperbolic function. +Syntax +Parameters +n +Numeric expression. If null, the function returns null. +Supported types +DescriptionReturns the hyperbolic +cosine.Example +```esql ROW a=1.8 | EVAL cosh=COSH(a) -Supported types: +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count.txt index 555b80f2d532d7..c3c7136459ebb3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count.txt @@ -1,10 +1,20 @@ COUNT -Counts field values. +Syntax +COUNT([input]) +Parameters +input +Column or literal for which to count the number of values. If omitted, returns a +count all (the number of rows). +DescriptionReturns the total number (count) of input values.Supported typesCan take any field type as input.Examples +```esql FROM employees | STATS COUNT(height) -Can take any field type as input and the result is always a long not matter -the input type.To count the number of rows, use COUNT(*): +``` + +To count the number of rows, use COUNT() or COUNT(*): +```esql FROM employees | STATS count = COUNT(*) BY languages | SORT languages DESC +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count_distinct.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count_distinct.txt index dbe422e6703b57..b09825440dc425 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count_distinct.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-count_distinct.txt @@ -1,10 +1,13 @@ COUNT_DISTINCT -The approximate number of distinct values. -FROM hosts -| STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1) -Can take any field type as input and the result is always a long not matter -the input type.Counts are approximateeditComputing exact counts requires loading values into a set and returning its +Syntax +COUNT_DISTINCT(column[, precision]) +Parameters +column +Column for which to count the number of distinct values. +precision +Precision. Refer to Counts are approximate. +DescriptionReturns the approximate number of distinct values.Counts are approximateeditComputing exact counts requires loading values into a set and returning its size. This doesn’t scale when working on high-cardinality sets and/or large values as the required memory usage and the need to communicate those per-shard sets between nodes would utilize too many resources of the cluster.This COUNT_DISTINCT function is based on the @@ -22,7 +25,15 @@ on the dataset in question. In general, most datasets show consistently good accuracy. Also note that even with a threshold as low as 100, the error remains very low (1-6% as seen in the above graph) even when counting millions of items.The HyperLogLog++ algorithm depends on the leading zeros of hashed values, the exact distributions of hashes in a dataset can affect the -accuracy of the cardinality.Precision is configurableeditThe COUNT_DISTINCT function takes an optional second parameter to configure the -precision discussed previously. +accuracy of the cardinality.The COUNT_DISTINCT function takes an optional second parameter to configure the +precision.Supported typesCan take any field type as input.Examples +```esql +FROM hosts +| STATS COUNT_DISTINCT(ip0), COUNT_DISTINCT(ip1) +``` + +With the optional second parameter to configure the precision: +```esql FROM hosts | STATS COUNT_DISTINCT(ip0, 80000), COUNT_DISTINCT(ip1, 5) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_extract.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_extract.txt index 442c9e6c9d719d..0ea53cb38d1f96 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_extract.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_extract.txt @@ -1,6 +1,31 @@ DATE_EXTRACT -Extracts parts of a date, like year, month, day, hour. -The supported field types are those provided by java.time.temporal.ChronoField. +Syntax +DATE_EXTRACT(date_part, date) +Parameters +date_part +Part of the date to extract. Can be: aligned_day_of_week_in_month, +aligned_day_of_week_in_year, aligned_week_of_month, aligned_week_of_year, +ampm_of_day, clock_hour_of_ampm, clock_hour_of_day, day_of_month, +day_of_week, day_of_year, epoch_day, era, hour_of_ampm, hour_of_day, +instant_seconds, micro_of_day, micro_of_second, milli_of_day, +milli_of_second, minute_of_day, minute_of_hour, month_of_year, +nano_of_day, nano_of_second, offset_seconds, proleptic_month, +second_of_day, second_of_minute, year, or year_of_era. Refer to +java.time.temporal.ChronoField +for a description of these values. +If null, the function returns null. +date +Date expression. If null, the function returns null. +DescriptionExtracts parts of a date, like year, month, day, hour.Examples +```esql ROW date = DATE_PARSE("yyyy-MM-dd", "2022-05-06") | EVAL year = DATE_EXTRACT("year", date) +``` + +Find all events that occurred outside of business hours (before 9 AM or after 5 +PM), on any given date: +```esql +FROM sample_data +| WHERE DATE_EXTRACT("hour_of_day", @timestamp) < 9 AND DATE_EXTRACT("hour_of_day", @timestamp) >= 17 +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_format.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_format.txt index b772cac90a0ee6..70feb4d1e3bf4d 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_format.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_format.txt @@ -1,7 +1,17 @@ DATE_FORMAT -Returns a string representation of a date in the provided format. If no format -is specified, the yyyy-MM-dd'T'HH:mm:ss.SSSZ format is used. +Syntax +DATE_FORMAT([format,] date) +Parameters +format +Date format (optional). If no format is specified, the +yyyy-MM-dd'T'HH:mm:ss.SSSZ format is used. If null, the function returns +null. +date +Date expression. If null, the function returns null. +DescriptionReturns a string representation of a date, in the provided format.Example +```esql FROM employees | KEEP first_name, last_name, hire_date | EVAL hired = DATE_FORMAT("YYYY-MM-dd", hire_date) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_parse.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_parse.txt index f03321af7eb935..c8a224b7136102 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_parse.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_parse.txt @@ -12,5 +12,7 @@ Date expression as a string. If null or an empty string, the function returns null. DescriptionReturns a date by parsing the second argument using the format specified in the first argument.Example +```esql ROW date_string = "2022-05-06" | EVAL date = DATE_PARSE("yyyy-MM-dd", date_string) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_trunc.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_trunc.txt index 773a2a9ce9513e..dd87fa74a69d4b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_trunc.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-date_trunc.txt @@ -1,8 +1,34 @@ DATE_TRUNC -Rounds down a date to the closest interval. Intervals can be expressed using the -timespan literal syntax. +Syntax +DATE_TRUNC(interval, date) +Parameters +interval +Interval, expressed using the timespan literal +syntax. If null, the function returns null. +date +Date expression. If null, the function returns null. +DescriptionRounds down a date to the closest interval.Examples +```esql FROM employees +| KEEP first_name, last_name, hire_date | EVAL year_hired = DATE_TRUNC(1 year, hire_date) -| STATS COUNT(emp_no) BY year_hired -| SORT year_hired +``` + +Combine DATE_TRUNC with STATS ... BY to create date histograms. For +example, the number of hires per year: +```esql +FROM employees +| EVAL year = DATE_TRUNC(1 year, hire_date) +| STATS hires = COUNT(emp_no) BY year +| SORT year +``` + +Or an hourly error rate: +```esql +FROM sample_data +| EVAL error = CASE(message LIKE "*error*", 1, 0) +| EVAL hour = DATE_TRUNC(1 hour, @timestamp) +| STATS error_rate = AVG(error) by hour +| SORT hour +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-dissect.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-dissect.txt index c4f99757f0b572..f323c2078a79bb 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-dissect.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-dissect.txt @@ -14,12 +14,17 @@ DescriptionDISSECT enables you to extract structured data out of a string. DISSECT matches the string against a delimiter-based pattern, and extracts the specified keys as columns.Refer to Process data with DISSECT for the syntax of dissect patterns.ExamplesThe following example parses a string that contains a timestamp, some text, and an IP address: +```esql ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" | DISSECT a "%{date} - %{msg} - %{ip}" | KEEP date, msg, ip +``` + By default, DISSECT outputs keyword string columns. To convert to another type, use Type conversion functions: +```esql ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" | DISSECT a "%{date} - %{msg} - %{ip}" | KEEP date, msg, ip | EVAL date = TO_DATETIME(date) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-drop.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-drop.txt index 88d5af4315d9fb..f84f9b9613de00 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-drop.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-drop.txt @@ -6,9 +6,14 @@ Parameters columns A comma-separated list of columns to remove. Supports wildcards. DescriptionThe DROP processing command removes one or more columns.Examples +```esql FROM employees | DROP height +``` + Rather than specify each column by name, you can use wildcards to drop all columns with a name that matches a pattern: +```esql FROM employees | DROP height* +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-e.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-e.txt index 7b56bebff6dced..4438b7dc356837 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-e.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-e.txt @@ -2,4 +2,6 @@ E Euler’s number. +```esql ROW E() +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-enrich.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-enrich.txt index 94b18473228cb5..c7de9fd3e3c56c 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-enrich.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-enrich.txt @@ -29,19 +29,31 @@ the match_field defined in the enrich policy and requires that the input table has a column with the same name (language_code in this example). ENRICH will look for records in the enrich index based on the match field value. +```esql ROW language_code = "1" | ENRICH languages_policy +``` + To use a column with a different name than the match_field defined in the policy as the match field, use ON : +```esql ROW a = "1" | ENRICH languages_policy ON a +``` + By default, each of the enrich fields defined in the policy is added as a column. To explicitly select the enrich fields that are added, use WITH , , ...: +```esql ROW a = "1" | ENRICH languages_policy ON a WITH language_name +``` + You can rename the columns that are added using WITH new_name=: +```esql ROW a = "1" | ENRICH languages_policy ON a WITH name = language_name +``` + In case of name collisions, the newly created columns will override existing columns. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-eval.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-eval.txt index 23aa334bdbb71f..fb11bfe5455101 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-eval.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-eval.txt @@ -11,13 +11,18 @@ function. DescriptionThe EVAL processing command enables you to append new columns with calculated values. EVAL supports various functions for calculating values. Refer to Functions for more information.Examples +```esql FROM employees | SORT emp_no | KEEP first_name, last_name, height | EVAL height_feet = height * 3.281, height_cm = height * 100 +``` + If the specified column already exists, the existing column will be dropped, and the new column will be appended to the table: +```esql FROM employees | SORT emp_no | KEEP first_name, last_name, height | EVAL height = height * 3.281 +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-floor.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-floor.txt index b27997edd8bffe..cb68b3277cdc34 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-floor.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-floor.txt @@ -2,8 +2,11 @@ FLOOR Round a number down to the nearest integer. +```esql ROW a=1.8 | EVAL a=FLOOR(a) +``` + This is a noop for long (including unsigned) and integer. For double this picks the the closest double value to the integer ala Math.floor. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-from.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-from.txt index 15a471cb44ead5..f57f10de37c960 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-from.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-from.txt @@ -1,29 +1,57 @@ FROM Syntax +```esql FROM index_pattern [METADATA fields] +``` + Parameters index_pattern A list of indices, data streams or aliases. Supports wildcards and date math. fields A comma-separated list of metadata fields to retrieve. -DescriptionThe FROM source command returns a table with data from a data stream, index, +DescriptionThe +```esql +FROM source command returns a table with data from a data stream, index, +``` + or alias. Each row in the resulting table represents a document. Each column corresponds to a field, and can be accessed by the name of that field. By default, an ES|QL query without an explicit LIMIT uses an implicit -limit of 500. This applies to FROM too. A FROM command without LIMIT: +limit of 500. This applies to +```esql +FROM too. A FROM command without LIMIT: +``` + +```esql FROM employees +``` + is executed as: +```esql FROM employees | LIMIT 500 +``` + Examples +```esql FROM employees +``` + You can use date math to refer to indices, aliases and data streams. This can be useful for time series data, for example to access today’s index: +```esql FROM +``` + Use comma-separated lists or wildcards to query multiple data streams, indices, or aliases: +```esql FROM employees-00001,other-employees-* +``` + Use the METADATA directive to enable metadata fields: +```esql FROM employees [METADATA _id] +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-greatest.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-greatest.txt index 119ecd48edf4cb..3a217abe2a0e43 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-greatest.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-greatest.txt @@ -3,8 +3,11 @@ GREATEST Returns the maximum value from many columns. This is similar to MV_MAX except it’s intended to run on multiple columns at once. +```esql ROW a = 10, b = 20 | EVAL g = GREATEST(a, b) +``` + When run on keyword or text fields, this’ll return the last string in alphabetical order. When run on boolean columns this will return true if any values are true. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-grok.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-grok.txt index 57d3cb32b72707..4b940e5c2c7f13 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-grok.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-grok.txt @@ -12,17 +12,25 @@ DescriptionGROK enables you to extract structured data out of a string. GROK matches the string against patterns, based on regular expressions, and extracts the specified patterns as columns.Refer to Process data with GROK for the syntax of grok patterns.ExamplesThe following example parses a string that contains a timestamp, an IP address, an email address, and a number: +```esql ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" | GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}" | KEEP date, ip, email, num +``` + By default, GROK outputs keyword string columns. int and float types can be converted by appending :type to the semantics in the pattern. For example {NUMBER:num:int}: +```esql ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" | GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}" | KEEP date, ip, email, num +``` + For other type conversions, use Type conversion functions: +```esql ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42" | GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}" | KEEP date, ip, email, num | EVAL date = TO_DATETIME(date) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-keep.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-keep.txt index 466a421cb247aa..287e079bb861c0 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-keep.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-keep.txt @@ -6,14 +6,22 @@ Parameters columns:: A comma-separated list of columns to keep. Supports wildcards.DescriptionThe KEEP processing command enables you to specify what columns are returned and the order in which they are returned.ExamplesThe columns are returned in the specified order: +```esql FROM employees | KEEP emp_no, first_name, last_name, height +``` + Rather than specify each column by name, you can use wildcards to return all columns with a name that matches a pattern: +```esql FROM employees | KEEP h* +``` + The asterisk wildcard (*) by itself translates to all columns that do not match the other arguments. This query will first return all columns with a name that starts with h, followed by all other columns: +```esql FROM employees | KEEP h*, * +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-least.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-least.txt index d598679f84f57c..949864ec07e4f3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-least.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-least.txt @@ -3,8 +3,11 @@ LEAST Returns the minimum value from many columns. This is similar to MV_MIN except it’s intended to run on multiple columns at once. +```esql ROW a = 10, b = 20 | EVAL l = LEAST(a, b) +``` + When run on keyword or text fields, this’ll return the first string in alphabetical order. When run on boolean columns this will return false if any values are false. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-left.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-left.txt index 2edc0378aa312c..fea60895db1372 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-left.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-left.txt @@ -2,9 +2,12 @@ LEFT Return the substring that extracts length chars from the string starting from the left. +```esql FROM employees | KEEP last_name | EVAL left = LEFT(last_name, 3) | SORT last_name ASC | LIMIT 5 +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-length.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-length.txt index 29e22edcb41769..b8a2ecf821e642 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-length.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-length.txt @@ -1,6 +1,8 @@ LENGTH Returns the character length of a string. +```esql FROM employees | KEEP first_name, last_name, height | EVAL fn_length = LENGTH(first_name) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-limit.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-limit.txt index 520b8e5547e9f3..5ee1f5fd6999db 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-limit.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-limit.txt @@ -19,6 +19,8 @@ settings: esql.query.result_truncation_default_size esql.query.result_truncation_max_size Example +```esql FROM employees | SORT emp_no ASC | LIMIT 5 +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-log10.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-log10.txt index dabc5bc7c05c7e..259ce71384a369 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-log10.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-log10.txt @@ -3,6 +3,9 @@ LOG10 Returns the log base 10. The input can be any numeric value, the return value is always a double.Logs of negative numbers are NaN. Logs of infinites are infinite, as is the log of 0. +```esql ROW d = 1000.0 | EVAL s = LOG10(d) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ltrim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ltrim.txt index 350b0b1e369ba5..d4d8e1c244a51d 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ltrim.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-ltrim.txt @@ -2,9 +2,12 @@ LTRIM Removes leading whitespaces from strings. +```esql ROW message = " some text ", color = " red " | EVAL message = LTRIM(message) | EVAL color = LTRIM(color) | EVAL message = CONCAT("'", message, "'") | EVAL color = CONCAT("'", color, "'") +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-max.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-max.txt index 22b23e89c74389..eae40918c20ebc 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-max.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-max.txt @@ -1,5 +1,7 @@ MAX The maximum value of a numeric field. +```esql FROM employees | STATS MAX(languages) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median.txt index df0aa45577b2ef..84807da7a352db 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median.txt @@ -2,8 +2,11 @@ MEDIAN The value that is greater than half of all values and less than half of all values, also known as the 50% PERCENTILE. +```esql FROM employees | STATS MEDIAN(salary), PERCENTILE(salary, 50) +``` + Like PERCENTILE, MEDIAN is usually approximate. MEDIAN is also non-deterministic. This means you can get slightly different results using the same data. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median_absolute_deviation.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median_absolute_deviation.txt index bf7329c62fb3b3..f05b04d62e4973 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median_absolute_deviation.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-median_absolute_deviation.txt @@ -6,8 +6,11 @@ or may not be normally distributed. For such data it can be more descriptive tha standard deviation.It is calculated as the median of each data point’s deviation from the median of the entire sample. That is, for a random variable X, the median absolute deviation is median(|median(X) - Xi|). +```esql FROM employees | STATS MEDIAN(salary), MEDIAN_ABSOLUTE_DEVIATION(salary) +``` + Like PERCENTILE, MEDIAN_ABSOLUTE_DEVIATION is usually approximate. MEDIAN_ABSOLUTE_DEVIATION is also non-deterministic. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-min.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-min.txt index 97e021e3153abb..62ff3d7c6be864 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-min.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-min.txt @@ -1,5 +1,7 @@ MIN The minimum value of a numeric field. +```esql FROM employees | STATS MIN(languages) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_avg.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_avg.txt index ee144a77697df3..554e0a50c7a590 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_avg.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_avg.txt @@ -2,6 +2,9 @@ MV_AVG Converts a multivalued field into a single valued field containing the average of all of the values. For example: +```esql ROW a=[3, 5, 1, 6] | EVAL avg_a = MV_AVG(a) +``` + The output type is always a double and the input type can be any number. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_concat.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_concat.txt index 1d579bee82a43e..872234370fddbe 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_concat.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_concat.txt @@ -3,9 +3,15 @@ MV_CONCAT Converts a multivalued string field into a single valued field containing the concatenation of all values separated by a delimiter: +```esql ROW a=["foo", "zoo", "bar"] | EVAL j = MV_CONCAT(a, ", ") +``` + If you want to concat non-string fields call TO_STRING on them first: +```esql ROW a=[10, 9, 8] | EVAL j = MV_CONCAT(TO_STRING(a), ", ") +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_count.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_count.txt index e6149e02c9fd9c..e2e1884e766045 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_count.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_count.txt @@ -3,6 +3,9 @@ MV_COUNT Converts a multivalued field into a single valued field containing a count of the number of values: +```esql ROW a=["foo", "zoo", "bar"] | EVAL count_a = MV_COUNT(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_dedupe.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_dedupe.txt index e844e01bdc6265..b5335d48506dbb 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_dedupe.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_dedupe.txt @@ -2,7 +2,10 @@ MV_DEDUPE Removes duplicates from a multivalued field. For example: +```esql ROW a=["foo", "foo", "bar", "foo"] | EVAL dedupe_a = MV_DEDUPE(a) +``` + Supported types: MV_DEDUPE may, but won’t always, sort the values in the field. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_expand.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_expand.txt index b8e757914b0b03..5125367fbc21d1 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_expand.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_expand.txt @@ -7,5 +7,7 @@ column The multivalued column to expand. DescriptionThe MV_EXPAND processing command expands multivalued columns into one row per value, duplicating other columns.Example +```esql ROW a=[1,2,3], b="b", j=["a","b"] | MV_EXPAND a +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_max.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_max.txt index 91ff991dfcb42e..430f23b27c43a1 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_max.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_max.txt @@ -2,10 +2,16 @@ MV_MAX Converts a multivalued field into a single valued field containing the maximum value. For example: +```esql ROW a=[3, 5, 1] | EVAL max_a = MV_MAX(a) +``` + It can be used by any field type, including keyword fields. In that case picks the last string, comparing their utf-8 representation byte by byte: +```esql ROW a=["foo", "zoo", "bar"] | EVAL max_a = MV_MAX(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_median.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_median.txt index 293e86b022c5de..63ab2329d9ebb0 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_median.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_median.txt @@ -1,10 +1,15 @@ MV_MEDIAN Converts a multivalued field into a single valued field containing the median value. For example: +```esql ROW a=[3, 5, 1] | EVAL median_a = MV_MEDIAN(a) +``` + It can be used by any numeric field type and returns a value of the same type. If the row has an even number of values for a column the result will be the average of the middle two entries. If the field is not floating point then the average rounds down: +```esql ROW a=[3, 7, 1, 6] | EVAL median_a = MV_MEDIAN(a) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_min.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_min.txt index 577464825cd724..1179f61d280d68 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_min.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_min.txt @@ -2,10 +2,16 @@ MV_MIN Converts a multivalued field into a single valued field containing the minimum value. For example: +```esql ROW a=[2, 1] | EVAL min_a = MV_MIN(a) +``` + It can be used by any field type, including keyword fields. In that case picks the first string, comparing their utf-8 representation byte by byte: +```esql ROW a=["foo", "bar"] | EVAL min_a = MV_MIN(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_sum.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_sum.txt index 34973728b27102..f6b6fdecc61305 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_sum.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-mv_sum.txt @@ -2,6 +2,9 @@ MV_SUM Converts a multivalued field into a single valued field containing the sum of all of the values. For example: +```esql ROW a=[3, 5, 6] | EVAL sum_a = MV_SUM(a) +``` + The input type can be any number and the output type is the same as the input type. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-now.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-now.txt index 2145d6b17add77..ccff8a884b0e67 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-now.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-now.txt @@ -1,4 +1,6 @@ NOW Returns current date and time. +```esql ROW current_date = NOW() +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-numeric-fields.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-numeric-fields.txt deleted file mode 100644 index f08b10515aa55e..00000000000000 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-numeric-fields.txt +++ /dev/null @@ -1,12 +0,0 @@ -Numeric fields - -auto_bucket can also operate on numeric fields like this: -FROM employees -| WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" -| EVAL bs = AUTO_BUCKET(salary, 20, 25324, 74999) -| SORT hire_date, salary -| KEEP hire_date, salary, bs -Unlike the example above where you are intentionally filtering on a date range, -you rarely want to filter on a numeric range. So you have find the min and max -separately. We don’t yet have an easy way to do that automatically. Improvements -coming! \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-operators.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-operators.txt index dc1eca3a0fc5c3..708fa25b2eae1c 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-operators.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-operators.txt @@ -86,24 +86,37 @@ IS NULL and IS NOT NULL predicates IS NULL and IS NOT NULL predicates For NULL comparison, use the IS NULL and IS NOT NULL predicates: +```esql FROM employees | WHERE birth_date IS NULL | KEEP first_name, last_name | SORT first_name | LIMIT 3 +``` + +```esql FROM employees | WHERE is_rehired IS NOT NULL | STATS COUNT(emp_no) +``` CIDR_MATCH CIDR_MATCH -Returns true if the provided IP is contained in one of the provided CIDR -blocks.CIDR_MATCH accepts two or more arguments. The first argument is the IP -address of type ip (both IPv4 and IPv6 are supported). Subsequent arguments -are the CIDR blocks to test the IP against. +Syntax +CIDR_MATCH(ip, block1[, ..., blockN]) +Parameters +ip +IP address of type ip (both IPv4 and IPv6 are supported). +blockX +CIDR block to test the IP against. +DescriptionReturns true if the provided IP is contained in one of the provided CIDR +blocks.Example +```esql FROM hosts -| WHERE CIDR_MATCH(ip, "127.0.0.2/32", "127.0.0.3/32") +| WHERE CIDR_MATCH(ip1, "127.0.0.2/32", "127.0.0.3/32") +| KEEP card, host, ip0, ip1 +``` ENDS_WITH ENDS_WITH @@ -111,9 +124,12 @@ ENDS_WITH Returns a boolean that indicates whether a keyword string ends with another string: +```esql FROM employees | KEEP last_name | EVAL ln_E = ENDS_WITH(last_name, "d") +``` + Supported types: IN @@ -121,12 +137,16 @@ IN The IN operator allows testing whether a field or expression equals an element in a list of literals, fields or expressions: +```esql ROW a = 1, b = 4, c = 3 | WHERE c-a IN (3, b / 2, a) +``` Returns a boolean that indicates whether its input is not a number. +```esql ROW d = 1.0 | EVAL s = IS_NAN(d) +``` LIKE LIKE @@ -137,9 +157,11 @@ also act on a constant (literal) expression. The right-hand side of the operator represents the pattern.The following wildcard characters are supported: * matches zero or more characters. ? matches one character. +```esql FROM employees | WHERE first_name LIKE "?b*" | KEEP first_name, last_name +``` RLIKE RLIKE @@ -148,9 +170,11 @@ Use RLIKE to filter data based on string patterns using using regular expressions. RLIKE usually acts on a field placed on the left-hand side of the operator, but it can also act on a constant (literal) expression. The right-hand side of the operator represents the pattern. +```esql FROM employees | WHERE first_name RLIKE ".leja.*" | KEEP first_name, last_name +``` STARTS_WITH STARTS_WITH @@ -158,7 +182,10 @@ STARTS_WITH Returns a boolean that indicates whether a keyword string starts with another string: +```esql FROM employees | KEEP last_name | EVAL ln_S = STARTS_WITH(last_name, "B") +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-percentile.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-percentile.txt index 432990415fc94a..662fa3a611a353 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-percentile.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-percentile.txt @@ -3,10 +3,13 @@ PERCENTILE The value at which a certain percentage of observed values occur. For example, the 95th percentile is the value which is greater than 95% of the observed values and the 50th percentile is the MEDIAN. +```esql FROM employees | STATS p0 = PERCENTILE(salary, 0) , p50 = PERCENTILE(salary, 50) , p99 = PERCENTILE(salary, 99) +``` + PERCENTILE is (usually) approximateeditThere are many different algorithms to calculate percentiles. The naive implementation simply stores all the values in a sorted array. To find the 50th percentile, you simply find the value that is at my_array[count(my_array) * 0.5].Clearly, the naive implementation does not scale — the sorted array grows diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pi.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pi.txt index 169af575669032..ade48755e280c2 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pi.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pi.txt @@ -2,4 +2,6 @@ PI The ratio of a circle’s circumference to its diameter. +```esql ROW PI() +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pow.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pow.txt index d74c58b7e0b6ad..56f1e48b73833a 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pow.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-pow.txt @@ -4,10 +4,16 @@ POW Returns the value of a base (first argument) raised to the power of an exponent (second argument). Both arguments must be numeric. The output is always a double. Note that it is still possible to overflow a double result here; in that case, null will be returned. +```esql ROW base = 2.0, exponent = 2 | EVAL result = POW(base, exponent) +``` + Fractional exponentseditThe exponent can be a fraction, which is similar to performing a root. For example, the exponent of 0.5 will give the square root of the base: +```esql ROW base = 4, exponent = 0.5 | EVAL s = POW(base, exponent) +``` + Table of supported input and output typeseditFor clarity, the following table describes the output result type for all combinations of numeric input types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rename.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rename.txt index 27ca77b68d0fd2..496db07019b7c6 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rename.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rename.txt @@ -9,10 +9,15 @@ new_nameX The new name of the column. DescriptionThe RENAME processing command renames one or more columns. If a column with the new name already exists, it will be replaced by the new column.Examples +```esql FROM employees | KEEP first_name, last_name, still_hired | RENAME still_hired AS employed +``` + Multiple columns can be renamed with a single RENAME command: +```esql FROM employees | KEEP first_name, last_name | RENAME first_name AS fn, last_name AS ln +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-replace.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-replace.txt index cf9102ab9471ee..859f031fd63982 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-replace.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-replace.txt @@ -2,6 +2,8 @@ REPLACE The function substitutes in the string (1st argument) any match of the regular expression (2nd argument) with the replacement string (3rd argument).If any of the arguments are NULL, the result is NULL. This example replaces an occurrence of the word "World" with the word "Universe": +```esql ROW str = "Hello World" | EVAL str = REPLACE(str, "World", "Universe") | KEEP str +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-right.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-right.txt index 2cd30d32cd7c11..b2e8fd12d3c2c7 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-right.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-right.txt @@ -2,9 +2,12 @@ RIGHT Return the substring that extracts length chars from the string starting from the right. +```esql FROM employees | KEEP last_name | EVAL right = RIGHT(last_name, 3) | SORT last_name ASC | LIMIT 5 +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-round.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-round.txt index 8ecb92ecc81be8..1047425f671479 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-round.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-round.txt @@ -3,6 +3,8 @@ ROUND Rounds a number to the closest number with the specified number of digits. Defaults to 0 digits if no number of digits is provided. If the specified number of digits is negative, rounds to the number of digits left of the decimal point. +```esql FROM employees | KEEP first_name, last_name, height | EVAL height_ft = ROUND(height * 3.281, 1) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-row.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-row.txt index fa57a1bcc5660f..8f60bd96b6bea3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-row.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-row.txt @@ -1,17 +1,35 @@ ROW Syntax +```esql ROW column1 = value1[, ..., columnN = valueN] +``` + Parameters columnX The column name. valueX The value for the column. Can be a literal, an expression, or a function. -DescriptionThe ROW source command produces a row with one or more columns with values +DescriptionThe +```esql +ROW source command produces a row with one or more columns with values +``` + that you specify. This can be useful for testing.Examples +```esql ROW a = 1, b = "two", c = null +``` + Use square brackets to create multi-value columns: +```esql ROW a = [2, 1] +``` + +```esql ROW supports the use of functions: +``` + +```esql ROW a = ROUND(1.23, 0) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rtrim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rtrim.txt index 63b6c428cadf2f..d25ec734fca79b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rtrim.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-rtrim.txt @@ -2,9 +2,12 @@ RTRIM Removes trailing whitespaces from strings. +```esql ROW message = " some text ", color = " red " | EVAL message = RTRIM(message) | EVAL color = RTRIM(color) | EVAL message = CONCAT("'", message, "'") | EVAL color = CONCAT("'", color, "'") +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-show.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-show.txt index cb7fab0300435b..dc6b80b9eba49f 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-show.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-show.txt @@ -1,15 +1,32 @@ SHOW Syntax +```esql SHOW item +``` + Parameters item Can be INFO or FUNCTIONS. -DescriptionThe SHOW source command returns information about the deployment and +DescriptionThe +```esql +SHOW source command returns information about the deployment and +``` + its capabilities: -Use SHOW INFO to return the deployment’s version, build date and hash. -Use SHOW FUNCTIONS to return a list of all supported functions and a +Use +```esql +SHOW INFO to return the deployment’s version, build date and hash. +``` + +Use +```esql +SHOW FUNCTIONS to return a list of all supported functions and a +``` + synopsis of each function. Examples +```esql SHOW functions | WHERE STARTS_WITH(name, "is_") +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sin.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sin.txt index 1c64c76791ea83..b0e05c95cb186e 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sin.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sin.txt @@ -2,6 +2,9 @@ SIN Sine trigonometric function. Input expected in radians. +```esql ROW a=1.8 | EVAL sin=SIN(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sinh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sinh.txt index 7a9d8a0bbcab7f..dfa5f203d8f163 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sinh.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sinh.txt @@ -2,6 +2,9 @@ SINH Sine hyperbolic function. +```esql ROW a=1.8 | EVAL sinh=SINH(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sort.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sort.txt index e1838ca5672412..1f9d4c2527cd8a 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sort.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sort.txt @@ -12,18 +12,29 @@ the highest value when sorting descending.By default, null values are treated as an ascending sort order, null values are sorted last, and with a descending sort order, null values are sorted first. You can change that by providing NULLS FIRST or NULLS LAST.Examples +```esql FROM employees | KEEP first_name, last_name, height | SORT height +``` + Explicitly sorting in ascending order with ASC: +```esql FROM employees | KEEP first_name, last_name, height | SORT height DESC +``` + Providing additional sort expressions to act as tie breakers: +```esql FROM employees | KEEP first_name, last_name, height | SORT height DESC, first_name ASC +``` + Sorting null values first using NULLS FIRST: +```esql FROM employees | KEEP first_name, last_name, height | SORT first_name ASC NULLS FIRST +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-split.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-split.txt index 8dbd7e74731e1c..834f8a10507eff 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-split.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-split.txt @@ -1,7 +1,10 @@ SPLIT Split a single valued string into multiple strings. For example: +```esql ROW words="foo;bar;baz;qux;quux;corge" | EVAL word = SPLIT(words, ";") +``` + Which splits "foo;bar;baz;qux;quux;corge" on ; and returns an array: Only single byte delimiters are currently supported. diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sqrt.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sqrt.txt index 6b5c8a56a0d434..0fef30ccbdf5d5 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sqrt.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sqrt.txt @@ -3,6 +3,9 @@ SQRT Returns the square root of a number. The input can be any numeric value, the return value is always a double.Square roots of negative numbers are NaN. Square roots of infinites are infinite. +```esql ROW d = 100.0 | EVAL s = SQRT(d) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-stats.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-stats.txt index 2a1edb4966d15b..971befa8d5626b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-stats.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-stats.txt @@ -31,20 +31,31 @@ Grouping on a single column is currently much more optimized than grouping something like CONCAT and then grouping - that is not going to be faster. ExamplesCalculating a statistic and grouping by the values of another column: +```esql FROM employees | STATS count = COUNT(emp_no) BY languages | SORT languages +``` + Omitting BY returns one row with the aggregations applied over the entire dataset: +```esql FROM employees | STATS avg_lang = AVG(languages) +``` + It’s possible to calculate multiple values: +```esql FROM employees | STATS avg_lang = AVG(languages), max_lang = MAX(languages) +``` + It’s also possible to group by multiple values (only supported for long and keyword family fields): +```esql FROM employees | EVAL hired = DATE_FORMAT("YYYY", hire_date) | STATS avg_salary = AVG(salary) BY hired, languages.long | EVAL avg_salary = ROUND(avg_salary) | SORT hired, languages.long +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-substring.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-substring.txt index a113ad838cc8a2..e4a24604858103 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-substring.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-substring.txt @@ -2,16 +2,24 @@ SUBSTRING Returns a substring of a string, specified by a start position and an optional length. This example returns the first three characters of every last name: +```esql FROM employees | KEEP last_name | EVAL ln_sub = SUBSTRING(last_name, 1, 3) +``` + A negative start position is interpreted as being relative to the end of the string. This example returns the last three characters of of every last name: +```esql FROM employees | KEEP last_name | EVAL ln_sub = SUBSTRING(last_name, -3, 3) +``` + If length is omitted, substring returns the remainder of the string. This example returns all characters except for the first: +```esql FROM employees | KEEP last_name | EVAL ln_sub = SUBSTRING(last_name, 2) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sum.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sum.txt index bc24875fce2192..36686979ebed68 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sum.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-sum.txt @@ -1,5 +1,7 @@ SUM The sum of a numeric field. +```esql FROM employees | STATS SUM(languages) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-syntax.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-syntax.txt index 8656c63f308f3f..7ad197c9480f54 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-syntax.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-syntax.txt @@ -27,24 +27,36 @@ expressions - require quoting if the identifier contains characters other than letters, numbers and `_` and doesn’t start with a letter, `_` or `@`. For instance: // Retain just one field +```esql FROM index | KEEP 1.field +``` + is legal. However, if same field is to be used with an EVAL, it’d have to be quoted: // Copy one field +```esql FROM index | EVAL my_field = `1.field` +``` + Literalsedit ES|QL currently supports numeric and string literals. String literalsedit A string literal is a sequence of unicode characters delimited by double quotes (`"`). // Filter by a string value +```esql FROM index | WHERE first_name == "Georgi" +``` + If the literal string itself contains quotes, these need to be escaped (`\\"`). ES|QL also supports the triple-quotes (`"""`) delimiter, for convenience: +```esql ROW name = """Indiana "Indy" Jones""" +``` + The special characters CR, LF and TAB can be provided with the usual escaping: `\r`, `\n`, `\t`, respectively. Numerical literalsedit @@ -67,11 +79,20 @@ ES|QL uses C++ style comments: double slash `//` for single line comments `/*` and `*/` for block comments // Query the employees index +```esql FROM employees | WHERE height > 2 +``` + +```esql FROM /* Query the employees index */ employees | WHERE height > 2 +``` + +```esql FROM employees +``` + /* Query the * employees * index */ diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tan.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tan.txt index 63b752c8c6248a..5706ad3a77f91c 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tan.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tan.txt @@ -2,6 +2,9 @@ TAN Tangent trigonometric function. Input expected in radians. +```esql ROW a=1.8 | EVAL tan=TAN(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tanh.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tanh.txt index 83493cec93984e..02391cb32bf46b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tanh.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tanh.txt @@ -2,6 +2,9 @@ TANH Tangent hyperbolic function. +```esql ROW a=1.8 | EVAL tanh=TANH(a) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tau.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tau.txt index b60a1bde563d20..600c43f47ccf91 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tau.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-tau.txt @@ -2,4 +2,6 @@ TAU The ratio of a circle’s circumference to its radius. +```esql ROW TAU() +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_boolean.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_boolean.txt index a6259f436f076d..498f40679b1293 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_boolean.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_boolean.txt @@ -4,7 +4,10 @@ Converts an input value to a boolean value.The input can be a single- or multi-v type must be of a string or numeric type.A string value of "true" will be case-insensitive converted to the Boolean true. For anything else, including the empty string, the function will return false. For example: +```esql ROW str = ["true", "TRuE", "false", "", "yes", "1"] | EVAL bool = TO_BOOLEAN(str) +``` + The numerical value of 0 will be converted to false, anything else will be converted to true.Alias: TO_BOOL \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_datetime.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_datetime.txt index d985309c75c626..534175b0824fdb 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_datetime.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_datetime.txt @@ -3,8 +3,11 @@ TO_DATETIME Converts an input value to a date value.The input can be a single- or multi-valued field or an expression. The input type must be of a string or numeric type.A string will only be successfully converted if it’s respecting the format yyyy-MM-dd'T'HH:mm:ss.SSS'Z' (to convert dates in other formats, use DATE_PARSE). For example: +```esql ROW string = ["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"] | EVAL datetime = TO_DATETIME(string) +``` + Note that in this example, the last value in the source multi-valued field has not been converted. The reason being that if the date format is not respected, the conversion will result in a null value. When this happens a @@ -12,6 +15,9 @@ Warning header is added to the response. The header will provide information on the source of the failure:"Line 1:112: evaluation of [TO_DATETIME(string)] failed, treating result as null. Only first 20 failures recorded."A following header will contain the failure reason and the offending value:"java.lang.IllegalArgumentException: failed to parse date field [1964-06-02 00:00:00] with format [yyyy-MM-dd'T'HH:mm:ss.SSS'Z']"If the input parameter is of a numeric type, its value will be interpreted as milliseconds since the Unix epoch. For example: +```esql ROW int = [0, 1] | EVAL dt = TO_DATETIME(int) +``` + Alias: TO_DT \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_degrees.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_degrees.txt index e6df993088477d..ed433509bae037 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_degrees.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_degrees.txt @@ -3,5 +3,7 @@ TO_DEGREES Converts a number in radians to degrees.The input can be a single- or multi-valued field or an expression. The input type must be of a numeric type and result is always double.Example: +```esql ROW rad = [1.57, 3.14, 4.71] | EVAL deg = TO_DEGREES(rad) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_double.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_double.txt index 2e1dd75654abe1..c5890745988b14 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_double.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_double.txt @@ -2,8 +2,11 @@ TO_DOUBLE Converts an input value to a double value.The input can be a single- or multi-valued field or an expression. The input type must be of a boolean, date, string or numeric type.Example: +```esql ROW str1 = "5.20128E11", str2 = "foo" | EVAL dbl = TO_DOUBLE("520128000000"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2) +``` + Note that in this example, the last conversion of the string isn’t possible. When this happens, the result is a null value. In this case a Warning header is added to the response. The header will provide information diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_integer.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_integer.txt index eab5669791922e..e1a43e83e3995a 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_integer.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_integer.txt @@ -2,8 +2,11 @@ TO_INTEGER Converts an input value to an integer value.The input can be a single- or multi-valued field or an expression. The input type must be of a boolean, date, string or numeric type.Example: +```esql ROW long = [5013792, 2147483647, 501379200000] | EVAL int = TO_INTEGER(long) +``` + Note that in this example, the last value of the multi-valued field cannot be converted as an integer. When this happens, the result is a null value. In this case a Warning header is added to the response. The header will diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_ip.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_ip.txt index 0e8f2fd1274a1d..23c8422170cfc7 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_ip.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_ip.txt @@ -1,9 +1,12 @@ TO_IP Converts an input string to an IP value.The input can be a single- or multi-valued field or an expression.Example: +```esql ROW str1 = "1.1.1.1", str2 = "foo" | EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2) | WHERE CIDR_MATCH(ip1, "1.0.0.0/8") +``` + Note that in the example above the last conversion of the string isn’t possible. When this happens, the result is a null value. In this case a Warning header is added to the response. The header will provide information diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_long.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_long.txt index 37a73209c7043f..802c09d7cf35de 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_long.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_long.txt @@ -2,8 +2,11 @@ TO_LONG Converts an input value to a long value.The input can be a single- or multi-valued field or an expression. The input type must be of a boolean, date, string or numeric type.Example: +```esql ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo" | EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3) +``` + Note that in this example, the last conversion of the string isn’t possible. When this happens, the result is a null value. In this case a Warning header is added to the response. The header will provide information diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_radians.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_radians.txt index d0118e1fa02716..9b40d70c52bc86 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_radians.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_radians.txt @@ -3,5 +3,7 @@ TO_RADIANS Converts a number in degrees to radians.The input can be a single- or multi-valued field or an expression. The input type must be of a numeric type and result is always double.Example: +```esql ROW deg = [90.0, 180.0, 270.0] | EVAL rad = TO_RADIANS(deg) +``` diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_string.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_string.txt index 4cb34acc5e0541..ec08289046414b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_string.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_string.txt @@ -2,9 +2,15 @@ TO_STRING Converts a field into a string. For example: +```esql ROW a=10 | EVAL j = TO_STRING(a) +``` + It also works fine on multivalued fields: +```esql ROW a=[10, 9, 8] | EVAL j = TO_STRING(a) +``` + Alias: TO_STRSupported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_unsigned_long.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_unsigned_long.txt index ae42a582079b3f..22c8a680c8c5b3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_unsigned_long.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_unsigned_long.txt @@ -2,8 +2,11 @@ TO_UNSIGNED_LONG Converts an input value to an unsigned long value.The input can be a single- or multi-valued field or an expression. The input type must be of a boolean, date, string or numeric type.Example: +```esql ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo" | EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3) +``` + Note that in this example, the last conversion of the string isn’t possible. When this happens, the result is a null value. In this case a Warning header is added to the response. The header will provide information diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_version.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_version.txt index 84ec4214c62792..9e95474fecd051 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_version.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-to_version.txt @@ -2,5 +2,8 @@ TO_VERSION Converts an input string to a version value. For example: +```esql ROW v = TO_VERSION("1.2.3") +``` + The input can be a single- or multi-valued field or an expression.Alias: TO_VERSupported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-trim.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-trim.txt index 5a7e51b0aa2ffd..91910162681d91 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-trim.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-trim.txt @@ -2,7 +2,10 @@ TRIM Removes leading and trailing whitespaces from strings. +```esql ROW message = " some text ", color = " red " | EVAL message = TRIM(message) | EVAL color = TRIM(color) +``` + Supported types: diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-where.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-where.txt index f03e351e933f86..49343c329fbcc9 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-where.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/esql_docs/esql-where.txt @@ -7,45 +7,69 @@ expression A boolean expression. DescriptionThe WHERE processing command produces a table that contains all the rows from the input table for which the provided condition evaluates to true.Examples +```esql FROM employees | KEEP first_name, last_name, still_hired | WHERE still_hired == true +``` + Which, if still_hired is a boolean field, can be simplified to: +```esql FROM employees | KEEP first_name, last_name, still_hired | WHERE still_hired +``` + WHERE supports various functions. For example the LENGTH function: +```esql FROM employees | KEEP first_name, last_name, height | WHERE LENGTH(first_name) < 4 +``` + For a complete list of all functions, refer to Functions and operators.For NULL comparison, use the IS NULL and IS NOT NULL predicates: +```esql FROM employees | WHERE birth_date IS NULL | KEEP first_name, last_name | SORT first_name | LIMIT 3 +``` + +```esql FROM employees | WHERE is_rehired IS NOT NULL | STATS COUNT(emp_no) +``` + Use LIKE to filter data based on string patterns using wildcards. LIKE usually acts on a field placed on the left-hand side of the operator, but it can also act on a constant (literal) expression. The right-hand side of the operator represents the pattern.The following wildcard characters are supported: * matches zero or more characters. ? matches one character. +```esql FROM employees | WHERE first_name LIKE "?b*" | KEEP first_name, last_name +``` + Use RLIKE to filter data based on string patterns using using regular expressions. RLIKE usually acts on a field placed on the left-hand side of the operator, but it can also act on a constant (literal) expression. The right-hand side of the operator represents the pattern. +```esql FROM employees | WHERE first_name RLIKE ".leja.*" | KEEP first_name, last_name +``` + The IN operator allows testing whether a field or expression equals an element in a list of literals, fields or expressions: +```esql ROW a = 1, b = 4, c = 3 | WHERE c-a IN (3, b / 2, a) +``` + For a complete list of all operators, refer to Operators. \ No newline at end of file diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts index 5aea8913bf1155..41beb01c5af62d 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts @@ -72,7 +72,7 @@ export function registerEsqlFunction({ name: 'execute_query', contexts: ['core'], visibility: FunctionVisibility.User, - description: 'Execute an ES|QL query', + description: 'Execute an ES|QL query.', parameters: { type: 'object', additionalProperties: false, @@ -129,14 +129,36 @@ export function registerEsqlFunction({ const source$ = streamIntoObservable( await client.chat({ connectorId, - messages: withEsqlSystemMessage(), + messages: withEsqlSystemMessage( + `Use the classify_esql function to classify the user's request + and get more information about specific functions and commands + you think are candidates for answering the question. + + + Examples for functions and commands: + Do you need to group data? Request \`STATS\`. + Extract data? Request \`DISSECT\` AND \`GROK\`. + Convert a column based on a set of conditionals? Request \`EVAL\` and \`CASE\`. + + Examples for determining whether the user wants to execute a query: + - "Show me the avg of x" + - "Give me the results of y" + - "Display the sum of z" + + Examples for determining whether the user does not want to execute a query: + - "I want a query that ..." + - "... Just show me the query" + - "Create a query that ..."` + ), signal, stream: true, functions: [ { - name: 'get_esql_info', - description: - 'Use this function to get more information about syntax, commands and examples. Take a deep breath and reason about what commands and functions you expect to use. Do you need to group data? Request `STATS`. Extract data? Request `DISSECT` AND `GROK`. Convert a column based on a set of conditionals? Request `EVAL` and `CASE`.', + name: 'classify_esql', + description: `Use this function to determine: + - what ES|QL functions and commands are candidates for answering the user's question + - whether the user has requested a query, and if so, it they want it to be executed, or just shown. + `, parameters: { type: 'object', properties: { @@ -154,12 +176,17 @@ export function registerEsqlFunction({ }, description: 'A list of functions.', }, + execute: { + type: 'boolean', + description: + 'Whether the user wants to execute a query (true) or just wants the query to be displayed (false)', + }, }, - required: ['commands', 'functions'], + required: ['commands', 'functions', 'execute'], }, }, ], - functionCall: 'get_esql_info', + functionCall: 'classify_esql', }) ).pipe(processOpenAiStream(), concatenateOpenAiChunks()); @@ -168,6 +195,7 @@ export function registerEsqlFunction({ const args = JSON.parse(response.message.function_call.arguments) as { commands: string[]; functions: string[]; + execute: boolean; }; const keywords = args.commands.concat(args.functions).concat('SYNTAX').concat('OVERVIEW'); @@ -254,7 +282,6 @@ export function registerEsqlFunction({ }, ], connectorId, - functions: [], signal, stream: true, }) @@ -294,6 +321,30 @@ export function registerEsqlFunction({ ], }); } + + const esqlQuery = cachedContent.match(/```esql([\s\S]*?)```/)?.[1]; + + if (esqlQuery && args.execute) { + subscriber.next({ + created: 0, + id: '', + model: '', + object: 'chat.completion.chunk', + choices: [ + { + delta: { + function_call: { + name: 'execute_query', + arguments: JSON.stringify({ query: esqlQuery }), + }, + }, + index: 0, + finish_reason: null, + }, + ], + }); + } + subscriber.complete(); }, error: (error) => { diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt b/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt index 7dca13c4901802..d9ce66038f170f 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/system_message.txt @@ -11,9 +11,8 @@ processing. This source command is then followed by one or more processing commands, which can transform the data returned by the previous command. -ES|QL is not Elasticsearch SQL, nor is it anything like SQL. SQL -commands are not available in ES|QL. Make sure you write a query -using ONLY commands specified in this conversation. +Make sure you write a query using ONLY commands specified in this +conversation. # Syntax @@ -168,6 +167,7 @@ one or more aggregated values over the grouped rows. This commands only Here are some example queries: +```esql FROM employees | WHERE still_hired == true | EVAL hired = DATE_FORMAT("YYYY", hire_date) @@ -179,34 +179,48 @@ FROM employees | KEEP avg_salary, lang | SORT avg_salary ASC | LIMIT 3 +``` +```esql FROM employees | EVAL trunk_worked_seconds = avg_worked_seconds / 100000000 * 100000000 | STATS c = count(languages.long) BY languages.long, trunk_worked_seconds | SORT c desc, languages.long, trunk_worked_seconds +``` +```esql ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1" | DISSECT a "%{date} - %{msg} - %{ip}" | KEEP date, msg, ip | EVAL date = TO_DATETIME(date) +``` +```esql FROM employees | WHERE first_name LIKE "?b*" | KEEP first_name, last_name +``` +```esql FROM employees | WHERE hire_date >= "1985-01-01T00:00:00Z" AND hire_date < "1986-01-01T00:00:00Z" | EVAL bucket = AUTO_BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") | STATS AVG(salary) BY bucket | SORT bucket +``` +```esql ROW a = 1, b = "two", c = null +``` +```esql FROM employees | EVAL is_recent_hire = CASE(hire_date <= "2023-01-01T00:00:00Z", 1, 0) | STATS total_recent_hires = SUM(is_recent_hire), total_hires = COUNT(*) BY country | EVAL recent_hiring_rate = total_recent_hires / total_hires +``` +```esql FROM logs-* | WHERE @timestamp <= NOW() - 24 hours // divide data in 1 hour buckets @@ -217,4 +231,4 @@ FROM logs-* | STATS total_events = COUNT(*), total_failures = SUM(is_5xx) BY host.hostname, bucket | EVAL failure_rate_per_host = total_failures / total_events | DROP total_events, total_failures - +``` diff --git a/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts index f8da02ad0666de..b9680d6472691e 100644 --- a/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts +++ b/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts @@ -33,6 +33,9 @@ export const EMPTY_RESPONSE: RuleRegistrySearchResponse = { export const RULE_SEARCH_STRATEGY_NAME = 'privateRuleRegistryAlertsSearchStrategy'; +// these are deprecated types should never show up in any alert table +const EXCLUDED_RULE_TYPE_IDS = ['siem.notifications']; + export const ruleRegistrySearchStrategyProvider = ( data: PluginStart, alerting: AlertingStart, @@ -85,14 +88,16 @@ export const ruleRegistrySearchStrategyProvider = ( featureIds.length > 0 ? await authorization.getAuthorizedRuleTypes(AlertingAuthorizationEntity.Alert, fIds) : []; + return { space, authzFilter, authorizedRuleTypes }; }; return from(getAsync(request.featureIds)).pipe( mergeMap(({ space, authzFilter, authorizedRuleTypes }) => { - const indices = alerting.getAlertIndicesAlias( - authorizedRuleTypes.map((art: { id: any }) => art.id), - space?.id + const allRuleTypes = authorizedRuleTypes.map((art: { id: string }) => art.id); + const ruleTypes = (allRuleTypes ?? []).filter( + (ruleTypeId: string) => !EXCLUDED_RULE_TYPE_IDS.includes(ruleTypeId) ); + const indices = alerting.getAlertIndicesAlias(ruleTypes, space?.id); if (indices.length === 0) { return of(EMPTY_RESPONSE); } diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts index 7810c29fbfbfe9..94aebe40caf9bf 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts @@ -31,6 +31,10 @@ export interface RiskStats { multipliers: string[]; calculated_level: RiskSeverity; inputs?: RiskInputs; + category_1_score: number; + category_1_count: number; + category_2_score: number; + category_2_count: number; } export { RiskSeverity }; diff --git a/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx b/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx index 47c1d8b478c2d1..e13788b8f7f076 100644 --- a/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx @@ -205,6 +205,10 @@ export const useDiscoverInTimelineActions = ( } else { // If no saved search exists. Create a new saved search instance and associate it with the timeline. try { + // Make sure we're not creating a saved search while a previous creation call is in progress + if (status !== 'idle') { + return; + } dispatch( timelineActions.startTimelineSaving({ id: TimelineId.active, @@ -218,7 +222,7 @@ export const useDiscoverInTimelineActions = ( const responseIsEmpty = !response || !response?.id; if (responseIsEmpty) { throw new Error('Response is empty'); - } else if (!savedSearchId && !responseIsEmpty && status !== 'loading') { + } else if (!savedSearchId && !responseIsEmpty) { dispatch( timelineActions.updateSavedSearchId({ id: TimelineId.active, diff --git a/x-pack/plugins/security_solution/public/entity_analytics/common/get_alerts_query_for_risk_score.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/common/get_alerts_query_for_risk_score.test.ts index ec4a99c4becc71..6018a1df3d99b6 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/common/get_alerts_query_for_risk_score.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/common/get_alerts_query_for_risk_score.test.ts @@ -12,6 +12,10 @@ const risk = { calculated_score_norm: 70, rule_risks: [], multipliers: [], + category_1_score: 0, + category_1_count: 0, + category_2_score: 0, + category_2_count: 0, }; describe('getAlertsQueryForRiskScore', () => { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx new file mode 100644 index 00000000000000..7ee80b8b695c93 --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/common.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiBasicTableColumn } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; + +import type { + HostRiskScore, + RiskStats, + UserRiskScore, +} from '../../../../common/search_strategy/security_solution/risk_score'; + +interface TableItem { + category: string; + count: number; + score: string; +} + +interface EntityData { + name: string; + risk: RiskStats; +} + +export const buildColumns: () => Array> = () => [ + { + field: 'category', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + }, + { + field: 'score', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + dataType: 'number', + }, + { + field: 'count', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + dataType: 'number', + }, +]; + +export const getItems: (entityData: EntityData | undefined) => TableItem[] = (entityData) => { + return [ + { + category: i18n.translate('xpack.securitySolution.flyout.entityDetails.alertsGroupLabel', { + defaultMessage: 'Alerts', + }), + score: displayNumber(entityData?.risk.category_1_score ?? 0), + count: entityData?.risk.category_1_count ?? 0, + }, + { + category: i18n.translate('xpack.securitySolution.flyout.entityDetails.contextGroupLabel', { + defaultMessage: 'Contexts', + }), + score: displayNumber(entityData?.risk.category_2_score ?? 0), + count: entityData?.risk.category_2_count ?? 0, + }, + ]; +}; + +export function isUserRiskData( + riskData: UserRiskScore | HostRiskScore | undefined +): riskData is UserRiskScore { + return !!riskData && (riskData as UserRiskScore).user !== undefined; +} + +export const getEntityData = ( + riskData: UserRiskScore | HostRiskScore | undefined +): EntityData | undefined => { + if (!riskData) { + return; + } + + if (isUserRiskData(riskData)) { + return riskData.user; + } + + return riskData.host; +}; + +const displayNumber = (num: number) => num.toFixed(2); + +export const LENS_VISUALIZATION_HEIGHT = 126; // Static height in pixels specified by design +export const LAST_30_DAYS = { from: 'now-30d', to: 'now' }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx index bd833bc68b0169..485ced7dea46c8 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx @@ -18,17 +18,6 @@ import type { VisualizationEmbeddableProps, } from '../../../common/components/visualization_actions/types'; -const mockContributingAlerts = Array(6).fill({}); -const expectedRiskInputsLength = mockContributingAlerts.length; - -const mockUseRiskContributingAlerts = jest - .fn() - .mockReturnValue({ loading: false, data: mockContributingAlerts }); - -jest.mock('../../hooks/use_risk_contributing_alerts', () => ({ - useRiskContributingAlerts: () => mockUseRiskContributingAlerts(), -})); - const mockVisualizationEmbeddable = jest .fn() .mockReturnValue(
); @@ -56,9 +45,17 @@ describe('RiskSummary', () => { expect(getByTestId('risk-summary-table')).toBeInTheDocument(); expect(getByTestId('risk-summary-table')).toHaveTextContent( - `Inputs${expectedRiskInputsLength}` + `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_1_count ?? 0}` + ); + expect(getByTestId('risk-summary-table')).toHaveTextContent( + `AlertsScore${mockHostRiskScoreState.data?.[0].host.risk.category_1_score ?? 0}` + ); + expect(getByTestId('risk-summary-table')).toHaveTextContent( + `Inputs${mockHostRiskScoreState.data?.[0].host.risk.category_2_count ?? 0}` + ); + expect(getByTestId('risk-summary-table')).toHaveTextContent( + `ContextsScore${mockHostRiskScoreState.data?.[0].host.risk.category_2_score ?? 0}` ); - expect(getByTestId('risk-summary-table')).toHaveTextContent('CategoryAlerts'); }); it('renders risk summary table when riskScoreData is empty', () => { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index 5190fb8955427f..9731ef7d7542fe 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -6,7 +6,7 @@ */ import React, { useCallback, useMemo } from 'react'; -import type { EuiBasicTableColumn } from '@elastic/eui'; + import { useEuiTheme, EuiAccordion, @@ -20,13 +20,11 @@ import { import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiThemeVars } from '@kbn/ui-theme'; -import { i18n } from '@kbn/i18n'; + import { useKibana } from '../../../common/lib/kibana/kibana_react'; + import { EntityDetailsLeftPanelTab } from '../../../flyout/entity_details/shared/components/left_panel/left_panel_header'; -import type { - HostRiskScore, - UserRiskScore, -} from '../../../../common/search_strategy/security_solution/risk_score'; + import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; import { ONE_WEEK_IN_HOURS } from '../../../timelines/components/side_panel/new_user_detail/constants'; import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; @@ -35,7 +33,15 @@ import { VisualizationEmbeddable } from '../../../common/components/visualizatio import { ExpandablePanel } from '../../../flyout/shared/components/expandable_panel'; import type { RiskScoreState } from '../../api/hooks/use_risk_score'; import { getRiskScoreSummaryAttributes } from '../../lens_attributes/risk_score_summary'; -import { useRiskContributingAlerts } from '../../hooks/use_risk_contributing_alerts'; + +import { + buildColumns, + getEntityData, + getItems, + isUserRiskData, + LAST_30_DAYS, + LENS_VISUALIZATION_HEIGHT, +} from './common'; export interface RiskSummaryProps { riskScoreData: RiskScoreState; @@ -43,32 +49,6 @@ export interface RiskSummaryProps { openDetailsPanel: (tab: EntityDetailsLeftPanelTab) => void; } -interface TableItem { - category: string; - count: number; -} -const LENS_VISUALIZATION_HEIGHT = 126; // Static height in pixels specified by design -const LAST_30_DAYS = { from: 'now-30d', to: 'now' }; -const ALERTS_FIELDS: string[] = []; - -function isUserRiskData( - riskData: UserRiskScore | HostRiskScore | undefined -): riskData is UserRiskScore { - return !!riskData && (riskData as UserRiskScore).user !== undefined; -} - -const getEntityData = (riskData: UserRiskScore | HostRiskScore | undefined) => { - if (!riskData) { - return; - } - - if (isUserRiskData(riskData)) { - return riskData.user; - } - - return riskData.host; -}; - const RiskSummaryComponent = ({ riskScoreData, queryId, @@ -79,10 +59,7 @@ const RiskSummaryComponent = ({ const riskData = data && data.length > 0 ? data[0] : undefined; const entityData = getEntityData(riskData); const { euiTheme } = useEuiTheme(); - const { data: alertsData } = useRiskContributingAlerts({ - riskScore: riskData, - fields: ALERTS_FIELDS, - }); + const lensAttributes = useMemo(() => { const entityName = entityData?.name ?? ''; const fieldName = isUserRiskData(riskData) ? 'user.name' : 'host.name'; @@ -95,50 +72,10 @@ const RiskSummaryComponent = ({ }); }, [entityData?.name, entityData?.risk?.calculated_level, riskData]); - const columns: Array> = useMemo( - () => [ - { - field: 'category', - name: ( - - ), - truncateText: false, - mobileOptions: { show: true }, - sortable: true, - }, - { - field: 'count', - name: ( - - ), - truncateText: false, - mobileOptions: { show: true }, - sortable: true, - dataType: 'number', - }, - ], - [] - ); - const xsFontSize = useEuiFontSize('xxs').fontSize; - const items: TableItem[] = useMemo( - () => [ - { - category: i18n.translate('xpack.securitySolution.flyout.entityDetails.alertsGroupLabel', { - defaultMessage: 'Alerts', - }), - count: alertsData?.length ?? 0, - }, - ], - [alertsData?.length] - ); + const columns = useMemo(buildColumns, []); + const rows = useMemo(() => getItems(entityData), [entityData]); const onToggle = useCallback( (isOpen) => { @@ -280,7 +217,7 @@ const RiskSummaryComponent = ({ data-test-subj="risk-summary-table" responsive={false} columns={columns} - items={items} + items={rows} compressed />
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx index 87905b248a7d97..578544ea691c4a 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/user_risk_score_table/index.test.tsx @@ -27,6 +27,10 @@ describe('UserRiskScoreTable', () => { calculated_score_norm: 71, calculated_level: RiskSeverity.high, multipliers: [], + category_1_count: 0, + category_2_count: 0, + category_1_score: 0, + category_2_score: 0, }, }, }, diff --git a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts index 544badd18b5e98..f60911cd873439 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.ts @@ -90,7 +90,7 @@ export const getRiskScoreSummaryAttributes: ( format: { id: 'number', params: { - decimals: 0, + decimals: 2, compact: false, }, }, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/mocks/index.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/mocks/index.ts index 9c7671917bbd9f..4f0103552ad564 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/mocks/index.ts +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/mocks/index.ts @@ -37,6 +37,10 @@ const userRiskScore: UserRiskScore = { timestamp: '2021-08-19T18:55:59.000Z', }, ], + category_1_count: 5, + category_1_score: 20, + category_2_count: 1, + category_2_score: 10, }, }, alertsCount: 0, @@ -62,6 +66,10 @@ const hostRiskScore: HostRiskScore = { timestamp: '2021-08-19T18:55:59.000Z', }, ], + category_1_count: 5, + category_1_score: 20, + category_2_count: 1, + category_2_score: 10, }, }, alertsCount: 0, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts index 2f6ea38b40b81d..0459636ff75caa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_responses.ts @@ -46,7 +46,7 @@ import { } from '../../../../../common/api/detection_engine/signals_migration/mocks'; // eslint-disable-next-line no-restricted-imports -import type { LegacyRuleNotificationAlertType } from '../../rule_actions_legacy'; +import type { LegacyRuleNotificationRuleType } from '../../rule_actions_legacy'; import type { RuleAlertType, RuleParams } from '../../rule_schema'; import { getQueryRuleParams } from '../../rule_schema/mocks'; @@ -520,7 +520,7 @@ export const legacyGetNotificationResult = ({ }: { id?: string; ruleId?: string; -} = {}): LegacyRuleNotificationAlertType => ({ +} = {}): LegacyRuleNotificationRuleType => ({ id, name: 'Notification for Rule Test', tags: [], @@ -567,7 +567,7 @@ export const legacyGetNotificationResult = ({ */ export const legacyGetFindNotificationsResultWithSingleHit = ( ruleId = '123' -): FindHit => ({ +): FindHit => ({ page: 1, perPage: 1, total: 1, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts index df2c4bb3366b9e..518ece11dbefef 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/api/create_legacy_notification/route.ts @@ -14,7 +14,7 @@ import { legacyUpdateOrCreateRuleActionsSavedObject } from '../../logic/rule_act // eslint-disable-next-line no-restricted-imports import { legacyReadNotifications } from '../../logic/notifications/legacy_read_notifications'; // eslint-disable-next-line no-restricted-imports -import type { LegacyRuleNotificationAlertTypeParams } from '../../logic/notifications/legacy_types'; +import type { LegacyRuleNotificationRuleTypeParams } from '../../logic/notifications/legacy_types'; // eslint-disable-next-line no-restricted-imports import { legacyCreateNotifications } from '../../logic/notifications/legacy_create_notifications'; import { UPDATE_OR_CREATE_LEGACY_ACTIONS } from '../../../../../../common/constants'; @@ -75,7 +75,7 @@ export const legacyCreateLegacyNotificationRoute = ( ruleAlertId, }); if (notification != null) { - await rulesClient.update({ + await rulesClient.update({ id: notification.id, data: { tags: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/index.ts index fddf872583040b..e577d0ac5355a8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/index.ts @@ -8,13 +8,13 @@ export * from './api/register_routes'; // eslint-disable-next-line no-restricted-imports -export { legacyRulesNotificationAlertType } from './logic/notifications/legacy_rules_notification_alert_type'; +export { legacyRulesNotificationRuleType } from './logic/notifications/legacy_rules_notification_rule_type'; // eslint-disable-next-line no-restricted-imports -export { legacyIsNotificationAlertExecutor } from './logic/notifications/legacy_types'; +export { isLegacyNotificationRuleExecutor } from './logic/notifications/legacy_types'; // eslint-disable-next-line no-restricted-imports export type { - LegacyRuleNotificationAlertType, - LegacyRuleNotificationAlertTypeParams, + LegacyRuleNotificationRuleType, + LegacyRuleNotificationRuleTypeParams, } from './logic/notifications/legacy_types'; export type { NotificationRuleTypeParams } from './logic/notifications/schedule_notification_actions'; export { scheduleNotificationActions } from './logic/notifications/schedule_notification_actions'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_create_notifications.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_create_notifications.ts index 983519404b2223..34428140e9a126 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_create_notifications.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_create_notifications.ts @@ -10,7 +10,7 @@ import { SERVER_APP_ID, LEGACY_NOTIFICATIONS_ID } from '../../../../../../common // eslint-disable-next-line no-restricted-imports import type { CreateNotificationParams, - LegacyRuleNotificationAlertTypeParams, + LegacyRuleNotificationRuleTypeParams, } from './legacy_types'; /** @@ -23,8 +23,8 @@ export const legacyCreateNotifications = async ({ ruleAlertId, interval, name, -}: CreateNotificationParams): Promise> => - rulesClient.create({ +}: CreateNotificationParams): Promise> => + rulesClient.create({ data: { name, tags: [], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_read_notifications.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_read_notifications.ts index 187cde7ce8c9d5..fda0b6b45ca56c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_read_notifications.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_read_notifications.ts @@ -9,7 +9,7 @@ import type { RuleTypeParams, SanitizedRule } from '@kbn/alerting-plugin/common' // eslint-disable-next-line no-restricted-imports import type { LegacyReadNotificationParams } from './legacy_types'; // eslint-disable-next-line no-restricted-imports -import { legacyIsAlertType } from './legacy_types'; +import { isLegacyRuleType } from './legacy_types'; // eslint-disable-next-line no-restricted-imports import { legacyFindNotifications } from './legacy_find_notifications'; @@ -24,7 +24,7 @@ export const legacyReadNotifications = async ({ if (id != null) { try { const notification = await rulesClient.get({ id }); - if (legacyIsAlertType(notification)) { + if (isLegacyRuleType(notification)) { return notification; } else { return null; @@ -43,10 +43,7 @@ export const legacyReadNotifications = async ({ filter: `alert.attributes.params.ruleAlertId: "${ruleAlertId}"`, page: 1, }); - if ( - notificationFromFind.data.length === 0 || - !legacyIsAlertType(notificationFromFind.data[0]) - ) { + if (notificationFromFind.data.length === 0 || !isLegacyRuleType(notificationFromFind.data[0])) { return null; } else { return notificationFromFind.data[0]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.test.ts similarity index 57% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.test.ts index 0f0eeece6f8f60..e3a5e24bd14c29 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.test.ts @@ -12,7 +12,7 @@ import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common'; import { getRuleMock } from '../../../routes/__mocks__/request_responses'; // eslint-disable-next-line no-restricted-imports -import { legacyRulesNotificationAlertType } from './legacy_rules_notification_alert_type'; +import { legacyRulesNotificationRuleType } from './legacy_rules_notification_rule_type'; import { buildSignalsSearchQuery } from './build_signals_query'; // eslint-disable-next-line no-restricted-imports import type { LegacyNotificationExecutorOptions } from './legacy_types'; @@ -26,12 +26,123 @@ import { getQueryRuleParams } from '../../../rule_schema/mocks'; jest.mock('./build_signals_query'); +const reported = { + actionGroup: 'default', + context: { + alerts: [ + { + '@timestamp': expect.any(String), + destination: { + ip: '127.0.0.1', + }, + someKey: 'someValue', + source: { + ip: '127.0.0.1', + }, + }, + ], + results_link: + '/app/security/detections/rules/id/rule-id?timerange=(global:(linkTo:!(timeline),timerange:(from:1576255233400,kind:absolute,to:1576341633400)),timeline:(linkTo:!(global),timerange:(from:1576255233400,kind:absolute,to:1576341633400)))', + rule: { + alert_suppression: undefined, + author: ['Elastic'], + building_block_type: 'default', + data_view_id: undefined, + description: 'Detecting root and admin users', + exceptions_list: [ + { + id: 'some_uuid', + list_id: 'list_id_single', + namespace_type: 'single', + type: 'detection', + }, + { + id: 'endpoint_list', + list_id: 'endpoint_list', + namespace_type: 'agnostic', + type: 'endpoint', + }, + ], + false_positives: [], + filters: [ + { + query: { + match_phrase: { + 'host.name': 'some-host', + }, + }, + }, + ], + from: 'now-6m', + id: 'rule-id', + immutable: false, + index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + investigation_fields: undefined, + language: 'kuery', + license: 'Elastic License', + max_signals: 10000, + name: 'Detect Root/Admin Users', + namespace: undefined, + note: '# Investigative notes', + output_index: '.siem-signals', + query: 'user.name: root or user.name: admin', + references: ['http://example.com', 'https://example.com'], + related_integrations: [], + required_fields: [], + response_actions: undefined, + risk_score: 50, + risk_score_mapping: [], + rule_id: 'rule-1', + rule_name_override: undefined, + saved_id: undefined, + setup: '', + severity: 'high', + severity_mapping: [], + threat: [ + { + framework: 'MITRE ATT&CK', + tactic: { + id: 'TA0000', + name: 'test tactic', + reference: 'https://attack.mitre.org/tactics/TA0000/', + }, + technique: [ + { + id: 'T0000', + name: 'test technique', + reference: 'https://attack.mitre.org/techniques/T0000/', + subtechnique: [ + { + id: 'T0000.000', + name: 'test subtechnique', + reference: 'https://attack.mitre.org/techniques/T0000/000/', + }, + ], + }, + ], + }, + ], + timeline_id: 'some-timeline-id', + timeline_title: 'some-timeline-title', + timestamp_override: undefined, + timestamp_override_fallback_disabled: undefined, + to: 'now', + type: 'query', + version: 1, + }, + }, + id: '1111', + state: { + signals_count: 1, + }, +}; + /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -describe('legacyRules_notification_alert_type', () => { +describe('legacyRules_notification_rule_type', () => { let payload: LegacyNotificationExecutorOptions; - let alert: ReturnType; + let rule: ReturnType; let logger: ReturnType; let alertServices: RuleExecutorServicesMock; @@ -78,7 +189,7 @@ describe('legacyRules_notification_alert_type', () => { }, }; - alert = legacyRulesNotificationAlertType({ + rule = legacyRulesNotificationRuleType({ logger, }); }); @@ -91,7 +202,7 @@ describe('legacyRules_notification_alert_type', () => { type: 'type', references: [], }); - await alert.executor(payload); + await rule.executor(payload); expect(logger.error).toHaveBeenCalledWith( `Security Solution notification (Legacy) saved object for alert ${payload.params.ruleAlertId} was not found with id: \"1111\". space id: \"\" This indicates a dangling (Legacy) notification alert. You should delete this rule through \"Kibana UI -> Stack Management -> Rules and Connectors\" to remove this error message.` ); @@ -109,7 +220,7 @@ describe('legacyRules_notification_alert_type', () => { sampleDocSearchResultsWithSortId() ); - await alert.executor(payload); + await rule.executor(payload); expect(buildSignalsSearchQuery).toHaveBeenCalledWith( expect.objectContaining({ @@ -135,17 +246,8 @@ describe('legacyRules_notification_alert_type', () => { sampleDocSearchResultsWithSortId() ); - await alert.executor(payload); - expect(alertServices.alertFactory.create).toHaveBeenCalled(); - - const [{ value: alertInstanceMock }] = alertServices.alertFactory.create.mock.results; - expect(alertInstanceMock.scheduleActions).toHaveBeenCalledWith( - 'default', - expect.objectContaining({ - results_link: - '/app/security/detections/rules/id/rule-id?timerange=(global:(linkTo:!(timeline),timerange:(from:1576255233400,kind:absolute,to:1576341633400)),timeline:(linkTo:!(global),timerange:(from:1576255233400,kind:absolute,to:1576341633400)))', - }) - ); + await rule.executor(payload); + expect(alertServices.alertsClient.report).toHaveBeenCalledWith(reported); }); it('should resolve results_link when meta is an empty object to use "/app/security"', async () => { @@ -160,17 +262,11 @@ describe('legacyRules_notification_alert_type', () => { alertServices.scopedClusterClient.asCurrentUser.search.mockResponse( sampleDocSearchResultsWithSortId() ); - await alert.executor(payload); - expect(alertServices.alertFactory.create).toHaveBeenCalled(); - - const [{ value: alertInstanceMock }] = alertServices.alertFactory.create.mock.results; - expect(alertInstanceMock.scheduleActions).toHaveBeenCalledWith( - 'default', - expect.objectContaining({ - results_link: - '/app/security/detections/rules/id/rule-id?timerange=(global:(linkTo:!(timeline),timerange:(from:1576255233400,kind:absolute,to:1576341633400)),timeline:(linkTo:!(global),timerange:(from:1576255233400,kind:absolute,to:1576341633400)))', - }) - ); + await rule.executor(payload); + expect(alertServices.alertsClient.report).toHaveBeenCalledWith({ + ...reported, + context: { ...reported.context, rule: { ...reported.context.rule, meta: {} } }, + }); }); it('should resolve results_link to custom kibana link when given one', async () => { @@ -187,20 +283,24 @@ describe('legacyRules_notification_alert_type', () => { alertServices.scopedClusterClient.asCurrentUser.search.mockResponse( sampleDocSearchResultsWithSortId() ); - await alert.executor(payload); - expect(alertServices.alertFactory.create).toHaveBeenCalled(); - - const [{ value: alertInstanceMock }] = alertServices.alertFactory.create.mock.results; - expect(alertInstanceMock.scheduleActions).toHaveBeenCalledWith( - 'default', - expect.objectContaining({ + await rule.executor(payload); + expect(alertServices.alertsClient.report).toHaveBeenCalledWith({ + ...reported, + context: { + ...reported.context, results_link: 'http://localhost/detections/rules/id/rule-id?timerange=(global:(linkTo:!(timeline),timerange:(from:1576255233400,kind:absolute,to:1576341633400)),timeline:(linkTo:!(global),timerange:(from:1576255233400,kind:absolute,to:1576341633400)))', - }) - ); + rule: { + ...reported.context.rule, + meta: { + kibana_siem_app_url: 'http://localhost', + }, + }, + }, + }); }); - it('should not call alertFactory.create if signalsCount was 0', async () => { + it('should not call alertsClient.report if signalsCount was 0', async () => { const ruleAlert = getRuleMock(getQueryRuleParams()); alertServices.savedObjectsClient.get.mockResolvedValue({ id: 'id', @@ -212,9 +312,9 @@ describe('legacyRules_notification_alert_type', () => { sampleEmptyDocSearchResults() ); - await alert.executor(payload); + await rule.executor(payload); - expect(alertServices.alertFactory.create).not.toHaveBeenCalled(); + expect(alertServices.alertsClient.report).not.toHaveBeenCalled(); }); it('should call scheduleActions if signalsCount was greater than 0', async () => { @@ -229,22 +329,32 @@ describe('legacyRules_notification_alert_type', () => { sampleDocSearchResultsNoSortIdNoVersion() ); - await alert.executor(payload); - - expect(alertServices.alertFactory.create).toHaveBeenCalled(); + await rule.executor(payload); - const [{ value: alertInstanceMock }] = alertServices.alertFactory.create.mock.results; - expect(alertInstanceMock.replaceState).toHaveBeenCalledWith( - expect.objectContaining({ signals_count: 100 }) - ); - expect(alertInstanceMock.scheduleActions).toHaveBeenCalledWith( - 'default', - expect.objectContaining({ - rule: expect.objectContaining({ - name: ruleAlert.name, - }), - }) - ); + expect(alertServices.alertsClient.report).toHaveBeenCalledWith({ + ...reported, + context: { + ...reported.context, + alerts: [ + { + '@timestamp': expect.any(String), + someKey: 'someValue', + }, + ], + results_link: + '/app/security/detections/rules/id/id?timerange=(global:(linkTo:!(timeline),timerange:(from:1576255233400,kind:absolute,to:1576341633400)),timeline:(linkTo:!(global),timerange:(from:1576255233400,kind:absolute,to:1576341633400)))', + rule: { + ...reported.context.rule, + id: 'id', + meta: { + someMeta: 'someField', + }, + }, + }, + state: { + signals_count: 100, + }, + }); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.ts similarity index 85% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.ts index 206444e82d7aab..5e237f85645591 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_rules_notification_rule_type.ts @@ -5,9 +5,11 @@ * 2.0. */ +import { mapKeys, snakeCase } from 'lodash/fp'; import type { Logger } from '@kbn/core/server'; import { parseScheduleDates } from '@kbn/securitysolution-io-ts-utils'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; +import { AlertsClientError, DEFAULT_AAD_CONFIG } from '@kbn/alerting-plugin/server'; import { DEFAULT_RULE_NOTIFICATION_QUERY_SIZE, LEGACY_NOTIFICATIONS_ID, @@ -15,12 +17,12 @@ import { } from '../../../../../../common/constants'; // eslint-disable-next-line no-restricted-imports -import type { LegacyNotificationAlertTypeDefinition } from './legacy_types'; +import type { LegacyNotificationRuleTypeDefinition } from './legacy_types'; // eslint-disable-next-line no-restricted-imports import { legacyRulesNotificationParams } from './legacy_types'; import type { AlertAttributes } from '../../../rule_types/types'; import { siemRuleActionGroups } from '../../../rule_types/utils/siem_rule_action_groups'; -import { scheduleNotificationActions } from './schedule_notification_actions'; +import { formatAlertsForNotificationActions } from './schedule_notification_actions'; import { getNotificationResultsLink } from './utils'; import { getSignals } from './get_signals'; // eslint-disable-next-line no-restricted-imports @@ -31,11 +33,11 @@ import { legacyInjectReferences } from './legacy_saved_object_references/legacy_ /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export const legacyRulesNotificationAlertType = ({ +export const legacyRulesNotificationRuleType = ({ logger, }: { logger: Logger; -}): LegacyNotificationAlertTypeDefinition => ({ +}): LegacyNotificationRuleTypeDefinition => ({ id: LEGACY_NOTIFICATIONS_ID, name: 'Security Solution notification (Legacy)', actionGroups: siemRuleActionGroups, @@ -52,6 +54,7 @@ export const legacyRulesNotificationAlertType = ({ }, minimumLicenseRequired: 'basic', isExportable: false, + alerts: DEFAULT_AAD_CONFIG, async executor({ startedAt, previousStartedAt, @@ -60,6 +63,11 @@ export const legacyRulesNotificationAlertType = ({ params, spaceId, }) { + const { alertsClient } = services; + if (!alertsClient) { + throw new AlertsClientError(); + } + const ruleAlertSavedObject = await services.savedObjectsClient.get( 'alert', params.ruleAlertId @@ -127,13 +135,17 @@ export const legacyRulesNotificationAlertType = ({ ); if (signalsCount !== 0) { - const alertInstance = services.alertFactory.create(ruleId); - scheduleNotificationActions({ - alertInstance, - signalsCount, - resultsLink, - ruleParams, - signals, + alertsClient.report({ + id: ruleId, + actionGroup: 'default', + state: { + signals_count: signalsCount, + }, + context: { + results_link: resultsLink, + rule: mapKeys(snakeCase, ruleParams), + alerts: formatAlertsForNotificationActions(signals), + }, }); } }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/README.md index 22e1da8dff5b30..09792ae0441bf0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/README.md +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/README.md @@ -2,7 +2,7 @@ This is where you add code when you have rules which contain saved object refere when you have "joins" in the saved objects between one saved object and another one. This can be a 1 to M (1 to many) relationship for example where you have a rule which contains the "id" of another saved object. -NOTE: This is the "legacy saved object references" and should only be for the "legacy_rules_notification_alert_type". +NOTE: This is the "legacy saved object references" and should only be for the "legacy_rules_notification_rule_type". The legacy notification system is being phased out and deprecated in favor of using the newer alerting notification system. It would be considered wrong to see additional code being added here at this point. However, maintenance should be expected until we have all users moved away from the legacy system. diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/legacy_extract_references.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/legacy_extract_references.ts index 069017fcabbcb5..c388422aedcf9d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/legacy_extract_references.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_saved_object_references/legacy_extract_references.ts @@ -30,7 +30,7 @@ import { legacyExtractRuleId } from './legacy_extract_rule_id'; * Optionally you can remove any parameters you do not want to store within the Saved Object here: * const paramsWithoutSavedObjectReferences = { removeParam, ...otherParams }; * - * If you do remove params, then update the types in: security_solution/server/lib/detection_engine/notifications/legacy_rules_notification_alert_type.ts + * If you do remove params, then update the types in: security_solution/server/lib/detection_engine/notifications/legacy_rules_notification_rule_type.ts * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function * @param logger Kibana injected logger * @param params The params of the base rule(s). diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_types.ts index 2aea76d8c51e18..824ad7573e10cd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/notifications/legacy_types.ts @@ -19,19 +19,20 @@ import type { RuleExecutorOptions, } from '@kbn/alerting-plugin/server'; import type { Rule, RuleAction } from '@kbn/alerting-plugin/common'; +import type { DefaultAlert } from '@kbn/alerts-as-data-utils'; import { LEGACY_NOTIFICATIONS_ID } from '../../../../../../common/constants'; /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export interface LegacyRuleNotificationAlertTypeParams extends RuleTypeParams { +export interface LegacyRuleNotificationRuleTypeParams extends RuleTypeParams { ruleAlertId: string; } /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export type LegacyRuleNotificationAlertType = Rule; +export type LegacyRuleNotificationRuleType = Rule; /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function @@ -81,35 +82,40 @@ export interface LegacyReadNotificationParams { /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export const legacyIsAlertType = ( - partialAlert: PartialRule -): partialAlert is LegacyRuleNotificationAlertType => { - return partialAlert.alertTypeId === LEGACY_NOTIFICATIONS_ID; +export const isLegacyRuleType = ( + partialRule: PartialRule +): partialRule is LegacyRuleNotificationRuleType => { + return partialRule.alertTypeId === LEGACY_NOTIFICATIONS_ID; }; /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ export type LegacyNotificationExecutorOptions = RuleExecutorOptions< - LegacyRuleNotificationAlertTypeParams, + LegacyRuleNotificationRuleTypeParams, RuleTypeState, AlertInstanceState, - AlertInstanceContext + AlertInstanceContext, + 'default', + DefaultAlert >; /** - * This returns true because by default a NotificationAlertTypeDefinition is an AlertType + * This returns true because by default a NotificationRuleTypeDefinition is an RuleType * since we are only increasing the strictness of params. * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export const legacyIsNotificationAlertExecutor = ( - obj: LegacyNotificationAlertTypeDefinition +export const isLegacyNotificationRuleExecutor = ( + obj: LegacyNotificationRuleTypeDefinition ): obj is RuleType< - LegacyRuleNotificationAlertTypeParams, - LegacyRuleNotificationAlertTypeParams, + LegacyRuleNotificationRuleTypeParams, + LegacyRuleNotificationRuleTypeParams, RuleTypeState, AlertInstanceState, - AlertInstanceContext + AlertInstanceContext, + 'default', + never, + DefaultAlert > => { return true; }; @@ -117,14 +123,16 @@ export const legacyIsNotificationAlertExecutor = ( /** * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function */ -export type LegacyNotificationAlertTypeDefinition = Omit< +export type LegacyNotificationRuleTypeDefinition = Omit< RuleType< - LegacyRuleNotificationAlertTypeParams, - LegacyRuleNotificationAlertTypeParams, + LegacyRuleNotificationRuleTypeParams, + LegacyRuleNotificationRuleTypeParams, RuleTypeState, AlertInstanceState, AlertInstanceContext, - 'default' + 'default', + never, + DefaultAlert >, 'executor' > & { @@ -136,17 +144,17 @@ export type LegacyNotificationAlertTypeDefinition = Omit< }; /** - * This is the notification type used within legacy_rules_notification_alert_type for the alert params. + * This is the notification type used within legacy_rules_notification_rule_type for the alert params. * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function - * @see legacy_rules_notification_alert_type + * @see legacy_rules_notification_rule_type */ export const legacyRulesNotificationParams = schema.object({ ruleAlertId: schema.string(), }); /** - * This legacy rules notification type used within legacy_rules_notification_alert_type for the alert params. + * This legacy rules notification type used within legacy_rules_notification_rule_type for the alert params. * @deprecated Once we are confident all rules relying on side-car actions SO's have been migrated to SO references we should remove this function - * @see legacy_rules_notification_alert_type + * @see legacy_rules_notification_rule_type */ export type LegacyRulesNotificationParams = TypeOf; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/post_legacy_notification.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/post_legacy_notification.sh index f160d1e899a556..317b9d8c0fafc9 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/post_legacy_notification.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/post_legacy_notification.sh @@ -20,6 +20,7 @@ NOTIFICATIONS=${2:-./legacy_notifications/one_action.json} curl -s -k \ -H 'Content-Type: application/json' \ -H 'kbn-xsrf: 123' \ + -H 'elastic-api-version: 1' \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X POST ${KIBANA_URL}${SPACE_URL}/internal/api/detection/legacy/notifications?alert_id="$1" \ -d @${NOTIFICATIONS} | jq . diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 27bdcfe796e766..ffe4e7a6e342b4 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -73,8 +73,8 @@ import type { } from './lib/detection_engine/rule_types/types'; // eslint-disable-next-line no-restricted-imports import { - legacyIsNotificationAlertExecutor, - legacyRulesNotificationAlertType, + isLegacyNotificationRuleExecutor, + legacyRulesNotificationRuleType, } from './lib/detection_engine/rule_actions_legacy'; import { createSecurityRuleTypeWrapper, @@ -354,9 +354,9 @@ export class Plugin implements ISecuritySolutionPlugin { ); if (plugins.alerting != null) { - const ruleNotificationType = legacyRulesNotificationAlertType({ logger }); + const ruleNotificationType = legacyRulesNotificationRuleType({ logger }); - if (legacyIsNotificationAlertExecutor(ruleNotificationType)) { + if (isLegacyNotificationRuleExecutor(ruleNotificationType)) { plugins.alerting.registerType(ruleNotificationType); } } diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/risk_score/all/index.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/risk_score/all/index.test.ts index b1e0d69f9c3c94..5af5ac8bb1a149 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/risk_score/all/index.test.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/risk_score/all/index.test.ts @@ -45,6 +45,10 @@ export const mockSearchStrategyResponse: IEsSearchResponse = { calculated_level: RiskSeverity.high, calculated_score_norm: 75, multipliers: [], + category_1_count: 10, + category_1_score: 20, + category_2_count: 1, + category_2_score: 10, }, }, }, diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 6f7afd7d124650..a7af8827c0efd5 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -7716,6 +7716,40 @@ } } } + }, + "muted_rules_stats": { + "type": "array", + "items": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "section": { + "type": "keyword" + }, + "benchmark_id": { + "type": "keyword" + }, + "benchmark_name": { + "type": "keyword" + }, + "benchmark_version": { + "type": "keyword" + }, + "rule_number": { + "type": "keyword" + }, + "posture_type": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + } } } }, diff --git a/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts b/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts index 7f91aaf93d8049..012fa07ca6f6cd 100644 --- a/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts +++ b/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts @@ -112,23 +112,48 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }); - const allHasSummaryField = response.body.sources.every((source) => { - if (source.documentType === 'transactionEvent') { - return true; - } + const allHasSummaryField = response.body.sources + .filter( + (source) => + source.documentType === ApmDocumentType.TransactionMetric && + source.rollupInterval !== RollupInterval.OneMinute + ) + .every((source) => { + return source.hasDurationSummaryField; + }); + expect(allHasSummaryField).to.eql(true); + }); + + it('does not support transaction.duration.summary when the field is not supported by all APM server versions', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/time_range_metadata', + params: { + query: { + start: startLegacy.toISOString(), + end: end.toISOString(), + enableContinuousRollups: true, + enableServiceTransactionMetrics: true, + useSpanName: false, + kuery: '', + }, + }, + }); + + const allHasSummaryField = response.body.sources.every((source) => { return source.hasDurationSummaryField; }); - expect(allHasSummaryField).to.eql(true); + expect(allHasSummaryField).to.eql(false); }); - it('does not have latency data for synth-java-legacy service', async () => { + it('does not have latency data for synth-java-legacy', async () => { const res = await getLatencyChartForService({ serviceName: 'synth-java-legacy', start, end, apmApiClient, + useDurationSummary: true, }); expect(res.body.currentPeriod.latencyTimeseries.map(({ y }) => y)).to.eql([ @@ -147,6 +172,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { start, end, apmApiClient, + useDurationSummary: true, }); expect(res.body.currentPeriod.latencyTimeseries.map(({ y }) => y)).to.eql([ @@ -169,11 +195,13 @@ function getLatencyChartForService({ start, end, apmApiClient, + useDurationSummary, }: { serviceName: string; start: moment.Moment; end: moment.Moment; apmApiClient: ApmApiClient; + useDurationSummary: boolean; }) { return apmApiClient.readUser({ endpoint: `GET /internal/apm/services/{serviceName}/transactions/charts/latency`, @@ -189,7 +217,7 @@ function getLatencyChartForService({ documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, bucketSizeInSeconds: 60, - useDurationSummary: true, + useDurationSummary, }, }, }); @@ -227,8 +255,9 @@ function generateTraceDataForService({ ); const apmPipeline = (base: Readable) => { - // @ts-expect-error - const defaultPipeline: NodeJS.ReadableStream = synthtrace.getDefaultPipeline()(base); + const defaultPipeline = synthtrace.getDefaultPipeline()( + base + ) as unknown as NodeJS.ReadableStream; return pipeline( defaultPipeline, diff --git a/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts b/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts index 32303b7b0bb4cc..6de17c22c2309e 100644 --- a/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts +++ b/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts @@ -11,8 +11,13 @@ import { omit, sortBy } from 'lodash'; import moment, { Moment } from 'moment'; import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; -import { deleteSummaryFieldTransform } from '@kbn/apm-synthtrace'; +import { + addObserverVersionTransform, + ApmSynthtraceEsClient, + deleteSummaryFieldTransform, +} from '@kbn/apm-synthtrace'; import { Readable, pipeline } from 'stream'; +import { ToolingLog } from '@kbn/tooling-log'; import { FtrProviderContext } from '../../common/ftr_provider_context'; export default function ApiTest({ getService }: FtrProviderContext) { @@ -85,27 +90,21 @@ export default function ApiTest({ getService }: FtrProviderContext) { const withSummaryFieldEnd = moment(withoutSummaryFieldEnd).add(2, 'hours'); before(async () => { - const previousTxEvents = getTransactionEvents( - withoutSummaryFieldStart, - withoutSummaryFieldEnd - ); - - const apmPipeline = (base: Readable) => { - // @ts-expect-error - const defaultPipeline: NodeJS.ReadableStream = - synthtraceEsClient.getDefaultPipeline()(base); - - return pipeline(defaultPipeline, deleteSummaryFieldTransform(), (err) => { - if (err) { - log.error(err); - } - }); - }; - - await synthtraceEsClient.index(previousTxEvents, apmPipeline); + await getTransactionEvents({ + start: withoutSummaryFieldStart, + end: withoutSummaryFieldEnd, + isLegacy: true, + synthtrace: synthtraceEsClient, + logger: log, + }); - const txEvents = getTransactionEvents(withSummaryFieldStart, withSummaryFieldEnd); - await synthtraceEsClient.index(txEvents); + await getTransactionEvents({ + start: withSummaryFieldStart, + end: withSummaryFieldEnd, + isLegacy: false, + synthtrace: synthtraceEsClient, + logger: log, + }); }); after(() => { @@ -123,7 +122,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { response.sources.filter( (source) => source.documentType === ApmDocumentType.TransactionMetric && - source.hasDurationSummaryField === true + source.hasDurationSummaryField ).length ).to.eql(3); }); @@ -138,9 +137,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { response.sources.filter( (source) => source.documentType === ApmDocumentType.TransactionMetric && - source.hasDurationSummaryField === false + !source.hasDurationSummaryField ).length - ).to.eql(3); + ).to.eql(2); }); }); }); @@ -494,7 +493,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, hasDocs: false, - hasDurationSummaryField: false, + hasDurationSummaryField: true, }, { documentType: ApmDocumentType.TransactionMetric, @@ -513,7 +512,19 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); } -function getTransactionEvents(start: Moment, end: Moment) { +function getTransactionEvents({ + start, + end, + synthtrace, + logger, + isLegacy = false, +}: { + start: Moment; + end: Moment; + synthtrace: ApmSynthtraceEsClient; + logger: ToolingLog; + isLegacy?: boolean; +}) { const serviceName = 'synth-go'; const transactionName = 'GET /api/product/list'; const GO_PROD_RATE = 15; @@ -523,7 +534,7 @@ function getTransactionEvents(start: Moment, end: Moment) { .service({ name: serviceName, environment: 'production', agentName: 'go' }) .instance('instance-a'); - return [ + const events = [ timerange(start, end) .interval('1m') .rate(GO_PROD_RATE) @@ -546,4 +557,23 @@ function getTransactionEvents(start: Moment, end: Moment) { .failure() ), ]; + + const apmPipeline = (base: Readable) => { + const defaultPipeline = synthtrace.getDefaultPipeline()( + base + ) as unknown as NodeJS.ReadableStream; + + return pipeline( + defaultPipeline, + addObserverVersionTransform('8.5.0'), + deleteSummaryFieldTransform(), + (err) => { + if (err) { + logger.error(err); + } + } + ); + }; + + return synthtrace.index(events, isLegacy ? apmPipeline : undefined); } diff --git a/x-pack/test/fleet_api_integration/apis/agents/list.ts b/x-pack/test/fleet_api_integration/apis/agents/list.ts index 4bf7e84d70e7f2..91796d5a9b9ddb 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/list.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/list.ts @@ -17,10 +17,8 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const es = getService('es'); let elasticAgentpkgVersion: string; - // Failing: See https://github.com/elastic/kibana/issues/170690 - // Failing: See https://github.com/elastic/kibana/issues/170690 - // Failing: See https://github.com/elastic/kibana/issues/170690 - describe.skip('fleet_list_agent', () => { + + describe('fleet_list_agent', () => { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/fleet/agents'); const getPkRes = await supertest @@ -159,6 +157,7 @@ export default function ({ getService }: FtrProviderContext) { dataset: 'elastic_agent.elastic_agent', }, elastic_agent: { id: 'agent1', process: 'elastic_agent' }, + component: { id: 'component1' }, system: { process: { memory: { @@ -179,6 +178,7 @@ export default function ({ getService }: FtrProviderContext) { document: { '@timestamp': new Date(now - 1 * 60 * 1000).toISOString(), elastic_agent: { id: 'agent1', process: 'elastic_agent' }, + component: { id: 'component2' }, data_stream: { namespace: 'default', type: 'metrics', diff --git a/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts b/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts index 06a67a13e425c1..a257ff97933d9d 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts @@ -41,43 +41,46 @@ export default function (providerContext: FtrProviderContext) { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); + const writeMetricsDoc = (namespace: string) => + es.transport.request( + { + method: 'POST', + path: `/${metricsTemplateName}-${namespace}/_doc?refresh=true`, + body: { + '@timestamp': new Date().toISOString(), + logs_test_name: 'test', + data_stream: { + dataset: `${pkgName}.test_metrics`, + namespace, + type: 'metrics', + }, + }, + }, + { meta: true } + ); + + const writeLogsDoc = (namespace: string) => + es.transport.request( + { + method: 'POST', + path: `/${logsTemplateName}-${namespace}/_doc?refresh=true`, + body: { + '@timestamp': new Date().toISOString(), + logs_test_name: 'test', + data_stream: { + dataset: `${pkgName}.test_logs`, + namespace, + type: 'logs', + }, + }, + }, + { meta: true } + ); beforeEach(async () => { await installPackage(pkgName, pkgVersion); await Promise.all( namespaces.map(async (namespace) => { - const createLogsRequest = es.transport.request( - { - method: 'POST', - path: `/${logsTemplateName}-${namespace}/_doc`, - body: { - '@timestamp': '2015-01-01', - logs_test_name: 'test', - data_stream: { - dataset: `${pkgName}.test_logs`, - namespace, - type: 'logs', - }, - }, - }, - { meta: true } - ); - const createMetricsRequest = es.transport.request( - { - method: 'POST', - path: `/${metricsTemplateName}-${namespace}/_doc`, - body: { - '@timestamp': '2015-01-01', - logs_test_name: 'test', - data_stream: { - dataset: `${pkgName}.test_metrics`, - namespace, - type: 'metrics', - }, - }, - }, - { meta: true } - ); - return Promise.all([createLogsRequest, createMetricsRequest]); + return Promise.all([writeLogsDoc(namespace), writeMetricsDoc(namespace)]); }) ); }); @@ -141,7 +144,11 @@ export default function (providerContext: FtrProviderContext) { it('after update, it should have rolled over logs datastream because mappings are not compatible and not metrics', async function () { await installPackage(pkgName, pkgUpdateVersion); + await asyncForEach(namespaces, async (namespace) => { + // write doc as rollover is lazy + await writeLogsDoc(namespace); + await writeMetricsDoc(namespace); const resLogsDatastream = await es.transport.request( { method: 'GET', @@ -266,6 +273,8 @@ export default function (providerContext: FtrProviderContext) { }) .expect(200); + // Write a doc to trigger lazy rollover + await writeLogsDoc('default'); // Datastream should have been rolled over expect(await getLogsDefaultBackingIndicesLength()).to.be(2); }); @@ -303,26 +312,29 @@ export default function (providerContext: FtrProviderContext) { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); - beforeEach(async () => { - await installPackage(pkgName, pkgVersion); - - // Create a sample document so the data stream is created - await es.transport.request( + const writeMetricDoc = (body: any = {}) => + es.transport.request( { method: 'POST', - path: `/${metricsTemplateName}-${namespace}/_doc`, + path: `/${metricsTemplateName}-${namespace}/_doc?refresh=true`, body: { - '@timestamp': '2015-01-01', + '@timestamp': new Date().toISOString(), logs_test_name: 'test', data_stream: { dataset: `${pkgName}.test_logs`, namespace, type: 'logs', }, + ...body, }, }, { meta: true } ); + beforeEach(async () => { + await installPackage(pkgName, pkgVersion); + + // Create a sample document so the data stream is created + await writeMetricDoc(); }); afterEach(async () => { @@ -340,6 +352,10 @@ export default function (providerContext: FtrProviderContext) { it('rolls over data stream when index_mode: time_series is set in the updated package version', async () => { await installPackage(pkgName, pkgUpdateVersion); + // Write a doc so lazy rollover can happen + await writeMetricDoc({ + some_field: 'test', + }); const resMetricsDatastream = await es.transport.request( { method: 'GET', diff --git a/x-pack/test/fleet_api_integration/apis/epm/get.ts b/x-pack/test/fleet_api_integration/apis/epm/get.ts index 045a6d034a0a08..7b79272bbef0bb 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/get.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/get.ts @@ -13,6 +13,7 @@ import { FtrProviderContext } from '../../../api_integration/ftr_provider_contex import { skipIfNoDockerRegistry } from '../../helpers'; import { setupFleetAndAgents } from '../agents/services'; import { testUsers } from '../test_users'; +import { bundlePackage, removeBundledPackages } from './install_bundled'; export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; @@ -22,6 +23,7 @@ export default function (providerContext: FtrProviderContext) { const testPkgName = 'apache'; const testPkgVersion = '0.1.4'; + const log = getService('log'); const uninstallPackage = async (name: string, version: string) => { await supertest.delete(`/api/fleet/epm/packages/${name}/${version}`).set('kbn-xsrf', 'xxxx'); @@ -38,8 +40,7 @@ export default function (providerContext: FtrProviderContext) { '../fixtures/direct_upload_packages/apache_0.1.4.zip' ); - // FLAKY: https://github.com/elastic/kibana/issues/163203 - describe.skip('EPM - get', () => { + describe('EPM - get', () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -114,6 +115,7 @@ export default function (providerContext: FtrProviderContext) { before(async () => { await installPackage(testPkgName, testPkgVersion); await installPackage('experimental', '0.1.0'); + await bundlePackage('endpoint-8.6.1'); await installPackage('endpoint', '8.6.1'); }); after(async () => { @@ -121,6 +123,9 @@ export default function (providerContext: FtrProviderContext) { await uninstallPackage('experimental', '0.1.0'); await uninstallPackage('endpoint', '8.6.1'); }); + after(async () => { + await removeBundledPackages(log); + }); it('Allows the fetching of installed packages', async () => { const res = await supertest.get(`/api/fleet/epm/packages/installed`).expect(200); const packages = res.body.items; diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts index 3fdb609129994d..4b91e8ac88e54c 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts @@ -9,58 +9,59 @@ import expect from '@kbn/expect'; import fs from 'fs/promises'; import path from 'path'; +import { ToolingLog } from '@kbn/tooling-log'; import { BUNDLED_PACKAGE_DIR } from '../../config.base'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { skipIfNoDockerRegistry } from '../../helpers'; import { setupFleetAndAgents } from '../agents/services'; -export default function (providerContext: FtrProviderContext) { - const { getService } = providerContext; - const supertest = getService('supertest'); - const log = getService('log'); - - const BUNDLED_PACKAGE_FIXTURES_DIR = path.join( - path.dirname(__filename), - '../fixtures/bundled_packages' +const BUNDLED_PACKAGE_FIXTURES_DIR = path.join( + path.dirname(__filename), + '../fixtures/bundled_packages' +); + +export const bundlePackage = async (name: string) => { + try { + await fs.access(BUNDLED_PACKAGE_DIR); + } catch (error) { + await fs.mkdir(BUNDLED_PACKAGE_DIR); + } + + await fs.copyFile( + path.join(BUNDLED_PACKAGE_FIXTURES_DIR, `${name}.zip`), + path.join(BUNDLED_PACKAGE_DIR, `${name}.zip`) ); +}; - const bundlePackage = async (name: string) => { - try { - await fs.access(BUNDLED_PACKAGE_DIR); - } catch (error) { - await fs.mkdir(BUNDLED_PACKAGE_DIR); - } - - await fs.copyFile( - path.join(BUNDLED_PACKAGE_FIXTURES_DIR, `${name}.zip`), - path.join(BUNDLED_PACKAGE_DIR, `${name}.zip`) - ); - }; +export const removeBundledPackages = async (log: ToolingLog) => { + try { + const files = await fs.readdir(BUNDLED_PACKAGE_DIR); - const removeBundledPackages = async () => { - try { - const files = await fs.readdir(BUNDLED_PACKAGE_DIR); + for (const file of files) { + const isFixtureFile = !!(await fs.readFile(path.join(BUNDLED_PACKAGE_FIXTURES_DIR, file))); - for (const file of files) { - const isFixtureFile = !!(await fs.readFile(path.join(BUNDLED_PACKAGE_FIXTURES_DIR, file))); - - // Only remove fixture files - leave normal bundled packages in place - if (isFixtureFile) { - await fs.unlink(path.join(BUNDLED_PACKAGE_DIR, file)); - } + // Only remove fixture files - leave normal bundled packages in place + if (isFixtureFile) { + await fs.unlink(path.join(BUNDLED_PACKAGE_DIR, file)); } - } catch (error) { - log.error('Error removing bundled packages'); - log.error(error); } - }; + } catch (error) { + log.error('Error removing bundled packages'); + log.error(error); + } +}; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const log = getService('log'); describe('installing bundled packages', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); afterEach(async () => { - await removeBundledPackages(); + await removeBundledPackages(log); }); describe('without registry', () => { diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts b/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts index 892f89f7c2bb6e..a4f313383f06c6 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_endpoint.ts @@ -9,14 +9,14 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { skipIfNoDockerRegistry } from '../../helpers'; import { setupFleetAndAgents } from '../agents/services'; +import { bundlePackage, removeBundledPackages } from './install_bundled'; export default function (providerContext: FtrProviderContext) { /** * There are a few features that are only currently supported for the Endpoint * package due to security concerns. */ - // Failing: See https://github.com/elastic/kibana/issues/156941 - describe.skip('Install endpoint package', () => { + describe('Install endpoint package', () => { const { getService } = providerContext; skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -25,8 +25,9 @@ export default function (providerContext: FtrProviderContext) { const dockerServers = getService('dockerServers'); const server = dockerServers.get('registry'); const es = getService('es'); + const log = getService('log'); const pkgName = 'endpoint'; - let pkgVersion: string; + const pkgVersion = '8.6.1'; const transforms = [ { @@ -39,12 +40,21 @@ export default function (providerContext: FtrProviderContext) { }, ]; + const installPackage = async (name: string, version: string) => { + await supertest + .post(`/api/fleet/epm/packages/${name}/${version}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }); + }; + before(async () => { if (!server.enabled) return; - // The latest endpoint package is already installed by default in our FTR config, - // just get the most recent version number. - const getResp = await supertest.get(`/api/fleet/epm/packages/${pkgName}`).expect(200); - pkgVersion = getResp.body.response.version; + await bundlePackage('endpoint-8.6.1'); + await installPackage('endpoint', '8.6.1'); + }); + after(async () => { + await uninstallPackage('endpoint', '8.6.1'); + await removeBundledPackages(log); }); describe('install', () => { diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts b/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts index 2fe976352944a5..2ec6fb92000e37 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_hidden_datastreams.ts @@ -34,46 +34,50 @@ export default function (providerContext: FtrProviderContext) { .send({ force: true }) .expect(200); - await es.index({ - index: 'metrics-apm.service_summary.10m-default', - document: { - '@timestamp': '2023-05-30T07:50:00.000Z', - agent: { - name: 'go', - }, - data_stream: { - dataset: 'apm.service_summary.10m', - namespace: 'default', - type: 'metrics', - }, - ecs: { - version: '8.6.0-dev', - }, - event: { - agent_id_status: 'missing', - ingested: '2023-05-30T07:57:12Z', - }, - metricset: { - interval: '10m', - name: 'service_summary', - }, - observer: { - hostname: '047e282994fb', - type: 'apm-server', - version: '8.7.0', - }, - processor: { - event: 'metric', - name: 'metric', - }, - service: { - language: { + const writeDoc = () => + es.index({ + refresh: true, + index: 'metrics-apm.service_summary.10m-default', + document: { + '@timestamp': '2023-05-30T07:50:00.000Z', + agent: { name: 'go', }, - name: '___main_elastic_cloud_87_ilm_fix', + data_stream: { + dataset: 'apm.service_summary.10m', + namespace: 'default', + type: 'metrics', + }, + ecs: { + version: '8.6.0-dev', + }, + event: { + agent_id_status: 'missing', + ingested: '2023-05-30T07:57:12Z', + }, + metricset: { + interval: '10m', + name: 'service_summary', + }, + observer: { + hostname: '047e282994fb', + type: 'apm-server', + version: '8.7.0', + }, + processor: { + event: 'metric', + name: 'metric', + }, + service: { + language: { + name: 'go', + }, + name: '___main_elastic_cloud_87_ilm_fix', + }, }, - }, - }); + }); + + await writeDoc(); await supertest .post(`/api/fleet/epm/packages/apm/8.8.0`) @@ -81,6 +85,8 @@ export default function (providerContext: FtrProviderContext) { .send({ force: true }) .expect(200); + // Rollover are lazy need to write a new doc + await writeDoc(); const ds = await es.indices.get({ index: 'metrics-apm.service_summary*', expand_wildcards: ['open', 'hidden'], diff --git a/x-pack/test/fleet_api_integration/apis/epm/list.ts b/x-pack/test/fleet_api_integration/apis/epm/list.ts index e07c215e4ad9f5..6bccbc37a678c7 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/list.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/list.ts @@ -10,6 +10,7 @@ import { FtrProviderContext } from '../../../api_integration/ftr_provider_contex import { skipIfNoDockerRegistry } from '../../helpers'; import { setupFleetAndAgents } from '../agents/services'; import { testUsers } from '../test_users'; +import { bundlePackage, removeBundledPackages } from './install_bundled'; export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; @@ -21,9 +22,9 @@ export default function (providerContext: FtrProviderContext) { // because `this` has to point to the Mocha context // see https://mochajs.org/#arrow-functions - // FLAKY: https://github.com/elastic/kibana/issues/167188 - describe.skip('EPM - list', async function () { + describe('EPM - list', async function () { skipIfNoDockerRegistry(providerContext); + const log = getService('log'); before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); @@ -32,6 +33,9 @@ export default function (providerContext: FtrProviderContext) { after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); }); + after(async () => { + await removeBundledPackages(log); + }); describe('list api tests', async () => { it('lists all packages from the registry', async function () { @@ -47,6 +51,7 @@ export default function (providerContext: FtrProviderContext) { }); it('lists all limited packages from the registry', async function () { + await bundlePackage('endpoint-8.6.1'); const fetchLimitedPackageList = async () => { const response = await supertest .get('/api/fleet/epm/packages/limited') diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/endpoint-8.6.1.zip b/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/endpoint-8.6.1.zip new file mode 100644 index 00000000000000..4c20854aee729c Binary files /dev/null and b/x-pack/test/fleet_api_integration/apis/fixtures/bundled_packages/endpoint-8.6.1.zip differ diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/maintenance_windows/create_window.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/maintenance_windows/create_window.ts index 00cc131bca2c55..b53ae05bc867cd 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/maintenance_windows/create_window.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/maintenance_windows/create_window.ts @@ -26,7 +26,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'create-maintenance-window', screenshotDirectories, 1400, - 1024 + 1600 + ); + const filterAlerts = await find.byCssSelector( + '[data-test-subj="maintenanceWindowScopedQuerySwitch"] .euiSwitch__button' + ); + await filterAlerts.click(); + await commonScreenshots.takeScreenshot( + 'create-maintenance-window-filter', + screenshotDirectories, + 1400, + 1600 ); const cancelButton = await testSubjects.find('cancelMaintenanceWindow'); await cancelButton.click(); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/legacy_actions/get_legacy_action_notifications_so_by_id.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/legacy_actions/get_legacy_action_notifications_so_by_id.ts index 3d92779e010d2b..bed1197fc91ee0 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/legacy_actions/get_legacy_action_notifications_so_by_id.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/actions/legacy_actions/get_legacy_action_notifications_so_by_id.ts @@ -9,9 +9,9 @@ import type { Client } from '@elastic/elasticsearch'; import type { SearchResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; import { SavedObjectReference } from '@kbn/core/server'; -import { LegacyRuleNotificationAlertTypeParams } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_actions_legacy'; +import { LegacyRuleNotificationRuleTypeParams } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_actions_legacy'; -interface LegacyActionNotificationSO extends LegacyRuleNotificationAlertTypeParams { +interface LegacyActionNotificationSO extends LegacyRuleNotificationRuleTypeParams { references: SavedObjectReference[]; } diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts index 351cb601c481e2..903ca0c087ed32 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts @@ -6,9 +6,11 @@ */ import { visitWithTimeRange } from '../../../../tasks/navigation'; -import { TIMELINE_TITLE } from '../../../../screens/timeline'; import { BASIC_TABLE_LOADING } from '../../../../screens/common'; -import { goToSavedObjectSettings } from '../../../../tasks/stack_management'; +import { + clickSavedObjectTagsFilter, + goToSavedObjectSettings, +} from '../../../../tasks/stack_management'; import { navigateFromKibanaCollapsibleTo, openKibanaNavigation, @@ -31,9 +33,9 @@ import { import { updateDateRangeInLocalDatePickers } from '../../../../tasks/date_picker'; import { login } from '../../../../tasks/login'; import { - addDescriptionToTimeline, addNameToTimelineAndSave, createNewTimeline, + createTimelineOptionsPopoverBottomBar, goToEsqlTab, openTimelineById, openTimelineFromSettings, @@ -43,15 +45,10 @@ import { STACK_MANAGEMENT_PAGE } from '../../../../screens/kibana_navigation'; import { GET_SAVED_OBJECTS_TAGS_OPTION, SAVED_OBJECTS_ROW_TITLES, - SAVED_OBJECTS_TAGS_FILTER, } from '../../../../screens/common/stack_management'; const INITIAL_START_DATE = 'Jan 18, 2021 @ 20:33:29.186'; const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; -const SAVED_SEARCH_UPDATE_REQ = 'SAVED_SEARCH_UPDATE_REQ'; -const SAVED_SEARCH_UPDATE_WITH_DESCRIPTION = 'SAVED_SEARCH_UPDATE_WITH_DESCRIPTION'; -const SAVED_SEARCH_CREATE_REQ = 'SAVED_SEARCH_CREATE_REQ'; -const SAVED_SEARCH_GET_REQ = 'SAVED_SEARCH_GET_REQ'; const TIMELINE_REQ_WITH_SAVED_SEARCH = 'TIMELINE_REQ_WITH_SAVED_SEARCH'; const TIMELINE_PATCH_REQ = 'TIMELINE_PATCH_REQ'; @@ -59,59 +56,37 @@ const TIMELINE_RESPONSE_SAVED_OBJECT_ID_PATH = 'response.body.data.persistTimeline.timeline.savedObjectId'; const esqlQuery = 'from auditbeat-* | where ecs.version == "8.0.0"'; -// FLAKY: https://github.com/elastic/kibana/issues/168745 -describe.skip( +const handleIntercepts = () => { + cy.intercept('PATCH', '/api/timeline', (req) => { + if (req.body.hasOwnProperty('timeline') && req.body.timeline.savedSearchId === null) { + req.alias = TIMELINE_PATCH_REQ; + } + }); + cy.intercept('PATCH', '/api/timeline', (req) => { + if (req.body.hasOwnProperty('timeline') && req.body.timeline.savedSearchId !== null) { + req.alias = TIMELINE_REQ_WITH_SAVED_SEARCH; + } + }); +}; + +describe( 'Discover Timeline State Integration', { tags: ['@ess', '@brokenInServerless'], - // ESQL and test involving STACK_MANAGEMENT_PAGE are broken in serverless }, () => { beforeEach(() => { - cy.intercept('PATCH', '/api/timeline', (req) => { - if (req.body.hasOwnProperty('timeline') && req.body.timeline.savedSearchId === null) { - req.alias = TIMELINE_PATCH_REQ; - } - }); - cy.intercept('PATCH', '/api/timeline', (req) => { - if (req.body.hasOwnProperty('timeline') && req.body.timeline.savedSearchId !== null) { - req.alias = TIMELINE_REQ_WITH_SAVED_SEARCH; - } - }); - cy.intercept('POST', '/api/content_management/rpc/get', (req) => { - if (req.body.hasOwnProperty('contentTypeId') && req.body.contentTypeId === 'search') { - req.alias = SAVED_SEARCH_GET_REQ; - } - }); - cy.intercept('POST', '/api/content_management/rpc/create', (req) => { - if (req.body.hasOwnProperty('contentTypeId') && req.body.contentTypeId === 'search') { - req.alias = SAVED_SEARCH_CREATE_REQ; - } - }); - - cy.intercept('POST', '/api/content_management/rpc/update', (req) => { - if (req.body.hasOwnProperty('contentTypeId') && req.body.contentTypeId === 'search') { - req.alias = SAVED_SEARCH_UPDATE_REQ; - } - }); - cy.intercept('POST', '/api/content_management/rpc/update', (req) => { - if ( - req.body.hasOwnProperty('data') && - req.body.data.hasOwnProperty('description') && - req.body.data.description.length > 0 - ) { - req.alias = SAVED_SEARCH_UPDATE_WITH_DESCRIPTION; - } - }); login(); visitWithTimeRange(ALERTS_URL); - createNewTimeline(); + createTimelineOptionsPopoverBottomBar(); goToEsqlTab(); updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); + handleIntercepts(); }); - context('save/restore', () => { - it('should be able create an empty timeline with default discover state', () => { + + describe('ESQL tab state', () => { + it('should be able create an empty timeline with default esql tab state', () => { addNameToTimelineAndSave('Timerange timeline'); createNewTimeline(); goToEsqlTab(); @@ -120,7 +95,7 @@ describe.skip( `Last 15 minutes` ); }); - it('should save/restore discover dataview/timerange/filter/query/columns when saving/resoring timeline', () => { + it('should save/restore esql tab dataview/timerange/filter/query/columns when saving/resoring timeline', () => { const timelineSuffix = Date.now(); const timelineName = `DataView timeline-${timelineSuffix}`; const column1 = 'event.category'; @@ -151,7 +126,7 @@ describe.skip( ); }); }); - it('should save/restore discover dataview/timerange/filter/query/columns when timeline is opened via url', () => { + it('should save/restore esql tab dataview/timerange/filter/query/columns when timeline is opened via url', () => { const timelineSuffix = Date.now(); const timelineName = `DataView timeline-${timelineSuffix}`; const column1 = 'event.category'; @@ -177,7 +152,7 @@ describe.skip( ); }); }); - it('should save/restore discover ES|QL when saving timeline', () => { + it('should save/restore esql tab ES|QL when saving timeline', () => { const timelineSuffix = Date.now(); const timelineName = `ES|QL timeline-${timelineSuffix}`; addNameToTimelineAndSave(timelineName); @@ -196,60 +171,51 @@ describe.skip( }); }); }); - /* - * skipping because it is @brokenInServerless and this cypress tag was somehow not working - * so skipping this test both in ess and serverless. - * - * Raised issue: https://github.com/elastic/kibana/issues/165913 - * - * */ - context.skip('saved search tags', () => { - it('should save discover saved search with `Security Solution` tag', () => { + + describe('Discover saved search state for ESQL tab', () => { + it('should save esql tab saved search with `Security Solution` tag', () => { const timelineSuffix = Date.now(); const timelineName = `SavedObject timeline-${timelineSuffix}`; addDiscoverEsqlQuery(esqlQuery); addNameToTimelineAndSave(timelineName); cy.wait(`@${TIMELINE_REQ_WITH_SAVED_SEARCH}`); + cy.get(LOADING_INDICATOR).should('not.exist'); openKibanaNavigation(); navigateFromKibanaCollapsibleTo(STACK_MANAGEMENT_PAGE); cy.get(LOADING_INDICATOR).should('not.exist'); goToSavedObjectSettings(); cy.get(LOADING_INDICATOR).should('not.exist'); - cy.get(SAVED_OBJECTS_TAGS_FILTER).trigger('click'); + clickSavedObjectTagsFilter(); cy.get(GET_SAVED_OBJECTS_TAGS_OPTION('Security_Solution')).trigger('click'); cy.get(BASIC_TABLE_LOADING).should('not.exist'); cy.get(SAVED_OBJECTS_ROW_TITLES).should( 'contain.text', - `Saved Search for timeline - ${timelineName}` + `Saved search for timeline - ${timelineName}` ); }); - }); - context('saved search', () => { + it('should rename the saved search on timeline rename', () => { - const timelineSuffix = Date.now(); - const timelineName = `Rename timeline-${timelineSuffix}`; + const initialTimelineSuffix = Date.now(); + const initialTimelineName = `Timeline-${initialTimelineSuffix}`; addDiscoverEsqlQuery(esqlQuery); - - addNameToTimelineAndSave(timelineName); - cy.wait(`@${TIMELINE_PATCH_REQ}`) - .its(TIMELINE_RESPONSE_SAVED_OBJECT_ID_PATH) - .then((timelineId) => { - cy.wait(`@${SAVED_SEARCH_UPDATE_REQ}`); - cy.wait(`@${TIMELINE_REQ_WITH_SAVED_SEARCH}`); - // create an empty timeline - createNewTimeline(); - // switch to old timeline - openTimelineFromSettings(); - openTimelineById(timelineId); - cy.get(TIMELINE_TITLE).should('have.text', timelineName); - const timelineDesc = 'Timeline Description with Saved Seach'; - addDescriptionToTimeline(timelineDesc); - cy.wait(`@${SAVED_SEARCH_UPDATE_WITH_DESCRIPTION}`, { - timeout: 30000, - }).then((interception) => { - expect(interception.request.body.data.description).eq(timelineDesc); - }); - }); + addNameToTimelineAndSave(initialTimelineName); + cy.get(LOADING_INDICATOR).should('not.exist'); + const timelineSuffix = Date.now(); + const renamedTimelineName = `Rename timeline-${timelineSuffix}`; + addNameToTimelineAndSave(renamedTimelineName); + cy.wait(`@${TIMELINE_REQ_WITH_SAVED_SEARCH}`); + openKibanaNavigation(); + navigateFromKibanaCollapsibleTo(STACK_MANAGEMENT_PAGE); + cy.get(LOADING_INDICATOR).should('not.exist'); + goToSavedObjectSettings(); + cy.get(LOADING_INDICATOR).should('not.exist'); + clickSavedObjectTagsFilter(); + cy.get(GET_SAVED_OBJECTS_TAGS_OPTION('Security_Solution')).trigger('click'); + cy.get(BASIC_TABLE_LOADING).should('not.exist'); + cy.get(SAVED_OBJECTS_ROW_TITLES).should( + 'contain.text', + `Saved search for timeline - ${renamedTimelineName}` + ); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts index 21a20a7027a12f..ff0bbac6866cdb 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts @@ -85,7 +85,7 @@ export const waitForTableToLoad = () => { export const waitForTabToBeLoaded = (tabId: string) => { recurse( - () => cy.get(tabId).should('be.visible').click(), + () => cy.get(tabId).click(), ($el) => expect($el).to.have.class('euiTab-isSelected'), { delay: 500, diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts b/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts index 95fd6d8583217c..f3609596e2888d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts @@ -60,7 +60,7 @@ export const addDiscoverEsqlQuery = (esqlQuery: string) => { selectCurrentDiscoverEsqlQuery(DISCOVER_ESQL_EDITABLE_INPUT); cy.get(DISCOVER_ESQL_EDITABLE_INPUT).type(`${esqlQuery}`); cy.get(DISCOVER_ESQL_EDITABLE_INPUT).blur(); - cy.get(GET_LOCAL_SEARCH_BAR_SUBMIT_BUTTON(DISCOVER_CONTAINER)).realClick(); + cy.get(GET_LOCAL_SEARCH_BAR_SUBMIT_BUTTON(DISCOVER_CONTAINER)).click(); }; export const convertEditorNonBreakingSpaceToSpace = (str: string) => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/stack_management.ts b/x-pack/test/security_solution_cypress/cypress/tasks/stack_management.ts index 4c53443c13ae19..9bc0f6360c88e3 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/stack_management.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/stack_management.ts @@ -5,10 +5,15 @@ * 2.0. */ -import { SAVED_OBJECTS_SETTINGS } from '../screens/common/stack_management'; +import { + SAVED_OBJECTS_SETTINGS, + SAVED_OBJECTS_TAGS_FILTER, +} from '../screens/common/stack_management'; export const goToSavedObjectSettings = () => { - cy.get(SAVED_OBJECTS_SETTINGS).scrollIntoView(); - cy.get(SAVED_OBJECTS_SETTINGS).should('be.visible').focus(); - cy.get(SAVED_OBJECTS_SETTINGS).should('be.visible').click(); + cy.get(SAVED_OBJECTS_SETTINGS).click(); +}; + +export const clickSavedObjectTagsFilter = () => { + cy.get(SAVED_OBJECTS_TAGS_FILTER).trigger('click'); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts index d8543ec852c17f..40ee5c4f29961e 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts @@ -288,7 +288,7 @@ export const attachTimelineToExistingCase = () => { const clickIdHoverActionOverflowButton = () => { cy.get(ID_HOVER_ACTION_OVERFLOW_BTN).should('exist'); - cy.get(ID_HOVER_ACTION_OVERFLOW_BTN).click({ force: true }); + cy.get(ID_HOVER_ACTION_OVERFLOW_BTN).click(); }; export const clickIdToggleField = () => { @@ -311,19 +311,31 @@ export const createNewTimeline = () => { }; export const openCreateTimelineOptionsPopover = () => { - cy.get(NEW_TIMELINE_ACTION).filter(':visible').should('be.visible').click(); + cy.get(NEW_TIMELINE_ACTION).filter(':visible').click(); +}; + +export const createTimelineOptionsPopoverBottomBar = () => { + recurse( + () => { + cy.get(TIMELINE_SETTINGS_ICON).filter(':visible').click(); + return cy.get(CREATE_NEW_TIMELINE).eq(0); + }, + (sub) => sub.is(':visible') + ); + + cy.get(CREATE_NEW_TIMELINE).eq(0).click(); }; export const createTimelineTemplateOptionsPopoverBottomBar = () => { recurse( () => { - cy.get(TIMELINE_SETTINGS_ICON).filter(':visible').should('be.visible').click(); + cy.get(TIMELINE_SETTINGS_ICON).filter(':visible').click(); return cy.get(CREATE_NEW_TIMELINE_TEMPLATE).eq(0); }, (sub) => sub.is(':visible') ); - cy.get(CREATE_NEW_TIMELINE_TEMPLATE).eq(0).should('be.visible').click(); + cy.get(CREATE_NEW_TIMELINE_TEMPLATE).eq(0).click(); }; export const createNewTimelineTemplate = () => { @@ -341,7 +353,7 @@ export const executeTimelineSearch = (query: string) => { }; export const expandFirstTimelineEventDetails = () => { - cy.get(TOGGLE_TIMELINE_EXPAND_EVENT).first().click({ force: true }); + cy.get(TOGGLE_TIMELINE_EXPAND_EVENT).first().click(); }; /** @@ -375,7 +387,7 @@ export const openTimelineFieldsBrowser = () => { export const openTimelineInspectButton = () => { cy.get(TIMELINE_INSPECT_BUTTON).should('not.be.disabled'); - cy.get(TIMELINE_INSPECT_BUTTON).click({ force: true }); + cy.get(TIMELINE_INSPECT_BUTTON).click(); }; export const openTimelineFromSettings = () => { @@ -417,7 +429,7 @@ export const populateTimeline = () => { const clickTimestampHoverActionOverflowButton = () => { cy.get(TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN).should('exist'); - cy.get(TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN).click({ force: true }); + cy.get(TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN).click(); }; export const clickTimestampToggleField = () => { @@ -425,7 +437,7 @@ export const clickTimestampToggleField = () => { cy.get(TIMESTAMP_TOGGLE_FIELD).should('exist'); - cy.get(TIMESTAMP_TOGGLE_FIELD).click({ force: true }); + cy.get(TIMESTAMP_TOGGLE_FIELD).click(); }; export const removeColumn = (columnName: string) => { @@ -436,7 +448,7 @@ export const removeColumn = (columnName: string) => { }; export const resetFields = () => { - cy.get(RESET_FIELDS).click({ force: true }); + cy.get(RESET_FIELDS).click(); }; export const selectCase = (caseId: string) => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts index 338017829e9f09..019971104973fd 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timelines.ts @@ -31,17 +31,15 @@ export const expandNotes = () => { export const importTimeline = (timeline: string) => { cy.get(IMPORT_TIMELINE_BTN).click(); - cy.get(INPUT_FILE).click({ force: true }); + cy.get(INPUT_FILE).click(); cy.get(INPUT_FILE).attachFile(timeline); cy.get(INPUT_FILE).trigger('change'); - cy.get(IMPORT_BTN).last().click({ force: true }); + cy.get(IMPORT_BTN).last().click(); cy.get(INPUT_FILE).should('not.exist'); }; export const openTimeline = (id?: string) => { - cy.get(id ? TIMELINE(id) : TIMELINE_NAME) - .should('be.visible') - .click(); + cy.get(id ? TIMELINE(id) : TIMELINE_NAME).click(); }; export const waitForTimelinesPanelToBeLoaded = () => { diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts index 8647d418a6395e..dd927c68593dd4 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts @@ -28,8 +28,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const unzipPromisify = promisify(unzip); const comboBox = getService('comboBox'); - // FLAKY: https://github.com/elastic/kibana/issues/173184 - describe.skip('Endpoint Exceptions', function () { + describe('Endpoint Exceptions', function () { targetTags(this, ['@ess', '@serverless']); this.timeout(10 * 60_000); diff --git a/x-pack/test_serverless/functional/config.base.ts b/x-pack/test_serverless/functional/config.base.ts index 501a23c2580467..51227434fd3776 100644 --- a/x-pack/test_serverless/functional/config.base.ts +++ b/x-pack/test_serverless/functional/config.base.ts @@ -107,6 +107,9 @@ export function createTestConfig(options: CreateTestConfigOptions) { pathname: '/app/dev_tools', hash: '/searchprofiler', }, + maintenanceWindows: { + pathname: '/app/management/insightsAndAlerting/maintenanceWindows', + }, }, // choose where screenshots should be saved screenshots: { diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/index.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/index.ts index 10b33b5fc944d1..a8da8791a972a6 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/index.ts @@ -27,5 +27,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./cases')); loadTestFile(require.resolve('./connectors')); + loadTestFile(require.resolve('./maintenance_windows')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts new file mode 100644 index 00000000000000..db43127a0adcff --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts @@ -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 { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects(['common', 'header', 'svlCommonPage']); + const svlCommonScreenshots = getService('svlCommonScreenshots'); + const screenshotDirectories = ['response_ops_docs', 'observability_maintenace_windows']; + const find = getService('find'); + const testSubjects = getService('testSubjects'); + + describe('create window', function () { + beforeEach(async () => { + await pageObjects.svlCommonPage.login(); + }); + + after(async () => { + await pageObjects.svlCommonPage.forceLogout(); + }); + + it('create maintenance window screenshot', async () => { + await pageObjects.common.navigateToApp('maintenanceWindows'); + await pageObjects.header.waitUntilLoadingHasFinished(); + const createButton = await find.byCssSelector( + '[data-test-subj="mw-empty-prompt"] .euiButton' + ); + await createButton.click(); + await svlCommonScreenshots.takeScreenshot( + 'create-maintenance-window', + screenshotDirectories, + 1400, + 1600 + ); + const filterAlerts = await find.byCssSelector( + '[data-test-subj="maintenanceWindowScopedQuerySwitch"] .euiSwitch__button' + ); + await filterAlerts.click(); + const radioGroup = await testSubjects.find('maintenanceWindowCategorySelectionRadioGroup'); + const label = await radioGroup.findByCssSelector(`label[for="observability"]`); + await label.click(); + await testSubjects.setValue('queryInput', 'kibana.alert.rule.name: custom-threshold-rule-1'); + await svlCommonScreenshots.takeScreenshot( + 'create-maintenance-window-filter', + screenshotDirectories, + 1400, + 1600 + ); + const cancelButton = await testSubjects.find('cancelMaintenanceWindow'); + await cancelButton.click(); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/index.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/index.ts new file mode 100644 index 00000000000000..f7c95d53f0206d --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default function ({ loadTestFile, getService }: FtrProviderContext) { + const browser = getService('browser'); + + describe('observability maintenance windows', function () { + before(async () => { + await browser.setWindowSize(1920, 1080); + }); + + loadTestFile(require.resolve('./create_window')); + }); +}