diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 1946b125bcdce..8b2ee125d4355 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: 2022-11-10 +date: 2022-11-14 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 b8d1bd624d45e..79e85a2da0943 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 0a911b9409919..c9acb4f92dda7 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 8423795f94d57..2f1e9358fb8ef 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: 2022-11-10 +date: 2022-11-14 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 8d16a89afe08d..36ee01f4e70dd 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 267250bcfe657..ebb8de5ab024a 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: 2022-11-10 +date: 2022-11-14 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 252311d6f21b5..0834d47f3a892 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: 2022-11-10 +date: 2022-11-14 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 4e149457fcb99..090ad95ad3561 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: 2022-11-10 +date: 2022-11-14 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 187b7a365354f..6d855835eb1ed 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: 2022-11-10 +date: 2022-11-14 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 0f357fe7b5e6a..b0add84289089 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: 2022-11-10 +date: 2022-11-14 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 f9cfb50c567cc..cab716db06e8b 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index 7d96a5144e7eb..2c049bdc05ada 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index c53df3648f7f8..5071a843407d4 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: 2022-11-10 +date: 2022-11-14 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 3c6cf3a125668..4be9351a67669 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: 2022-11-10 +date: 2022-11-14 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 a21f32ac3668d..e5c22bf1505ac 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 2c7cc2ac7bb3d..ce139cf7d42ed 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index fb862136e65b9..65eb5ae6fbfaa 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index e1c9d067c1815..bb24a6dd5c844 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: 2022-11-10 +date: 2022-11-14 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 261079d470f49..ea1248f7abff7 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: 2022-11-10 +date: 2022-11-14 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 364c8e2c876e7..43c487d59ead2 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 2d2deab1c6b80..e507aee4e8a8c 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 8e896cdc1e3dd..99cfdfa6c4b3f 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 216f0a8647bfa..34b815f7618cb 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index ea4dc4a7d59e6..dc9669ac05e33 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: 2022-11-10 +date: 2022-11-14 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 2a96c028175c1..91117eb2f3601 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: 2022-11-10 +date: 2022-11-14 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 56126419ef012..b6b827864f84a 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: 2022-11-10 +date: 2022-11-14 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 5e61a4b24e9f8..65cf9e60cfb47 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: 2022-11-10 +date: 2022-11-14 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 7b0c42b099eef..a4af8d9b980fb 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 40077f55e6ca2..be06c4a6f866d 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 290ba68a07730..56c5a07d570b5 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 4864c62fc0016..a1d69aca71983 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index fa1711dd0d5bc..2103edf4de6fb 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: 2022-11-10 +date: 2022-11-14 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 2785340d08a26..94716d555c4c7 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: 2022-11-10 +date: 2022-11-14 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 179db4becbcfb..c32f219d494c0 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 9a37caa51e238..3f1bd5d82bde0 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: 2022-11-10 +date: 2022-11-14 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 52f26fe925ef8..9e3df05c330af 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: 2022-11-10 +date: 2022-11-14 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 b8f5ce593b6c5..75286d09216de 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: 2022-11-10 +date: 2022-11-14 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 97a76210a9f8e..89de95ba03392 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: 2022-11-10 +date: 2022-11-14 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 2ec9101f11050..f4b15bfa32fba 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: 2022-11-10 +date: 2022-11-14 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 046bb59b0d688..0db1d2b4f8efa 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 56a2023fa26cd..c32dbd5fd0210 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 396a5703f4418..04a39e0e8f958 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: 2022-11-10 +date: 2022-11-14 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 4e9c9e437cfcb..734ded08d26a9 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: 2022-11-10 +date: 2022-11-14 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 2fa31d64294f9..5d29a2afb932a 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: 2022-11-10 +date: 2022-11-14 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 cb2d2c872c3f3..3eec15fea0eaa 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: 2022-11-10 +date: 2022-11-14 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 1e6ed4dd3bc2a..a61fc7a9d666f 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: 2022-11-10 +date: 2022-11-14 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 2c045a25a85d6..163bfdb31e9e1 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: 2022-11-10 +date: 2022-11-14 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 e7bf58bf0e2d3..7ae4b8fdc74a9 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: 2022-11-10 +date: 2022-11-14 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 197341c8c989f..1d9ea9632e1c9 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: 2022-11-10 +date: 2022-11-14 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 f12a8f58517ec..57de4e7dd4649 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: 2022-11-10 +date: 2022-11-14 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 88b696cccb97a..e810c2d926b1c 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: 2022-11-10 +date: 2022-11-14 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 501cb31ddb677..de330f46be0d5 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: 2022-11-10 +date: 2022-11-14 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 46c51a8bb17ec..77a2dd0635ad8 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: 2022-11-10 +date: 2022-11-14 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 5dee362a34c73..1203adf26d6f1 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: 2022-11-10 +date: 2022-11-14 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 04dbc41428d48..5483340f8cc3b 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: 2022-11-10 +date: 2022-11-14 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 b7a4c695802f8..020000ab47d02 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: 2022-11-10 +date: 2022-11-14 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 eaba14cc18e55..e2d42f960cd88 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: 2022-11-10 +date: 2022-11-14 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 471bd0a2c9da9..d976a77ce3e1b 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: 2022-11-10 +date: 2022-11-14 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 30b2828a0920b..6d332044cab81 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 2feb3907e35dd..4d60e1cc0cf72 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -3518,6 +3518,52 @@ ], "returnComment": [] }, + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.agent_details_diagnostics", + "type": "Function", + "tags": [], + "label": "agent_details_diagnostics", + "description": [], + "signature": [ + "({ agentId }: ", + { + "pluginId": "fleet", + "scope": "public", + "docId": "kibFleetPluginApi", + "section": "def-public.DynamicPagePathValues", + "text": "DynamicPagePathValues" + }, + ") => [string, string]" + ], + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.agent_details_diagnostics.$1", + "type": "Object", + "tags": [], + "label": "{ agentId }", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "public", + "docId": "kibFleetPluginApi", + "section": "def-public.DynamicPagePathValues", + "text": "DynamicPagePathValues" + } + ], + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "fleet", "id": "def-public.pagePathGetters.enrollment_tokens", @@ -7024,7 +7070,7 @@ "section": "def-common.AuthenticatedUser", "text": "AuthenticatedUser" }, - " | undefined; } | undefined, packagePolicy?: ", + " | undefined; force?: boolean | undefined; } | undefined, packagePolicy?: ", { "pluginId": "fleet", "scope": "common", @@ -7134,6 +7180,20 @@ "path": "x-pack/plugins/fleet/server/services/package_policy_service.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackagePolicyClient.upgrade.$4.force", + "type": "CompoundType", + "tags": [], + "label": "force", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/package_policy_service.ts", + "deprecated": false, + "trackAdoption": false } ] }, @@ -16178,6 +16238,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_API_ROUTES.REQUEST_DIAGNOSTICS_PATTERN", + "type": "string", + "tags": [], + "label": "REQUEST_DIAGNOSTICS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_API_ROUTES.BULK_REQUEST_DIAGNOSTICS_PATTERN", + "type": "string", + "tags": [], + "label": "BULK_REQUEST_DIAGNOSTICS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.AGENT_API_ROUTES.AVAILABLE_VERSIONS_PATTERN", @@ -16278,6 +16360,28 @@ "path": "x-pack/plugins/fleet/common/constants/routes.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_API_ROUTES.LIST_UPLOADS_PATTERN", + "type": "string", + "tags": [], + "label": "LIST_UPLOADS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_API_ROUTES.GET_UPLOAD_FILE_PATTERN", + "type": "string", + "tags": [], + "label": "GET_UPLOAD_FILE_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -17138,6 +17242,133 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getRequestDiagnosticsPath", + "type": "Function", + "tags": [], + "label": "getRequestDiagnosticsPath", + "description": [], + "signature": [ + "(agentId: string) => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getRequestDiagnosticsPath.$1", + "type": "string", + "tags": [], + "label": "agentId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getBulkRequestDiagnosticsPath", + "type": "Function", + "tags": [], + "label": "getBulkRequestDiagnosticsPath", + "description": [], + "signature": [ + "() => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getListAgentUploads", + "type": "Function", + "tags": [], + "label": "getListAgentUploads", + "description": [], + "signature": [ + "(agentId: string) => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getListAgentUploads.$1", + "type": "string", + "tags": [], + "label": "agentId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getAgentFileDownloadLink", + "type": "Function", + "tags": [], + "label": "getAgentFileDownloadLink", + "description": [], + "signature": [ + "(fileId: string, fileName: string) => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getAgentFileDownloadLink.$1", + "type": "string", + "tags": [], + "label": "fileId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getAgentFileDownloadLink.$2", + "type": "string", + "tags": [], + "label": "fileName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 727dc963d0c9c..84e66d2d518b8 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Fleet](https://github.com/orgs/elastic/teams/fleet) for questions regar | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1001 | 3 | 898 | 18 | +| 1016 | 3 | 913 | 18 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index b72d8c2091d50..ad4d814b45e3f 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: 2022-11-10 +date: 2022-11-14 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 e4f2d550673f1..cef3d0e03f459 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: 2022-11-10 +date: 2022-11-14 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 58168adad9a74..b42e828d5e936 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index cf6e2c2557619..a9dd1c7ff15fc 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: 2022-11-10 +date: 2022-11-14 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 591ef5bb3e78f..bd1f0c50fd7eb 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: 2022-11-10 +date: 2022-11-14 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 7b5c459e11c7c..c56d6bfadd6bd 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 75d5e97ebe2d2..efa566a64a7e7 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: 2022-11-10 +date: 2022-11-14 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 cf702b74d1376..c5d1a2633944c 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: 2022-11-10 +date: 2022-11-14 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 678081be2dd34..b9462e2c89727 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 4f957dd5c504e..9f6f02cc9d947 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: 2022-11-10 +date: 2022-11-14 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 c1ea88c35717b..1984f2d7bea9b 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 0184c336630e6..13f2b6a9a6b19 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index f5988590f9c94..8fc7f02841a0f 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: 2022-11-10 +date: 2022-11-14 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 7e774514da76e..646564f411715 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 1371540f7e321..c85826a60ec66 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: 2022-11-10 +date: 2022-11-14 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 87d5cf40304b6..61ca9eb1e14ba 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: 2022-11-10 +date: 2022-11-14 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 985982c9e1b05..df4170926394e 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: 2022-11-10 +date: 2022-11-14 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 9bd75b4abc44f..bacc19fb8c97f 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 57400276fdfc3..2fa552f24139b 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 528d8087ec942..24b0b00af2a9d 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 0d781d0387478..70c4c508e715d 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index cd54b3623ee08..064e05cdaac16 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: 2022-11-10 +date: 2022-11-14 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 c0ddd7d3e1a2b..f19be08f64ada 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 084ae437768b1..9d2f4bd718435 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 87c803990f87d..9721131fb3340 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: 2022-11-10 +date: 2022-11-14 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 63f02ddb9ce2a..871d42f6430bf 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: 2022-11-10 +date: 2022-11-14 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 0c9b959198cdc..7c9db36ad3787 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: 2022-11-10 +date: 2022-11-14 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 7e36135b301bc..b0aa37995e636 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: 2022-11-10 +date: 2022-11-14 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 f2e42f8efbe67..63bc66612bf5e 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 19f3ea58e9ddf..590f28fa16654 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: 2022-11-10 +date: 2022-11-14 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 4892b8f1688e7..a30a2bd5aad2f 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: 2022-11-10 +date: 2022-11-14 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 5e951622d0eb1..88f3d6ef9f09c 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: 2022-11-10 +date: 2022-11-14 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 fb8e5b5ca449f..3c533c6b68e72 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_inspector.mdx b/api_docs/kbn_content_management_inspector.mdx index cf9be5b4ce3f2..e15fba3fd7ead 100644 --- a/api_docs/kbn_content_management_inspector.mdx +++ b/api_docs/kbn_content_management_inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-inspector title: "@kbn/content-management-inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-inspector plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-inspector'] --- import kbnContentManagementInspectorObj from './kbn_content_management_inspector.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 79fd318bcf705..0ee5e8c4dd839 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 9ecfc099aa7c8..426a86f93fcd5 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: 2022-11-10 +date: 2022-11-14 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 ff9536060acc5..a9abfae2264f2 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: 2022-11-10 +date: 2022-11-14 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 0c9c9e07b61cd..455ad94440ab9 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: 2022-11-10 +date: 2022-11-14 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 1cb867564013a..e9ba786c4566a 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: 2022-11-10 +date: 2022-11-14 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 29ace5e79029f..c108055286ba2 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: 2022-11-10 +date: 2022-11-14 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 a68d34d5bcfdc..ebc811fa25aaf 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: 2022-11-10 +date: 2022-11-14 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 d1f9df400e1e0..a70e22d7f18dd 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: 2022-11-10 +date: 2022-11-14 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 9a9a7cf18a417..ee6e5ded35cf8 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: 2022-11-10 +date: 2022-11-14 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 fe74a9ded0b12..ef75a4a6ef9e1 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: 2022-11-10 +date: 2022-11-14 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 76a2d046c9182..ca5ab93309f2b 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: 2022-11-10 +date: 2022-11-14 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 2074cf676ff03..1b35acdca9eea 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: 2022-11-10 +date: 2022-11-14 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 aed893e61524d..f6803246ed53b 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: 2022-11-10 +date: 2022-11-14 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 e498c84236437..595dac8f89103 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: 2022-11-10 +date: 2022-11-14 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 467481ea68980..c3c67b1bff842 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: 2022-11-10 +date: 2022-11-14 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 6dac9caa70ee8..b77234ca6e4ff 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: 2022-11-10 +date: 2022-11-14 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 a951bcf93abec..2baf2420dceae 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: 2022-11-10 +date: 2022-11-14 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 021211ef97ab1..ccfed5be0912c 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: 2022-11-10 +date: 2022-11-14 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 dedf0e6270e17..91fb7404cfc5b 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: 2022-11-10 +date: 2022-11-14 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 a85314929e839..8daa29c8010d5 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: 2022-11-10 +date: 2022-11-14 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 e3182c86c47a4..10cf539f29d3d 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: 2022-11-10 +date: 2022-11-14 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 472218feae895..01ede8b7e5bee 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: 2022-11-10 +date: 2022-11-14 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 e15fc90790e88..1e5bb4d70947b 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: 2022-11-10 +date: 2022-11-14 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 6f32649e18ca7..5792693c7ac3e 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: 2022-11-10 +date: 2022-11-14 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 1f07bc13fc69e..b6c95d07a587b 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: 2022-11-10 +date: 2022-11-14 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_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 7199d24609726..56bd2e611d04c 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: 2022-11-10 +date: 2022-11-14 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 253db8e045228..cc3137bdfb7a4 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: 2022-11-10 +date: 2022-11-14 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 193c20989893c..af52c6b4f69f5 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: 2022-11-10 +date: 2022-11-14 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 ead3e7f3b6c50..0d78316b7e5e6 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: 2022-11-10 +date: 2022-11-14 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 20a7cca05cdd9..94f3027d5e5bc 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: 2022-11-10 +date: 2022-11-14 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 8087376c9a42b..d5c1ed0f01e82 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: 2022-11-10 +date: 2022-11-14 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 317d53c8cf7ed..8adf49639e730 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: 2022-11-10 +date: 2022-11-14 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 1107ea2cd197f..ab04ecb696d49 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: 2022-11-10 +date: 2022-11-14 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 c7df77f889ad9..8bf7b3ccb0a6d 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: 2022-11-10 +date: 2022-11-14 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 835691f5e3dba..f4243540111cf 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: 2022-11-10 +date: 2022-11-14 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 7d625b091cb8d..d5dca4dd0561d 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: 2022-11-10 +date: 2022-11-14 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 24c5ec6e9af9d..93fff6394c5c8 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: 2022-11-10 +date: 2022-11-14 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 1766b771a57fd..77157474a61a4 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: 2022-11-10 +date: 2022-11-14 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 69e27ed795fe3..de35c937306d9 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: 2022-11-10 +date: 2022-11-14 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 149371650208d..9b2ba7f306805 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: 2022-11-10 +date: 2022-11-14 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 11862117561d7..04905b55afef9 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: 2022-11-10 +date: 2022-11-14 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 19199fcc1d10a..023ca70f41b7f 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: 2022-11-10 +date: 2022-11-14 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 b8e77e2d8471c..5bb6a6b6b5e2f 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: 2022-11-10 +date: 2022-11-14 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 f47ea79c65d9c..aaa8c32c7ba92 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: 2022-11-10 +date: 2022-11-14 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 855463a83d786..b573e3bd0bc32 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: 2022-11-10 +date: 2022-11-14 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 481e993667222..44a398efa7cee 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: 2022-11-10 +date: 2022-11-14 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 9472b67753da9..624658191db11 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: 2022-11-10 +date: 2022-11-14 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 d2fe2e6008691..811348bcfcf3b 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: 2022-11-10 +date: 2022-11-14 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 fd80cd2f5b134..1bff405abd56c 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: 2022-11-10 +date: 2022-11-14 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 454751e0bcbc3..3326620ffac9d 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: 2022-11-10 +date: 2022-11-14 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 288876e7df0e4..1bcfa774202a4 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: 2022-11-10 +date: 2022-11-14 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 d816b34eb3092..50249261f8ad5 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: 2022-11-10 +date: 2022-11-14 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 c216eedb158e6..f3b19f576e18d 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: 2022-11-10 +date: 2022-11-14 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 5f0c274ef3b9c..6815437ff66e9 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: 2022-11-10 +date: 2022-11-14 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 01e09e779f1f8..85da17d45a84b 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: 2022-11-10 +date: 2022-11-14 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 90f5c7e716173..e84d4409c1692 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: 2022-11-10 +date: 2022-11-14 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 cd0628d63da92..05cd364cdaa52 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: 2022-11-10 +date: 2022-11-14 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 6d9593c9d9c96..4cdb3d53a9e09 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: 2022-11-10 +date: 2022-11-14 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 fd8fa994c3b61..cfaf9f087e79b 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: 2022-11-10 +date: 2022-11-14 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 aa1678bd9925c..747019e938112 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: 2022-11-10 +date: 2022-11-14 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 38b965a76e89a..b30cf61049393 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: 2022-11-10 +date: 2022-11-14 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 c177fa48c225a..53227ed1285ba 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: 2022-11-10 +date: 2022-11-14 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 8fc6ca0de6649..826d2b53889e6 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: 2022-11-10 +date: 2022-11-14 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 28d38c82857b4..c9e9ea6c36f7e 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: 2022-11-10 +date: 2022-11-14 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 71813025a1503..6c7296c89ef7d 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: 2022-11-10 +date: 2022-11-14 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 73c74f91e5826..4fd42d2b666fe 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: 2022-11-10 +date: 2022-11-14 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 cea356b91c49f..7185784b1217a 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: 2022-11-10 +date: 2022-11-14 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 ab06e151a0b49..7f1ce72a5b85b 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: 2022-11-10 +date: 2022-11-14 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 9e577306ce0c3..0de156efde157 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: 2022-11-10 +date: 2022-11-14 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 5887bf9f607f5..34b13ced0e86b 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: 2022-11-10 +date: 2022-11-14 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 09198acecc0df..9ebbb892eb7df 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: 2022-11-10 +date: 2022-11-14 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.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 9ac3b7f4431dd..ee1e268d36992 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.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 d61134f2e6115..357036fbc121d 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: 2022-11-10 +date: 2022-11-14 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 c012a52e583ee..75b0f9b78ff16 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: 2022-11-10 +date: 2022-11-14 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 c0227acd7c42c..14018bb2ceb2e 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: 2022-11-10 +date: 2022-11-14 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 3907095f01f1f..b7973c05ffdc9 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: 2022-11-10 +date: 2022-11-14 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 56bb98981109d..1b6da4c8b24e1 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: 2022-11-10 +date: 2022-11-14 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 36a6a7b9e9990..0ed797dbae656 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: 2022-11-10 +date: 2022-11-14 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 f3d7a4d570544..a301c71d3047e 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: 2022-11-10 +date: 2022-11-14 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 44fec5dc44021..21216792c6d38 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: 2022-11-10 +date: 2022-11-14 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 97f834fa5f633..434ac6ceb5d52 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: 2022-11-10 +date: 2022-11-14 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 6a4c7c4e8183e..732d7e71ed8af 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: 2022-11-10 +date: 2022-11-14 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 444ec85fb874e..336112a74f047 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: 2022-11-10 +date: 2022-11-14 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 8be5c443793fe..f54f4d79bf8f3 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: 2022-11-10 +date: 2022-11-14 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 49c45ce15c5f5..0883b059c808a 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: 2022-11-10 +date: 2022-11-14 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 15dadd7b28d91..b4d3706d49312 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: 2022-11-10 +date: 2022-11-14 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 7ee5574b4687b..a74aa46810b00 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: 2022-11-10 +date: 2022-11-14 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 2ea6f5bcf43e5..f1b0ea16b45dc 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: 2022-11-10 +date: 2022-11-14 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 de38568c049c4..532162e96c9c5 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: 2022-11-10 +date: 2022-11-14 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 8eb806fc071d7..cd1a3fc356e34 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: 2022-11-10 +date: 2022-11-14 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 7bd20e0fe0ed5..67598fe1369a0 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: 2022-11-10 +date: 2022-11-14 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 4710f65f52ae1..67f833829f91a 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: 2022-11-10 +date: 2022-11-14 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 50b42f3f9727f..8581dd228fa90 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: 2022-11-10 +date: 2022-11-14 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 0066531329387..3f9ceec919b9a 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: 2022-11-10 +date: 2022-11-14 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 ecad1a86ab36c..e07d1bbe44d2b 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: 2022-11-10 +date: 2022-11-14 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 431b7d63b34f8..098e9a4560fa2 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: 2022-11-10 +date: 2022-11-14 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 a66d6230e2ec4..90492868fedca 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: 2022-11-10 +date: 2022-11-14 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 8236a0dcb496c..a0d32da75860e 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: 2022-11-10 +date: 2022-11-14 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 9208b05fae15e..ddabce8c7e443 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: 2022-11-10 +date: 2022-11-14 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 b4b454e02805b..6ae20b09a0f45 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: 2022-11-10 +date: 2022-11-14 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 62712c7023a24..3c5a02055d086 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 2f8ef4e95b718..3114ea4448572 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: 2022-11-10 +date: 2022-11-14 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 add6e3175f9ce..6dd7fae6ac209 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: 2022-11-10 +date: 2022-11-14 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 11bfa66c68dcf..4de249c38c58e 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: 2022-11-10 +date: 2022-11-14 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 7e56369db4823..6ab1bc56076e0 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: 2022-11-10 +date: 2022-11-14 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 4c6b667ef5bdf..715b53540f8f4 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: 2022-11-10 +date: 2022-11-14 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 46884e34df57b..eb4ffa0e2e9fa 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: 2022-11-10 +date: 2022-11-14 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 62e7dcc3493b8..2c928259cfb24 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: 2022-11-10 +date: 2022-11-14 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_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 13eff3035913c..3648a8a30fd02 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: 2022-11-10 +date: 2022-11-14 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 1f146e4391ae2..03fc422a57a1d 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: 2022-11-10 +date: 2022-11-14 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_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index c4c47afec5b90..0c9d62ded680d 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 92976504deafc..b937dcbb00296 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: 2022-11-10 +date: 2022-11-14 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 bf41c1ef4621c..2102ad6be1058 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: 2022-11-10 +date: 2022-11-14 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 dce6763399a5a..9ae88650837d7 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: 2022-11-10 +date: 2022-11-14 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 56a2672266814..057c2daf4ff81 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: 2022-11-10 +date: 2022-11-14 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 56f289caa0c21..8005332cc6ca5 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: 2022-11-10 +date: 2022-11-14 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 4d1256a5b2fab..a1267e7dff1f1 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: 2022-11-10 +date: 2022-11-14 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 e0044c27cd904..f7819202aa8e3 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: 2022-11-10 +date: 2022-11-14 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 f021b84032779..c1e8b234c883f 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: 2022-11-10 +date: 2022-11-14 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 a4e71751da6c6..7a7098e3e97f3 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: 2022-11-10 +date: 2022-11-14 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 4d32ea2920dc2..4b4798cea6495 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: 2022-11-10 +date: 2022-11-14 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 815be76b6bf23..83590a8ebd2c4 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: 2022-11-10 +date: 2022-11-14 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 8268e68741a43..7f90025c00715 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: 2022-11-10 +date: 2022-11-14 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 7de36c9ce77bd..7e9b66a58a023 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: 2022-11-10 +date: 2022-11-14 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 81db0276c0e32..70d42eb468cf7 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: 2022-11-10 +date: 2022-11-14 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 8a51a12dd5a5e..1f132c230fc2c 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: 2022-11-10 +date: 2022-11-14 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 e9a4251d3c8a0..bf5a408245bdd 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: 2022-11-10 +date: 2022-11-14 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 3e9ed068c8441..79e075ada3fea 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: 2022-11-10 +date: 2022-11-14 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 bb7f8b25b1197..b5be4b25facee 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: 2022-11-10 +date: 2022-11-14 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 d4b73e3a809d6..165e3f483f0f8 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: 2022-11-10 +date: 2022-11-14 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 e35d4c847e750..75dc54c102277 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: 2022-11-10 +date: 2022-11-14 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 e2f1fb842f7b9..7aca6095df28b 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: 2022-11-10 +date: 2022-11-14 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 d53c44cb1a782..d9543261b8f6a 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: 2022-11-10 +date: 2022-11-14 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_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index e7cfa8aa06328..3e013e5eb661d 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: 2022-11-10 +date: 2022-11-14 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 673b27aad19cb..01a65a7a91e1d 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: 2022-11-10 +date: 2022-11-14 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 47f0354c84f33..3352627b3f9df 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: 2022-11-10 +date: 2022-11-14 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_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 0d48368da6f79..292535f377ed0 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 1513a66f1cfed..e66c93ba7972c 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: 2022-11-10 +date: 2022-11-14 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 1abb5074465ac..fd4b43facc91f 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: 2022-11-10 +date: 2022-11-14 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 b52fba46de00a..2a38add7f1e8f 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: 2022-11-10 +date: 2022-11-14 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 58a7aa43b7af2..1b71501ebd30b 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: 2022-11-10 +date: 2022-11-14 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 a3f3ae03a0d2d..5debf2f2bd7e3 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: 2022-11-10 +date: 2022-11-14 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 2c101f9a807b0..95aa4ab117079 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: 2022-11-10 +date: 2022-11-14 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 0a16585d5b79b..c5daa0cc3d934 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: 2022-11-10 +date: 2022-11-14 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 1bdb466c37050..439b74ae74fdc 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: 2022-11-10 +date: 2022-11-14 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 c141ff367ae41..f7b35c01eadbd 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: 2022-11-10 +date: 2022-11-14 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 f8fb0dde67b73..3e5b77e356491 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: 2022-11-10 +date: 2022-11-14 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 5084c1db20e00..0198cc0562405 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: 2022-11-10 +date: 2022-11-14 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_crypto.mdx b/api_docs/kbn_crypto.mdx index e0f257c07d5f1..d561be651b523 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: 2022-11-10 +date: 2022-11-14 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 389f74dd1a9a8..c6921546ede42 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index aa8eea4be3195..be25f2306f9f2 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index b7d1b8d055b6c..3131cdce400e4 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: 2022-11-10 +date: 2022-11-14 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 d2866d30f18be..4b9c7f1c486cc 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: 2022-11-10 +date: 2022-11-14 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 36c4d757ba998..7966e893a60a7 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: 2022-11-10 +date: 2022-11-14 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 5efb131703903..803fc16ce495c 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 104a2369b81a9..5938e7050fff6 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: 2022-11-10 +date: 2022-11-14 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 b91875c2872a9..6cee8cc698985 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 7735c516b2dd2..42e688c9b03c6 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 6b8d008b29660..87696c701f0d7 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: 2022-11-10 +date: 2022-11-14 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 393d59aabe4ec..5ad1414a5666b 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: 2022-11-10 +date: 2022-11-14 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 08f4f53cfcc98..c9794cc869dad 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: 2022-11-10 +date: 2022-11-14 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 e706bd0f97699..a1c24f90f8b1c 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: 2022-11-10 +date: 2022-11-14 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 1447e825e0430..096609dee5566 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: 2022-11-10 +date: 2022-11-14 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 592776e4e2319..a574bbc60cbc8 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 6462fd0dec15d..fbb5839f33b53 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 885c51ad58ad1..d2af7e14259f5 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: 2022-11-10 +date: 2022-11-14 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 c6206a9a934d6..a134d04e0ee12 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index b7fe63618e9de..df574b3c0aeda 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 1838d9e7cf802..cec40a7719652 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 27c04c3be54e9..45d9cf0d1968d 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: 2022-11-10 +date: 2022-11-14 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 d9d5ca65aa611..ccb0f429f06de 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: 2022-11-10 +date: 2022-11-14 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 1fe283e329b24..ab041f88af50c 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: 2022-11-10 +date: 2022-11-14 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 b23e314d85c19..350ed89dd1324 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: 2022-11-10 +date: 2022-11-14 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 ca1c55732a951..efa23713e87ec 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: 2022-11-10 +date: 2022-11-14 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 300082ada8a05..b499cae7898f9 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: 2022-11-10 +date: 2022-11-14 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 32771becfd7d2..5778946b01e71 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: 2022-11-10 +date: 2022-11-14 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 1e4e30e82ef31..f790474b18197 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: 2022-11-10 +date: 2022-11-14 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 ac50ae06a87c7..6fc567d171231 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index df5b8ff4fbfc2..4c3baa1039672 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: 2022-11-10 +date: 2022-11-14 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 ce986149e6bdc..dc095482503a2 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: 2022-11-10 +date: 2022-11-14 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 b61cf5214e8f3..2692167507c53 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: 2022-11-10 +date: 2022-11-14 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 165fff9e99186..8b4155e5ecf15 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index fb5e751fdee44..fcc7068ca0261 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: 2022-11-10 +date: 2022-11-14 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 17961b54f368e..9c4793c19eec3 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 64320f7635f2e..5c67ac324e4cc 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: 2022-11-10 +date: 2022-11-14 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 f7da58635fa05..18e93905a4e87 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: 2022-11-10 +date: 2022-11-14 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 2886475d2f180..1900e8e7cf455 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 62b622f586c2a..0311aacf613e3 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 2bf601cbf83a0..c10347241c17f 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: 2022-11-10 +date: 2022-11-14 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_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index b9a82878eef49..793e46febc99c 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: 2022-11-10 +date: 2022-11-14 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index fdfcbef2b8629..a9ac0a1ff76c2 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 52766063cbf9a..f4924b5014790 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 0f48de79e7205..a9c15924e7c63 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: 2022-11-10 +date: 2022-11-14 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 8323ddc83f887..9e605ad4ee997 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: 2022-11-10 +date: 2022-11-14 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 d9dc273e37e24..7f1dbb30516ab 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index d684efab12eaf..ea1746a73fedc 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: 2022-11-10 +date: 2022-11-14 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 0233bec5beb76..3d4e8fa566558 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: 2022-11-10 +date: 2022-11-14 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 bfe253397e6b1..881fe49b1a95a 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 8d33a1f9bcb72..76ee22c3e1f18 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 95fa8c1bcf02b..cf53671382223 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 5f91c3cb45b29..88c9ee0150914 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 389cc67febc50..88cae77b799f6 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index f01ef09540d7f..6b597abd9d60a 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: 2022-11-10 +date: 2022-11-14 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 1d25d45f476b6..af021700a2bfc 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 5c8fb88642b6d..01618189de4f6 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: 2022-11-10 +date: 2022-11-14 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 b8b7c2f0b49d0..2c864a67101b7 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: 2022-11-10 +date: 2022-11-14 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 53c2d1d6d6f2f..fb1586fa8fd15 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: 2022-11-10 +date: 2022-11-14 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 1f616fe9486ab..504ecedaa6ce8 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: 2022-11-10 +date: 2022-11-14 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 cbf7d87492a67..e93f0c527348a 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: 2022-11-10 +date: 2022-11-14 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 66557c4460206..1a327cade1c47 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: 2022-11-10 +date: 2022-11-14 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 1653057dc87e8..5c4f700c82157 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: 2022-11-10 +date: 2022-11-14 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 617e2421ac119..2ce15041f4749 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: 2022-11-10 +date: 2022-11-14 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 d5ba8af94875b..71937d5808edd 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: 2022-11-10 +date: 2022-11-14 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 f2bec43c5fac9..8f030694fcd8b 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: 2022-11-10 +date: 2022-11-14 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 0da88cb50f208..7f51edf4f5bd4 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: 2022-11-10 +date: 2022-11-14 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 62edcc824d502..5739d46ae9c86 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: 2022-11-10 +date: 2022-11-14 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 c5a788953fe9e..b0ccd560068e2 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: 2022-11-10 +date: 2022-11-14 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 a200087919ef1..9d92d9be7e1f0 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 204bc5484e6de..7144c05daf421 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: 2022-11-10 +date: 2022-11-14 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 fa0483c766cc7..aaf377b14c628 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index b2e95b524852a..446c6b592f5c4 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 1afedb2f0a787..f44120a346e76 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index cad5a42e9606e..e096c4706050f 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 4de1f644b9c00..4afbe3492ec38 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: 2022-11-10 +date: 2022-11-14 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 3b670eee4cf12..5c88e1b741049 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: 2022-11-10 +date: 2022-11-14 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 876dd57afdc65..023bf6515a438 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: 2022-11-10 +date: 2022-11-14 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_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 32c203ecc0f59..4870af95c22e8 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: 2022-11-10 +date: 2022-11-14 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 35d91a703d1eb..0367271baa1ae 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: 2022-11-10 +date: 2022-11-14 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 ba4842a3965a0..15e38600fc16e 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: 2022-11-10 +date: 2022-11-14 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 8800b46935a1e..58788cca65410 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: 2022-11-10 +date: 2022-11-14 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 3323f880c427f..36bc04fcf654a 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: 2022-11-10 +date: 2022-11-14 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 efffe4bcad7b9..edacc9daef7bf 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: 2022-11-10 +date: 2022-11-14 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 77860f914e53a..db2ba93964a45 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: 2022-11-10 +date: 2022-11-14 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 2d5418c9afa15..81ae6fc7f09e9 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: 2022-11-10 +date: 2022-11-14 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 ad8be9004b3a5..4c3f44de1931c 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: 2022-11-10 +date: 2022-11-14 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 7f2e9b852a819..ff63492c6ce2d 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: 2022-11-10 +date: 2022-11-14 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 16cf0ae2bbaee..add6b1778e9a7 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: 2022-11-10 +date: 2022-11-14 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 7041874ef74cd..f9b4e1394c711 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: 2022-11-10 +date: 2022-11-14 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 18f70fb0d20b9..93f091c0fa269 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: 2022-11-10 +date: 2022-11-14 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 0712624bf6ff5..a5760d276edc2 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: 2022-11-10 +date: 2022-11-14 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 8fb28c5a4bb5d..bc87535e64d66 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: 2022-11-10 +date: 2022-11-14 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 850f1c243bfca..066e1fd052bc2 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: 2022-11-10 +date: 2022-11-14 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 3d40eefa4041b..c58e34ead1ee9 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: 2022-11-10 +date: 2022-11-14 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_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 82d494eff5031..1009b7708d6dd 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: 2022-11-10 +date: 2022-11-14 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 7e6bd6538d631..237504cc05378 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: 2022-11-10 +date: 2022-11-14 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 1b43ff9668afd..892142f666b35 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: 2022-11-10 +date: 2022-11-14 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 257254689e976..d91ce748ff4d3 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: 2022-11-10 +date: 2022-11-14 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 da315691db93f..689b3033dc83b 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 386530fe14b53..23b649c4e3650 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 4459d7cde957c..18042bd2c9056 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 548d694f6bcf7..3590c4f85caaa 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: 2022-11-10 +date: 2022-11-14 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 a659dc3c62d3e..03bfcf6391863 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: 2022-11-10 +date: 2022-11-14 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 e7406f8b7b9fe..aada3a7b99ceb 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: 2022-11-10 +date: 2022-11-14 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 a54825f2da47e..78ed4927b4886 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: 2022-11-10 +date: 2022-11-14 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 9faea2a41ef1d..dbf50bed22ef0 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 7230f6d1c36c3..2c329fbe75732 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: 2022-11-10 +date: 2022-11-14 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 457c1005d8fb2..9bbaf1ea091b8 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 243f1fba46360..2af8213c519a7 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 87acb6a1912f3..8095277a76c7f 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 275b1421a4313..232077fda9276 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index afddf4bd86b8c..a5687648765ee 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: 2022-11-10 +date: 2022-11-14 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_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index f32d926c78f4d..040e3289dc153 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: 2022-11-10 +date: 2022-11-14 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 638cfe5b30c97..4e27fb35ce4de 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 4d930926404d6..57d72807318b7 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: 2022-11-10 +date: 2022-11-14 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 3e65f25e12d16..69c6b2433a3cd 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: 2022-11-10 +date: 2022-11-14 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 024863725156b..16cc8d2785b1f 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: 2022-11-10 +date: 2022-11-14 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 047876be39a16..1a1065e5d4e38 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 6df92ff648c8a..ca1be9b022bd8 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 5b887a68889e4..b7dd8d0b7deb5 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: 2022-11-10 +date: 2022-11-14 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 404fa33ec854d..8b6daf279cc8a 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: 2022-11-10 +date: 2022-11-14 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 60a85fde7af87..dfab1353e892a 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: 2022-11-10 +date: 2022-11-14 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 dc51a2f5df60d..9bba488acb6cf 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index a7a66dcf29d6b..458aacc523c66 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -742,6 +742,22 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.getChartInfo", + "type": "Function", + "tags": [], + "label": "getChartInfo", + "description": [], + "signature": [ + "() => Readonly" + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -7093,6 +7109,40 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getVisualizationInfo", + "type": "Function", + "tags": [], + "label": "getVisualizationInfo", + "description": [], + "signature": [ + "((state: T) => ", + "VisualizationInfo", + ") | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getVisualizationInfo.$1", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "T" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index c22f60b5fc3ca..ceb92339f45cf 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 678 | 0 | 584 | 48 | +| 681 | 0 | 587 | 49 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index d903dbf8a51af..aa2cb09654407 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: 2022-11-10 +date: 2022-11-14 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 db65f2173d62d..d5b56d89063aa 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: 2022-11-10 +date: 2022-11-14 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 85a59aa952e78..593ec7e652d96 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index cd9c862bd1d0a..06883ff2b50a0 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 9d71cd7f6f543..be79db0cf1c62 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: 2022-11-10 +date: 2022-11-14 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 697d0a02fd5fc..b4417f2095827 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: 2022-11-10 +date: 2022-11-14 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 b0a979acabeda..b8f0da524c672 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index ec4fd079d786e..4e23f09f052bd 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -3001,7 +3001,11 @@ "section": "def-common.MlSummaryJob", "text": "MlSummaryJob" }, - "[]>; }" + "[]>; forceStartDatafeeds: (datafeedIds: string[], start?: number | undefined, end?: number | undefined) => Promise<", + "Results", + ">; stopDatafeeds: (datafeedIds: string[]) => Promise<", + "Results", + ">; }" ], "path": "x-pack/plugins/ml/server/shared.ts", "deprecated": false, diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 928852d04dc6c..1fea2f9ab1054 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) for q | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 254 | 9 | 78 | 39 | +| 254 | 9 | 78 | 40 | ## Client diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index d4dd795bae62b..5bc37ae9a21c5 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: 2022-11-10 +date: 2022-11-14 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 a1af42b8522a0..611087c5b1b4b 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: 2022-11-10 +date: 2022-11-14 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 f689fa9599303..0c9affb397c70 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: 2022-11-10 +date: 2022-11-14 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 2821d66625059..b111ad5e3ee41 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 5b431e5910dea..f8c71b22b0d11 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index df91d90365c03..5acf26117c25c 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -2390,6 +2390,20 @@ "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "observability", + "id": "def-public.ExploratoryEmbeddableProps.align", + "type": "CompoundType", + "tags": [], + "label": "align", + "description": [], + "signature": [ + "\"left\" | \"right\" | \"center\" | undefined" + ], + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -7871,7 +7885,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; revision: number; created_at: string; updated_at: string; }[]; }, ", + ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; revision: number; created_at: string; updated_at: string; }[]; }, ", { "pluginId": "observability", "scope": "server", @@ -7931,7 +7945,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; }; }; revision: number; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; }; }; revision: number; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -7965,7 +7979,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_duration\">; params: ", + "<\"sli.apm.transaction_duration\">; params: ", "TypeC", "<{ environment: ", "UnionC", @@ -7997,7 +8011,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_error_rate\">; params: ", + "<\"sli.apm.transaction_error_rate\">; params: ", "IntersectionC", "<[", "TypeC", @@ -8043,7 +8057,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.kql.custom\">; params: ", + "<\"sli.kql.custom\">; params: ", "TypeC", "<{ index: ", "StringC", @@ -8101,7 +8115,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8131,7 +8145,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_duration\">; params: ", + "<\"sli.apm.transaction_duration\">; params: ", "TypeC", "<{ environment: ", "UnionC", @@ -8163,7 +8177,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_error_rate\">; params: ", + "<\"sli.apm.transaction_error_rate\">; params: ", "IntersectionC", "<[", "TypeC", @@ -8209,7 +8223,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.kql.custom\">; params: ", + "<\"sli.kql.custom\">; params: ", "TypeC", "<{ index: ", "StringC", @@ -8375,7 +8389,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; revision: number; created_at: string; updated_at: string; }[]; }, ", + ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; revision: number; created_at: string; updated_at: string; }[]; }, ", { "pluginId": "observability", "scope": "server", @@ -8435,7 +8449,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; }; }; revision: number; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; }; }; revision: number; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8469,7 +8483,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_duration\">; params: ", + "<\"sli.apm.transaction_duration\">; params: ", "TypeC", "<{ environment: ", "UnionC", @@ -8501,7 +8515,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_error_rate\">; params: ", + "<\"sli.apm.transaction_error_rate\">; params: ", "IntersectionC", "<[", "TypeC", @@ -8547,7 +8561,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.kql.custom\">; params: ", + "<\"sli.kql.custom\">; params: ", "TypeC", "<{ index: ", "StringC", @@ -8605,7 +8619,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"slo.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"slo.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"slo.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8635,7 +8649,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_duration\">; params: ", + "<\"sli.apm.transaction_duration\">; params: ", "TypeC", "<{ environment: ", "UnionC", @@ -8667,7 +8681,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.apm.transaction_error_rate\">; params: ", + "<\"sli.apm.transaction_error_rate\">; params: ", "IntersectionC", "<[", "TypeC", @@ -8713,7 +8727,7 @@ "TypeC", "<{ type: ", "LiteralC", - "<\"slo.kql.custom\">; params: ", + "<\"sli.kql.custom\">; params: ", "TypeC", "<{ index: ", "StringC", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 6de8086d9ed45..c50e1495f9ad2 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Observability UI](https://github.com/orgs/elastic/teams/observability-u | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 555 | 40 | 552 | 31 | +| 556 | 40 | 553 | 31 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 4ba1167114835..d54eb794f52bb 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index f994fc19cbb18..ffdb96d1937df 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 33332 | 515 | 23640 | 1113 | +| 33354 | 515 | 23662 | 1115 | ## Plugin Directory @@ -85,7 +85,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 288 | 26 | 249 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | | | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 278 | 0 | 19 | 3 | -| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1001 | 3 | 898 | 18 | +| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1016 | 3 | 913 | 18 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | globalSearchProviders | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -105,7 +105,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 0 | 0 | 0 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 624 | 3 | 424 | 8 | | | [Security Team](https://github.com/orgs/elastic/teams/security-team) | - | 3 | 0 | 3 | 1 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 678 | 0 | 584 | 48 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 681 | 0 | 587 | 49 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 8 | 0 | 8 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 3 | 0 | 3 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -114,13 +114,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 41 | 0 | 41 | 6 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 266 | 0 | 265 | 26 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 | -| | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 254 | 9 | 78 | 39 | +| | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 254 | 9 | 78 | 40 | | | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 15 | 3 | 13 | 1 | | | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 9 | 0 | 9 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 34 | 0 | 34 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 2 | 0 | 2 | 1 | -| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 555 | 40 | 552 | 31 | +| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 556 | 40 | 553 | 31 | | | [Security asset management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 21 | 0 | 21 | 4 | | painlessLab | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 243 | 8 | 187 | 12 | @@ -128,7 +128,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 4 | 0 | 4 | 0 | | | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 36 | 0 | 16 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 0 | 21 | 0 | -| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 234 | 0 | 206 | 10 | +| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 236 | 0 | 208 | 10 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 24 | 0 | 19 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 193 | 2 | 152 | 5 | | | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 16 | 0 | 16 | 0 | @@ -181,7 +181,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 26 | 0 | 25 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 53 | 0 | 50 | 5 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 796 | 12 | 766 | 18 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 797 | 12 | 767 | 18 | | watcher | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | ## Package Directory diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index e38536f5862f3..77ce4947e8bca 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: 2022-11-10 +date: 2022-11-14 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 8b1a7ae324823..75f07b102ef62 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index b51b172468bc0..bb50787c2480f 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: 2022-11-10 +date: 2022-11-14 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 7c7e1f722675e..6c3566c3e2ee1 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: 2022-11-10 +date: 2022-11-14 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 19579dd02f316..0c9c8f963fd3e 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index 9617d9512e941..741c2c76ca63e 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -3068,6 +3068,38 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-server.LifecycleAlertServices.getAlertByAlertUuid", + "type": "Function", + "tags": [], + "label": "getAlertByAlertUuid", + "description": [], + "signature": [ + "(alertUuid: string) => { [x: string]: any; } | null" + ], + "path": "x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "ruleRegistry", + "id": "def-server.LifecycleAlertServices.getAlertByAlertUuid.$1", + "type": "string", + "tags": [], + "label": "alertUuid", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index c9290c0f89bb3..fb38c688de4aa 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; @@ -21,7 +21,7 @@ Contact [RAC](https://github.com/orgs/elastic/teams/rac) for questions regarding | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 234 | 0 | 206 | 10 | +| 236 | 0 | 208 | 10 | ## Server diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index dd16a1b7f6cbe..6ffd0621f67e5 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: 2022-11-10 +date: 2022-11-14 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 9f6fb64f7edd0..560f46755ac02 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: 2022-11-10 +date: 2022-11-14 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 4de8f4332a750..201455e71a9f1 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: 2022-11-10 +date: 2022-11-14 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 6a7a35a108ebf..c9e91128b116a 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: 2022-11-10 +date: 2022-11-14 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 521ce0ab7fbda..4329e9f72e320 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: 2022-11-10 +date: 2022-11-14 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 f276885e6cd0e..3491909ad6f40 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: 2022-11-10 +date: 2022-11-14 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 bc9d5ee65c7c8..744334b22be7b 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: 2022-11-10 +date: 2022-11-14 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 cba03ae20e736..25f7d2b86ba61 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: 2022-11-10 +date: 2022-11-14 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 7d00eaed6254e..c07c5e0ca4d79 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: 2022-11-10 +date: 2022-11-14 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 77fb4a60b8761..07f7deb6c6fc6 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index e61f95f40900d..ef1318b0519ab 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c8eb8f8dc30d5..51437c77ece8b 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: 2022-11-10 +date: 2022-11-14 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 ddb390a73aaaf..9403eb3fe1a27 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: 2022-11-10 +date: 2022-11-14 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 4508a1536575e..e02926a64534b 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: 2022-11-10 +date: 2022-11-14 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 e062ff2b7b3bd..1a1adfebacc37 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: 2022-11-10 +date: 2022-11-14 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 d26ab3a1097a9..b1693627e5857 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: 2022-11-10 +date: 2022-11-14 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 c85c9578a00a8..5a25d9cccd70a 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: 2022-11-10 +date: 2022-11-14 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 463f6252c16b6..17345b8decda9 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: 2022-11-10 +date: 2022-11-14 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 dc016f1e6ad71..deff50c82b128 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: 2022-11-10 +date: 2022-11-14 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 59da36b8addcd..0c822af7ded85 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: 2022-11-10 +date: 2022-11-14 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 8527fc8bc2533..3c2ce2ac131b2 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: 2022-11-10 +date: 2022-11-14 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 f39ad8ea28321..fff1ade211057 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index b32e108bd5438..8a59f4598f3da 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: 2022-11-10 +date: 2022-11-14 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 a3c6bda1c232a..d94e4858f7817 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: 2022-11-10 +date: 2022-11-14 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 edaf063e60f2a..7e09116d8c338 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: 2022-11-10 +date: 2022-11-14 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 18580e0f8be12..d8ba601f83781 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: 2022-11-10 +date: 2022-11-14 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 3f12f3284cf29..79448deec8441 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: 2022-11-10 +date: 2022-11-14 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 564a8a1e955a0..eb62570bc40a8 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index b1c484fdbe789..3cd7e767532ad 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 5bbf82c4195a7..b52145e8bbfb2 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: 2022-11-10 +date: 2022-11-14 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 6ef12c05e22eb..e1af88d1f4992 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: 2022-11-10 +date: 2022-11-14 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 b6d718303c8d2..725e6980be4e9 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 70038d4a604aa..661978df2d519 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: 2022-11-10 +date: 2022-11-14 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 84d071b6be236..b43aaf93d3389 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: 2022-11-10 +date: 2022-11-14 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 ff920fac53f37..c3e238b8fc5bb 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: 2022-11-10 +date: 2022-11-14 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 307fb8c37f92b..4da230f615eef 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: 2022-11-10 +date: 2022-11-14 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 b3bce2c67839d..9620a2f6a9f73 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: 2022-11-10 +date: 2022-11-14 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 473deca1df0f5..6a9723b324563 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: 2022-11-10 +date: 2022-11-14 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 972b57bdf2a4d..59c067793fa16 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: 2022-11-10 +date: 2022-11-14 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 164c56a9cc166..cfa020a69fc8e 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: 2022-11-10 +date: 2022-11-14 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 1aceca338547a..9c744b4ea669a 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: 2022-11-10 +date: 2022-11-14 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 74211351402ea..4acab64c45931 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: 2022-11-10 +date: 2022-11-14 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 1437441be55b3..049fd16292249 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: 2022-11-10 +date: 2022-11-14 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 66f0e19d672e5..842dd1afc79a4 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: 2022-11-10 +date: 2022-11-14 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 c3b58d44def44..dbeef0dd2f337 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 6d762a7f4c6ad..a721548359ead 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -1885,6 +1885,24 @@ "children": [], "returnComment": [] }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizeEmbeddable.getExpressionVariables$", + "type": "Function", + "tags": [], + "label": "getExpressionVariables$", + "description": [], + "signature": [ + "() => ", + "Observable", + " | undefined>" + ], + "path": "src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, { "parentPluginId": "visualizations", "id": "def-public.VisualizeEmbeddable.inputIsRefType", @@ -6352,7 +6370,9 @@ "section": "def-public.ExpressionRenderError", "text": "ExpressionRenderError" }, - ") => void; reload: () => Promise; supportedTriggers: () => string[]; inputIsRefType: (input: ", + ") => void; reload: () => Promise; supportedTriggers: () => string[]; getExpressionVariables$: () => ", + "Observable", + " | undefined>; inputIsRefType: (input: ", { "pluginId": "visualizations", "scope": "public", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 8115dc2152f9c..ce24eca2e3632 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: 2022-11-10 +date: 2022-11-14 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 796 | 12 | 766 | 18 | +| 797 | 12 | 767 | 18 | ## Client diff --git a/docs/api-generated/cases/case-apis-passthru.asciidoc b/docs/api-generated/cases/case-apis-passthru.asciidoc index e58eeb38483a7..13f84c1e85cc3 100644 --- a/docs/api-generated/cases/case-apis-passthru.asciidoc +++ b/docs/api-generated/cases/case-apis-passthru.asciidoc @@ -21,9 +21,16 @@ Any modifications made to this file will be overwritten.
  • post /s/{spaceId}/api/cases/{caseId}/comments
  • post /s/{spaceId}/api/cases
  • delete /s/{spaceId}/api/cases
  • +
  • delete /s/{spaceId}/api/cases/{caseId}/comments/{commentId}
  • delete /s/{spaceId}/api/cases/{caseId}/comments
  • get /s/{spaceId}/api/cases/{caseId}/comments
  • +
  • get /s/{spaceId}/api/cases/{caseId}
  • +
  • get /s/{spaceId}/api/cases/{caseId}/comments/{commentId}
  • get /s/{spaceId}/api/cases/configure
  • +
  • get /s/{spaceId}/api/cases/reporters
  • +
  • get /s/{spaceId}/api/cases/status
  • +
  • get /s/{spaceId}/api/cases/tags
  • +
  • get /s/{spaceId}/api/cases/alerts/{alertId}
  • post /s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push
  • post /s/{spaceId}/api/cases/configure
  • patch /s/{spaceId}/api/cases
  • @@ -301,6 +308,47 @@ Any modifications made to this file will be overwritten. + + + + +

    Responses

    +

    204

    + Indicates a successful call. + + +
    +
    +
    + Up +
    delete /s/{spaceId}/api/cases/{caseId}/comments/{commentId}
    +
    Deletes a comment or alert from a case. (deleteCaseComment)
    +
    You must have all privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases you're deleting.
    + +

    Path parameters

    +
    +
    caseId (required)
    + +
    Path Parameter — The identifier for the case. To retrieve case IDs, use the find cases API. All non-ASCII characters must be URL encoded. default: null
    commentId (required)
    + +
    Path Parameter — The identifier for the comment. To retrieve comment IDs, use the get case or find cases APIs. default: null
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + +

    Request headers

    +
    +
    kbn-xsrf (required)
    + +
    Header Parameter — default: null
    + +
    + + + + @@ -450,6 +498,160 @@ Any modifications made to this file will be overwritten. case_response_properties

    +
    +
    + Up +
    get /s/{spaceId}/api/cases/{caseId}
    +
    Retrieves information about a case. (getCase)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the case you're seeking.
    + +

    Path parameters

    +
    +
    caseId (required)
    + +
    Path Parameter — The identifier for the case. To retrieve case IDs, use the find cases API. All non-ASCII characters must be URL encoded. default: null
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + +

    Query parameters

    +
    +
    includeComments (optional)
    + +
    Query Parameter — Determines whether case comments are returned. default: true
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "owner" : "cases",
    +  "totalComment" : 0,
    +  "settings" : {
    +    "syncAlerts" : true
    +  },
    +  "totalAlerts" : 0,
    +  "closed_at" : "2000-01-23T04:56:07.000+00:00",
    +  "comments" : [ null, null ],
    +  "assignees" : [ {
    +    "uid" : "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0"
    +  }, {
    +    "uid" : "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0"
    +  } ],
    +  "created_at" : "2022-05-13T09:16:17.416Z",
    +  "description" : "A case description.",
    +  "title" : "Case title 1",
    +  "created_by" : {
    +    "full_name" : "full_name",
    +    "profile_uid" : "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0",
    +    "email" : "email",
    +    "username" : "elastic"
    +  },
    +  "version" : "WzUzMiwxXQ==",
    +  "closed_by" : {
    +    "full_name" : "full_name",
    +    "profile_uid" : "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0",
    +    "email" : "email",
    +    "username" : "elastic"
    +  },
    +  "tags" : [ "tag-1" ],
    +  "duration" : 120,
    +  "updated_at" : "2000-01-23T04:56:07.000+00:00",
    +  "updated_by" : {
    +    "full_name" : "full_name",
    +    "profile_uid" : "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0",
    +    "email" : "email",
    +    "username" : "elastic"
    +  },
    +  "id" : "66b9aa00-94fa-11ea-9f74-e7e108796192",
    +  "external_service" : {
    +    "external_title" : "external_title",
    +    "pushed_by" : {
    +      "full_name" : "full_name",
    +      "profile_uid" : "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0",
    +      "email" : "email",
    +      "username" : "elastic"
    +    },
    +    "external_url" : "external_url",
    +    "pushed_at" : "2000-01-23T04:56:07.000+00:00",
    +    "connector_id" : "connector_id",
    +    "external_id" : "external_id",
    +    "connector_name" : "connector_name"
    +  }
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + case_response_properties +
    +
    +
    +
    + Up +
    get /s/{spaceId}/api/cases/{caseId}/comments/{commentId}
    +
    Retrieves a comment from a case. (getCaseComment)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases with the comments you're seeking.
    + +

    Path parameters

    +
    +
    caseId (required)
    + +
    Path Parameter — The identifier for the case. To retrieve case IDs, use the find cases API. All non-ASCII characters must be URL encoded. default: null
    commentId (required)
    + +
    Path Parameter — The identifier for the comment. To retrieve comment IDs, use the get case or find cases APIs. default: null
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    null
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + getCaseComment_200_response +
    +
    Up @@ -484,7 +686,7 @@ Any modifications made to this file will be overwritten.

    Example data

    -
    Content-Type: application/json; charset=utf-8
    +
    Content-Type: application/json
    {
       "closure_type" : "close-by-user",
       "owner" : "cases",
    @@ -524,7 +726,221 @@ Any modifications made to this file will be overwritten.
         This API call produces the following media types according to the Accept request header;
         the media type will be conveyed by the Content-Type response header.
         
      -
    • application/json; charset=utf-8
    • +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + +
    +
    +
    +
    + Up +
    get /s/{spaceId}/api/cases/reporters
    +
    Returns information about the users who opened cases. (getCaseReporters)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases. The API returns information about the users as they existed at the time of the case creation, including their name, full name, and email address. If any of those details change thereafter or if a user is deleted, the information returned by this API is unchanged.
    + +

    Path parameters

    +
    +
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + +

    Query parameters

    +
    +
    owner (optional)
    + +
    Query Parameter — A filter to limit the response to a specific set of applications. If this parameter is omitted, the response contains information about all the cases that the user has access to read. default: null
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "full_name" : "full_name",
    +  "profile_uid" : "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0",
    +  "email" : "email",
    +  "username" : "elastic"
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + +
    +
    +
    +
    + Up +
    get /s/{spaceId}/api/cases/status
    +
    Returns the number of cases that are open, closed, and in progress. (getCaseStatus)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases you're seeking.
    + +

    Path parameters

    +
    +
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + +

    Query parameters

    +
    +
    owner (optional)
    + +
    Query Parameter — A filter to limit the response to a specific set of applications. If this parameter is omitted, the response contains information about all the cases that the user has access to read. default: null
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "count_in_progress_cases" : 6,
    +  "count_open_cases" : 1,
    +  "count_closed_cases" : 0
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + getCaseStatus_200_response +
    +
    +
    +
    + Up +
    get /s/{spaceId}/api/cases/tags
    +
    Aggregates and returns a list of case tags. (getCaseTags)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases you're seeking.
    + +

    Path parameters

    +
    +
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + +

    Query parameters

    +
    +
    owner (optional)
    + +
    Query Parameter — A filter to limit the retrieved case statistics to a specific set of applications. If this parameter is omitted, the response contains tags from all cases that the user has access to read. default: null
    +
    + + +

    Return type

    +
    + + array[String] +
    + + + +

    Example data

    +
    Content-Type: application/json
    +
    ""
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + +
    +
    +
    +
    + Up +
    get /s/{spaceId}/api/cases/alerts/{alertId}
    +
    Returns the cases associated with a specific alert. (getCasesByAlert)
    +
    You must have read privileges for the Cases feature in the Management, Observability, or Security section of the Kibana feature privileges, depending on the owner of the cases you're seeking.
    + +

    Path parameters

    +
    +
    alertId (required)
    + +
    Path Parameter — An identifier for the alert. default: null
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    +
    + + + + +

    Query parameters

    +
    +
    owner (optional)
    + +
    Query Parameter — A filter to limit the response to a specific set of applications. If this parameter is omitted, the response contains information about all the cases that the user has access to read. default: null
    +
    + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    [ {
    +  "id" : "06116b80-e1c3-11ec-be9b-9b1838238ee6",
    +  "title" : "security_case"
    +} ]
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json

    Responses

    @@ -701,7 +1117,7 @@ Any modifications made to this file will be overwritten.

    Example data

    -
    Content-Type: application/json; charset=utf-8
    +
    Content-Type: application/json
    {
       "closure_type" : "close-by-user",
       "owner" : "cases",
    @@ -741,7 +1157,7 @@ Any modifications made to this file will be overwritten.
         This API call produces the following media types according to the Accept request header;
         the media type will be conveyed by the Content-Type response header.
         
      -
    • application/json; charset=utf-8
    • +
    • application/json

    Responses

    @@ -1035,7 +1451,7 @@ Any modifications made to this file will be overwritten.

    Example data

    -
    Content-Type: application/json; charset=utf-8
    +
    Content-Type: application/json
    {
       "closure_type" : "close-by-user",
       "owner" : "cases",
    @@ -1075,7 +1491,7 @@ Any modifications made to this file will be overwritten.
         This API call produces the following media types according to the Accept request header;
         the media type will be conveyed by the Content-Type response header.
         
      -
    • application/json; charset=utf-8
    • +
    • application/json

    Responses

    @@ -1096,7 +1512,6 @@ Any modifications made to this file will be overwritten.
  • add_case_comment_request - Add case comment request
  • add_user_comment_request_properties - Add case comment request properties for user comments
  • alert_comment_response_properties - Add case comment response properties for alerts
  • -
  • alert_comment_response_properties_created_by -
  • alert_comment_response_properties_pushed_by -
  • alert_comment_response_properties_rule -
  • alert_identifiers - Alert identifiers
  • @@ -1125,12 +1540,16 @@ Any modifications made to this file will be overwritten.
  • create_case_request_assignees_inner -
  • create_case_request_connector -
  • external_service -
  • +
  • getCaseComment_200_response -
  • getCaseConfiguration_200_response_inner -
  • getCaseConfiguration_200_response_inner_connector -
  • getCaseConfiguration_200_response_inner_created_by -
  • getCaseConfiguration_200_response_inner_mappings_inner -
  • getCaseConfiguration_200_response_inner_updated_by -
  • -
  • getCaseConfiguration_owner_parameter -
  • +
  • getCaseReporters_200_response_inner -
  • +
  • getCaseStatus_200_response -
  • +
  • getCasesByAlert_200_response_inner -
  • +
  • getCasesByAlert_owner_parameter -
  • owners -
  • rule - Alerting rule
  • setCaseConfiguration_request -
  • @@ -1226,7 +1645,7 @@ Any modifications made to this file will be overwritten.
    alertId (optional)
    created_at (optional)
    Date format: date-time
    -
    created_by (optional)
    +
    created_by (optional)
    id (optional)
    index (optional)
    owner (optional)
    @@ -1237,20 +1656,10 @@ Any modifications made to this file will be overwritten.
    Enum:
    alert
    updated_at (optional)
    Date format: date-time
    -
    updated_by (optional)
    +
    updated_by (optional)
    version (optional)
    -
    -

    alert_comment_response_properties_created_by - Up

    -
    -
    -
    email (optional)
    -
    full_name (optional)
    -
    username (optional)
    -
    profile_uid (optional)
    -
    -

    alert_comment_response_properties_pushed_by - Up

    @@ -1546,6 +1955,28 @@ Any modifications made to this file will be overwritten.
    pushed_by (optional)
    +
    +

    getCaseComment_200_response - Up

    +
    +
    +
    alertId (optional)
    +
    created_at (optional)
    Date format: date-time
    +
    created_by (optional)
    +
    id (optional)
    +
    index (optional)
    +
    owner (optional)
    +
    pushed_at (optional)
    Date format: date-time
    +
    pushed_by (optional)
    +
    rule (optional)
    +
    type
    +
    Enum:
    +
    user
    +
    updated_at (optional)
    Date format: date-time
    +
    updated_by (optional)
    +
    version (optional)
    +
    comment (optional)
    +
    +

    getCaseConfiguration_200_response_inner - Up

    @@ -1601,7 +2032,34 @@ Any modifications made to this file will be overwritten.
    -

    getCaseConfiguration_owner_parameter - Up

    +

    getCaseReporters_200_response_inner - Up

    +
    +
    +
    email (optional)
    +
    full_name (optional)
    +
    username (optional)
    +
    profile_uid (optional)
    +
    +
    +
    +

    getCaseStatus_200_response - Up

    +
    +
    +
    count_closed_cases (optional)
    +
    count_in_progress_cases (optional)
    +
    count_open_cases (optional)
    +
    +
    +
    +

    getCasesByAlert_200_response_inner - Up

    +
    +
    +
    id (optional)
    String The case identifier.
    +
    title (optional)
    String The case title.
    +
    +
    +
    +

    getCasesByAlert_owner_parameter - Up

    diff --git a/docs/api/cases/cases-api-get-case.asciidoc b/docs/api/cases/cases-api-get-case.asciidoc index 9d43afb695a79..b5942f0424408 100644 --- a/docs/api/cases/cases-api-get-case.asciidoc +++ b/docs/api/cases/cases-api-get-case.asciidoc @@ -6,6 +6,12 @@ Returns information about a case. +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[open API specification]. For a preview, check out <>. +==== + === {api-request-title} `GET :/api/cases/` diff --git a/docs/api/cases/cases-api-get-cases-by-alert.asciidoc b/docs/api/cases/cases-api-get-cases-by-alert.asciidoc index 01aec7a7e4c77..14b45f9b4b0e7 100644 --- a/docs/api/cases/cases-api-get-cases-by-alert.asciidoc +++ b/docs/api/cases/cases-api-get-cases-by-alert.asciidoc @@ -8,6 +8,13 @@ preview::[] Returns the cases associated with a specific alert. +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[open API specification]. For a preview, check out <>. +==== + + === {api-request-title} `GET :/api/cases/alerts/` diff --git a/docs/api/cases/cases-api-get-reporters.asciidoc b/docs/api/cases/cases-api-get-reporters.asciidoc index 558f799e518ae..9792bc77ae517 100644 --- a/docs/api/cases/cases-api-get-reporters.asciidoc +++ b/docs/api/cases/cases-api-get-reporters.asciidoc @@ -6,6 +6,13 @@ Returns information about the users who opened cases. +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[open API specification]. For a preview, check out <>. +==== + + === {api-request-title} `GET :/api/cases/reporters` diff --git a/docs/api/cases/cases-api-get-status.asciidoc b/docs/api/cases/cases-api-get-status.asciidoc index f96747dcc1116..a6d64bc4e9585 100644 --- a/docs/api/cases/cases-api-get-status.asciidoc +++ b/docs/api/cases/cases-api-get-status.asciidoc @@ -6,6 +6,12 @@ Returns the number of cases that are open, closed, and in progress. +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[open API specification]. For a preview, check out <>. +==== + deprecated::[8.1.0] === {api-request-title} diff --git a/docs/api/cases/cases-api-get-tags.asciidoc b/docs/api/cases/cases-api-get-tags.asciidoc index aea18291abd59..e22a2f08cfda5 100644 --- a/docs/api/cases/cases-api-get-tags.asciidoc +++ b/docs/api/cases/cases-api-get-tags.asciidoc @@ -6,6 +6,12 @@ Aggregates and returns a list of case tags. +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[open API specification]. For a preview, check out <>. +==== + === {api-request-title} `GET :/api/cases/tags` diff --git a/package.json b/package.json index 44a3d668b6a62..667b1bec59753 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "@dnd-kit/utilities": "^2.0.0", "@elastic/apm-rum": "^5.12.0", "@elastic/apm-rum-react": "^1.4.2", - "@elastic/charts": "50.0.2", + "@elastic/charts": "50.2.1", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.4.0-canary.1", "@elastic/ems-client": "8.3.3", diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 1e27f47e8e471..37c7aaf9d0695 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -20,7 +20,7 @@ pageLoadAssetSize: controls: 40000 core: 435325 crossClusterReplication: 65408 - customIntegrations: 28810 + customIntegrations: 44305 dashboard: 82025 dashboardEnhanced: 65646 data: 454087 diff --git a/src/plugins/console/public/lib/autocomplete/components/component_template_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/component_template_autocomplete_component.js index 2b547d698415c..3eb369dec919d 100644 --- a/src/plugins/console/public/lib/autocomplete/components/component_template_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/component_template_autocomplete_component.js @@ -6,12 +6,18 @@ * Side Public License, v 1. */ -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; import { ListComponent } from './list_component'; export class ComponentTemplateAutocompleteComponent extends ListComponent { constructor(name, parent) { - super(name, getAutocompleteInfo().getEntityProvider('componentTemplates'), parent, true, true); + super( + name, + getAutocompleteInfo().getEntityProvider(ENTITIES.COMPONENT_TEMPLATES), + parent, + true, + true + ); } getContextKey() { diff --git a/src/plugins/console/public/lib/autocomplete/components/data_stream_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/data_stream_autocomplete_component.js index 0b043410c3b25..3ebc017c39796 100644 --- a/src/plugins/console/public/lib/autocomplete/components/data_stream_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/data_stream_autocomplete_component.js @@ -7,11 +7,16 @@ */ import { ListComponent } from './list_component'; -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; export class DataStreamAutocompleteComponent extends ListComponent { constructor(name, parent, multiValued) { - super(name, getAutocompleteInfo().getEntityProvider('dataStreams'), parent, multiValued); + super( + name, + getAutocompleteInfo().getEntityProvider(ENTITIES.DATA_STREAMS), + parent, + multiValued + ); } getContextKey() { diff --git a/src/plugins/console/public/lib/autocomplete/components/field_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/field_autocomplete_component.js index e3257b2bd86b8..3192bf830f4f3 100644 --- a/src/plugins/console/public/lib/autocomplete/components/field_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/field_autocomplete_component.js @@ -7,11 +7,11 @@ */ import _ from 'lodash'; -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; import { ListComponent } from './list_component'; function FieldGenerator(context) { - return _.map(getAutocompleteInfo().getEntityProvider('fields', context), function (field) { + return _.map(getAutocompleteInfo().getEntityProvider(ENTITIES.FIELDS, context), function (field) { return { name: field.name, meta: field.type }; }); } diff --git a/src/plugins/console/public/lib/autocomplete/components/index_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/index_autocomplete_component.js index c2a7e2fb14286..7615c511148b0 100644 --- a/src/plugins/console/public/lib/autocomplete/components/index_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/index_autocomplete_component.js @@ -7,7 +7,7 @@ */ import _ from 'lodash'; -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; import { ListComponent } from './list_component'; function nonValidIndexType(token) { @@ -16,7 +16,7 @@ function nonValidIndexType(token) { export class IndexAutocompleteComponent extends ListComponent { constructor(name, parent, multiValued) { - super(name, getAutocompleteInfo().getEntityProvider('indices'), parent, multiValued); + super(name, getAutocompleteInfo().getEntityProvider(ENTITIES.INDICES), parent, multiValued); } validateTokens(tokens) { if (!this.multiValued && tokens.length > 1) { diff --git a/src/plugins/console/public/lib/autocomplete/components/index_template_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/index_template_autocomplete_component.js index 7bb3c32239751..41c760c809004 100644 --- a/src/plugins/console/public/lib/autocomplete/components/index_template_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/index_template_autocomplete_component.js @@ -6,12 +6,18 @@ * Side Public License, v 1. */ -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; import { ListComponent } from './list_component'; export class IndexTemplateAutocompleteComponent extends ListComponent { constructor(name, parent) { - super(name, getAutocompleteInfo().getEntityProvider('indexTemplates'), parent, true, true); + super( + name, + getAutocompleteInfo().getEntityProvider(ENTITIES.INDEX_TEMPLATES), + parent, + true, + true + ); } getContextKey() { diff --git a/src/plugins/console/public/lib/autocomplete/components/username_autocomplete_component.js b/src/plugins/console/public/lib/autocomplete/components/username_autocomplete_component.js index c505f66a68b0c..75394787533f1 100644 --- a/src/plugins/console/public/lib/autocomplete/components/username_autocomplete_component.js +++ b/src/plugins/console/public/lib/autocomplete/components/username_autocomplete_component.js @@ -7,7 +7,7 @@ */ import _ from 'lodash'; -import { getAutocompleteInfo } from '../../../services'; +import { getAutocompleteInfo, ENTITIES } from '../../../services'; import { ListComponent } from './list_component'; function nonValidUsernameType(token) { @@ -16,7 +16,7 @@ function nonValidUsernameType(token) { export class UsernameAutocompleteComponent extends ListComponent { constructor(name, parent, multiValued) { - super(name, getAutocompleteInfo().getEntityProvider('indices'), parent, multiValued); + super(name, getAutocompleteInfo().getEntityProvider(ENTITIES.INDICES), parent, multiValued); } validateTokens(tokens) { if (!this.multiValued && tokens.length > 1) { diff --git a/src/plugins/console/public/lib/autocomplete_entities/types.ts b/src/plugins/console/public/lib/autocomplete_entities/types.ts index e49f8f106f37a..9c2607b8ad84f 100644 --- a/src/plugins/console/public/lib/autocomplete_entities/types.ts +++ b/src/plugins/console/public/lib/autocomplete_entities/types.ts @@ -29,7 +29,7 @@ export interface FieldMapping { fields?: FieldMapping[]; } -export interface MappingsApiResponse { +export interface AutoCompleteEntitiesApiResponse { mappings: IndicesGetMappingResponse; aliases: IndicesGetAliasResponse; dataStreams: IndicesGetDataStreamResponse; diff --git a/src/plugins/console/public/services/autocomplete.ts b/src/plugins/console/public/services/autocomplete.ts index 59974184ea2f5..3e1a38a514607 100644 --- a/src/plugins/console/public/services/autocomplete.ts +++ b/src/plugins/console/public/services/autocomplete.ts @@ -8,7 +8,7 @@ import { createGetterSetter } from '@kbn/kibana-utils-plugin/public'; import type { HttpSetup } from '@kbn/core/public'; -import type { MappingsApiResponse } from '../lib/autocomplete_entities/types'; +import type { AutoCompleteEntitiesApiResponse } from '../lib/autocomplete_entities/types'; import { API_BASE_PATH } from '../../common/constants'; import { Alias, @@ -20,6 +20,15 @@ import { } from '../lib/autocomplete_entities'; import { DevToolsSettings, Settings } from './settings'; +export enum ENTITIES { + INDICES = 'indices', + FIELDS = 'fields', + INDEX_TEMPLATES = 'indexTemplates', + COMPONENT_TEMPLATES = 'componentTemplates', + LEGACY_TEMPLATES = 'legacyTemplates', + DATA_STREAMS = 'dataStreams', +} + export class AutocompleteInfo { public readonly alias = new Alias(); public readonly mapping = new Mapping(); @@ -39,19 +48,19 @@ export class AutocompleteInfo { context: { indices: string[]; types: string[] } = { indices: [], types: [] } ) { switch (type) { - case 'indices': + case ENTITIES.INDICES: const includeAliases = true; const collaborator = this.mapping; return () => this.alias.getIndices(includeAliases, collaborator); - case 'fields': + case ENTITIES.FIELDS: return this.mapping.getMappings(context.indices, context.types); - case 'indexTemplates': + case ENTITIES.INDEX_TEMPLATES: return () => this.indexTemplate.getTemplates(); - case 'componentTemplates': + case ENTITIES.COMPONENT_TEMPLATES: return () => this.componentTemplate.getTemplates(); - case 'legacyTemplates': + case ENTITIES.LEGACY_TEMPLATES: return () => this.legacyTemplate.getTemplates(); - case 'dataStreams': + case ENTITIES.DATA_STREAMS: return () => this.dataStream.getDataStreams(); default: throw new Error(`Unsupported type: ${type}`); @@ -61,7 +70,7 @@ export class AutocompleteInfo { public retrieve(settings: Settings, settingsToRetrieve: DevToolsSettings['autocomplete']) { this.clearSubscriptions(); this.http - .get(`${API_BASE_PATH}/autocomplete_entities`, { + .get(`${API_BASE_PATH}/autocomplete_entities`, { query: { ...settingsToRetrieve }, }) .then((data) => { @@ -83,7 +92,7 @@ export class AutocompleteInfo { } } - private load(data: MappingsApiResponse) { + private load(data: AutoCompleteEntitiesApiResponse) { this.mapping.loadMappings(data.mappings); const collaborator = this.mapping; this.alias.loadAliases(data.aliases, collaborator); diff --git a/src/plugins/console/public/services/index.ts b/src/plugins/console/public/services/index.ts index d73c169fd647a..73929f89e386f 100644 --- a/src/plugins/console/public/services/index.ts +++ b/src/plugins/console/public/services/index.ts @@ -10,4 +10,9 @@ export { createHistory, History } from './history'; export { createStorage, Storage, StorageKeys, setStorage, getStorage } from './storage'; export type { DevToolsSettings } from './settings'; export { createSettings, Settings, DEFAULT_SETTINGS } from './settings'; -export { AutocompleteInfo, getAutocompleteInfo, setAutocompleteInfo } from './autocomplete'; +export { + AutocompleteInfo, + getAutocompleteInfo, + setAutocompleteInfo, + ENTITIES, +} from './autocomplete'; diff --git a/src/plugins/console/server/lib/proxy_request.ts b/src/plugins/console/server/lib/proxy_request.ts index 875345be52055..90d3cafa8c566 100644 --- a/src/plugins/console/server/lib/proxy_request.ts +++ b/src/plugins/console/server/lib/proxy_request.ts @@ -12,6 +12,7 @@ import net from 'net'; import stream from 'stream'; import Boom from '@hapi/boom'; import { URL } from 'url'; +import { sanitizeHostname } from './utils'; interface Args { method: 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'; @@ -23,13 +24,6 @@ interface Args { rejectUnauthorized?: boolean; } -/** - * Node http request library does not expect there to be trailing "[" or "]" - * characters in ipv6 host names. - */ -const sanitizeHostname = (hostName: string): string => - hostName.trim().replace(/^\[/, '').replace(/\]$/, ''); - // We use a modified version of Hapi's Wreck because Hapi, Axios, and Superagent don't support GET requests // with bodies, but ES APIs do. Similarly with DELETE requests with bodies. Another library, `request` // diverged too much from current behaviour. diff --git a/src/plugins/console/server/lib/utils/index.ts b/src/plugins/console/server/lib/utils/index.ts index 2c595640eefbf..aac0f890a8a80 100644 --- a/src/plugins/console/server/lib/utils/index.ts +++ b/src/plugins/console/server/lib/utils/index.ts @@ -8,4 +8,4 @@ export { encodePath } from './encode_path'; export { toURL } from './to_url'; -export { streamToJSON } from './stream_to_json'; +export { sanitizeHostname } from './sanitize_hostname'; diff --git a/src/plugins/console/server/lib/utils/sanitize_hostname.test.ts b/src/plugins/console/server/lib/utils/sanitize_hostname.test.ts new file mode 100644 index 0000000000000..987481ddfa5fd --- /dev/null +++ b/src/plugins/console/server/lib/utils/sanitize_hostname.test.ts @@ -0,0 +1,27 @@ +/* + * Copyright 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 { sanitizeHostname } from './sanitize_hostname'; + +describe('sanitizeHostname', () => { + it('should remove leading and trailing brackets', () => { + expect(sanitizeHostname('[::1]')).toBe('::1'); + }); + + it('should remove leading brackets', () => { + expect(sanitizeHostname('[::1')).toBe('::1'); + }); + + it('should remove trailing brackets', () => { + expect(sanitizeHostname('::1]')).toBe('::1'); + }); + + it('should not remove brackets in the middle of the string', () => { + expect(sanitizeHostname('[::1]foo')).toBe('::1]foo'); + }); +}); diff --git a/src/plugins/console/server/routes/api/console/autocomplete_entities/register_mappings_route.ts b/src/plugins/console/server/lib/utils/sanitize_hostname.ts similarity index 59% rename from src/plugins/console/server/routes/api/console/autocomplete_entities/register_mappings_route.ts rename to src/plugins/console/server/lib/utils/sanitize_hostname.ts index 53d12f69d30e5..a7b49c5874f58 100644 --- a/src/plugins/console/server/routes/api/console/autocomplete_entities/register_mappings_route.ts +++ b/src/plugins/console/server/lib/utils/sanitize_hostname.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import type { RouteDependencies } from '../../..'; -import { registerGetRoute } from './register_get_route'; - -export function registerMappingsRoute(deps: RouteDependencies) { - registerGetRoute(deps); -} +/** + * Node http request library does not expect there to be trailing "[" or "]" + * characters in ipv6 host names. + */ +export const sanitizeHostname = (hostName: string): string => + hostName.trim().replace(/^\[/, '').replace(/\]$/, ''); diff --git a/src/plugins/console/server/lib/utils/stream_to_json.test.ts b/src/plugins/console/server/lib/utils/stream_to_json.test.ts deleted file mode 100644 index 780d3adb4a145..0000000000000 --- a/src/plugins/console/server/lib/utils/stream_to_json.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { Readable } from 'stream'; -import { streamToJSON } from './stream_to_json'; -import type { IncomingMessage } from 'http'; - -describe('streamToString', () => { - it('should limit the response size', async () => { - const stream = new Readable({ - read() { - this.push('a'.repeat(1000)); - }, - }); - await expect( - streamToJSON(stream as IncomingMessage, 500) - ).rejects.toThrowErrorMatchingInlineSnapshot(`"Response size limit exceeded"`); - }); - - it('should parse the response', async () => { - const stream = new Readable({ - read() { - this.push('{"test": "test"}'); - this.push(null); - }, - }); - const result = await streamToJSON(stream as IncomingMessage, 5000); - expect(result).toEqual({ test: 'test' }); - }); -}); diff --git a/src/plugins/console/server/lib/utils/stream_to_json.ts b/src/plugins/console/server/lib/utils/stream_to_json.ts deleted file mode 100644 index 5ff1974e9fd47..0000000000000 --- a/src/plugins/console/server/lib/utils/stream_to_json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import type { IncomingMessage } from 'http'; - -export function streamToJSON(stream: IncomingMessage, limit: number) { - return new Promise((resolve, reject) => { - const chunks: Buffer[] = []; - stream.on('data', (chunk) => { - chunks.push(chunk); - if (Buffer.byteLength(Buffer.concat(chunks)) > limit) { - stream.destroy(); - reject(new Error('Response size limit exceeded')); - } - }); - stream.on('end', () => { - const response = Buffer.concat(chunks).toString('utf8'); - resolve(JSON.parse(response)); - }); - stream.on('error', reject); - }); -} diff --git a/src/plugins/console/server/routes/api/console/autocomplete_entities/index.ts b/src/plugins/console/server/routes/api/console/autocomplete_entities/index.ts index 796451b2721f3..1c6b23fa7fd7f 100644 --- a/src/plugins/console/server/routes/api/console/autocomplete_entities/index.ts +++ b/src/plugins/console/server/routes/api/console/autocomplete_entities/index.ts @@ -6,4 +6,207 @@ * Side Public License, v 1. */ -export { registerMappingsRoute } from './register_mappings_route'; +import http from 'http'; +import https from 'https'; +import { Buffer } from 'buffer'; +import { parse } from 'query-string'; +import Boom from '@hapi/boom'; +import type { KibanaRequest } from '@kbn/core-http-server'; +import type { SemVer } from 'semver'; +import type { RouteDependencies } from '../../..'; +import { sanitizeHostname } from '../../../../lib/utils'; +import type { ESConfigForProxy } from '../../../../types'; +import { getRequestConfig } from '../proxy/create_handler'; + +interface SettingsToRetrieve { + indices: boolean; + fields: boolean; + templates: boolean; + dataStreams: boolean; +} + +type Config = ESConfigForProxy & { headers: KibanaRequest['headers'] } & { kibanaVersion: SemVer }; + +const MAX_RESPONSE_SIZE = 10 * 1024 * 1024; // 10MB +// Limit the response size to 10MB, because the response can be very large and sending it to the client +// can cause the browser to hang. + +const getMappings = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.fields) { + const mappings = await getEntity('/_mapping', config); + return mappings; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +const getAliases = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.indices) { + const aliases = await getEntity('/_alias', config); + return aliases; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +const getDataStreams = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.dataStreams) { + const dataStreams = await getEntity('/_data_stream', config); + return dataStreams; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +const getLegacyTemplates = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.templates) { + const legacyTemplates = await getEntity('/_template', config); + return legacyTemplates; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +const getIndexTemplates = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.templates) { + const indexTemplates = await getEntity('/_index_template', config); + return indexTemplates; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +const getComponentTemplates = async (settings: SettingsToRetrieve, config: Config) => { + if (settings.templates) { + const componentTemplates = await getEntity('/_component_template', config); + return componentTemplates; + } + // If the user doesn't want autocomplete suggestions, then clear any that exist. + return {}; +}; + +/** + * Get the autocomplete suggestions for the given entity. + * We are using the raw http request in this function to retrieve the entities instead of esClient because + * the esClient does not handle large responses well. For example, the response size for + * the mappings can be very large(> 1GB) and the esClient will throw an 'Invalid string length' + * error when trying to parse the response. By using the raw http request, we can limit the + * response size and avoid the error. + * @param path The path to the entity to retrieve. For example, '/_mapping' or '/_alias'. + * @param config The configuration for the request. + * @returns The entity retrieved from Elasticsearch. + */ +const getEntity = (path: string, config: Config) => { + return new Promise((resolve, reject) => { + const { hosts, kibanaVersion } = config; + for (let idx = 0; idx < hosts.length; idx++) { + const host = hosts[idx]; + const uri = new URL(host + path); + const { protocol, hostname, port } = uri; + const { headers } = getRequestConfig(config.headers, config, uri.toString(), kibanaVersion); + const client = protocol === 'https:' ? https : http; + const options = { + method: 'GET', + headers: { ...headers }, + host: sanitizeHostname(hostname), + port: port === '' ? undefined : parseInt(port, 10), + protocol, + path: `${path}?pretty=false`, // add pretty=false to compress the response by removing whitespace + }; + + try { + const req = client.request(options, (res) => { + const chunks: Buffer[] = []; + res.on('data', (chunk) => { + chunks.push(chunk); + + // Destroy the request if the response is too large + if (Buffer.byteLength(Buffer.concat(chunks)) > MAX_RESPONSE_SIZE) { + req.destroy(); + reject(Boom.badRequest(`Response size is too large for ${path}`)); + } + }); + res.on('end', () => { + const body = Buffer.concat(chunks).toString('utf8'); + resolve(JSON.parse(body)); + }); + }); + req.on('error', reject); + req.end(); + break; + } catch (err) { + if (idx === hosts.length - 1) { + reject(err); + } + // Try the next host + } + } + }); +}; + +export const registerAutocompleteEntitiesRoute = (deps: RouteDependencies) => { + deps.router.get( + { + path: '/api/console/autocomplete_entities', + options: { + tags: ['access:console'], + }, + validate: false, + }, + async (context, request, response) => { + const settings = parse(request.url.search, { + parseBooleans: true, + }) as unknown as SettingsToRetrieve; + + // If no settings are specified, then return 400. + if (Object.keys(settings).length === 0) { + return response.badRequest({ + body: 'Request must contain at least one of the following parameters: indices, fields, templates, dataStreams', + }); + } + + const legacyConfig = await deps.proxy.readLegacyESConfig(); + const configWithHeaders = { + ...legacyConfig, + headers: request.headers, + kibanaVersion: deps.kibanaVersion, + }; + + // Wait for all requests to complete, in case one of them fails return the successfull ones + const results = await Promise.allSettled([ + getMappings(settings, configWithHeaders), + getAliases(settings, configWithHeaders), + getDataStreams(settings, configWithHeaders), + getLegacyTemplates(settings, configWithHeaders), + getIndexTemplates(settings, configWithHeaders), + getComponentTemplates(settings, configWithHeaders), + ]); + + const [mappings, aliases, dataStreams, legacyTemplates, indexTemplates, componentTemplates] = + results.map((result) => { + // If the request was successful, return the result + if (result.status === 'fulfilled') { + return result.value; + } + + // If the request failed, log the error and return an empty object + if (result.reason instanceof Error) { + deps.log.debug(`Failed to retrieve autocomplete suggestions: ${result.reason.message}`); + } + + return {}; + }); + + return response.ok({ + body: { + mappings, + aliases, + dataStreams, + legacyTemplates, + indexTemplates, + componentTemplates, + }, + }); + } + ); +}; diff --git a/src/plugins/console/server/routes/api/console/autocomplete_entities/register_get_route.ts b/src/plugins/console/server/routes/api/console/autocomplete_entities/register_get_route.ts deleted file mode 100644 index 98bd51e901b09..0000000000000 --- a/src/plugins/console/server/routes/api/console/autocomplete_entities/register_get_route.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import type { IScopedClusterClient } from '@kbn/core/server'; -import { parse } from 'query-string'; -import type { IncomingMessage } from 'http'; -import type { RouteDependencies } from '../../..'; -import { API_BASE_PATH } from '../../../../../common/constants'; -import { streamToJSON } from '../../../../lib/utils'; - -interface Settings { - indices: boolean; - fields: boolean; - templates: boolean; - dataStreams: boolean; -} - -const RESPONSE_SIZE_LIMIT = 10 * 1024 * 1024; -// Limit the response size to 10MB, because the response can be very large and sending it to the client -// can cause the browser to hang. - -async function getMappings(esClient: IScopedClusterClient, settings: Settings) { - if (settings.fields) { - const stream = await esClient.asInternalUser.indices.getMapping(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -async function getAliases(esClient: IScopedClusterClient, settings: Settings) { - if (settings.indices) { - const stream = await esClient.asInternalUser.indices.getAlias(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -async function getDataStreams(esClient: IScopedClusterClient, settings: Settings) { - if (settings.dataStreams) { - const stream = await esClient.asInternalUser.indices.getDataStream(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -async function getLegacyTemplates(esClient: IScopedClusterClient, settings: Settings) { - if (settings.templates) { - const stream = await esClient.asInternalUser.indices.getTemplate(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -async function getComponentTemplates(esClient: IScopedClusterClient, settings: Settings) { - if (settings.templates) { - const stream = await esClient.asInternalUser.cluster.getComponentTemplate(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -async function getIndexTemplates(esClient: IScopedClusterClient, settings: Settings) { - if (settings.templates) { - const stream = await esClient.asInternalUser.indices.getIndexTemplate(undefined, { - asStream: true, - }); - return streamToJSON(stream as unknown as IncomingMessage, RESPONSE_SIZE_LIMIT); - } - // If the user doesn't want autocomplete suggestions, then clear any that exist. - return {}; -} - -export function registerGetRoute({ router, lib: { handleEsError } }: RouteDependencies) { - router.get( - { - path: `${API_BASE_PATH}/autocomplete_entities`, - validate: false, - }, - async (ctx, request, response) => { - try { - const settings = parse(request.url.search, { parseBooleans: true }) as unknown as Settings; - - // If no settings are provided return 400 - if (Object.keys(settings).length === 0) { - return response.badRequest({ - body: 'Request must contain a query param of autocomplete settings', - }); - } - - const esClient = (await ctx.core).elasticsearch.client; - - // Wait for all requests to complete, in case one of them fails return the successfull ones - const results = await Promise.allSettled([ - getMappings(esClient, settings), - getAliases(esClient, settings), - getDataStreams(esClient, settings), - getLegacyTemplates(esClient, settings), - getIndexTemplates(esClient, settings), - getComponentTemplates(esClient, settings), - ]); - - const [ - mappings, - aliases, - dataStreams, - legacyTemplates, - indexTemplates, - componentTemplates, - ] = results.map((result) => { - // If the request was successful, return the result - if (result.status === 'fulfilled') { - return result.value; - } - // If the request failed, return an empty object - return {}; - }); - - return response.ok({ - body: { - mappings, - aliases, - dataStreams, - legacyTemplates, - indexTemplates, - componentTemplates, - }, - }); - } catch (e) { - return handleEsError({ error: e, response }); - } - } - ); -} diff --git a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts index eddefc86fcbd2..70de8d6c59c7f 100644 --- a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts +++ b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts @@ -43,7 +43,7 @@ function filterHeaders(originalHeaders: object, headersToKeep: string[]): object return pick(originalHeaders, headersToKeepNormalized); } -function getRequestConfig( +export function getRequestConfig( headers: object, esConfig: ESConfigForProxy, uri: string, diff --git a/src/plugins/console/server/routes/index.ts b/src/plugins/console/server/routes/index.ts index b82b2ffbffa8e..e1a036f55a62c 100644 --- a/src/plugins/console/server/routes/index.ts +++ b/src/plugins/console/server/routes/index.ts @@ -17,7 +17,7 @@ import { handleEsError } from '../shared_imports'; import { registerEsConfigRoute } from './api/console/es_config'; import { registerProxyRoute } from './api/console/proxy'; import { registerSpecDefinitionsRoute } from './api/console/spec_definitions'; -import { registerMappingsRoute } from './api/console/autocomplete_entities'; +import { registerAutocompleteEntitiesRoute } from './api/console/autocomplete_entities'; export interface ProxyDependencies { readLegacyESConfig: () => Promise; @@ -43,5 +43,5 @@ export const registerRoutes = (dependencies: RouteDependencies) => { registerEsConfigRoute(dependencies); registerProxyRoute(dependencies); registerSpecDefinitionsRoute(dependencies); - registerMappingsRoute(dependencies); + registerAutocompleteEntitiesRoute(dependencies); }; diff --git a/src/plugins/custom_integrations/common/language_integrations.ts b/src/plugins/custom_integrations/common/language_integrations.ts index 8a24295096b40..d5b72bcd2afcf 100644 --- a/src/plugins/custom_integrations/common/language_integrations.ts +++ b/src/plugins/custom_integrations/common/language_integrations.ts @@ -115,9 +115,9 @@ export const languageIntegrations: LanguageIntegration[] = [ description: i18n.translate('customIntegrations.languageclients.PythonDescription', { defaultMessage: 'Index data to Elasticsearch with the Python client.', }), - docUrlTemplate: `${ELASTICSEARCH_CLIENT_URL}/python-api/{branch}/index.html`, + docUrlTemplate: '', integrationsAppUrl: `/app/integrations/language_clients/python/overview`, - exportLanguageUiComponent: false, + exportLanguageUiComponent: true, }, { id: 'rust', diff --git a/src/plugins/custom_integrations/public/components/fleet_integration/elasticsearch_py/elasticsearch_py_readme.tsx b/src/plugins/custom_integrations/public/components/fleet_integration/elasticsearch_py/elasticsearch_py_readme.tsx new file mode 100644 index 0000000000000..25fb3f916a61b --- /dev/null +++ b/src/plugins/custom_integrations/public/components/fleet_integration/elasticsearch_py/elasticsearch_py_readme.tsx @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; + +// eslint-disable-next-line @kbn/eslint/module_migration +import styled from 'styled-components'; + +import { + EuiCode, + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiPage, + EuiPageBody, + EuiPageHeader, + EuiPageSection, + EuiSpacer, + EuiText, + EuiTitle, + EuiPanel, + EuiImage, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { euiThemeVars } from '@kbn/ui-theme'; +import icon from '../../../assets/language_clients/python.svg'; + +const CenterColumn = styled(EuiFlexItem)` + max-width: 740px; +`; + +const FixedHeader = styled.div` + width: 100%; + height: 196px; + border-bottom: 1px solid ${euiThemeVars.euiColorLightShade}; +`; + +const IconPanel = styled(EuiPanel)` + padding: ${(props) => props.theme.eui.euiSizeXL}; + width: ${(props) => + parseFloat(props.theme.eui.euiSize) * 6 + parseFloat(props.theme.eui.euiSizeXL) * 2}px; + svg, + img { + height: ${(props) => parseFloat(props.theme.eui.euiSize) * 6}px; + width: ${(props) => parseFloat(props.theme.eui.euiSize) * 6}px; + } + .euiFlexItem { + height: ${(props) => parseFloat(props.theme.eui.euiSize) * 6}px; + justify-content: center; + } +`; + +const TopFlexGroup = styled(EuiFlexGroup)` + max-width: 1150px; + margin-left: auto; + margin-right: auto; + padding: calc(${euiThemeVars.euiSizeXL} * 2) ${euiThemeVars.euiSizeM} 0 ${euiThemeVars.euiSizeM}; +`; + +export const ElasticsearchPyClientReadme = () => { + return ( + <> + + + + + + + + + +

    + +

    +
    +
    +
    +
    + + + + + + + + + + } + /> + + + + +

    + +

    +
    + + + + + {`# The Python client for Elasticsearch can be installed with pip: \n`} + {`$ python -m pip install elasticsearch`} + +
    + + + +

    + +

    +
    + + + API key, + cloud_id: Cloud ID, + }} + /> + + + + + + {` +from elasticsearch import Elasticsearch + +# Found in the 'Manage this deployment' page +CLOUD_ID = "deployment-name:dXMtZWFzdDQuZ2Nw..." + +# Found in the 'Management' page under the section 'Security' +API_KEY = "YOUR_API_KEY" + +# Create the client instance +client = Elasticsearch( + cloud_id=CLOUD_ID, + api_key=API_KEY, +) + `} + +
    +
    +
    +
    +
    + + ); +}; diff --git a/src/plugins/custom_integrations/public/plugin.tsx b/src/plugins/custom_integrations/public/plugin.tsx index e1e10f327075c..dbd62d59adcf6 100755 --- a/src/plugins/custom_integrations/public/plugin.tsx +++ b/src/plugins/custom_integrations/public/plugin.tsx @@ -24,6 +24,7 @@ import { CustomIntegrationsServicesProvider } from './services'; import { servicesFactory } from './services/kibana'; import { SampleClientReadme } from './components/fleet_integration/sample/sample_client_readme'; import { ElasticsearchJsClientReadme } from './components/fleet_integration/elasticsearch_js/elasticsearch_js_readme'; +import { ElasticsearchPyClientReadme } from './components/fleet_integration/elasticsearch_py/elasticsearch_py_readme'; export class CustomIntegrationsPlugin implements Plugin @@ -50,6 +51,7 @@ export class CustomIntegrationsPlugin const languageClientsUiComponents = { sample: SampleClientReadme, javascript: ElasticsearchJsClientReadme, + python: ElasticsearchPyClientReadme, }; const ContextProvider: React.FC = ({ children }) => ( diff --git a/src/plugins/custom_integrations/server/plugin.test.ts b/src/plugins/custom_integrations/server/plugin.test.ts index 324522a383d83..54010843d2e24 100644 --- a/src/plugins/custom_integrations/server/plugin.test.ts +++ b/src/plugins/custom_integrations/server/plugin.test.ts @@ -108,8 +108,7 @@ describe('CustomIntegrationsPlugin', () => { description: 'Index data to Elasticsearch with the Python client.', type: 'ui_link', shipper: 'language_clients', - uiInternalPath: - 'https://www.elastic.co/guide/en/elasticsearch/client/python-api/branch/index.html', + uiInternalPath: '/app/integrations/language_clients/python/overview', isBeta: false, icons: [{ type: 'svg', src: undefined }], categories: ['elastic_stack', 'custom', 'language_client'], diff --git a/src/plugins/files/docs/tutorial.mdx b/src/plugins/files/docs/tutorial.mdx index deef2de26045d..3b2853ff65b11 100644 --- a/src/plugins/files/docs/tutorial.mdx +++ b/src/plugins/files/docs/tutorial.mdx @@ -89,6 +89,10 @@ export const exampleFileKind: FileKind = { In this example we have chosen to disallow metadata updates and file sharing endpoints. **Make sure that you only expose the actions you need over HTTP**. + + HTTP access tags (`access:myApp`) define a new permission for an HTTP endpoint. **Ensure that users have the permissions they need to access their files!** See `KibanaFeatureConfig` for more information. + + Now we are able to register this file kind with the file service: ```ts diff --git a/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx b/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx index da1931120d371..ac2c8e166ed82 100644 --- a/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx +++ b/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx @@ -235,6 +235,36 @@ describe('Guided setup', () => { expect(exists('onboarding--completeGuideButton--testGuide')).toBe(true); }); + test('should not show the completed state when the last step is not marked as complete', async () => { + const { component, exists, find } = testBed; + + const mockCompleteTestGuideState: GuideState = { + ...mockActiveTestGuideState, + steps: [ + { + id: mockActiveTestGuideState.steps[0].id, + status: 'complete', + }, + { + id: mockActiveTestGuideState.steps[1].id, + status: 'complete', + }, + { + id: mockActiveTestGuideState.steps[2].id, + status: 'complete', + }, + ], + }; + + await updateComponentWithState(component, mockCompleteTestGuideState, true); + + expect(find('guideTitle').text()).not.toContain('Well done'); + expect(find('guideDescription').text()).not.toContain( + `You've completed the Elastic Testing example guide` + ); + expect(exists('useElasticButton')).toBe(false); + }); + describe('Steps', () => { const clickStepButton = async ({ telemetryGuideId, diff --git a/src/plugins/guided_onboarding/public/services/api.test.ts b/src/plugins/guided_onboarding/public/services/api.test.ts index 5949e455334d9..b6efc346fc7d5 100644 --- a/src/plugins/guided_onboarding/public/services/api.test.ts +++ b/src/plugins/guided_onboarding/public/services/api.test.ts @@ -17,6 +17,7 @@ import { ApiService } from './api'; import { testGuide, testGuideFirstStep, + testGuideLastStep, testGuideManualCompletionStep, testGuideStep1ActiveState, testGuideStep1InProgressState, @@ -359,6 +360,59 @@ describe('GuidedOnboarding ApiService', () => { await apiService.completeGuideStep(testGuide, testGuideFirstStep); expect(httpClient.put).toHaveBeenCalledTimes(0); }); + + it('marks the guide as "ready_to_complete" if the current step is the last step in the guide and configured for manual completion', async () => { + const testGuideStep3InProgressState: GuideState = { + ...testGuideStep2ActiveState, + steps: [ + testGuideStep2ActiveState.steps[0], + { ...testGuideStep2ActiveState.steps[1], status: 'complete' }, + { ...testGuideStep2ActiveState.steps[2], status: 'ready_to_complete' }, + ], + }; + httpClient.get.mockResolvedValue({ + state: [testGuideStep3InProgressState], + }); + apiService.setup(httpClient); + + await apiService.completeGuideStep(testGuide, testGuideLastStep); + + expect(httpClient.put).toHaveBeenCalledTimes(1); + // Verify the guide now has a "ready_to_complete" status and the last step is "complete" + expect(httpClient.put).toHaveBeenCalledWith(`${API_BASE_PATH}/state`, { + body: JSON.stringify({ + ...testGuideStep3InProgressState, + steps: [ + ...testGuideStep3InProgressState.steps.slice(0, 2), + { ...testGuideStep3InProgressState.steps[2], status: 'complete' }, + ], + status: 'ready_to_complete', + }), + }); + }); + + it('marks the guide as "in_progress" if the current step is not the last step in the guide', async () => { + httpClient.get.mockResolvedValue({ + state: [testGuideStep1InProgressState], + }); + apiService.setup(httpClient); + + await apiService.completeGuideStep(testGuide, testGuideFirstStep); + + expect(httpClient.put).toHaveBeenCalledTimes(1); + // Verify the guide now has a "in_progress" status and the second step is "active" + expect(httpClient.put).toHaveBeenCalledWith(`${API_BASE_PATH}/state`, { + body: JSON.stringify({ + ...testGuideStep2ActiveState, + steps: [ + testGuideStep2ActiveState.steps[0], + { ...testGuideStep2ActiveState.steps[1], status: 'active' }, + testGuideStep2ActiveState.steps[2], + ], + status: 'in_progress', + }), + }); + }); }); describe('isGuidedOnboardingActiveForIntegration$', () => { diff --git a/src/plugins/guided_onboarding/public/services/api.ts b/src/plugins/guided_onboarding/public/services/api.ts index 097c668c6bc21..41815a71840c5 100644 --- a/src/plugins/guided_onboarding/public/services/api.ts +++ b/src/plugins/guided_onboarding/public/services/api.ts @@ -16,8 +16,8 @@ import { getInProgressStepId, getStepConfig, getUpdatedSteps, + getGuideStatusOnStepCompletion, isIntegrationInGuideStep, - isLastStep, isStepInProgress, isStepReadyToComplete, } from './helpers'; @@ -319,7 +319,7 @@ export class ApiService implements GuidedOnboardingApi { const currentGuide: GuideState = { guideId, isActive: true, - status: isLastStep(guideId, stepId) ? 'ready_to_complete' : 'in_progress', + status: getGuideStatusOnStepCompletion(guideState, guideId, stepId), steps: updatedSteps, }; diff --git a/src/plugins/guided_onboarding/public/services/helpers.ts b/src/plugins/guided_onboarding/public/services/helpers.ts index c9bfc7dfb0404..039dbf07a1e4f 100644 --- a/src/plugins/guided_onboarding/public/services/helpers.ts +++ b/src/plugins/guided_onboarding/public/services/helpers.ts @@ -6,7 +6,13 @@ * Side Public License, v 1. */ -import type { GuideId, GuideStepIds, GuideState, GuideStep } from '@kbn/guided-onboarding'; +import type { + GuideId, + GuideStepIds, + GuideState, + GuideStep, + GuideStatus, +} from '@kbn/guided-onboarding'; import { guidesConfig } from '../constants/guides_config'; import { GuideConfig, StepConfig } from '../types'; @@ -128,3 +134,27 @@ export const getUpdatedSteps = ( return step; }); }; + +export const getGuideStatusOnStepCompletion = ( + guideState: GuideState, + guideId: GuideId, + stepId: GuideStepIds +): GuideStatus => { + const stepConfig = getStepConfig(guideId, stepId); + const isManualCompletion = stepConfig?.manualCompletion || false; + const isLastStepInGuide = isLastStep(guideId, stepId); + const isCurrentStepReadyToComplete = isStepReadyToComplete(guideState, guideId, stepId); + + // We want to set the guide status to 'ready_to_complete' if the current step is the last step in the guide + // and the step is not configured for manual completion + // or if the current step is configured for manual completion and the last step is ready to complete + if ( + (isLastStepInGuide && !isManualCompletion) || + (isLastStepInGuide && isManualCompletion && isCurrentStepReadyToComplete) + ) { + return 'ready_to_complete'; + } + + // Otherwise the guide is still in progress + return 'in_progress'; +}; diff --git a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts index 70c2c5e1ce1ad..89bf8a44139cf 100644 --- a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts +++ b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts @@ -193,9 +193,10 @@ export async function getNumberHistogram( ? minMaxResult.aggregations!.sample.top_values : { buckets: [] as Array<{ doc_count: number; key: string | number }>, + sum_other_doc_count: 0, }; - const topValuesBuckets = { + const topValues = { buckets: terms.buckets.map((bucket) => ({ count: bucket.doc_count, key: bucket.key, @@ -211,9 +212,11 @@ export async function getNumberHistogram( if (histogramInterval === 0) { return { totalDocuments: getHitsTotal(minMaxResult), - sampledValues: minMaxResult.aggregations!.sample.sample_count.value!, + sampledValues: + sumSampledValues(topValues, terms.sum_other_doc_count) || + minMaxResult.aggregations!.sample.sample_count.value!, sampledDocuments: minMaxResult.aggregations!.sample.doc_count, - topValues: topValuesBuckets, + topValues, histogram: useTopHits ? { buckets: [] } : { @@ -244,14 +247,16 @@ export async function getNumberHistogram( return { totalDocuments: getHitsTotal(minMaxResult), sampledDocuments: minMaxResult.aggregations!.sample.doc_count, - sampledValues: minMaxResult.aggregations!.sample.sample_count.value!, + sampledValues: + sumSampledValues(topValues, terms.sum_other_doc_count) || + minMaxResult.aggregations!.sample.sample_count.value!, histogram: { buckets: histogramResult.aggregations!.sample.histo.buckets.map((bucket) => ({ count: bucket.doc_count, key: bucket.key, })), }, - topValues: topValuesBuckets, + topValues, }; } @@ -284,16 +289,22 @@ export async function getStringSamples( { body: { aggs: typeof topValuesBody } } >; + const topValues = { + buckets: topValuesResult.aggregations!.sample.top_values.buckets.map((bucket) => ({ + count: bucket.doc_count, + key: bucket.key, + })), + }; + return { totalDocuments: getHitsTotal(topValuesResult), sampledDocuments: topValuesResult.aggregations!.sample.doc_count, - sampledValues: topValuesResult.aggregations!.sample.sample_count.value!, - topValues: { - buckets: topValuesResult.aggregations!.sample.top_values.buckets.map((bucket) => ({ - count: bucket.doc_count, - key: bucket.key, - })), - }, + sampledValues: + sumSampledValues( + topValues, + topValuesResult.aggregations!.sample.top_values.sum_other_doc_count + ) || topValuesResult.aggregations!.sample.sample_count.value!, + topValues, }; } @@ -392,3 +403,14 @@ function getFieldRef(field: DataViewField) { const getHitsTotal = (body: estypes.SearchResponse): number => { return (body.hits.total as estypes.SearchTotalHits).value ?? body.hits.total ?? 0; }; + +// We could use `aggregations.sample.sample_count.value` instead, but it does not always give a correct sum +// See Github issue #144625 +export function sumSampledValues( + topValues: FieldStatsResponse['topValues'], + sumOtherDocCount: number +): number { + const valuesInTopBuckets = + topValues?.buckets?.reduce((prev, bucket) => bucket.count + prev, 0) || 0; + return valuesInTopBuckets + (sumOtherDocCount || 0); +} diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx index 663d015c429de..acd27c1d0f0b3 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx @@ -7,7 +7,7 @@ */ import _, { get } from 'lodash'; -import { Subscription } from 'rxjs'; +import { Subscription, ReplaySubject } from 'rxjs'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { render } from 'react-dom'; @@ -126,6 +126,9 @@ export class VisualizeEmbeddable VisualizeByValueInput, VisualizeByReferenceInput >; + private readonly expressionVariablesSubject = new ReplaySubject< + Record | undefined + >(1); constructor( timefilter: TimefilterContract, @@ -581,6 +584,13 @@ export class VisualizeEmbeddable private async updateHandler() { const context = this.getExecutionContext(); + const expressionVariables = await this.vis.type.getExpressionVariables?.( + this.vis, + this.timefilter + ); + + this.expressionVariablesSubject.next(expressionVariables); + const expressionParams: IExpressionLoaderParams = { searchContext: { timeRange: this.timeRange, @@ -590,7 +600,7 @@ export class VisualizeEmbeddable }, variables: { embeddableTitle: this.getTitle(), - ...(await this.vis.type.getExpressionVariables?.(this.vis, this.timefilter)), + ...expressionVariables, }, searchSessionId: this.input.searchSessionId, syncColors: this.input.syncColors, @@ -637,6 +647,10 @@ export class VisualizeEmbeddable return this.vis.type.getSupportedTriggers?.(this.vis.params) ?? []; } + public getExpressionVariables$() { + return this.expressionVariablesSubject.asObservable(); + } + inputIsRefType = (input: VisualizeInput): input is VisualizeByReferenceInput => { if (!this.attributeService) { throw new Error('AttributeService must be defined for getInputAsRefType'); diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_top_nav.tsx b/src/plugins/visualizations/public/visualize_app/components/visualize_top_nav.tsx index 2deffa0c511b3..7e8bf9002af35 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_top_nav.tsx +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_top_nav.tsx @@ -21,7 +21,6 @@ import type { } from '../types'; import { VISUALIZE_APP_NAME } from '../../../common/constants'; import { getTopNavConfig, isFallbackDataView } from '../utils'; -import type { NavigateToLensContext } from '../../../common'; const LOCAL_STORAGE_EDIT_IN_LENS_BADGE = 'EDIT_IN_LENS_BADGE_VISIBLE'; @@ -65,8 +64,8 @@ const TopNav = ({ const { setHeaderActionMenu, visualizeCapabilities } = services; const { embeddableHandler, vis } = visInstance; const [inspectorSession, setInspectorSession] = useState(); - const [editInLensConfig, setEditInLensConfig] = useState(); const [navigateToLens, setNavigateToLens] = useState(false); + const [displayEditInLensItem, setDisplayEditInLensItem] = useState(false); // If the user has clicked the edit in lens button, we want to hide the badge. // The information is stored in local storage to persist across reloads. const [hideTryInLensBadge, setHideTryInLensBadge] = useLocalStorage( @@ -98,30 +97,19 @@ const TopNav = ({ [doReload] ); - const uiStateJSON = useMemo(() => vis.uiState.toJSON(), [vis.uiState]); useEffect(() => { - const asyncGetTriggerContext = async () => { - if (vis.type.navigateToLens) { - const triggerConfig = await vis.type.navigateToLens( - vis, - services.data.query.timefilter.timefilter + const subscription = embeddableHandler + .getExpressionVariables$() + .subscribe((expressionVariables) => { + setDisplayEditInLensItem( + Boolean(vis.type.navigateToLens && expressionVariables?.canNavigateToLens) ); - setEditInLensConfig(triggerConfig); - } + }); + return () => { + subscription.unsubscribe(); }; - asyncGetTriggerContext(); - }, [ - services.data.query.timefilter.timefilter, - vis, - vis.type, - vis.params, - uiStateJSON?.vis, - uiStateJSON?.table, - vis.data.indexPattern, - eventEmitter, - ]); + }, [embeddableHandler, vis]); - const displayEditInLensItem = Boolean(vis.type.navigateToLens && editInLensConfig); const config = useMemo(() => { if (isEmbeddableRendered) { return getTopNavConfig( @@ -138,7 +126,6 @@ const TopNav = ({ visualizationIdFromUrl, stateTransfer: services.stateTransferService, embeddableId, - editInLensConfig, displayEditInLensItem, hideLensBadge, setNavigateToLens, @@ -162,7 +149,6 @@ const TopNav = ({ visualizationIdFromUrl, services, embeddableId, - editInLensConfig, displayEditInLensItem, hideLensBadge, hideTryInLensBadge, diff --git a/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.test.tsx b/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.test.tsx index a7f2f3427c785..909e3029db48d 100644 --- a/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.test.tsx +++ b/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.test.tsx @@ -421,52 +421,6 @@ describe('getTopNavConfig', () => { stateContainer, visualizationIdFromUrl: undefined, stateTransfer: createEmbeddableStateTransferMock(), - editInLensConfig: { - layers: { - '0': { - indexPatternId: 'test-id', - timeFieldName: 'timefield-1', - chartType: 'area', - axisPosition: 'left', - palette: { - name: 'default', - type: 'palette', - }, - metrics: [ - { - agg: 'count', - isFullReference: false, - fieldName: 'document', - params: {}, - color: '#68BC00', - }, - ], - timeInterval: 'auto', - }, - }, - configuration: { - fill: 0.5, - legend: { - isVisible: true, - position: 'right', - shouldTruncate: true, - maxLines: 1, - }, - gridLinesVisibility: { - x: true, - yLeft: true, - yRight: true, - }, - extents: { - yLeftExtent: { - mode: 'full', - }, - yRightExtent: { - mode: 'full', - }, - }, - }, - }, displayEditInLensItem: true, hideLensBadge: false, } as unknown as TopNavConfigParams, @@ -478,7 +432,6 @@ describe('getTopNavConfig', () => { Object { "className": "visNavItem__goToLens", "description": "Go to Lens with your current configuration", - "disableButton": false, "emphasize": false, "id": "goToLens", "label": "Edit visualization in Lens", diff --git a/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.tsx b/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.tsx index cab3d41ff8266..0c66dc9a66e6e 100644 --- a/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.tsx +++ b/src/plugins/visualizations/public/visualize_app/utils/get_top_nav_config.tsx @@ -36,7 +36,6 @@ import { VisualizeAppStateContainer, VisualizeEditorVisInstance, } from '../types'; -import { NavigateToLensContext } from '../../../common'; import { VisualizeConstants } from '../../../common/constants'; import { getEditBreadcrumbs } from './breadcrumbs'; import { VISUALIZE_APP_LOCATOR, VisualizeLocatorParams } from '../../../common/locator'; @@ -67,7 +66,6 @@ export interface TopNavConfigParams { visualizationIdFromUrl?: string; stateTransfer: EmbeddableStateTransfer; embeddableId?: string; - editInLensConfig?: NavigateToLensContext | null; displayEditInLensItem: boolean; hideLensBadge: () => void; setNavigateToLens: (flag: boolean) => void; @@ -99,7 +97,6 @@ export const getTopNavConfig = ( visualizationIdFromUrl, stateTransfer, embeddableId, - editInLensConfig, displayEditInLensItem, hideLensBadge, setNavigateToLens, @@ -293,7 +290,6 @@ export const getTopNavConfig = ( defaultMessage: 'Go to Lens with your current configuration', }), className: 'visNavItem__goToLens', - disableButton: !editInLensConfig, testId: 'visualizeEditInLensButton', ...(showBadge && { badge: { @@ -308,14 +304,18 @@ export const getTopNavConfig = ( if (eventEmitter && visInstance.vis.data.savedSearchId) { eventEmitter.emit('unlinkFromSavedSearch', false); } + const navigateToLensConfig = await visInstance.vis.type.navigateToLens?.( + vis, + data.query.timefilter.timefilter + ); const updatedWithMeta = { - ...editInLensConfig, + ...navigateToLensConfig, savedObjectId: visInstance.vis.id, embeddableId, vizEditorOriginatingAppUrl: getVizEditorOriginatingAppUrl(history), originatingApp, }; - if (editInLensConfig) { + if (navigateToLensConfig) { hideLensBadge(); setNavigateToLens(true); getUiActions() diff --git a/test/api_integration/apis/console/autocomplete_entities.ts b/test/api_integration/apis/console/autocomplete_entities.ts index 7f74156f379a0..6bd899c979a2b 100644 --- a/test/api_integration/apis/console/autocomplete_entities.ts +++ b/test/api_integration/apis/console/autocomplete_entities.ts @@ -7,127 +7,275 @@ */ import expect from '@kbn/expect'; -import type { Response } from 'superagent'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); + const client = getService('es'); - function utilTest(name: string, query: object, test: (response: Response) => void) { - it(name, async () => { - const response = await supertest.get('/api/console/autocomplete_entities').query(query); - test(response); + const createIndex = async (indexName: string) => { + await client.indices.create({ + index: indexName, + body: { + mappings: { + properties: { + foo: { + type: 'text', + }, + }, + }, + }, + }); + }; + + const createAlias = async (indexName: string, aliasName: string) => { + await client.indices.putAlias({ + index: indexName, + name: aliasName, + }); + }; + + const createLegacyTemplate = async (templateName: string) => { + await client.indices.putTemplate({ + name: templateName, + body: { + index_patterns: ['*'], + }, + }); + }; + + const createComponentTemplate = async (templateName: string) => { + await client.cluster.putComponentTemplate({ + name: templateName, + body: { + template: { + mappings: { + properties: { + '@timestamp': { + type: 'date', + format: 'date_optional_time||epoch_millis', + }, + message: { + type: 'wildcard', + }, + }, + }, + }, + }, + }); + }; + + const createIndexTemplate = async ( + templateName: string, + indexPatterns: string[], + composedOf: string[] + ) => { + await client.indices.putIndexTemplate({ + name: templateName, + body: { + index_patterns: indexPatterns, + data_stream: {}, + composed_of: composedOf, + priority: 500, + }, + }); + }; + + const createDataStream = async (dataStream: string) => { + await client.indices.createDataStream({ + name: dataStream, + }); + }; + + const deleteIndex = async (indexName: string) => { + await client.indices.delete({ + index: indexName, + }); + }; + + const deleteAlias = async (indexName: string, aliasName: string) => { + await client.indices.deleteAlias({ + index: indexName, + name: aliasName, + }); + }; + + const deleteIndexTemplate = async (templateName: string) => { + await client.indices.deleteIndexTemplate({ + name: templateName, + }); + }; + + const deleteComponentTemplate = async (templateName: string) => { + await client.cluster.deleteComponentTemplate({ + name: templateName, + }); + }; + + const deleteLegacyTemplate = async (templateName: string) => { + await client.indices.deleteTemplate({ + name: templateName, }); - } + }; + + const deleteDataStream = async (dataStream: string) => { + await client.indices.deleteDataStream({ + name: dataStream, + }); + }; + + const sendRequest = async (query: object) => { + return await supertest.get('/api/console/autocomplete_entities').query(query); + }; describe('/api/console/autocomplete_entities', () => { - utilTest('should not succeed if no settings are provided in query params', {}, (response) => { + const indexName = 'test-index-1'; + const aliasName = 'test-alias-1'; + const indexTemplateName = 'test-index-template-1'; + const componentTemplateName = 'test-component-template-1'; + const dataStreamName = 'test-data-stream-1'; + const legacyTemplateName = 'test-legacy-template-1'; + + before(async () => { + // Setup indices, aliases, templates, and data streams + await createIndex(indexName); + await createAlias(indexName, aliasName); + await createComponentTemplate(componentTemplateName); + await createIndexTemplate(indexTemplateName, [dataStreamName], [componentTemplateName]); + await createDataStream(dataStreamName); + await createLegacyTemplate(legacyTemplateName); + }); + + after(async () => { + // Cleanup indices, aliases, templates, and data streams + await deleteAlias(indexName, aliasName); + await deleteIndex(indexName); + await deleteDataStream(dataStreamName); + await deleteIndexTemplate(indexTemplateName); + await deleteComponentTemplate(componentTemplateName); + await deleteLegacyTemplate(legacyTemplateName); + }); + + it('should not succeed if no settings are provided in query params', async () => { + const response = await sendRequest({}); const { status } = response; expect(status).to.be(400); }); - utilTest( - 'should return an object with properties of "mappings", "aliases", "dataStreams", "legacyTemplates", "indexTemplates", "componentTemplates"', - { + it('should return an object with properties of "mappings", "aliases", "dataStreams", "legacyTemplates", "indexTemplates", "componentTemplates"', async () => { + const response = await sendRequest({ indices: true, fields: true, templates: true, dataStreams: true, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(Object.keys(body).sort()).to.eql([ - 'aliases', - 'componentTemplates', - 'dataStreams', - 'indexTemplates', - 'legacyTemplates', - 'mappings', - ]); - } - ); - - utilTest( - 'should return empty payload with all settings are set to false', - { + }); + + const { body, status } = response; + expect(status).to.be(200); + expect(Object.keys(body).sort()).to.eql([ + 'aliases', + 'componentTemplates', + 'dataStreams', + 'indexTemplates', + 'legacyTemplates', + 'mappings', + ]); + }); + + it('should return empty payload with all settings are set to false', async () => { + const response = await sendRequest({ indices: false, fields: false, templates: false, dataStreams: false, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(body.legacyTemplates).to.eql({}); - expect(body.indexTemplates).to.eql({}); - expect(body.componentTemplates).to.eql({}); - expect(body.aliases).to.eql({}); - expect(body.mappings).to.eql({}); - expect(body.dataStreams).to.eql({}); - } - ); - - utilTest( - 'should return empty templates with templates setting is set to false', - { - indices: true, - fields: true, + }); + + const { body, status } = response; + expect(status).to.be(200); + expect(body.legacyTemplates).to.eql({}); + expect(body.indexTemplates).to.eql({}); + expect(body.componentTemplates).to.eql({}); + expect(body.aliases).to.eql({}); + expect(body.mappings).to.eql({}); + expect(body.dataStreams).to.eql({}); + }); + + it('should return empty templates with templates setting is set to false', async () => { + const response = await sendRequest({ templates: false, - dataStreams: true, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(body.legacyTemplates).to.eql({}); - expect(body.indexTemplates).to.eql({}); - expect(body.componentTemplates).to.eql({}); - } - ); - - utilTest( - 'should return empty data streams with dataStreams setting is set to false', - { - indices: true, - fields: true, - templates: true, + }); + const { body, status } = response; + expect(status).to.be(200); + expect(body.legacyTemplates).to.eql({}); + expect(body.indexTemplates).to.eql({}); + expect(body.componentTemplates).to.eql({}); + }); + + it('should return empty data streams with dataStreams setting is set to false', async () => { + const response = await sendRequest({ dataStreams: false, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(body.dataStreams).to.eql({}); - } - ); - - utilTest( - 'should return empty aliases with indices setting is set to false', - { + }); + const { body, status } = response; + expect(status).to.be(200); + expect(body.dataStreams).to.eql({}); + }); + + it('should return empty aliases with indices setting is set to false', async () => { + const response = await sendRequest({ indices: false, - fields: true, - templates: true, - dataStreams: true, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(body.aliases).to.eql({}); - } - ); - - utilTest( - 'should return empty mappings with fields setting is set to false', - { - indices: true, + }); + const { body, status } = response; + expect(status).to.be(200); + expect(body.aliases).to.eql({}); + }); + + it('should return empty mappings with fields setting is set to false', async () => { + const response = await sendRequest({ fields: false, - templates: true, - dataStreams: true, - }, - (response) => { - const { body, status } = response; - expect(status).to.be(200); - expect(body.mappings).to.eql({}); - } - ); + }); + const { body, status } = response; + expect(status).to.be(200); + expect(body.mappings).to.eql({}); + }); + + it('should return mappings with fields setting is set to true', async () => { + const response = await sendRequest({ fields: true }); + + const { body, status } = response; + expect(status).to.be(200); + expect(Object.keys(body.mappings)).to.contain(indexName); + }); + + it('should return aliases with indices setting is set to true', async () => { + const response = await sendRequest({ indices: true }); + + const { body, status } = response; + expect(status).to.be(200); + expect(body.aliases[indexName].aliases).to.eql({ [aliasName]: {} }); + }); + + it('should return data streams with dataStreams setting is set to true', async () => { + const response = await sendRequest({ dataStreams: true }); + + const { body, status } = response; + expect(status).to.be(200); + expect(body.dataStreams.data_streams.map((ds: { name: string }) => ds.name)).to.contain( + dataStreamName + ); + }); + + it('should return all templates with templates setting is set to true', async () => { + const response = await sendRequest({ templates: true }); + + const { body, status } = response; + expect(status).to.be(200); + expect(Object.keys(body.legacyTemplates)).to.contain(legacyTemplateName); + expect(body.indexTemplates.index_templates.map((it: { name: string }) => it.name)).to.contain( + indexTemplateName + ); + expect( + body.componentTemplates.component_templates.map((ct: { name: string }) => ct.name) + ).to.contain(componentTemplateName); + }); }); }; diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/power_user/integration_settings/integration_policy.cy.ts b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/power_user/integration_settings/integration_policy.cy.ts index 46f93cfcd29d9..528e260940e3c 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/e2e/power_user/integration_settings/integration_policy.cy.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/e2e/power_user/integration_settings/integration_policy.cy.ts @@ -66,7 +66,7 @@ describe('when navigating to integration page', () => { cy.getByTestSubj('addIntegrationPolicyButton').click(); }); - it.skip('checks validators for required fields', () => { + it('checks validators for required fields', () => { const requiredFields = policyFormFields.filter((field) => field.required); requiredFields.map((field) => { @@ -76,7 +76,7 @@ describe('when navigating to integration page', () => { }); }); - it.skip('should display Tail-based section on latest version', () => { + it('should display Tail-based section on latest version', () => { cy.visitKibana('/app/fleet/integrations/apm/add-integration'); cy.contains('Tail-based sampling').should('exist'); }); diff --git a/x-pack/plugins/apm/server/routes/fleet/source_maps.ts b/x-pack/plugins/apm/server/routes/fleet/source_maps.ts index 41231d69a3389..6000b79956665 100644 --- a/x-pack/plugins/apm/server/routes/fleet/source_maps.ts +++ b/x-pack/plugins/apm/server/routes/fleet/source_maps.ts @@ -13,7 +13,6 @@ import { import { promisify } from 'util'; import { unzip } from 'zlib'; import { Artifact } from '@kbn/fleet-plugin/server'; -import { isEmpty } from 'lodash'; import { SourceMap } from '../source_maps/route'; import { APMPluginStartDependencies } from '../../types'; import { getApmPackagePolicies } from './get_apm_package_policies'; @@ -55,32 +54,15 @@ export async function listArtifacts({ fleetPluginStart: FleetPluginStart; }) { const apmArtifactClient = getApmArtifactClient(fleetPluginStart); - - const artifacts = []; - const perPage = 100; - let page = 1; - - let fleetArtifactsResponse = await apmArtifactClient.listArtifacts({ + const fleetArtifactsResponse = await apmArtifactClient.listArtifacts({ kuery: 'type: sourcemap', - perPage, - page, + perPage: 20, + page: 1, + sortOrder: 'desc', + sortField: 'created', }); - artifacts.push(...fleetArtifactsResponse.items); - - while ( - fleetArtifactsResponse.total > artifacts.length && - !isEmpty(fleetArtifactsResponse.items) - ) { - page += 1; - fleetArtifactsResponse = await apmArtifactClient.listArtifacts({ - kuery: 'type: sourcemap', - perPage, - page, - }); - artifacts.push(...fleetArtifactsResponse.items); - } - return decodeArtifacts(artifacts); + return decodeArtifacts(fleetArtifactsResponse.items); } export async function createApmArtifact({ diff --git a/x-pack/plugins/cases/docs/openapi/bundled-min.json b/x-pack/plugins/cases/docs/openapi/bundled-min.json index 974ce675a12c0..c3fc5ebc17443 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled-min.json +++ b/x-pack/plugins/cases/docs/openapi/bundled-min.json @@ -176,6 +176,69 @@ } ] }, + "/s/{spaceId}/api/cases/alerts/{alertId}": { + "get": { + "summary": "Returns the cases associated with a specific alert.", + "operationId": "getCasesByAlert", + "description": "You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking.\n", + "x-technical-preview": true, + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/alert_id" + }, + { + "$ref": "#/components/parameters/space_id" + }, + { + "$ref": "#/components/parameters/owner" + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The case identifier." + }, + "title": { + "type": "string", + "description": "The case title." + } + } + }, + "example": [ + { + "id": "06116b80-e1c3-11ec-be9b-9b1838238ee6", + "title": "security_case" + } + ] + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, "/s/{spaceId}/api/cases/configure": { "get": { "summary": "Retrieves external connection details, such as the closure type and default connector for cases.", @@ -196,7 +259,7 @@ "200": { "description": "Indicates a successful call.", "content": { - "application/json; charset=utf-8": { + "application/json": { "schema": { "type": "array", "items": { @@ -417,7 +480,7 @@ "200": { "description": "Indicates a successful call.", "content": { - "application/json; charset=utf-8": { + "application/json": { "schema": { "type": "object", "properties": { @@ -631,7 +694,7 @@ "200": { "description": "Indicates a successful call.", "content": { - "application/json; charset=utf-8": { + "application/json": { "schema": { "type": "array", "items": { @@ -768,6 +831,250 @@ } ] }, + "/s/{spaceId}/api/cases/reporters": { + "get": { + "summary": "Returns information about the users who opened cases.", + "operationId": "getCaseReporters", + "description": "You must have read privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases. The API returns information about the users as they existed at the time of the case creation, including their name, full name, and email address. If any of those details change thereafter or if a user is deleted, the information returned by this API is unchanged.\n", + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/space_id" + }, + { + "$ref": "#/components/parameters/owner" + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "email": { + "type": "string", + "example": null, + "nullable": true + }, + "full_name": { + "type": "string", + "example": null, + "nullable": true + }, + "username": { + "type": "string", + "example": "elastic", + "nullable": true + }, + "profile_uid": { + "type": "string", + "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + } + } + } + }, + "examples": { + "getReportersResponse": { + "$ref": "#/components/examples/get_reporters_response" + } + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "/s/{spaceId}/api/cases/status": { + "get": { + "summary": "Returns the number of cases that are open, closed, and in progress.", + "operationId": "getCaseStatus", + "description": "You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking.\n", + "deprecated": true, + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/space_id" + }, + { + "$ref": "#/components/parameters/owner" + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "count_closed_cases": { + "type": "integer" + }, + "count_in_progress_cases": { + "type": "integer" + }, + "count_open_cases": { + "type": "integer" + } + } + }, + "examples": { + "getStatusResponse": { + "$ref": "#/components/examples/get_status_response" + } + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "/s/{spaceId}/api/cases/tags": { + "get": { + "summary": "Aggregates and returns a list of case tags.", + "operationId": "getCaseTags", + "description": "You must have read privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking.\n", + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/space_id" + }, + { + "in": "query", + "name": "owner", + "description": "A filter to limit the retrieved case statistics to a specific set of applications. If this parameter is omitted, the response contains tags from all cases that the user has access to read.", + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/owners" + }, + { + "type": "array", + "items": { + "$ref": "#/components/schemas/owners" + } + } + ] + } + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + } + }, + "examples": { + "getTagsResponse": { + "$ref": "#/components/examples/get_tags_response" + } + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "/s/{spaceId}/api/cases/{caseId}": { + "get": { + "summary": "Retrieves information about a case.", + "operationId": "getCase", + "description": "You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case you're seeking.\n", + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/case_id" + }, + { + "$ref": "#/components/parameters/space_id" + }, + { + "in": "query", + "name": "includeComments", + "description": "Determines whether case comments are returned.", + "deprecated": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/case_response_properties" + }, + "examples": { + "getCaseResponse": { + "$ref": "#/components/examples/get_case_response" + } + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, "/s/{spaceId}/api/cases/{caseId}/comments": { "post": { "summary": "Adds a comment or alert to a case.", @@ -950,6 +1257,93 @@ } ] }, + "/s/{spaceId}/api/cases/{caseId}/comments/{commentId}": { + "delete": { + "summary": "Deletes a comment or alert from a case.", + "operationId": "deleteCaseComment", + "description": "You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're deleting.\n", + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + }, + { + "$ref": "#/components/parameters/case_id" + }, + { + "$ref": "#/components/parameters/comment_id" + }, + { + "$ref": "#/components/parameters/space_id" + } + ], + "responses": { + "204": { + "description": "Indicates a successful call." + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "get": { + "summary": "Retrieves a comment from a case.", + "operationId": "getCaseComment", + "description": "You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases with the comments you're seeking.\n", + "tags": [ + "cases" + ], + "parameters": [ + { + "$ref": "#/components/parameters/case_id" + }, + { + "$ref": "#/components/parameters/comment_id" + }, + { + "$ref": "#/components/parameters/space_id" + } + ], + "responses": { + "200": { + "description": "Indicates a successful call.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/alert_comment_response_properties" + }, + { + "$ref": "#/components/schemas/user_comment_response_properties" + } + ] + }, + "examples": { + "getCaseCommentResponse": { + "$ref": "#/components/examples/get_comment_response" + } + } + } + } + } + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, + "servers": [ + { + "url": "https://localhost:5601" + } + ] + }, "/s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push": { "post": { "summary": "Pushes a case to an external service.", @@ -1043,6 +1437,16 @@ "example": "default" } }, + "alert_id": { + "in": "path", + "name": "alertId", + "description": "An identifier for the alert.", + "required": true, + "schema": { + "type": "string", + "example": "09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540" + } + }, "owner": { "in": "query", "name": "owner", @@ -1082,6 +1486,16 @@ "example": "9c235210-6834-11ea-a78c-6ffb38a34414" } }, + "comment_id": { + "in": "path", + "name": "commentId", + "description": "The identifier for the comment. To retrieve comment IDs, use the get case or find cases APIs.\n", + "required": true, + "schema": { + "type": "string", + "example": "71ec1870-725b-11ea-a0b2-c51ea50a58e2" + } + }, "connector_id": { "in": "path", "name": "connectorId", @@ -2691,6 +3105,109 @@ "id": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" } }, + "get_reporters_response": { + "summary": "A list of three users that opened cases", + "value": [ + { + "username": "elastic", + "full_name": null, + "email": null + }, + { + "username": "user1", + "full_name": "User 1", + "email": "user1@elastic.co" + }, + { + "username": "user2", + "full_name": "User 2", + "email": "user2@elastic.co" + } + ] + }, + "get_status_response": { + "summary": "Get the number of cases in each state.", + "value": { + "count_open_cases": 27, + "count_in_progress_cases": 50, + "count_closed_cases": 198 + } + }, + "get_tags_response": { + "summary": "A list of tags that are used in cases", + "value": [ + "observability", + "security", + "tag 1", + "tag 2" + ] + }, + "get_case_response": { + "summary": "Retrieves information about a case including its comments.", + "value": { + "id": "31cdada0-02c1-11ed-85f2-4f7c222ca2fa", + "version": "WzM2LDFd", + "comments": [ + { + "id": "2134c1d0-02c2-11ed-85f2-4f7c222ca2fa", + "version": "WzM3LDFd", + "type": "user", + "owner": "cases", + "comment": "A new comment", + "created_at": "2022-07-13T15:40:32.335Z", + "created_by": { + "email": null, + "full_name": null, + "username": "elastic" + }, + "pushed_at": null, + "pushed_by": null, + "updated_at": null, + "updated_by": null + } + ], + "totalComment": 1, + "totalAlerts": 0, + "title": "Case title 1", + "tags": [ + "tag 1" + ], + "settings": { + "syncAlerts": true + }, + "owner": "cases", + "description": "A case description", + "duration": null, + "severity": "low", + "closed_at": null, + "closed_by": null, + "created_at": "2022-07-13T15:33:50.604Z", + "created_by": { + "username": "elastic", + "email": null, + "full_name": null + }, + "status": "open", + "updated_at": "2022-07-13T15:40:32.335Z", + "updated_by": { + "full_name": null, + "email": null, + "username": "elastic" + }, + "assignees": [ + { + "uid": "u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0" + } + ], + "connector": { + "id": "none", + "name": "none", + "type": ".none", + "fields": null + }, + "external_service": null + } + }, "add_comment_request": { "summary": "Adds a comment to a case.", "value": { @@ -2831,6 +3348,26 @@ "external_service": null } }, + "get_comment_response": { + "summary": "A single user comment retrieved from a case", + "value": { + "id": "8048b460-fe2b-11ec-b15d-779a7c8bbcc3", + "version": "WzIzLDFd", + "type": "user", + "owner": "cases", + "comment": "A new comment", + "created_at": "2022-07-07T19:32:13.104Z", + "created_by": { + "email": null, + "full_name": null, + "username": "elastic" + }, + "pushed_at": null, + "pushed_by": null, + "updated_at": null, + "updated_by": null + } + }, "push_case_response": { "summary": "The push case API returns a JSON object with details about the case and the external service.", "value": { diff --git a/x-pack/plugins/cases/docs/openapi/bundled-min.yaml b/x-pack/plugins/cases/docs/openapi/bundled-min.yaml index b68c0a0855108..e255439def5db 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled-min.yaml +++ b/x-pack/plugins/cases/docs/openapi/bundled-min.yaml @@ -103,6 +103,42 @@ paths: - url: https://localhost:5601 servers: - url: https://localhost:5601 + /s/{spaceId}/api/cases/alerts/{alertId}: + get: + summary: Returns the cases associated with a specific alert. + operationId: getCasesByAlert + description: | + You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking. + x-technical-preview: true + tags: + - cases + parameters: + - $ref: '#/components/parameters/alert_id' + - $ref: '#/components/parameters/space_id' + - $ref: '#/components/parameters/owner' + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + description: The case identifier. + title: + type: string + description: The case title. + example: + - id: 06116b80-e1c3-11ec-be9b-9b1838238ee6 + title: security_case + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 /s/{spaceId}/api/cases/configure: get: summary: Retrieves external connection details, such as the closure type and default connector for cases. @@ -118,7 +154,7 @@ paths: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: @@ -273,7 +309,7 @@ paths: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: object properties: @@ -421,7 +457,7 @@ paths: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: @@ -514,6 +550,149 @@ paths: - url: https://localhost:5601 servers: - url: https://localhost:5601 + /s/{spaceId}/api/cases/reporters: + get: + summary: Returns information about the users who opened cases. + operationId: getCaseReporters + description: | + You must have read privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases. The API returns information about the users as they existed at the time of the case creation, including their name, full name, and email address. If any of those details change thereafter or if a user is deleted, the information returned by this API is unchanged. + tags: + - cases + parameters: + - $ref: '#/components/parameters/space_id' + - $ref: '#/components/parameters/owner' + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + type: array + items: + type: object + properties: + email: + type: string + example: null + nullable: true + full_name: + type: string + example: null + nullable: true + username: + type: string + example: elastic + nullable: true + profile_uid: + type: string + example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + getReportersResponse: + $ref: '#/components/examples/get_reporters_response' + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 + /s/{spaceId}/api/cases/status: + get: + summary: Returns the number of cases that are open, closed, and in progress. + operationId: getCaseStatus + description: | + You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking. + deprecated: true + tags: + - cases + parameters: + - $ref: '#/components/parameters/space_id' + - $ref: '#/components/parameters/owner' + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + type: object + properties: + count_closed_cases: + type: integer + count_in_progress_cases: + type: integer + count_open_cases: + type: integer + examples: + getStatusResponse: + $ref: '#/components/examples/get_status_response' + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 + /s/{spaceId}/api/cases/tags: + get: + summary: Aggregates and returns a list of case tags. + operationId: getCaseTags + description: | + You must have read privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking. + tags: + - cases + parameters: + - $ref: '#/components/parameters/space_id' + - in: query + name: owner + description: A filter to limit the retrieved case statistics to a specific set of applications. If this parameter is omitted, the response contains tags from all cases that the user has access to read. + schema: + oneOf: + - $ref: '#/components/schemas/owners' + - type: array + items: + $ref: '#/components/schemas/owners' + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + type: array + items: + type: string + examples: + getTagsResponse: + $ref: '#/components/examples/get_tags_response' + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 + /s/{spaceId}/api/cases/{caseId}: + get: + summary: Retrieves information about a case. + operationId: getCase + description: | + You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the case you're seeking. + tags: + - cases + parameters: + - $ref: '#/components/parameters/case_id' + - $ref: '#/components/parameters/space_id' + - in: query + name: includeComments + description: Determines whether case comments are returned. + deprecated: true + schema: + type: boolean + default: true + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + $ref: '#/components/schemas/case_response_properties' + examples: + getCaseResponse: + $ref: '#/components/examples/get_case_response' + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/comments: post: summary: Adds a comment or alert to a case. @@ -617,6 +796,51 @@ paths: - url: https://localhost:5601 servers: - url: https://localhost:5601 + /s/{spaceId}/api/cases/{caseId}/comments/{commentId}: + delete: + summary: Deletes a comment or alert from a case. + operationId: deleteCaseComment + description: | + You must have `all` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're deleting. + tags: + - cases + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + - $ref: '#/components/parameters/case_id' + - $ref: '#/components/parameters/comment_id' + - $ref: '#/components/parameters/space_id' + responses: + '204': + description: Indicates a successful call. + servers: + - url: https://localhost:5601 + get: + summary: Retrieves a comment from a case. + operationId: getCaseComment + description: | + You must have `read` privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases with the comments you're seeking. + tags: + - cases + parameters: + - $ref: '#/components/parameters/case_id' + - $ref: '#/components/parameters/comment_id' + - $ref: '#/components/parameters/space_id' + responses: + '200': + description: Indicates a successful call. + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/alert_comment_response_properties' + - $ref: '#/components/schemas/user_comment_response_properties' + examples: + getCaseCommentResponse: + $ref: '#/components/examples/get_comment_response' + servers: + - url: https://localhost:5601 + servers: + - url: https://localhost:5601 /s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push: post: summary: Pushes a case to an external service. @@ -674,6 +898,14 @@ components: schema: type: string example: default + alert_id: + in: path + name: alertId + description: An identifier for the alert. + required: true + schema: + type: string + example: 09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540 owner: in: query name: owner @@ -702,6 +934,15 @@ components: schema: type: string example: 9c235210-6834-11ea-a78c-6ffb38a34414 + comment_id: + in: path + name: commentId + description: | + The identifier for the comment. To retrieve comment IDs, use the get case or find cases APIs. + required: true + schema: + type: string + example: 71ec1870-725b-11ea-a0b2-c51ea50a58e2 connector_id: in: path name: connectorId @@ -1887,6 +2128,83 @@ components: version: WzIwNzMsMV0= error: null id: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + get_reporters_response: + summary: A list of three users that opened cases + value: + - username: elastic + full_name: null + email: null + - username: user1 + full_name: User 1 + email: user1@elastic.co + - username: user2 + full_name: User 2 + email: user2@elastic.co + get_status_response: + summary: Get the number of cases in each state. + value: + count_open_cases: 27 + count_in_progress_cases: 50 + count_closed_cases: 198 + get_tags_response: + summary: A list of tags that are used in cases + value: + - observability + - security + - tag 1 + - tag 2 + get_case_response: + summary: Retrieves information about a case including its comments. + value: + id: 31cdada0-02c1-11ed-85f2-4f7c222ca2fa + version: WzM2LDFd + comments: + - id: 2134c1d0-02c2-11ed-85f2-4f7c222ca2fa + version: WzM3LDFd + type: user + owner: cases + comment: A new comment + created_at: '2022-07-13T15:40:32.335Z' + created_by: + email: null + full_name: null + username: elastic + pushed_at: null + pushed_by: null + updated_at: null + updated_by: null + totalComment: 1 + totalAlerts: 0 + title: Case title 1 + tags: + - tag 1 + settings: + syncAlerts: true + owner: cases + description: A case description + duration: null + severity: low + closed_at: null + closed_by: null + created_at: '2022-07-13T15:33:50.604Z' + created_by: + username: elastic + email: null + full_name: null + status: open + updated_at: '2022-07-13T15:40:32.335Z' + updated_by: + full_name: null + email: null + username: elastic + assignees: + - uid: u_mGBROF_q5bmFCATbLXAcCwKa0k8JvONAwSruelyKA5E_0 + connector: + id: none + name: none + type: .none + fields: null + external_service: null add_comment_request: summary: Adds a comment to a case. value: @@ -2000,6 +2318,23 @@ components: type: .none fields: null external_service: null + get_comment_response: + summary: A single user comment retrieved from a case + value: + id: 8048b460-fe2b-11ec-b15d-779a7c8bbcc3 + version: WzIzLDFd + type: user + owner: cases + comment: A new comment + created_at: '2022-07-07T19:32:13.104Z' + created_by: + email: null + full_name: null + username: elastic + pushed_at: null + pushed_by: null + updated_at: null + updated_by: null push_case_response: summary: The push case API returns a JSON object with details about the case and the external service. value: diff --git a/x-pack/plugins/cases/docs/openapi/entrypoint-min.yaml b/x-pack/plugins/cases/docs/openapi/entrypoint-min.yaml index e9546ec2470ca..16e2bba667397 100644 --- a/x-pack/plugins/cases/docs/openapi/entrypoint-min.yaml +++ b/x-pack/plugins/cases/docs/openapi/entrypoint-min.yaml @@ -19,28 +19,28 @@ paths: $ref: 'paths/s@{spaceid}@api@cases.yaml' # '/s/{spaceId}/api/cases/_find': # $ref: 'paths/s@{spaceid}@api@cases@_find.yaml' -# '/s/{spaceId}/api/cases/alerts/{alertId}': -# $ref: 'paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml' + '/s/{spaceId}/api/cases/alerts/{alertId}': + $ref: 'paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml' '/s/{spaceId}/api/cases/configure': $ref: paths/s@{spaceid}@api@cases@configure.yaml '/s/{spaceId}/api/cases/configure/{configurationId}': $ref: paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml # '/s/{spaceId}/api/cases/configure/connectors/_find': # $ref: paths/s@{spaceid}@api@cases@configure@connectors@_find.yaml -# '/s/{spaceId}/api/cases/reporters': -# $ref: 'paths/s@{spaceid}@api@cases@reporters.yaml' -# '/s/{spaceId}/api/cases/status': -# $ref: 'paths/s@{spaceid}@api@cases@status.yaml' -# '/s/{spaceId}/api/cases/tags': -# $ref: 'paths/s@{spaceid}@api@cases@tags.yaml' -# '/s/{spaceId}/api/cases/{caseId}': -# $ref: 'paths/s@{spaceid}@api@cases@{caseid}.yaml' + '/s/{spaceId}/api/cases/reporters': + $ref: 'paths/s@{spaceid}@api@cases@reporters.yaml' + '/s/{spaceId}/api/cases/status': + $ref: 'paths/s@{spaceid}@api@cases@status.yaml' + '/s/{spaceId}/api/cases/tags': + $ref: 'paths/s@{spaceid}@api@cases@tags.yaml' + '/s/{spaceId}/api/cases/{caseId}': + $ref: 'paths/s@{spaceid}@api@cases@{caseid}.yaml' # '/s/{spaceId}/api/cases/{caseId}/alerts': # $ref: 'paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml' '/s/{spaceId}/api/cases/{caseId}/comments': $ref: 'paths/s@{spaceid}@api@cases@{caseid}@comments.yaml' -# '/s/{spaceId}/api/cases/{caseId}/comments/{commentId}': -# $ref: 'paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml' + '/s/{spaceId}/api/cases/{caseId}/comments/{commentId}': + $ref: 'paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml' '/s/{spaceId}/api/cases/{caseId}/connector/{connectorId}/_push': $ref: 'paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml' # '/s/{spaceId}/api/cases/{caseId}/user_actions': diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml index 24615d772b3ef..f12e48f4bb6b9 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml @@ -16,7 +16,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml index e4383741c193d..e95a6f5410149 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure.yaml @@ -14,7 +14,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: @@ -82,7 +82,7 @@ post: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: object properties: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml index 44c90917204d7..c15c3ff5dc1d7 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@configure@{configurationid}.yaml @@ -43,7 +43,7 @@ patch: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml index 93b7ac3863c99..171af68a417ba 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@reporters.yaml @@ -18,7 +18,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml index dad05ad967728..c3f4875e07ffd 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@status.yaml @@ -15,7 +15,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: object properties: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml index 6787c075cb19f..a4ce739c52b04 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@tags.yaml @@ -2,7 +2,7 @@ get: summary: Aggregates and returns a list of case tags. operationId: getCaseTags description: > - You must have read privileges for the **Cases*** feature in the + You must have read privileges for the **Cases** feature in the **Management**, **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases you're seeking. tags: @@ -22,7 +22,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml index 66430fd219d25..66b8d6cc276bf 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@alerts.yaml @@ -15,7 +15,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: type: array items: diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml index 3aac8f33bc68b..f12e43158a99a 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@comments@{commentid}.yaml @@ -23,7 +23,7 @@ get: operationId: getCaseComment description: > You must have `read` privileges for the **Cases** feature in the **Management**, - **Observability**, or **Security*** section of the Kibana feature privileges, + **Observability**, or **Security** section of the Kibana feature privileges, depending on the owner of the cases with the comments you're seeking. tags: - cases @@ -35,7 +35,7 @@ get: '200': description: Indicates a successful call. content: - application/json; charset=utf-8: + application/json: schema: oneOf: - $ref: '../components/schemas/alert_comment_response_properties.yaml' diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index de00930837ec1..72b3dddb7958e 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -4263,6 +4263,7 @@ "type": "boolean" }, "fleet_server_hosts": { + "deprecated": true, "type": "array", "items": { "type": "string" diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index f3a94715d66c2..489e49fe30afa 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -2659,6 +2659,7 @@ components: has_seen_add_data_notice: type: boolean fleet_server_hosts: + deprecated: true type: array items: type: string diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/settings.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/settings.yaml index 145b598267a0a..bd078039d7f76 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/settings.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/settings.yaml @@ -6,11 +6,12 @@ properties: has_seen_add_data_notice: type: boolean fleet_server_hosts: + deprecated: true type: array items: type: string - prerelease_integrations_enabled: - type: boolean + prerelease_integrations_enabled: + type: boolean required: - fleet_server_hosts - id diff --git a/x-pack/plugins/fleet/server/collectors/fleet_server_collector.ts b/x-pack/plugins/fleet/server/collectors/fleet_server_collector.ts index f89b471a8d083..4438b23c8a285 100644 --- a/x-pack/plugins/fleet/server/collectors/fleet_server_collector.ts +++ b/x-pack/plugins/fleet/server/collectors/fleet_server_collector.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { isBoom } from '@hapi/boom'; import type { SavedObjectsClient, ElasticsearchClient } from '@kbn/core/server'; -import { packagePolicyService, settingsService } from '../services'; +import { packagePolicyService } from '../services'; import { getAgentStatusForAgentPolicy } from '../services/agents'; +import { listFleetServerHosts } from '../services/fleet_server_host'; const DEFAULT_USAGE = { total_all_statuses: 0, @@ -39,16 +39,8 @@ export const getFleetServerUsage = async ( return DEFAULT_USAGE; } - const numHostsUrls = await settingsService - .getSettings(soClient) - .then((settings) => settings.fleet_server_hosts?.length ?? 0) - .catch((err) => { - if (isBoom(err) && err.output.statusCode === 404) { - return 0; - } - - throw err; - }); + const fleetServerHosts = await listFleetServerHosts(soClient); + const numHostsUrls = fleetServerHosts.items.flatMap((host) => host.host_urls).length; // Find all policies with Fleet server than query agent status let hasMore = true; diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts index 3a1ba1d33abc9..61c60e1c97d82 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts @@ -8,7 +8,13 @@ import type { SavedObjectsClientContract } from '@kbn/core/server'; import { safeLoad } from 'js-yaml'; -import type { FullAgentPolicy, PackagePolicy, Output, FullAgentPolicyOutput } from '../../types'; +import type { + FullAgentPolicy, + AgentPolicy, + PackagePolicy, + Output, + FullAgentPolicyOutput, +} from '../../types'; import { agentPolicyService } from '../agent_policy'; import { outputService } from '../output'; import { dataTypes, outputType } from '../../../common/constants'; @@ -34,7 +40,7 @@ export async function getFullAgentPolicy( id: string, options?: { standalone: boolean } ): Promise { - let agentPolicy; + let agentPolicy: AgentPolicy | null | undefined; const standalone = options?.standalone ?? false; try { @@ -187,7 +193,9 @@ export async function getFullAgentPolicy( if (!standalone) { const fleetServerHost = await getFleetServerHostsForAgentPolicy(soClient, agentPolicy).catch( (err) => { - appContextService.getLogger()?.error(err); + appContextService + .getLogger() + ?.warn(`Unable to get fleet server hosts for policy ${agentPolicy?.id}: ${err.message}`); return; } diff --git a/x-pack/plugins/fleet/server/services/managed_package_policies.test.ts b/x-pack/plugins/fleet/server/services/managed_package_policies.test.ts index 5a1d86574f07b..4110438f8f3fd 100644 --- a/x-pack/plugins/fleet/server/services/managed_package_policies.test.ts +++ b/x-pack/plugins/fleet/server/services/managed_package_policies.test.ts @@ -92,7 +92,7 @@ describe('upgradeManagedPackagePolicies', () => { soClient, esClient, ['managed-package-id'], - undefined, + { force: true }, packagePolicy, '1.0.0' ); diff --git a/x-pack/plugins/fleet/server/services/managed_package_policies.ts b/x-pack/plugins/fleet/server/services/managed_package_policies.ts index 8d335e2a12345..053d46d1a087d 100644 --- a/x-pack/plugins/fleet/server/services/managed_package_policies.ts +++ b/x-pack/plugins/fleet/server/services/managed_package_policies.ts @@ -118,7 +118,7 @@ async function upgradePackagePolicy( soClient, esClient, [packagePolicy.id], - undefined, + { force: true }, packagePolicy, installedPackage.version ); diff --git a/x-pack/plugins/fleet/server/services/package_policy_service.ts b/x-pack/plugins/fleet/server/services/package_policy_service.ts index 0a16a01c3dc4c..4a88b43a57be1 100644 --- a/x-pack/plugins/fleet/server/services/package_policy_service.ts +++ b/x-pack/plugins/fleet/server/services/package_policy_service.ts @@ -112,7 +112,7 @@ export interface PackagePolicyClient { soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, ids: string[], - options?: { user?: AuthenticatedUser }, + options?: { user?: AuthenticatedUser; force?: boolean }, packagePolicy?: PackagePolicy, pkgVersion?: string ): Promise; diff --git a/x-pack/plugins/fleet/server/services/settings.ts b/x-pack/plugins/fleet/server/services/settings.ts index e710251c39f91..7fe6c25d24b86 100644 --- a/x-pack/plugins/fleet/server/services/settings.ts +++ b/x-pack/plugins/fleet/server/services/settings.ts @@ -13,6 +13,7 @@ import { GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, GLOBAL_SETTINGS_ID } from '../../com import type { SettingsSOAttributes, Settings, BaseSettings } from '../../common/types'; import { appContextService } from './app_context'; +import { listFleetServerHosts } from './fleet_server_host'; export async function getSettings(soClient: SavedObjectsClientContract): Promise { const res = await soClient.find({ @@ -23,10 +24,12 @@ export async function getSettings(soClient: SavedObjectsClientContract): Promise throw Boom.notFound('Global settings not found'); } const settingsSo = res.saved_objects[0]; + const fleetServerHosts = await listFleetServerHosts(soClient); + return { id: settingsSo.id, ...settingsSo.attributes, - fleet_server_hosts: settingsSo.attributes.fleet_server_hosts || [], + fleet_server_hosts: fleetServerHosts.items.flatMap((item) => item.host_urls), preconfigured_fields: getConfigFleetServerHosts() ? ['fleet_server_hosts'] : [], }; } diff --git a/x-pack/plugins/fleet/server/types/rest_spec/epm.ts b/x-pack/plugins/fleet/server/types/rest_spec/epm.ts index 9dc11599fa0de..3fbf8b98f5eea 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/epm.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/epm.ts @@ -57,6 +57,7 @@ export const GetInfoRequestSchemaDeprecated = { query: schema.object({ ignoreUnverified: schema.maybe(schema.boolean()), prerelease: schema.maybe(schema.boolean()), + full: schema.maybe(schema.boolean()), }), }; diff --git a/x-pack/plugins/infra/server/lib/alerting/common/utils.ts b/x-pack/plugins/infra/server/lib/alerting/common/utils.ts index b97b4a59893ba..ce0f0970f37bf 100644 --- a/x-pack/plugins/infra/server/lib/alerting/common/utils.ts +++ b/x-pack/plugins/infra/server/lib/alerting/common/utils.ts @@ -14,6 +14,7 @@ import { ObservabilityConfig } from '@kbn/observability-plugin/server'; import { ALERT_RULE_PARAMETERS, TIMESTAMP } from '@kbn/rule-data-utils'; import { parseTechnicalFields } from '@kbn/rule-registry-plugin/common/parse_technical_fields'; import { ES_FIELD_TYPES } from '@kbn/field-types'; +import { set } from '@kbn/safer-lodash-set'; import { LINK_TO_METRICS_EXPLORER } from '../../../../common/alerting/metrics'; import { getInventoryViewInAppUrl } from '../../../../common/alerting/metrics/alert_link'; import { @@ -21,6 +22,18 @@ import { InventoryMetricConditions, } from '../../../../common/alerting/metrics/types'; +const ALERT_CONTEXT_CONTAINER = 'container'; +const ALERT_CONTEXT_ORCHESTRATOR = 'orchestrator'; +const ALERT_CONTEXT_CLOUD = 'cloud'; +const ALERT_CONTEXT_HOST = 'host'; +const ALERT_CONTEXT_LABELS = 'labels'; +const ALERT_CONTEXT_TAGS = 'tags'; + +const HOST_NAME = 'host.name'; +const HOST_HOSTNAME = 'host.hostname'; +const HOST_ID = 'host.id'; +const CONTAINER_ID = 'container.id'; + const SUPPORTED_ES_FIELD_TYPES = [ ES_FIELD_TYPES.KEYWORD, ES_FIELD_TYPES.IP, @@ -142,11 +155,6 @@ export const getAlertDetailsUrl = ( alertUuid: string | null ) => addSpaceIdToPath(basePath.publicBaseUrl, spaceId, `/app/observability/alerts/${alertUuid}`); -const HOST_NAME = 'host.name'; -const HOST_HOSTNAME = 'host.hostname'; -const HOST_ID = 'host.id'; -const CONTAINER_ID = 'container.id'; - export const KUBERNETES_POD_UID = 'kubernetes.pod.uid'; export const NUMBER_OF_DOCUMENTS = 10; export const termsAggField: Record = { [KUBERNETES_POD_UID]: CONTAINER_ID }; @@ -210,3 +218,79 @@ export const shouldTermsAggOnContainer = (groupBy: string | string[] | undefined ? groupBy.includes(KUBERNETES_POD_UID) : groupBy === KUBERNETES_POD_UID; }; + +export const flattenAdditionalContext = ( + additionalContext: AdditionalContext | undefined | null +): AdditionalContext => { + let flattenedContext: AdditionalContext = {}; + if (additionalContext) { + Object.keys(additionalContext).forEach((context: string) => { + if (additionalContext[context]) { + flattenedContext = { + ...flattenedContext, + ...flattenObject(additionalContext[context], [context + '.']), + }; + } + }); + } + return flattenedContext; +}; + +export const getContextForRecoveredAlerts = ( + alertHits: AdditionalContext | undefined | null +): AdditionalContext => { + const alertHitsSource = + alertHits && alertHits.length > 0 ? unflattenObject(alertHits[0]._source) : undefined; + + return { + cloud: alertHitsSource?.[ALERT_CONTEXT_CLOUD], + host: alertHitsSource?.[ALERT_CONTEXT_HOST], + orchestrator: alertHitsSource?.[ALERT_CONTEXT_ORCHESTRATOR], + container: alertHitsSource?.[ALERT_CONTEXT_CONTAINER], + labels: alertHitsSource?.[ALERT_CONTEXT_LABELS], + tags: alertHitsSource?.[ALERT_CONTEXT_TAGS], + }; +}; + +export const unflattenObject = (object: object): T => + Object.entries(object).reduce((acc, [key, value]) => { + set(acc, key, value); + return acc; + }, {} as T); + +/** + * Wrap the key with [] if it is a key from an Array + * @param key The object key + * @param isArrayItem Flag to indicate if it is the key of an Array + */ +const renderKey = (key: string, isArrayItem: boolean): string => (isArrayItem ? `[${key}]` : key); + +export const flattenObject = ( + obj: AdditionalContext, + prefix: string[] = [], + isArrayItem = false +): AdditionalContext => + Object.keys(obj).reduce((acc, k) => { + const nextValue = obj[k]; + + if (typeof nextValue === 'object' && nextValue !== null) { + const isNextValueArray = Array.isArray(nextValue); + const dotSuffix = isNextValueArray ? '' : '.'; + + if (Object.keys(nextValue).length > 0) { + return { + ...acc, + ...flattenObject( + nextValue, + [...prefix, `${renderKey(k, isArrayItem)}${dotSuffix}`], + isNextValueArray + ), + }; + } + } + + const fullPath = `${prefix.join('')}${renderKey(k, isArrayItem)}`; + acc[fullPath] = nextValue; + + return acc; + }, {}); diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/evaluate_condition.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/evaluate_condition.ts index 21ae9388da239..fb19bbcef9c57 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/evaluate_condition.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/evaluate_condition.ts @@ -15,6 +15,7 @@ import { LogQueryFields } from '../../metrics/types'; import { InfraSource } from '../../sources'; import { calculateFromBasedOnMetric } from './lib/calculate_from_based_on_metric'; import { getData } from './lib/get_data'; +import { AdditionalContext } from '../common/utils'; export type ConditionResult = InventoryMetricConditions & { shouldFire: boolean; @@ -22,7 +23,7 @@ export type ConditionResult = InventoryMetricConditions & { currentValue: number; isNoData: boolean; isError: boolean; - context: [x: string]; + context: AdditionalContext; }; export const evaluateCondition = async ({ diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts index 4a5fe10081355..57459b5939870 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts @@ -31,8 +31,11 @@ import { stateToAlertMessage, } from '../common/messages'; import { + AdditionalContext, createScopedLogger, + flattenAdditionalContext, getAlertDetailsUrl, + getContextForRecoveredAlerts, getViewInInventoryAppUrl, UNGROUPED_FACTORY_KEY, } from '../common/utils'; @@ -54,7 +57,7 @@ type InventoryMetricThresholdAlert = Alert< type InventoryMetricThresholdAlertFactory = ( id: string, reason: string, - additionalContext?: [x: string] | null, + additionalContext?: AdditionalContext | null, threshold?: number | undefined, value?: number | undefined ) => InventoryMetricThresholdAlert; @@ -80,14 +83,20 @@ export const createInventoryMetricThresholdExecutor = (libs: InfraBackendLibs) = const esClient = services.scopedClusterClient.asCurrentUser; - const { alertWithLifecycle, savedObjectsClient, getAlertStartedDate, getAlertUuid } = services; + const { + alertWithLifecycle, + savedObjectsClient, + getAlertStartedDate, + getAlertUuid, + getAlertByAlertUuid, + } = services; const alertFactory: InventoryMetricThresholdAlertFactory = (id, reason, additionalContext) => alertWithLifecycle({ id, fields: { [ALERT_REASON]: reason, [ALERT_RULE_PARAMETERS]: params as any, // the type assumes the object is already flattened when writing the same way as when reading https://github.com/elastic/kibana/blob/main/x-pack/plugins/rule_registry/common/field_map/runtime_type_from_fieldmap.ts#L60 - ...additionalContext, + ...flattenAdditionalContext(additionalContext), }, }); @@ -245,6 +254,8 @@ export const createInventoryMetricThresholdExecutor = (libs: InfraBackendLibs) = const recoveredAlertId = alert.getId(); const indexedStartedDate = getAlertStartedDate(recoveredAlertId) ?? startedAt.toISOString(); const alertUuid = getAlertUuid(recoveredAlertId); + const alertHits = alertUuid ? await getAlertByAlertUuid(alertUuid) : undefined; + const additionalContext = getContextForRecoveredAlerts(alertHits); alert.setContext({ alertDetailsUrl: getAlertDetailsUrl(libs.basePath, spaceId, alertUuid), @@ -260,6 +271,7 @@ export const createInventoryMetricThresholdExecutor = (libs: InfraBackendLibs) = timestamp: indexedStartedDate, spaceId, }), + ...additionalContext, }); } diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/create_request.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/create_request.ts index b13638f6c2336..47736ca1b1a28 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/create_request.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/create_request.ts @@ -15,6 +15,7 @@ import { parseFilterQuery } from '../../../../utils/serialized_query'; import { createMetricAggregations } from './create_metric_aggregations'; import { InventoryMetricConditions } from '../../../../../common/alerting/metrics'; import { createBucketSelector } from './create_bucket_selector'; +import { KUBERNETES_POD_UID, NUMBER_OF_DOCUMENTS, termsAggField } from '../../common/utils'; export const createRequest = ( index: string, @@ -25,7 +26,8 @@ export const createRequest = ( afterKey: { node: string } | undefined, condition: InventoryMetricConditions, filterQuery?: string, - customMetric?: SnapshotCustomMetricInput + customMetric?: SnapshotCustomMetricInput, + fieldsExisted?: Record | null ) => { const filters: any[] = [ { @@ -55,13 +57,39 @@ export const createRequest = ( const metricAggregations = createMetricAggregations(timerange, nodeType, metric, customMetric); const bucketSelector = createBucketSelector(metric, condition, customMetric); + const containerContextAgg = + nodeType === 'pod' && fieldsExisted && fieldsExisted[termsAggField[KUBERNETES_POD_UID]] + ? { + containerContext: { + terms: { + field: termsAggField[KUBERNETES_POD_UID], + size: NUMBER_OF_DOCUMENTS, + }, + aggs: { + container: { + top_hits: { + size: 1, + _source: { + includes: ['container.*'], + }, + }, + }, + }, + }, + } + : undefined; + + const includesList = ['host.*', 'labels.*', 'tags', 'cloud.*', 'orchestrator.*']; + const excludesList = ['host.cpu.*', 'host.disk.*', 'host.network.*']; + if (!containerContextAgg) includesList.push('container.*'); + const additionalContextAgg = { additionalContext: { top_hits: { size: 1, _source: { - includes: ['host.*', 'labels.*', 'tags', 'cloud.*', 'orchestrator.*', 'container.*'], - excludes: ['host.cpu.*', 'host.disk.*', 'host.network.*'], + includes: includesList, + excludes: excludesList, }, }, }, @@ -77,7 +105,12 @@ export const createRequest = ( aggs: { nodes: { composite, - aggs: { ...metricAggregations, ...bucketSelector, ...additionalContextAgg }, + aggs: { + ...metricAggregations, + ...bucketSelector, + ...additionalContextAgg, + ...containerContextAgg, + }, }, }, }, diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/get_data.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/get_data.ts index 264e0b365fc9c..555ea6375eed3 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/get_data.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/lib/get_data.ts @@ -18,15 +18,17 @@ import { import { LogQueryFields } from '../../../metrics/types'; import { InfraSource } from '../../../sources'; import { createRequest } from './create_request'; +import { + AdditionalContext, + doFieldsExist, + KUBERNETES_POD_UID, + termsAggField, +} from '../../common/utils'; interface BucketKey { node: string; } -interface AdditionalContext { - [x: string]: any; -} - type Response = Record< string, { @@ -43,8 +45,20 @@ interface Bucket { doc_count: number; shouldWarn: { value: number }; shouldTrigger: { value: number }; + containerContext?: ContainerContext; additionalContext: SearchResponse>; } + +interface ContainerContext { + buckets: ContainerBucket[]; +} + +interface ContainerBucket { + key: BucketKey; + doc_count: number; + container: SearchResponse>; +} + type NodeBucket = Bucket & Metric; interface ResponseAggregations { nodes: { @@ -53,6 +67,19 @@ interface ResponseAggregations { }; } +const createContainerList = (containerContext: ContainerContext) => { + const containerList = []; + for (const containerBucket of containerContext.buckets) { + const containerHits = containerBucket.container.hits?.hits; + const containerSource = + containerHits && containerHits.length > 0 ? containerHits[0]._source : null; + if (containerSource && containerSource.container) { + containerList.push(containerSource.container); + } + } + return containerList; +}; + export const getData = async ( esClient: ElasticsearchClient, nodeType: InventoryItemType, @@ -73,6 +100,11 @@ export const getData = async ( const nextAfterKey = nodes.after_key; for (const bucket of nodes.buckets) { const metricId = customMetric && customMetric.field ? customMetric.id : metric; + + const containerList = bucket.containerContext + ? createContainerList(bucket.containerContext) + : undefined; + const bucketHits = bucket.additionalContext?.hits?.hits; const additionalContextSource = bucketHits && bucketHits.length > 0 ? bucketHits[0]._source : null; @@ -81,6 +113,7 @@ export const getData = async ( value: bucket?.[metricId]?.value ?? null, warn: bucket?.shouldWarn.value > 0 ?? false, trigger: bucket?.shouldTrigger.value > 0 ?? false, + container: containerList, ...additionalContextSource, }; } @@ -108,6 +141,12 @@ export const getData = async ( metric === 'logRate' && logQueryFields ? logQueryFields.indexPattern : source.configuration.metricAlias; + + const fieldsExisted = + nodeType === 'pod' + ? await doFieldsExist(esClient, [termsAggField[KUBERNETES_POD_UID]], index) + : null; + const request = createRequest( index, nodeType, @@ -117,7 +156,8 @@ export const getData = async ( afterKey, condition, filterQuery, - customMetric + customMetric, + fieldsExisted ); logger.trace(`Request: ${JSON.stringify(request)}`); const body = await esClient.search(request); diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index ff3f2b4119705..09eced776d1a9 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -30,10 +30,12 @@ import { createScopedLogger, AdditionalContext, getAlertDetailsUrl, + getContextForRecoveredAlerts, getViewInMetricsAppUrl, UNGROUPED_FACTORY_KEY, hasAdditionalContext, validGroupByForContext, + flattenAdditionalContext, } from '../common/utils'; import { EvaluatedRuleParams, evaluateRule } from './lib/evaluate_rule'; @@ -96,14 +98,14 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs) => executionId, }); - const { alertWithLifecycle, savedObjectsClient, getAlertUuid } = services; + const { alertWithLifecycle, savedObjectsClient, getAlertUuid, getAlertByAlertUuid } = services; const alertFactory: MetricThresholdAlertFactory = (id, reason, additionalContext) => alertWithLifecycle({ id, fields: { [ALERT_REASON]: reason, - ...additionalContext, + ...flattenAdditionalContext(additionalContext), }, }); @@ -299,6 +301,9 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs) => const recoveredAlertId = alert.getId(); const alertUuid = getAlertUuid(recoveredAlertId); + const alertHits = alertUuid ? await getAlertByAlertUuid(alertUuid) : undefined; + const additionalContext = getContextForRecoveredAlerts(alertHits); + alert.setContext({ alertDetailsUrl: getAlertDetailsUrl(libs.basePath, spaceId, alertUuid), alertState: stateToAlertMessage[AlertStates.OK], @@ -307,6 +312,7 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs) => timestamp: startedAt.toISOString(), threshold: mapToConditionsLookup(criteria, (c) => c.threshold), viewInAppUrl: getViewInMetricsAppUrl(libs.basePath, spaceId), + ...additionalContext, }); } diff --git a/x-pack/plugins/ml/server/saved_objects/sync_task.ts b/x-pack/plugins/ml/server/saved_objects/sync_task.ts index cc72247593ca0..e954defa11610 100644 --- a/x-pack/plugins/ml/server/saved_objects/sync_task.ts +++ b/x-pack/plugins/ml/server/saved_objects/sync_task.ts @@ -41,7 +41,6 @@ export class SavedObjectsSyncService { description: "This task periodically syncs ML's saved objects", timeout: '1m', maxAttempts: 3, - maxConcurrency: 1, createTaskRunner: ({ taskInstance }: { taskInstance: ConcreteTaskInstance }) => { return { diff --git a/x-pack/plugins/ml/server/shared_services/providers/__mocks__/jobs_service.ts b/x-pack/plugins/ml/server/shared_services/providers/__mocks__/jobs_service.ts index e39373d66eff8..a0cbae7ca1354 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/__mocks__/jobs_service.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/__mocks__/jobs_service.ts @@ -8,4 +8,6 @@ export const createJobServiceProviderMock = () => jest.fn(() => ({ jobsSummary: jest.fn(), + forceStartDatafeeds: jest.fn(), + stopDatafeeds: jest.fn(), })); diff --git a/x-pack/plugins/ml/server/shared_services/providers/job_service.ts b/x-pack/plugins/ml/server/shared_services/providers/job_service.ts index 7ec7102c1c3f4..c9b4a5c0b0b13 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/job_service.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/job_service.ts @@ -17,6 +17,8 @@ export interface JobServiceProvider { savedObjectsClient: SavedObjectsClientContract ): { jobsSummary: OrigJobServiceProvider['jobsSummary']; + forceStartDatafeeds: OrigJobServiceProvider['forceStartDatafeeds']; + stopDatafeeds: OrigJobServiceProvider['stopDatafeeds']; }; } @@ -33,6 +35,24 @@ export function getJobServiceProvider(getGuards: GetGuards): JobServiceProvider return jobsSummary(...args); }); }, + forceStartDatafeeds: async (...args) => { + return await getGuards(request, savedObjectsClient) + .isFullLicense() + .hasMlCapabilities(['canStartStopDatafeed']) + .ok(({ scopedClient, mlClient }) => { + const { forceStartDatafeeds } = jobServiceProvider(scopedClient, mlClient); + return forceStartDatafeeds(...args); + }); + }, + stopDatafeeds: async (...args) => { + return await getGuards(request, savedObjectsClient) + .isFullLicense() + .hasMlCapabilities(['canStartStopDatafeed']) + .ok(({ scopedClient, mlClient }) => { + const { stopDatafeeds } = jobServiceProvider(scopedClient, mlClient); + return stopDatafeeds(...args); + }); + }, }; }, }; diff --git a/x-pack/plugins/observability/dev_docs/slo.md b/x-pack/plugins/observability/dev_docs/slo.md index 62bae550916b4..ba9d58f8c772f 100644 --- a/x-pack/plugins/observability/dev_docs/slo.md +++ b/x-pack/plugins/observability/dev_docs/slo.md @@ -57,7 +57,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_error_rate", + "type": "sli.apm.transaction_error_rate", "params": { "environment": "production", "service": "o11y-app", @@ -91,7 +91,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_error_rate", + "type": "sli.apm.transaction_error_rate", "params": { "environment": "production", "service": "o11y-app", @@ -127,7 +127,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_error_rate", + "type": "sli.apm.transaction_error_rate", "params": { "environment": "production", "service": "o11y-app", @@ -165,7 +165,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_duration", + "type": "sli.apm.transaction_duration", "params": { "environment": "production", "service": "o11y-app", @@ -199,7 +199,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_duration", + "type": "sli.apm.transaction_duration", "params": { "environment": "production", "service": "o11y-app", @@ -236,7 +236,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.apm.transaction_duration", + "type": "sli.apm.transaction_duration", "params": { "environment": "production", "service": "o11y-app", @@ -278,7 +278,7 @@ curl --request POST \ "name": "My SLO Name", "description": "My SLO Description", "indicator": { - "type": "slo.kql.custom", + "type": "sli.kql.custom", "params": { "index": "high-cardinality-data-fake_logs*", "numerator": "latency < 300", diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts index 1fe020ee1b2a5..3aa92587a867c 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts @@ -105,7 +105,19 @@ export function getSyntheticsKPIConfig({ dataView }: ConfigProps): SeriesConfig columnFilters: [ { language: 'kuery', - query: `state.id: * and state.up: 0`, + query: `summary: * and summary.down > 0 and and monitor.status: "down"`, + }, + ], + }, + { + label: 'Monitor Complete', + id: 'state.up', + field: 'state.up', + columnType: OPERATION_COLUMN, + columnFilters: [ + { + language: 'kuery', + query: `summary: * and summary.down: 0 and monitor.status: "up"`, }, ], }, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts index 56129ffd86da8..1ad3410ca344e 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/single_metric_config.ts @@ -93,6 +93,30 @@ export function getSyntheticsSingleMetricConfig({ dataView }: ConfigProps): Seri titlePosition: 'bottom', }, }, + { + id: 'monitor_total_runs', + label: i18n.translate('xpack.observability.expView.totalRuns', { + defaultMessage: 'Total Runs', + }), + metricStateOptions: { + titlePosition: 'bottom', + }, + columnType: FORMULA_COLUMN, + formula: 'unique_count(monitor.check_group)', + format: 'number', + }, + { + id: 'monitor_complete', + label: i18n.translate('xpack.observability.expView.complete', { + defaultMessage: 'Complete', + }), + metricStateOptions: { + titlePosition: 'bottom', + }, + columnType: FORMULA_COLUMN, + formula: 'unique_count(monitor.check_group, kql=\'monitor.status: "up"\')', + format: 'number', + }, { id: 'monitor_errors', label: i18n.translate('xpack.observability.expView.errors', { @@ -104,7 +128,7 @@ export function getSyntheticsSingleMetricConfig({ dataView }: ConfigProps): Seri palette: getColorPalette('danger'), }, columnType: FORMULA_COLUMN, - formula: 'unique_count(state.id, kql=\'monitor.status: "down"\')', + formula: 'unique_count(monitor.check_group, kql=\'monitor.status: "down"\')', format: 'number', }, { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx index fc80a96e7b69f..221fc8528b975 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/embeddable/embeddable.tsx @@ -50,6 +50,7 @@ export interface ExploratoryEmbeddableProps { showCalculationMethod?: boolean; title?: string | JSX.Element; withActions?: boolean | ActionTypes[]; + align?: 'left' | 'right' | 'center'; } export interface ExploratoryEmbeddableComponentProps extends ExploratoryEmbeddableProps { @@ -80,6 +81,7 @@ export default function Embeddable({ withActions = true, lensFormulaHelper, hideTicks, + align, }: ExploratoryEmbeddableComponentProps) { const LensComponent = lens?.EmbeddableComponent; const LensSaveModalComponent = lens?.SaveModalComponent; @@ -168,7 +170,7 @@ export default function Embeddable({ } return ( - + {(title || showCalculationMethod || appendTitle) && ( {title && ( @@ -226,6 +228,7 @@ export default function Embeddable({ const Wrapper = styled.div<{ $customHeight?: string | number; + align?: 'left' | 'right' | 'center'; }>` height: ${(props) => (props.$customHeight ? `${props.$customHeight};` : `100%;`)}; position: relative; @@ -239,6 +242,14 @@ const Wrapper = styled.div<{ } .legacyMtrVis { + > :first-child { + justify-content: ${(props) => + props.align === 'left' + ? `flex-start;` + : props.align === 'right' + ? `flex-end;` + : 'center;'}; + } justify-content: flex-end; .legacyMtrVis__container { padding: 0; diff --git a/x-pack/plugins/observability/server/types/models/common.ts b/x-pack/plugins/observability/server/domain/models/common.ts similarity index 86% rename from x-pack/plugins/observability/server/types/models/common.ts rename to x-pack/plugins/observability/server/domain/models/common.ts index 7f672136c9194..cfed25d0ef116 100644 --- a/x-pack/plugins/observability/server/types/models/common.ts +++ b/x-pack/plugins/observability/server/domain/models/common.ts @@ -5,7 +5,7 @@ * 2.0. */ import * as t from 'io-ts'; -import { dateRangeSchema } from '../schema'; +import { dateRangeSchema } from '../../types/schema'; type DateRange = t.TypeOf; diff --git a/x-pack/plugins/observability/server/domain/models/duration.test.ts b/x-pack/plugins/observability/server/domain/models/duration.test.ts new file mode 100644 index 0000000000000..47c408766fea0 --- /dev/null +++ b/x-pack/plugins/observability/server/domain/models/duration.test.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 { Duration, DurationUnit } from './duration'; + +describe('Duration', () => { + it('throws when value is negative', () => { + expect(() => new Duration(-1, DurationUnit.Day)).toThrow('invalid duration value'); + }); + + it('throws when value is zero', () => { + expect(() => new Duration(0, DurationUnit.Day)).toThrow('invalid duration value'); + }); + + it('throws when unit is not valid', () => { + expect(() => new Duration(1, 'z' as DurationUnit)).toThrow('invalid duration unit'); + }); + + describe('format', () => { + it('formats the duration correctly', () => { + expect(new Duration(1, DurationUnit.Minute).format()).toBe('1m'); + expect(new Duration(1, DurationUnit.Hour).format()).toBe('1h'); + expect(new Duration(1, DurationUnit.Day).format()).toBe('1d'); + expect(new Duration(1, DurationUnit.Week).format()).toBe('1w'); + expect(new Duration(1, DurationUnit.Month).format()).toBe('1M'); + expect(new Duration(1, DurationUnit.Quarter).format()).toBe('1Q'); + expect(new Duration(1, DurationUnit.Year).format()).toBe('1Y'); + }); + }); + + describe('isShorterThan', () => { + it('returns true when the current duration is shorter than the other duration', () => { + const short = new Duration(1, DurationUnit.Minute); + expect(short.isShorterThan(new Duration(1, DurationUnit.Hour))).toBe(true); + expect(short.isShorterThan(new Duration(1, DurationUnit.Day))).toBe(true); + expect(short.isShorterThan(new Duration(1, DurationUnit.Week))).toBe(true); + expect(short.isShorterThan(new Duration(1, DurationUnit.Month))).toBe(true); + expect(short.isShorterThan(new Duration(1, DurationUnit.Quarter))).toBe(true); + expect(short.isShorterThan(new Duration(1, DurationUnit.Year))).toBe(true); + }); + + it('returns false when the current duration is longer (or equal) than the other duration', () => { + const long = new Duration(1, DurationUnit.Year); + expect(long.isShorterThan(new Duration(1, DurationUnit.Minute))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Hour))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Day))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Week))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Month))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Quarter))).toBe(false); + expect(long.isShorterThan(new Duration(1, DurationUnit.Year))).toBe(false); + }); + }); +}); diff --git a/x-pack/plugins/observability/server/types/models/duration.ts b/x-pack/plugins/observability/server/domain/models/duration.ts similarity index 81% rename from x-pack/plugins/observability/server/types/models/duration.ts rename to x-pack/plugins/observability/server/domain/models/duration.ts index aafed067f0bae..64fac053a1990 100644 --- a/x-pack/plugins/observability/server/types/models/duration.ts +++ b/x-pack/plugins/observability/server/domain/models/duration.ts @@ -9,13 +9,13 @@ import { assertNever } from '@kbn/std'; import * as moment from 'moment'; enum DurationUnit { - 'm' = 'm', - 'h' = 'h', - 'd' = 'd', - 'w' = 'w', - 'M' = 'M', - 'Q' = 'Q', - 'Y' = 'Y', + 'Minute' = 'm', + 'Hour' = 'h', + 'Day' = 'd', + 'Week' = 'w', + 'Month' = 'M', + 'Quarter' = 'Q', + 'Year' = 'Y', } class Duration { @@ -41,19 +41,19 @@ class Duration { const toMomentUnitOfTime = (unit: DurationUnit): moment.unitOfTime.Diff => { switch (unit) { - case DurationUnit.m: + case DurationUnit.Minute: return 'minutes'; - case DurationUnit.h: + case DurationUnit.Hour: return 'hours'; - case DurationUnit.d: + case DurationUnit.Day: return 'days'; - case DurationUnit.w: + case DurationUnit.Week: return 'weeks'; - case DurationUnit.M: + case DurationUnit.Month: return 'months'; - case DurationUnit.Q: + case DurationUnit.Quarter: return 'quarters'; - case DurationUnit.Y: + case DurationUnit.Year: return 'years'; default: assertNever(unit); diff --git a/x-pack/plugins/observability/server/types/models/error_budget.ts b/x-pack/plugins/observability/server/domain/models/error_budget.ts similarity index 86% rename from x-pack/plugins/observability/server/types/models/error_budget.ts rename to x-pack/plugins/observability/server/domain/models/error_budget.ts index bc3b36af654b5..8b2084101898b 100644 --- a/x-pack/plugins/observability/server/types/models/error_budget.ts +++ b/x-pack/plugins/observability/server/domain/models/error_budget.ts @@ -6,7 +6,7 @@ */ import * as t from 'io-ts'; -import { errorBudgetSchema } from '../schema'; +import { errorBudgetSchema } from '../../types/schema'; type ErrorBudget = t.TypeOf; diff --git a/x-pack/plugins/observability/server/types/models/index.ts b/x-pack/plugins/observability/server/domain/models/index.ts similarity index 92% rename from x-pack/plugins/observability/server/types/models/index.ts rename to x-pack/plugins/observability/server/domain/models/index.ts index 443dea8f09d6d..3d6a78aa10ce8 100644 --- a/x-pack/plugins/observability/server/types/models/index.ts +++ b/x-pack/plugins/observability/server/domain/models/index.ts @@ -5,8 +5,9 @@ * 2.0. */ -export * from './slo'; -export * from './indicators'; -export * from './error_budget'; -export * from './duration'; export * from './common'; +export * from './duration'; +export * from './error_budget'; +export * from './indicators'; +export * from './slo'; +export * from './time_window'; diff --git a/x-pack/plugins/observability/server/types/models/indicators.ts b/x-pack/plugins/observability/server/domain/models/indicators.ts similarity index 97% rename from x-pack/plugins/observability/server/types/models/indicators.ts rename to x-pack/plugins/observability/server/domain/models/indicators.ts index ea02059a03ff4..4303cad7cd8e0 100644 --- a/x-pack/plugins/observability/server/types/models/indicators.ts +++ b/x-pack/plugins/observability/server/domain/models/indicators.ts @@ -13,7 +13,7 @@ import { indicatorSchema, indicatorTypesSchema, kqlCustomIndicatorSchema, -} from '../schema'; +} from '../../types/schema'; type APMTransactionErrorRateIndicator = t.TypeOf; type APMTransactionDurationIndicator = t.TypeOf; diff --git a/x-pack/plugins/observability/server/domain/models/slo.ts b/x-pack/plugins/observability/server/domain/models/slo.ts new file mode 100644 index 0000000000000..022a5a9e6a3c4 --- /dev/null +++ b/x-pack/plugins/observability/server/domain/models/slo.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; +import { sloSchema } from '../../types/schema'; + +type SLO = t.TypeOf; +type StoredSLO = t.OutputOf; + +export type { SLO, StoredSLO }; diff --git a/x-pack/plugins/observability/server/types/models/time_window.ts b/x-pack/plugins/observability/server/domain/models/time_window.ts similarity index 84% rename from x-pack/plugins/observability/server/types/models/time_window.ts rename to x-pack/plugins/observability/server/domain/models/time_window.ts index 0478a3aae0ed9..288e151fe6bdb 100644 --- a/x-pack/plugins/observability/server/types/models/time_window.ts +++ b/x-pack/plugins/observability/server/domain/models/time_window.ts @@ -6,7 +6,7 @@ */ import * as t from 'io-ts'; -import { timeWindowSchema } from '../schema/time_window'; +import { timeWindowSchema } from '../../types/schema/time_window'; type TimeWindow = t.TypeOf; diff --git a/x-pack/plugins/observability/server/domain/services/compute_burn_rate.test.ts b/x-pack/plugins/observability/server/domain/services/compute_burn_rate.test.ts new file mode 100644 index 0000000000000..92b1de2d5a3d8 --- /dev/null +++ b/x-pack/plugins/observability/server/domain/services/compute_burn_rate.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { computeBurnRate } from './compute_burn_rate'; +import { toDateRange } from './date_range'; +import { createSLO } from '../../services/slo/fixtures/slo'; +import { sixHoursRolling } from '../../services/slo/fixtures/time_window'; + +describe('computeBurnRate', () => { + it('computes 0 when total is 0', () => { + expect( + computeBurnRate(createSLO(), { + good: 10, + total: 0, + date_range: toDateRange(sixHoursRolling()), + }) + ).toEqual(0); + }); + + it('computes 0 when good is greater than total', () => { + expect( + computeBurnRate(createSLO(), { + good: 9999, + total: 1, + date_range: toDateRange(sixHoursRolling()), + }) + ).toEqual(0); + }); + + it('computes the burn rate as 1x the error budget', () => { + expect( + computeBurnRate(createSLO({ objective: { target: 0.9 } }), { + good: 90, + total: 100, + date_range: toDateRange(sixHoursRolling()), + }) + ).toEqual(1); + }); + + it('computes the burn rate as 10x the error budget', () => { + expect( + computeBurnRate(createSLO({ objective: { target: 0.99 } }), { + good: 90, + total: 100, + date_range: toDateRange(sixHoursRolling()), + }) + ).toEqual(10); + }); + + it('computes the burn rate as 0.5x the error budget', () => { + expect( + computeBurnRate(createSLO({ objective: { target: 0.8 } }), { + good: 90, + total: 100, + date_range: toDateRange(sixHoursRolling()), + }) + ).toEqual(0.5); + }); +}); diff --git a/x-pack/plugins/observability/server/domain/services/compute_burn_rate.ts b/x-pack/plugins/observability/server/domain/services/compute_burn_rate.ts new file mode 100644 index 0000000000000..2cd758c4c3a74 --- /dev/null +++ b/x-pack/plugins/observability/server/domain/services/compute_burn_rate.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { toHighPrecision } from '../../utils/number'; +import { IndicatorData, SLO } from '../models'; + +/** + * A Burn Rate is computed with the Indicator Data retrieved from a specific lookback period + * It tells how fast we are consumming our error budget during a specific period + */ +export function computeBurnRate(slo: SLO, sliData: IndicatorData): number { + const { good, total } = sliData; + if (total === 0 || good >= total) { + return 0; + } + + const errorBudget = 1 - slo.objective.target; + const errorRate = 1 - good / total; + return toHighPrecision(errorRate / errorBudget); +} diff --git a/x-pack/plugins/observability/server/domain/services/compute_error_budget.ts b/x-pack/plugins/observability/server/domain/services/compute_error_budget.ts index 68531d4f4cb0b..3b245d396caec 100644 --- a/x-pack/plugins/observability/server/domain/services/compute_error_budget.ts +++ b/x-pack/plugins/observability/server/domain/services/compute_error_budget.ts @@ -6,7 +6,7 @@ */ import moment from 'moment'; -import { ErrorBudget, IndicatorData, SLO, toMomentUnitOfTime } from '../../types/models'; +import { ErrorBudget, IndicatorData, SLO, toMomentUnitOfTime } from '../models'; import { calendarAlignedTimeWindowSchema, timeslicesBudgetingMethodSchema, diff --git a/x-pack/plugins/observability/server/domain/services/compute_sli.test.ts b/x-pack/plugins/observability/server/domain/services/compute_sli.test.ts index 9d69539c72f70..9383ab4202978 100644 --- a/x-pack/plugins/observability/server/domain/services/compute_sli.test.ts +++ b/x-pack/plugins/observability/server/domain/services/compute_sli.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DateRange } from '../../types/models'; +import { DateRange } from '../models'; import { computeSLI } from './compute_sli'; const DATE_RANGE: DateRange = { from: new Date(), to: new Date() }; diff --git a/x-pack/plugins/observability/server/domain/services/compute_sli.ts b/x-pack/plugins/observability/server/domain/services/compute_sli.ts index 6a0f885737633..3d0abf13b77d8 100644 --- a/x-pack/plugins/observability/server/domain/services/compute_sli.ts +++ b/x-pack/plugins/observability/server/domain/services/compute_sli.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IndicatorData } from '../../types/models'; +import { IndicatorData } from '../models'; import { toHighPrecision } from '../../utils/number'; export function computeSLI(sliData: IndicatorData): number { diff --git a/x-pack/plugins/observability/server/domain/services/date_range.test.ts b/x-pack/plugins/observability/server/domain/services/date_range.test.ts index e4a8cdac45931..a785c529dd8a2 100644 --- a/x-pack/plugins/observability/server/domain/services/date_range.test.ts +++ b/x-pack/plugins/observability/server/domain/services/date_range.test.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { TimeWindow } from '../../types/models/time_window'; -import { Duration, DurationUnit } from '../../types/models'; +import { TimeWindow } from '../models/time_window'; +import { Duration, DurationUnit } from '../models'; import { toDateRange } from './date_range'; -const THIRTY_DAYS = new Duration(30, DurationUnit.d); -const WEEKLY = new Duration(1, DurationUnit.w); -const BIWEEKLY = new Duration(2, DurationUnit.w); -const MONTHLY = new Duration(1, DurationUnit.M); -const QUARTERLY = new Duration(1, DurationUnit.Q); +const THIRTY_DAYS = new Duration(30, DurationUnit.Day); +const WEEKLY = new Duration(1, DurationUnit.Week); +const BIWEEKLY = new Duration(2, DurationUnit.Week); +const MONTHLY = new Duration(1, DurationUnit.Month); +const QUARTERLY = new Duration(1, DurationUnit.Quarter); const NOW = new Date('2022-08-11T08:31:00.000Z'); diff --git a/x-pack/plugins/observability/server/domain/services/date_range.ts b/x-pack/plugins/observability/server/domain/services/date_range.ts index 2c23d0672fa31..7a4c765b96aae 100644 --- a/x-pack/plugins/observability/server/domain/services/date_range.ts +++ b/x-pack/plugins/observability/server/domain/services/date_range.ts @@ -7,9 +7,9 @@ import { assertNever } from '@kbn/std'; import moment from 'moment'; -import { DateRange, toMomentUnitOfTime } from '../../types/models'; +import { DateRange, toMomentUnitOfTime } from '../models'; -import type { TimeWindow } from '../../types/models/time_window'; +import type { TimeWindow } from '../models/time_window'; import { calendarAlignedTimeWindowSchema, rollingTimeWindowSchema } from '../../types/schema'; export const toDateRange = (timeWindow: TimeWindow, currentDate: Date = new Date()): DateRange => { diff --git a/x-pack/plugins/observability/server/domain/services/index.ts b/x-pack/plugins/observability/server/domain/services/index.ts index 8fd5a1e24b772..ab5b5ed35c529 100644 --- a/x-pack/plugins/observability/server/domain/services/index.ts +++ b/x-pack/plugins/observability/server/domain/services/index.ts @@ -7,5 +7,6 @@ export * from './compute_error_budget'; export * from './compute_sli'; +export * from './compute_burn_rate'; export * from './date_range'; export * from './validate_slo'; diff --git a/x-pack/plugins/observability/server/domain/services/validate_slo.test.ts b/x-pack/plugins/observability/server/domain/services/validate_slo.test.ts index 2a1142aa22076..0be391acf984f 100644 --- a/x-pack/plugins/observability/server/domain/services/validate_slo.test.ts +++ b/x-pack/plugins/observability/server/domain/services/validate_slo.test.ts @@ -7,7 +7,7 @@ import { validateSLO } from '.'; import { createSLO } from '../../services/slo/fixtures/slo'; -import { Duration, DurationUnit } from '../../types/models/duration'; +import { Duration, DurationUnit } from '../models/duration'; describe('validateSLO', () => { describe('any slo', () => { @@ -16,21 +16,21 @@ describe('validateSLO', () => { expect(() => validateSLO(slo)).toThrowError('Invalid objective.target'); }); - it("throws when 'objective.target' is gt 1", () => { - const slo = createSLO({ objective: { target: 1.0001 } }); + it("throws when 'objective.target' is gte 1", () => { + const slo = createSLO({ objective: { target: 1 } }); expect(() => validateSLO(slo)).toThrowError('Invalid objective.target'); }); it("throws when time window duration unit is 'm'", () => { const slo = createSLO({ - time_window: { duration: new Duration(1, DurationUnit.m), is_rolling: true }, + time_window: { duration: new Duration(1, DurationUnit.Minute), is_rolling: true }, }); expect(() => validateSLO(slo)).toThrowError('Invalid time_window.duration'); }); it("throws when time window duration unit is 'h'", () => { const slo = createSLO({ - time_window: { duration: new Duration(1, DurationUnit.h), is_rolling: true }, + time_window: { duration: new Duration(1, DurationUnit.Hour), is_rolling: true }, }); expect(() => validateSLO(slo)).toThrowError('Invalid time_window.duration'); }); @@ -42,7 +42,7 @@ describe('validateSLO', () => { budgeting_method: 'timeslices', objective: { target: 0.95, - timeslice_window: new Duration(1, DurationUnit.m), + timeslice_window: new Duration(1, DurationUnit.Minute), }, }); expect(() => validateSLO(slo)).toThrowError('Invalid objective.timeslice_target'); @@ -54,7 +54,7 @@ describe('validateSLO', () => { objective: { target: 0.95, timeslice_target: 0, - timeslice_window: new Duration(1, DurationUnit.m), + timeslice_window: new Duration(1, DurationUnit.Minute), }, }); @@ -67,7 +67,7 @@ describe('validateSLO', () => { objective: { target: 0.95, timeslice_target: 1.001, - timeslice_window: new Duration(1, DurationUnit.m), + timeslice_window: new Duration(1, DurationUnit.Minute), }, }); expect(() => validateSLO(slo)).toThrowError('Invalid objective.timeslice_target'); @@ -97,47 +97,47 @@ describe('validateSLO', () => { expect(() => validateSLO({ ...slo, - objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.d) }, + objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Day) }, }) ).toThrowError('Invalid objective.timeslice_window'); expect(() => validateSLO({ ...slo, - objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.w) }, + objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Week) }, }) ).toThrowError('Invalid objective.timeslice_window'); expect(() => validateSLO({ ...slo, - objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.M) }, + objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Month) }, }) ).toThrowError('Invalid objective.timeslice_window'); expect(() => validateSLO({ ...slo, - objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Q) }, + objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Quarter) }, }) ).toThrowError('Invalid objective.timeslice_window'); expect(() => validateSLO({ ...slo, - objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Y) }, + objective: { ...slo.objective, timeslice_window: new Duration(1, DurationUnit.Year) }, }) ).toThrowError('Invalid objective.timeslice_window'); }); it("throws when 'objective.timeslice_window' is longer than 'slo.time_window'", () => { const slo = createSLO({ - time_window: { duration: new Duration(1, DurationUnit.w), is_rolling: true }, + time_window: { duration: new Duration(1, DurationUnit.Week), is_rolling: true }, budgeting_method: 'timeslices', objective: { target: 0.95, timeslice_target: 0.95, - timeslice_window: new Duration(169, DurationUnit.h), // 1 week + 1 hours = 169 hours + timeslice_window: new Duration(169, DurationUnit.Hour), // 1 week + 1 hours = 169 hours }, }); diff --git a/x-pack/plugins/observability/server/domain/services/validate_slo.ts b/x-pack/plugins/observability/server/domain/services/validate_slo.ts index db9c1cbf97ddc..8349ab1635290 100644 --- a/x-pack/plugins/observability/server/domain/services/validate_slo.ts +++ b/x-pack/plugins/observability/server/domain/services/validate_slo.ts @@ -6,8 +6,8 @@ */ import { IllegalArgumentError } from '../../errors'; -import { SLO } from '../../types/models'; -import { Duration, DurationUnit } from '../../types/models/duration'; +import { SLO } from '../models'; +import { Duration, DurationUnit } from '../models/duration'; import { timeslicesBudgetingMethodSchema } from '../../types/schema'; /** @@ -44,18 +44,22 @@ export function validateSLO(slo: SLO) { } function isValidTargetNumber(value: number): boolean { - return value > 0 && value <= 1; + return value > 0 && value < 1; } function isValidTimeWindowDuration(duration: Duration): boolean { - return [DurationUnit.d, DurationUnit.w, DurationUnit.M, DurationUnit.Q, DurationUnit.Y].includes( - duration.unit - ); + return [ + DurationUnit.Day, + DurationUnit.Week, + DurationUnit.Month, + DurationUnit.Quarter, + DurationUnit.Year, + ].includes(duration.unit); } function isValidTimesliceWindowDuration(timesliceWindow: Duration, timeWindow: Duration): boolean { return ( - [DurationUnit.m, DurationUnit.h].includes(timesliceWindow.unit) && + [DurationUnit.Minute, DurationUnit.Hour].includes(timesliceWindow.unit) && timesliceWindow.isShorterThan(timeWindow) ); } diff --git a/x-pack/plugins/observability/server/routes/slo/route.ts b/x-pack/plugins/observability/server/routes/slo/route.ts index 058fb96063712..5b3f0868bfc37 100644 --- a/x-pack/plugins/observability/server/routes/slo/route.ts +++ b/x-pack/plugins/observability/server/routes/slo/route.ts @@ -7,22 +7,22 @@ import { CreateSLO, - DeleteSLO, DefaultResourceInstaller, + DefaultSLIClient, DefaultTransformManager, - KibanaSavedObjectsSLORepository, + DeleteSLO, + FindSLO, GetSLO, + KibanaSavedObjectsSLORepository, UpdateSLO, - DefaultSLIClient, } from '../../services/slo'; -import { FindSLO } from '../../services/slo/find_slo'; import { ApmTransactionDurationTransformGenerator, ApmTransactionErrorRateTransformGenerator, KQLCustomTransformGenerator, TransformGenerator, } from '../../services/slo/transform_generators'; -import { IndicatorTypes } from '../../types/models'; +import { IndicatorTypes } from '../../domain/models'; import { createSLOParamsSchema, deleteSLOParamsSchema, @@ -33,9 +33,9 @@ import { import { createObservabilityServerRoute } from '../create_observability_server_route'; const transformGenerators: Record = { - 'slo.apm.transaction_duration': new ApmTransactionDurationTransformGenerator(), - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), - 'slo.kql.custom': new KQLCustomTransformGenerator(), + 'sli.apm.transaction_duration': new ApmTransactionDurationTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.kql.custom': new KQLCustomTransformGenerator(), }; const createSLORoute = createObservabilityServerRoute({ diff --git a/x-pack/plugins/observability/server/saved_objects/slo.ts b/x-pack/plugins/observability/server/saved_objects/slo.ts index 461896a35f84e..5169c26252bc0 100644 --- a/x-pack/plugins/observability/server/saved_objects/slo.ts +++ b/x-pack/plugins/observability/server/saved_objects/slo.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '@kbn/core-saved-objects-server'; import { SavedObject } from '@kbn/core/server'; -import { StoredSLO } from '../types/models'; +import { StoredSLO } from '../domain/models'; export const SO_SLO_TYPE = 'slo'; diff --git a/x-pack/plugins/observability/server/services/slo/create_slo.ts b/x-pack/plugins/observability/server/services/slo/create_slo.ts index 6d79a6906fc88..aab2a42f7ede3 100644 --- a/x-pack/plugins/observability/server/services/slo/create_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/create_slo.ts @@ -7,7 +7,7 @@ import uuid from 'uuid'; -import { SLO } from '../../types/models'; +import { SLO } from '../../domain/models'; import { ResourceInstaller } from './resource_installer'; import { SLORepository } from './slo_repository'; import { TransformManager } from './transform_manager'; diff --git a/x-pack/plugins/observability/server/services/slo/find_slo.test.ts b/x-pack/plugins/observability/server/services/slo/find_slo.test.ts index b25501bbe5032..a15eac792286c 100644 --- a/x-pack/plugins/observability/server/services/slo/find_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/find_slo.test.ts @@ -49,7 +49,7 @@ describe('FindSLO', () => { transaction_type: 'irrelevant', 'threshold.us': 500000, }, - type: 'slo.apm.transaction_duration', + type: 'sli.apm.transaction_duration', }, objective: { target: 0.999, diff --git a/x-pack/plugins/observability/server/services/slo/find_slo.ts b/x-pack/plugins/observability/server/services/slo/find_slo.ts index 3a11b06ad1d6c..b1df462f4dc52 100644 --- a/x-pack/plugins/observability/server/services/slo/find_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/find_slo.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SLO } from '../../types/models'; +import { SLO } from '../../domain/models'; import { FindSLOParams, FindSLOResponse, findSLOResponseSchema } from '../../types/rest_specs'; import { Criteria, Paginated, Pagination, SLORepository } from './slo_repository'; diff --git a/x-pack/plugins/observability/server/services/slo/fixtures/duration.ts b/x-pack/plugins/observability/server/services/slo/fixtures/duration.ts index be0eb1407145c..0086754150e8d 100644 --- a/x-pack/plugins/observability/server/services/slo/fixtures/duration.ts +++ b/x-pack/plugins/observability/server/services/slo/fixtures/duration.ts @@ -5,16 +5,20 @@ * 2.0. */ -import { Duration, DurationUnit } from '../../../types/models'; +import { Duration, DurationUnit } from '../../../domain/models'; export function sevenDays(): Duration { - return new Duration(7, DurationUnit.d); + return new Duration(7, DurationUnit.Day); } export function oneWeek(): Duration { - return new Duration(1, DurationUnit.w); + return new Duration(1, DurationUnit.Week); +} + +export function sixHours(): Duration { + return new Duration(6, DurationUnit.Hour); } export function oneMinute(): Duration { - return new Duration(1, DurationUnit.m); + return new Duration(1, DurationUnit.Minute); } diff --git a/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts b/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts index dbce530c7df6a..d727cf0e6e329 100644 --- a/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts +++ b/x-pack/plugins/observability/server/services/slo/fixtures/slo.ts @@ -14,7 +14,7 @@ import { Indicator, KQLCustomIndicator, SLO, -} from '../../../types/models'; +} from '../../../domain/models'; import { CreateSLOParams } from '../../../types/rest_specs'; import { Paginated } from '../slo_repository'; import { sevenDays } from './duration'; @@ -23,7 +23,7 @@ import { sevenDaysRolling } from './time_window'; export const createAPMTransactionErrorRateIndicator = ( params: Partial = {} ): Indicator => ({ - type: 'slo.apm.transaction_error_rate', + type: 'sli.apm.transaction_error_rate', params: { environment: 'irrelevant', service: 'irrelevant', @@ -37,7 +37,7 @@ export const createAPMTransactionErrorRateIndicator = ( export const createAPMTransactionDurationIndicator = ( params: Partial = {} ): Indicator => ({ - type: 'slo.apm.transaction_duration', + type: 'sli.apm.transaction_duration', params: { environment: 'irrelevant', service: 'irrelevant', @@ -51,7 +51,7 @@ export const createAPMTransactionDurationIndicator = ( export const createKQLCustomIndicator = ( params: Partial = {} ): Indicator => ({ - type: 'slo.kql.custom', + type: 'sli.kql.custom', params: { index: 'my-index*', query_filter: 'labels.groupId: group-3', diff --git a/x-pack/plugins/observability/server/services/slo/fixtures/time_window.ts b/x-pack/plugins/observability/server/services/slo/fixtures/time_window.ts index 6f9228bc9304f..7527fff98220f 100644 --- a/x-pack/plugins/observability/server/services/slo/fixtures/time_window.ts +++ b/x-pack/plugins/observability/server/services/slo/fixtures/time_window.ts @@ -5,8 +5,15 @@ * 2.0. */ -import { TimeWindow } from '../../../types/models/time_window'; -import { oneWeek, sevenDays } from './duration'; +import { TimeWindow } from '../../../domain/models/time_window'; +import { oneWeek, sevenDays, sixHours } from './duration'; + +export function sixHoursRolling(): TimeWindow { + return { + duration: sixHours(), + is_rolling: true, + }; +} export function sevenDaysRolling(): TimeWindow { return { diff --git a/x-pack/plugins/observability/server/services/slo/get_slo.test.ts b/x-pack/plugins/observability/server/services/slo/get_slo.test.ts index 568afe7799ba4..0416a37ecddec 100644 --- a/x-pack/plugins/observability/server/services/slo/get_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/get_slo.test.ts @@ -49,7 +49,7 @@ describe('GetSLO', () => { transaction_name: 'irrelevant', transaction_type: 'irrelevant', }, - type: 'slo.apm.transaction_error_rate', + type: 'sli.apm.transaction_error_rate', }, objective: { target: 0.999, diff --git a/x-pack/plugins/observability/server/services/slo/get_slo.ts b/x-pack/plugins/observability/server/services/slo/get_slo.ts index fe44571be55f6..1ad07fe0cf564 100644 --- a/x-pack/plugins/observability/server/services/slo/get_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/get_slo.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ErrorBudget, SLO } from '../../types/models'; +import { ErrorBudget, SLO } from '../../domain/models'; import { GetSLOResponse, getSLOResponseSchema } from '../../types/rest_specs'; import { SLORepository } from './slo_repository'; import { SLIClient } from './sli_client'; diff --git a/x-pack/plugins/observability/server/services/slo/index.ts b/x-pack/plugins/observability/server/services/slo/index.ts index 237e1cca0a80b..b47881545e867 100644 --- a/x-pack/plugins/observability/server/services/slo/index.ts +++ b/x-pack/plugins/observability/server/services/slo/index.ts @@ -5,12 +5,12 @@ * 2.0. */ -export * from './resource_installer'; -export * from './slo_repository'; -export * from './transform_manager'; export * from './create_slo'; export * from './delete_slo'; -export * from './get_slo'; -export * from './update_slo'; export * from './find_slo'; +export * from './get_slo'; +export * from './resource_installer'; export * from './sli_client'; +export * from './slo_repository'; +export * from './transform_manager'; +export * from './update_slo'; diff --git a/x-pack/plugins/observability/server/services/slo/mocks/index.ts b/x-pack/plugins/observability/server/services/slo/mocks/index.ts index 6ad452168bba7..2acce436a2402 100644 --- a/x-pack/plugins/observability/server/services/slo/mocks/index.ts +++ b/x-pack/plugins/observability/server/services/slo/mocks/index.ts @@ -37,6 +37,7 @@ const createSLORepositoryMock = (): jest.Mocked => { const createSLIClientMock = (): jest.Mocked => { return { fetchCurrentSLIData: jest.fn(), + fetchSLIDataFrom: jest.fn(), }; }; diff --git a/x-pack/plugins/observability/server/services/slo/sli_client.test.ts b/x-pack/plugins/observability/server/services/slo/sli_client.test.ts index 359b74cd58cca..b19d92155b0be 100644 --- a/x-pack/plugins/observability/server/services/slo/sli_client.test.ts +++ b/x-pack/plugins/observability/server/services/slo/sli_client.test.ts @@ -11,10 +11,24 @@ import moment from 'moment'; import { SLO_DESTINATION_INDEX_NAME } from '../../assets/constants'; import { toDateRange } from '../../domain/services'; import { InternalQueryError } from '../../errors'; -import { Duration, DurationUnit } from '../../types/models'; +import { Duration, DurationUnit } from '../../domain/models'; import { createSLO } from './fixtures/slo'; import { DefaultSLIClient } from './sli_client'; +const commonEsResponse = { + took: 100, + timed_out: false, + _shards: { + total: 0, + successful: 0, + skipped: 0, + failed: 0, + }, + hits: { + hits: [], + }, +}; + describe('SLIClient', () => { let esClientMock: ElasticsearchClientMock; @@ -27,22 +41,12 @@ describe('SLIClient', () => { it('throws when aggregations failed', async () => { const slo = createSLO({ time_window: { - duration: new Duration(7, DurationUnit.d), + duration: new Duration(7, DurationUnit.Day), is_rolling: true, }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: {}, }); const sliClient = new DefaultSLIClient(esClientMock); @@ -56,22 +60,12 @@ describe('SLIClient', () => { it('returns the aggregated good and total values', async () => { const slo = createSLO({ time_window: { - duration: new Duration(7, DurationUnit.d), + duration: new Duration(7, DurationUnit.Day), is_rolling: true, }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: { good: { value: 90 }, total: { value: 100 }, @@ -93,6 +87,7 @@ describe('SLIClient', () => { expect(esClientMock.search).toHaveBeenCalledWith( expect.objectContaining({ index: `${SLO_DESTINATION_INDEX_NAME}*`, + size: 0, query: { bool: { filter: [ @@ -119,24 +114,14 @@ describe('SLIClient', () => { it('returns the aggregated good and total values', async () => { const slo = createSLO({ time_window: { - duration: new Duration(1, DurationUnit.M), + duration: new Duration(1, DurationUnit.Month), calendar: { start_time: new Date('2022-09-01T00:00:00.000Z'), }, }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: { good: { value: 90 }, total: { value: 100 }, @@ -187,22 +172,12 @@ describe('SLIClient', () => { objective: { target: 0.95, timeslice_target: 0.95, - timeslice_window: new Duration(10, DurationUnit.m), + timeslice_window: new Duration(10, DurationUnit.Minute), }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: {}, }); const sliClient = new DefaultSLIClient(esClientMock); @@ -219,27 +194,17 @@ describe('SLIClient', () => { objective: { target: 0.95, timeslice_target: 0.9, - timeslice_window: new Duration(10, DurationUnit.m), + timeslice_window: new Duration(10, DurationUnit.Minute), }, time_window: { - duration: new Duration(1, DurationUnit.M), + duration: new Duration(1, DurationUnit.Month), calendar: { start_time: new Date('2022-09-01T00:00:00.000Z'), }, }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: { slices: { buckets: [] }, good: { value: 90 }, @@ -330,25 +295,15 @@ describe('SLIClient', () => { objective: { target: 0.95, timeslice_target: 0.9, - timeslice_window: new Duration(10, DurationUnit.m), + timeslice_window: new Duration(10, DurationUnit.Minute), }, time_window: { - duration: new Duration(1, DurationUnit.M), + duration: new Duration(1, DurationUnit.Month), is_rolling: true, }, }); esClientMock.search.mockResolvedValueOnce({ - took: 100, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - hits: [], - }, + ...commonEsResponse, aggregations: { good: { value: 90 }, total: { value: 100 }, @@ -429,6 +384,265 @@ describe('SLIClient', () => { }); }); }); + + describe('fetchSLIDataFrom', () => { + const LONG_WINDOW = 'long_window'; + const SHORT_WINDOW = 'short_window'; + + describe('for SLO defined with occurrences budgeting method', () => { + it('calls ES with the lookback windows aggregations', async () => { + const slo = createSLO({ budgeting_method: 'occurrences' }); + const lookbackWindows = [ + { name: LONG_WINDOW, duration: new Duration(1, DurationUnit.Hour) }, + { name: SHORT_WINDOW, duration: new Duration(5, DurationUnit.Minute) }, + ]; + esClientMock.search.mockResolvedValueOnce({ + ...commonEsResponse, + aggregations: { + [LONG_WINDOW]: { + buckets: [ + { + key: '2022-11-08T13:53:00.000Z-2022-11-08T14:53:00.000Z', + from: 1667915580000, + from_as_string: '2022-11-08T13:53:00.000Z', + to: 1667919180000, + to_as_string: '2022-11-08T14:53:00.000Z', + doc_count: 60, + total: { + value: 32169, + }, + good: { + value: 15748, + }, + }, + ], + }, + [SHORT_WINDOW]: { + buckets: [ + { + key: '2022-11-08T14:48:00.000Z-2022-11-08T14:53:00.000Z', + from: 1667918880000, + from_as_string: '2022-11-08T14:48:00.000Z', + to: 1667919180000, + to_as_string: '2022-11-08T14:53:00.000Z', + doc_count: 5, + total: { + value: 2211, + }, + good: { + value: 772, + }, + }, + ], + }, + }, + }); + const sliClient = new DefaultSLIClient(esClientMock); + + const result = await sliClient.fetchSLIDataFrom(slo, lookbackWindows); + + expect(esClientMock.search.mock.lastCall[0]).toMatchObject({ + aggs: { + [LONG_WINDOW]: { + date_range: { + field: '@timestamp', + ranges: [{ from: 'now-1h/m', to: 'now/m' }], + }, + aggs: { + good: { sum: { field: 'slo.numerator' } }, + total: { sum: { field: 'slo.denominator' } }, + }, + }, + [SHORT_WINDOW]: { + date_range: { + field: '@timestamp', + ranges: [{ from: 'now-5m/m', to: 'now/m' }], + }, + aggs: { + good: { sum: { field: 'slo.numerator' } }, + total: { sum: { field: 'slo.denominator' } }, + }, + }, + }, + }); + + expect(result[LONG_WINDOW]).toMatchObject({ good: 15748, total: 32169 }); + expect(result[SHORT_WINDOW]).toMatchObject({ good: 772, total: 2211 }); + }); + }); + + describe('for SLO defined with timeslices budgeting method', () => { + it('calls ES with the lookback windows aggregations', async () => { + const slo = createSLO({ + budgeting_method: 'timeslices', + objective: { + target: 0.95, + timeslice_target: 0.9, + timeslice_window: new Duration(10, DurationUnit.Minute), + }, + }); + + const lookbackWindows = [ + { name: LONG_WINDOW, duration: new Duration(1, DurationUnit.Hour) }, + { name: SHORT_WINDOW, duration: new Duration(5, DurationUnit.Minute) }, + ]; + esClientMock.search.mockResolvedValueOnce({ + ...commonEsResponse, + aggregations: { + [LONG_WINDOW]: { + buckets: [ + { + key: '2022-11-08T13:53:00.000Z-2022-11-08T14:53:00.000Z', + from: 1667915580000, + from_as_string: '2022-11-08T13:53:00.000Z', + to: 1667919180000, + to_as_string: '2022-11-08T14:53:00.000Z', + doc_count: 60, + total: { + value: 32169, + }, + good: { + value: 15748, + }, + }, + ], + }, + [SHORT_WINDOW]: { + buckets: [ + { + key: '2022-11-08T14:48:00.000Z-2022-11-08T14:53:00.000Z', + from: 1667918880000, + from_as_string: '2022-11-08T14:48:00.000Z', + to: 1667919180000, + to_as_string: '2022-11-08T14:53:00.000Z', + doc_count: 5, + total: { + value: 2211, + }, + good: { + value: 772, + }, + }, + ], + }, + }, + }); + const sliClient = new DefaultSLIClient(esClientMock); + + const result = await sliClient.fetchSLIDataFrom(slo, lookbackWindows); + + expect(esClientMock.search.mock.lastCall[0]).toMatchObject({ + aggs: { + [LONG_WINDOW]: { + date_range: { + field: '@timestamp', + ranges: [{ from: 'now-1h/m', to: 'now/m' }], + }, + aggs: { + slices: { + date_histogram: { + field: '@timestamp', + fixed_interval: '10m', + }, + aggs: { + good: { + sum: { + field: 'slo.numerator', + }, + }, + total: { + sum: { + field: 'slo.denominator', + }, + }, + good_slice: { + bucket_script: { + buckets_path: { + good: 'good', + total: 'total', + }, + script: 'params.good / params.total >= 0.9 ? 1 : 0', + }, + }, + count_slice: { + bucket_script: { + buckets_path: {}, + script: '1', + }, + }, + }, + }, + good: { + sum_bucket: { + buckets_path: 'slices>good_slice.value', + }, + }, + total: { + sum_bucket: { + buckets_path: 'slices>count_slice.value', + }, + }, + }, + }, + [SHORT_WINDOW]: { + date_range: { + field: '@timestamp', + ranges: [{ from: 'now-5m/m', to: 'now/m' }], + }, + aggs: { + slices: { + date_histogram: { + field: '@timestamp', + fixed_interval: '10m', + }, + aggs: { + good: { + sum: { + field: 'slo.numerator', + }, + }, + total: { + sum: { + field: 'slo.denominator', + }, + }, + good_slice: { + bucket_script: { + buckets_path: { + good: 'good', + total: 'total', + }, + script: 'params.good / params.total >= 0.9 ? 1 : 0', + }, + }, + count_slice: { + bucket_script: { + buckets_path: {}, + script: '1', + }, + }, + }, + }, + good: { + sum_bucket: { + buckets_path: 'slices>good_slice.value', + }, + }, + total: { + sum_bucket: { + buckets_path: 'slices>count_slice.value', + }, + }, + }, + }, + }, + }); + + expect(result[LONG_WINDOW]).toMatchObject({ good: 15748, total: 32169 }); + expect(result[SHORT_WINDOW]).toMatchObject({ good: 772, total: 2211 }); + }); + }); + }); }); expect.extend({ diff --git a/x-pack/plugins/observability/server/services/slo/sli_client.ts b/x-pack/plugins/observability/server/services/slo/sli_client.ts index a1cc948a31368..84f93d55a6b80 100644 --- a/x-pack/plugins/observability/server/services/slo/sli_client.ts +++ b/x-pack/plugins/observability/server/services/slo/sli_client.ts @@ -5,13 +5,17 @@ * 2.0. */ -import { AggregationsSumAggregate } from '@elastic/elasticsearch/lib/api/types'; +import { + AggregationsAggregationContainer, + AggregationsDateRangeAggregate, + AggregationsSumAggregate, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient } from '@kbn/core/server'; import { assertNever } from '@kbn/std'; import { SLO_DESTINATION_INDEX_NAME } from '../../assets/constants'; import { toDateRange } from '../../domain/services/date_range'; import { InternalQueryError } from '../../errors'; -import { DateRange, Duration, IndicatorData, SLO } from '../../types/models'; +import { DateRange, Duration, IndicatorData, SLO } from '../../domain/models'; import { occurencesBudgetingMethodSchema, timeslicesBudgetingMethodSchema, @@ -19,9 +23,21 @@ import { export interface SLIClient { fetchCurrentSLIData(slo: SLO): Promise; + fetchSLIDataFrom( + slo: SLO, + lookbackWindows: LookbackWindow[] + ): Promise>; +} + +type WindowName = string; + +interface LookbackWindow { + name: WindowName; + duration: Duration; } type AggKey = 'good' | 'total'; +type EsAggregations = Record; export class DefaultSLIClient implements SLIClient { constructor(private esClient: ElasticsearchClient) {} @@ -87,6 +103,40 @@ export class DefaultSLIClient implements SLIClient { assertNever(slo.budgeting_method); } + + async fetchSLIDataFrom( + slo: SLO, + lookbackWindows: LookbackWindow[] + ): Promise> { + const sortedLookbackWindows = [...lookbackWindows].sort((a, b) => + a.duration.isShorterThan(b.duration) ? 1 : -1 + ); + const longestLookbackWindow = sortedLookbackWindows[0]; + const longestDateRange = toDateRange({ + duration: longestLookbackWindow.duration, + is_rolling: true, + }); + + if (occurencesBudgetingMethodSchema.is(slo.budgeting_method)) { + const result = await this.esClient.search({ + ...commonQuery(slo, longestDateRange), + aggs: toLookbackWindowsAggregationsQuery(sortedLookbackWindows), + }); + + return handleWindowedResult(result.aggregations, lookbackWindows); + } + + if (timeslicesBudgetingMethodSchema.is(slo.budgeting_method)) { + const result = await this.esClient.search({ + ...commonQuery(slo, longestDateRange), + aggs: toLookbackWindowsSlicedAggregationsQuery(slo, sortedLookbackWindows), + }); + + return handleWindowedResult(result.aggregations, lookbackWindows); + } + + assertNever(slo.budgeting_method); + } } function commonQuery(slo: SLO, dateRange: DateRange) { @@ -126,8 +176,123 @@ function handleResult( }; } +function toLookbackWindowsAggregationsQuery(sortedLookbackWindow: LookbackWindow[]) { + return sortedLookbackWindow.reduce>( + (acc, lookbackWindow) => ({ + ...acc, + [lookbackWindow.name]: { + date_range: { + field: '@timestamp', + ranges: [{ from: `now-${lookbackWindow.duration.format()}/m`, to: 'now/m' }], + }, + aggs: { + good: { sum: { field: 'slo.numerator' } }, + total: { sum: { field: 'slo.denominator' } }, + }, + }, + }), + {} + ); +} + +function toLookbackWindowsSlicedAggregationsQuery(slo: SLO, lookbackWindows: LookbackWindow[]) { + return lookbackWindows.reduce>( + (acc, lookbackWindow) => ({ + ...acc, + [lookbackWindow.name]: { + date_range: { + field: '@timestamp', + ranges: [ + { + from: `now-${lookbackWindow.duration.format()}/m`, + to: 'now/m', + }, + ], + }, + aggs: { + slices: { + date_histogram: { + field: '@timestamp', + fixed_interval: toInterval(slo.objective.timeslice_window), + }, + aggs: { + good: { + sum: { + field: 'slo.numerator', + }, + }, + total: { + sum: { + field: 'slo.denominator', + }, + }, + good_slice: { + bucket_script: { + buckets_path: { + good: 'good', + total: 'total', + }, + script: `params.good / params.total >= ${slo.objective.timeslice_target} ? 1 : 0`, + }, + }, + count_slice: { + bucket_script: { + buckets_path: {}, + script: '1', + }, + }, + }, + }, + good: { + sum_bucket: { + buckets_path: 'slices>good_slice.value', + }, + }, + total: { + sum_bucket: { + buckets_path: 'slices>count_slice.value', + }, + }, + }, + }, + }), + {} + ); +} + +function handleWindowedResult( + aggregations: Record | undefined, + lookbackWindows: LookbackWindow[] +): Record { + if (aggregations === undefined) { + throw new InternalQueryError('Invalid aggregation response'); + } + + const indicatorDataPerLookbackWindow: Record = {}; + lookbackWindows.forEach((lookbackWindow) => { + const windowAggBuckets = aggregations[lookbackWindow.name]?.buckets; + if (!Array.isArray(windowAggBuckets) || windowAggBuckets.length === 0) { + throw new InternalQueryError('Invalid aggregation bucket response'); + } + const bucket = windowAggBuckets[0]; + const good = (bucket.good as AggregationsSumAggregate).value; + const total = (bucket.total as AggregationsSumAggregate).value; + if (good === null || total === null) { + throw new InternalQueryError('Invalid aggregation sum bucket response'); + } + + indicatorDataPerLookbackWindow[lookbackWindow.name] = { + good, + total, + date_range: { from: new Date(bucket.from_as_string!), to: new Date(bucket.to_as_string!) }, + }; + }); + + return indicatorDataPerLookbackWindow; +} + function toInterval(duration: Duration | undefined): string { if (duration === undefined) return '1m'; - return `${duration.value}${duration.unit}`; + return duration.format(); } diff --git a/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts b/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts index 69cec2407328f..4a4749c185d27 100644 --- a/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts +++ b/x-pack/plugins/observability/server/services/slo/slo_repository.test.ts @@ -13,11 +13,12 @@ import { } from '@kbn/core/server'; import { savedObjectsClientMock } from '@kbn/core/server/mocks'; -import { SLO, sloSchema, StoredSLO } from '../../types/models'; +import { SLO, StoredSLO } from '../../domain/models'; import { SO_SLO_TYPE } from '../../saved_objects'; import { KibanaSavedObjectsSLORepository } from './slo_repository'; import { createAPMTransactionDurationIndicator, createSLO } from './fixtures/slo'; import { SLONotFound } from '../../errors'; +import { sloSchema } from '../../types/schema'; const SOME_SLO = createSLO({ indicator: createAPMTransactionDurationIndicator() }); diff --git a/x-pack/plugins/observability/server/services/slo/slo_repository.ts b/x-pack/plugins/observability/server/services/slo/slo_repository.ts index 2b4cee6e79a08..12cd3be1c28d1 100644 --- a/x-pack/plugins/observability/server/services/slo/slo_repository.ts +++ b/x-pack/plugins/observability/server/services/slo/slo_repository.ts @@ -12,9 +12,10 @@ import { pipe } from 'fp-ts/lib/pipeable'; import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; -import { StoredSLO, SLO, sloSchema } from '../../types/models'; +import { StoredSLO, SLO } from '../../domain/models'; import { SO_SLO_TYPE } from '../../saved_objects'; import { SLONotFound } from '../../errors'; +import { sloSchema } from '../../types/schema'; export interface Criteria { name?: string; diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_duration.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_duration.ts index 35a9b5088ca70..2725c33af3940 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_duration.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_duration.ts @@ -14,7 +14,7 @@ import { getSLOTransformId, } from '../../../assets/constants'; import { getSLOTransformTemplate } from '../../../assets/transform_templates/slo_transform_template'; -import { SLO, APMTransactionDurationIndicator } from '../../../types/models'; +import { SLO, APMTransactionDurationIndicator } from '../../../domain/models'; import { TransformGenerator } from '.'; const APM_SOURCE_INDEX = 'metrics-apm*'; diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_error_rate.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_error_rate.ts index 0da9f93e8d145..b0418d5f1f9f3 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_error_rate.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/apm_transaction_error_rate.ts @@ -15,7 +15,7 @@ import { SLO_INGEST_PIPELINE_NAME, getSLOTransformId, } from '../../../assets/constants'; -import { APMTransactionErrorRateIndicator, SLO } from '../../../types/models'; +import { APMTransactionErrorRateIndicator, SLO } from '../../../domain/models'; const APM_SOURCE_INDEX = 'metrics-apm*'; const ALLOWED_STATUS_CODES = ['2xx', '3xx', '4xx', '5xx']; diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts index c2228b6a3095c..02809a0d05659 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/kql_custom.ts @@ -17,7 +17,7 @@ import { SLO_INGEST_PIPELINE_NAME, getSLOTransformId, } from '../../../assets/constants'; -import { KQLCustomIndicator, SLO } from '../../../types/models'; +import { KQLCustomIndicator, SLO } from '../../../domain/models'; export class KQLCustomTransformGenerator extends TransformGenerator { public getTransformParams(slo: SLO): TransformPutTransformRequest { diff --git a/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts b/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts index cd0ceaa602c22..69a80fa9a0f4e 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_generators/transform_generator.ts @@ -15,7 +15,7 @@ import { rollingTimeWindowSchema, timeslicesBudgetingMethodSchema, } from '../../../types/schema'; -import { SLO } from '../../../types/models'; +import { SLO } from '../../../domain/models'; export abstract class TransformGenerator { public abstract getTransformParams(slo: SLO): TransformPutTransformRequest; diff --git a/x-pack/plugins/observability/server/services/slo/transform_manager.test.ts b/x-pack/plugins/observability/server/services/slo/transform_manager.test.ts index 696e04f5c13bc..0b97ae3aa6dc3 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_manager.test.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_manager.test.ts @@ -20,7 +20,7 @@ import { ApmTransactionErrorRateTransformGenerator, TransformGenerator, } from './transform_generators'; -import { SLO, IndicatorTypes } from '../../types/models'; +import { SLO, IndicatorTypes } from '../../domain/models'; import { createAPMTransactionDurationIndicator, createAPMTransactionErrorRateIndicator, @@ -41,19 +41,19 @@ describe('TransformManager', () => { it('throws when no generator exists for the slo indicator type', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_duration': new DummyTransformGenerator(), + 'sli.apm.transaction_duration': new DummyTransformGenerator(), }; const service = new DefaultTransformManager(generators, esClientMock, loggerMock); await expect( service.install(createSLO({ indicator: createAPMTransactionErrorRateIndicator() })) - ).rejects.toThrowError('Unsupported SLO type: slo.apm.transaction_error_rate'); + ).rejects.toThrowError('Unsupported SLI type: sli.apm.transaction_error_rate'); }); it('throws when transform generator fails', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_duration': new FailTransformGenerator(), + 'sli.apm.transaction_duration': new FailTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); @@ -68,7 +68,7 @@ describe('TransformManager', () => { it('installs the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -84,7 +84,7 @@ describe('TransformManager', () => { it('starts the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); @@ -98,7 +98,7 @@ describe('TransformManager', () => { it('stops the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); @@ -112,7 +112,7 @@ describe('TransformManager', () => { it('uninstalls the transform', async () => { // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); @@ -127,7 +127,7 @@ describe('TransformManager', () => { ); // @ts-ignore defining only a subset of the possible SLI const generators: Record = { - 'slo.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), + 'sli.apm.transaction_error_rate': new ApmTransactionErrorRateTransformGenerator(), }; const transformManager = new DefaultTransformManager(generators, esClientMock, loggerMock); diff --git a/x-pack/plugins/observability/server/services/slo/transform_manager.ts b/x-pack/plugins/observability/server/services/slo/transform_manager.ts index 66c4f972ad48c..3bd56669046ac 100644 --- a/x-pack/plugins/observability/server/services/slo/transform_manager.ts +++ b/x-pack/plugins/observability/server/services/slo/transform_manager.ts @@ -7,7 +7,7 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; -import { SLO, IndicatorTypes } from '../../types/models'; +import { SLO, IndicatorTypes } from '../../domain/models'; import { retryTransientEsErrors } from '../../utils/retry'; import { TransformGenerator } from './transform_generators'; @@ -31,7 +31,7 @@ export class DefaultTransformManager implements TransformManager { const generator = this.generators[slo.indicator.type]; if (!generator) { this.logger.error(`No transform generator found for ${slo.indicator.type} SLO type`); - throw new Error(`Unsupported SLO type: ${slo.indicator.type}`); + throw new Error(`Unsupported SLI type: ${slo.indicator.type}`); } const transformParams = generator.getTransformParams(slo); @@ -40,7 +40,7 @@ export class DefaultTransformManager implements TransformManager { logger: this.logger, }); } catch (err) { - this.logger.error(`Cannot create transform for ${slo.indicator.type} SLO type: ${err}`); + this.logger.error(`Cannot create transform for ${slo.indicator.type} SLI type: ${err}`); throw err; } diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts index f846a6e17e40e..cd3dbb6352936 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.test.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.test.ts @@ -8,7 +8,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; import { getSLOTransformId } from '../../assets/constants'; -import { SLO } from '../../types/models'; +import { SLO } from '../../domain/models'; import { createAPMTransactionErrorRateIndicator, createSLO } from './fixtures/slo'; import { createSLORepositoryMock, createTransformManagerMock } from './mocks'; import { SLORepository } from './slo_repository'; diff --git a/x-pack/plugins/observability/server/services/slo/update_slo.ts b/x-pack/plugins/observability/server/services/slo/update_slo.ts index 9daf1596e442a..8712119d345de 100644 --- a/x-pack/plugins/observability/server/services/slo/update_slo.ts +++ b/x-pack/plugins/observability/server/services/slo/update_slo.ts @@ -16,7 +16,7 @@ import { } from '../../types/rest_specs'; import { SLORepository } from './slo_repository'; import { TransformManager } from './transform_manager'; -import { SLO } from '../../types/models'; +import { SLO } from '../../domain/models'; import { validateSLO } from '../../domain/services'; export class UpdateSLO { diff --git a/x-pack/plugins/observability/server/types/models/duration.test.ts b/x-pack/plugins/observability/server/types/models/duration.test.ts deleted file mode 100644 index 6f6b2dcb0c2d3..0000000000000 --- a/x-pack/plugins/observability/server/types/models/duration.test.ts +++ /dev/null @@ -1,57 +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 { Duration, DurationUnit } from './duration'; - -describe('Duration', () => { - it('throws when value is negative', () => { - expect(() => new Duration(-1, DurationUnit.d)).toThrow('invalid duration value'); - }); - - it('throws when value is zero', () => { - expect(() => new Duration(0, DurationUnit.d)).toThrow('invalid duration value'); - }); - - it('throws when unit is not valid', () => { - expect(() => new Duration(1, 'z' as DurationUnit)).toThrow('invalid duration unit'); - }); - - describe('format', () => { - it('formats the duration correctly', () => { - expect(new Duration(1, DurationUnit.m).format()).toBe('1m'); - expect(new Duration(1, DurationUnit.h).format()).toBe('1h'); - expect(new Duration(1, DurationUnit.d).format()).toBe('1d'); - expect(new Duration(1, DurationUnit.w).format()).toBe('1w'); - expect(new Duration(1, DurationUnit.M).format()).toBe('1M'); - expect(new Duration(1, DurationUnit.Q).format()).toBe('1Q'); - expect(new Duration(1, DurationUnit.Y).format()).toBe('1Y'); - }); - }); - - describe('isShorterThan', () => { - it('returns true when the current duration is shorter than the other duration', () => { - const short = new Duration(1, DurationUnit.m); - expect(short.isShorterThan(new Duration(1, DurationUnit.h))).toBe(true); - expect(short.isShorterThan(new Duration(1, DurationUnit.d))).toBe(true); - expect(short.isShorterThan(new Duration(1, DurationUnit.w))).toBe(true); - expect(short.isShorterThan(new Duration(1, DurationUnit.M))).toBe(true); - expect(short.isShorterThan(new Duration(1, DurationUnit.Q))).toBe(true); - expect(short.isShorterThan(new Duration(1, DurationUnit.Y))).toBe(true); - }); - - it('returns false when the current duration is longer (or equal) than the other duration', () => { - const long = new Duration(1, DurationUnit.Y); - expect(long.isShorterThan(new Duration(1, DurationUnit.m))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.h))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.d))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.w))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.M))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.Q))).toBe(false); - expect(long.isShorterThan(new Duration(1, DurationUnit.Y))).toBe(false); - }); - }); -}); diff --git a/x-pack/plugins/observability/server/types/models/slo.ts b/x-pack/plugins/observability/server/types/models/slo.ts deleted file mode 100644 index 294e98a2b39a2..0000000000000 --- a/x-pack/plugins/observability/server/types/models/slo.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; -import { - budgetingMethodSchema, - dateType, - indicatorSchema, - objectiveSchema, - timeWindowSchema, -} from '../schema'; - -const sloSchema = t.type({ - id: t.string, - name: t.string, - description: t.string, - indicator: indicatorSchema, - time_window: timeWindowSchema, - budgeting_method: budgetingMethodSchema, - objective: objectiveSchema, - revision: t.number, - created_at: dateType, - updated_at: dateType, -}); - -export { sloSchema }; - -type SLO = t.TypeOf; -type StoredSLO = t.OutputOf; - -export type { SLO, StoredSLO }; diff --git a/x-pack/plugins/observability/server/types/schema/duration.ts b/x-pack/plugins/observability/server/types/schema/duration.ts index c7a3815140a6a..1de7ca4f7ec61 100644 --- a/x-pack/plugins/observability/server/types/schema/duration.ts +++ b/x-pack/plugins/observability/server/types/schema/duration.ts @@ -7,7 +7,7 @@ import { either } from 'fp-ts/lib/Either'; import * as t from 'io-ts'; -import { Duration, DurationUnit } from '../models/duration'; +import { Duration, DurationUnit } from '../../domain/models/duration'; const durationType = new t.Type( 'Duration', diff --git a/x-pack/plugins/observability/server/types/schema/indicators.ts b/x-pack/plugins/observability/server/types/schema/indicators.ts index 46d3e8694e684..feef158c11521 100644 --- a/x-pack/plugins/observability/server/types/schema/indicators.ts +++ b/x-pack/plugins/observability/server/types/schema/indicators.ts @@ -8,7 +8,7 @@ import * as t from 'io-ts'; import { allOrAnyString, dateRangeSchema } from './common'; -const apmTransactionDurationIndicatorTypeSchema = t.literal('slo.apm.transaction_duration'); +const apmTransactionDurationIndicatorTypeSchema = t.literal('sli.apm.transaction_duration'); const apmTransactionDurationIndicatorSchema = t.type({ type: apmTransactionDurationIndicatorTypeSchema, params: t.type({ @@ -20,7 +20,7 @@ const apmTransactionDurationIndicatorSchema = t.type({ }), }); -const apmTransactionErrorRateIndicatorTypeSchema = t.literal('slo.apm.transaction_error_rate'); +const apmTransactionErrorRateIndicatorTypeSchema = t.literal('sli.apm.transaction_error_rate'); const apmTransactionErrorRateIndicatorSchema = t.type({ type: apmTransactionErrorRateIndicatorTypeSchema, params: t.intersection([ @@ -38,7 +38,7 @@ const apmTransactionErrorRateIndicatorSchema = t.type({ ]), }); -const kqlCustomIndicatorTypeSchema = t.literal('slo.kql.custom'); +const kqlCustomIndicatorTypeSchema = t.literal('sli.kql.custom'); const kqlCustomIndicatorSchema = t.type({ type: kqlCustomIndicatorTypeSchema, params: t.type({ diff --git a/x-pack/plugins/observability/server/types/schema/slo.ts b/x-pack/plugins/observability/server/types/schema/slo.ts index e9a3a752c8840..a8c5542f239a2 100644 --- a/x-pack/plugins/observability/server/types/schema/slo.ts +++ b/x-pack/plugins/observability/server/types/schema/slo.ts @@ -6,7 +6,10 @@ */ import * as t from 'io-ts'; +import { dateType } from './common'; import { durationType } from './duration'; +import { indicatorSchema } from './indicators'; +import { timeWindowSchema } from './time_window'; const occurencesBudgetingMethodSchema = t.literal('occurrences'); const timeslicesBudgetingMethodSchema = t.literal('timeslices'); @@ -21,9 +24,23 @@ const objectiveSchema = t.intersection([ t.partial({ timeslice_target: t.number, timeslice_window: durationType }), ]); +const sloSchema = t.type({ + id: t.string, + name: t.string, + description: t.string, + indicator: indicatorSchema, + time_window: timeWindowSchema, + budgeting_method: budgetingMethodSchema, + objective: objectiveSchema, + revision: t.number, + created_at: dateType, + updated_at: dateType, +}); + export { budgetingMethodSchema, + objectiveSchema, occurencesBudgetingMethodSchema, + sloSchema, timeslicesBudgetingMethodSchema, - objectiveSchema, }; diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index 6f2bfb27a1613..13d1fc645be71 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -54,10 +54,11 @@ export const uiSettings: Record = { }), value: false, description: i18n.translate( - 'xpack.observability.enableNewSyntheticsViewExperimentDescription', + 'xpack.observability.enableNewSyntheticsViewExperimentDescriptionBeta', { defaultMessage: - 'Enable new synthetic monitoring application in observability. Refresh the page to apply the setting.', + '{technicalPreviewLabel} Enable new synthetic monitoring application in observability. Refresh the page to apply the setting.', + values: { technicalPreviewLabel: `[${technicalPreviewLabel}]` }, } ), schema: schema.boolean(), diff --git a/x-pack/plugins/profiling/common/run_length_encoding.test.ts b/x-pack/plugins/profiling/common/run_length_encoding.test.ts index 22f3b5141b0a0..4831177075fc2 100644 --- a/x-pack/plugins/profiling/common/run_length_encoding.test.ts +++ b/x-pack/plugins/profiling/common/run_length_encoding.test.ts @@ -113,6 +113,10 @@ describe('Run-length encoding operations', () => { data: 'CQM', expected: [3, 3, 3, 3, 3, 3, 3, 3, 3], }, + { + data: 'AQkBCAEHAQYBBQEEAQMBAgEBAQA', + expected: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], + }, { data: 'EgMHBA', expected: Array(18).fill(3).concat(Array(7).fill(4)), diff --git a/x-pack/plugins/profiling/common/run_length_encoding.ts b/x-pack/plugins/profiling/common/run_length_encoding.ts index 28a34a94acd57..813c46eb09d91 100644 --- a/x-pack/plugins/profiling/common/run_length_encoding.ts +++ b/x-pack/plugins/profiling/common/run_length_encoding.ts @@ -122,7 +122,7 @@ export function runLengthDecodeBase64Url(input: string, size: number, capacity: let i = 0; let j = 0; - for (i = 0; i < multipleOf8; i += 8) { + for (i = 0; i < multipleOf8 * 8; i += 8) { n = (charCodeAt(input, i) << 26) | (charCodeAt(input, i + 1) << 20) | diff --git a/x-pack/plugins/profiling/public/components/functions_view/index.tsx b/x-pack/plugins/profiling/public/components/functions_view/index.tsx index 2c7b25754f3d9..1b7df44e68290 100644 --- a/x-pack/plugins/profiling/public/components/functions_view/index.tsx +++ b/x-pack/plugins/profiling/public/components/functions_view/index.tsx @@ -49,7 +49,7 @@ export function FunctionsView({ children }: { children: React.ReactElement }) { timeFrom: new Date(timeRange.start).getTime() / 1000, timeTo: new Date(timeRange.end).getTime() / 1000, startIndex: 0, - endIndex: 1000, + endIndex: 100000, kuery, }); }, @@ -66,7 +66,7 @@ export function FunctionsView({ children }: { children: React.ReactElement }) { timeFrom: new Date(comparisonTimeRange.start).getTime() / 1000, timeTo: new Date(comparisonTimeRange.end).getTime() / 1000, startIndex: 0, - endIndex: 1000, + endIndex: 100000, kuery: comparisonKuery, }); }, diff --git a/x-pack/plugins/profiling/public/components/topn_functions.tsx b/x-pack/plugins/profiling/public/components/topn_functions.tsx index 30d7ede63140a..851d21c0edf4e 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions.tsx +++ b/x-pack/plugins/profiling/public/components/topn_functions.tsx @@ -212,6 +212,9 @@ export const TopNFunctionsTable = ({ defaultMessage: 'Rank', }), align: 'right', + render: (_, { rank }) => { + return {rank}; + }, }, { field: TopNFunctionSortField.Frame, @@ -322,7 +325,7 @@ export const TopNFunctionsTable = ({ : row[sortField]; }, [sortDirection] - ); + ).slice(0, 100); return ( <> diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts index 6f7dafd3e495f..cf4b012633f96 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts @@ -44,6 +44,7 @@ import { IRuleDataClient } from '../rule_data_client'; import { AlertExecutorOptionsWithExtraServices } from '../types'; import { fetchExistingAlerts } from './fetch_existing_alerts'; import { getCommonAlertFields } from './get_common_alert_fields'; +import { fetchAlertByAlertUUID } from './fetch_alert_by_uuid'; type ImplicitTechnicalFieldName = CommonAlertFieldNameLatest | CommonAlertIdFieldNameLatest; @@ -71,6 +72,7 @@ export interface LifecycleAlertServices< alertWithLifecycle: LifecycleAlertService; getAlertStartedDate: (alertInstanceId: string) => string | null; getAlertUuid: (alertInstanceId: string) => string | null; + getAlertByAlertUuid: (alertUuid: string) => { [x: string]: any } | null; } export type LifecycleRuleExecutor< @@ -182,6 +184,13 @@ export const createLifecycleExecutor = return state.trackedAlerts[alertId].alertUuid; }, + getAlertByAlertUuid: async (alertUuid: string) => { + try { + return await fetchAlertByAlertUUID(ruleDataClient, alertUuid); + } catch (err) { + return null; + } + }, }; const nextWrappedState = await wrappedExecutor({ diff --git a/x-pack/plugins/rule_registry/server/utils/fetch_alert_by_uuid.ts b/x-pack/plugins/rule_registry/server/utils/fetch_alert_by_uuid.ts new file mode 100644 index 0000000000000..e44a462d45438 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/utils/fetch_alert_by_uuid.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PublicContract } from '@kbn/utility-types'; +import { IRuleDataClient } from '../rule_data_client'; +import { ALERT_UUID } from '../../common/technical_rule_data_field_names'; + +type RuleDataClient = PublicContract; + +export const fetchAlertByAlertUUID = async (ruleDataClient: RuleDataClient, alertUuid: string) => { + const request = { + body: { + query: { + bool: { + filter: [ + { + term: { + [ALERT_UUID]: alertUuid, + }, + }, + ], + }, + }, + size: 1, + }, + allow_no_indices: true, + }; + const { hits } = await ruleDataClient.getReader().search(request); + return hits?.hits; +}; diff --git a/x-pack/plugins/rule_registry/server/utils/lifecycle_alert_services.mock.ts b/x-pack/plugins/rule_registry/server/utils/lifecycle_alert_services.mock.ts index a383110394da7..ab0628f738286 100644 --- a/x-pack/plugins/rule_registry/server/utils/lifecycle_alert_services.mock.ts +++ b/x-pack/plugins/rule_registry/server/utils/lifecycle_alert_services.mock.ts @@ -37,4 +37,5 @@ export const createLifecycleAlertServicesMock = < alertWithLifecycle: ({ id }) => alertServices.alertFactory.create(id), getAlertStartedDate: jest.fn((id: string) => null), getAlertUuid: jest.fn((id: string) => null), + getAlertByAlertUuid: jest.fn((id: string) => null), }); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/machine_learning_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/machine_learning_rule.cy.ts index c5352268805ca..e0de4ee956b37 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/machine_learning_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/machine_learning_rule.cy.ts @@ -26,7 +26,7 @@ import { FALSE_POSITIVES_DETAILS, removeExternalLinkText, MACHINE_LEARNING_JOB_ID, - MACHINE_LEARNING_JOB_STATUS, + // MACHINE_LEARNING_JOB_STATUS, MITRE_ATTACK_DETAILS, REFERENCE_URLS_DETAILS, RISK_SCORE_DETAILS, @@ -107,7 +107,11 @@ describe('Detection rules, machine learning', () => { ); getDetails(RULE_TYPE_DETAILS).should('have.text', 'Machine Learning'); getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); - cy.get(MACHINE_LEARNING_JOB_STATUS).should('have.text', 'StoppedStopped'); + // With the #1912 ML rule improvement changes we enable jobs on rule creation. + // Though, in cypress jobs enabling does not work reliably and job can be started or stopped. + // Thus, we disable next check till we fix the issue with enabling jobs in cypress. + // Relevant ticket: https://github.com/elastic/security-team/issues/5389 + // cy.get(MACHINE_LEARNING_JOB_STATUS).should('have.text', 'StoppedStopped'); cy.get(MACHINE_LEARNING_JOB_ID).should( 'have.text', getMachineLearningRule().machineLearningJobs.join('') diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index 59464a3ceda2f..3bfa4123ac591 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -395,8 +395,8 @@ export const getNewTermsRule = (): NewTermsRule => ({ export const getMachineLearningRule = (): MachineLearningRule => ({ machineLearningJobs: [ - 'v3_linux_anomalous_process_all_hosts', 'v3_linux_anomalous_network_activity', + 'v3_linux_anomalous_process_all_hosts', ], anomalyScoreThreshold: 20, name: 'New ML Rule Test', diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.tsx index 6152c13b15d3d..95720eb94f22f 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.tsx @@ -155,7 +155,7 @@ const DraggableOnWrapperComponent: React.FC = ({ openPopover, onFocus, setContainerRef, - showTopN, + isShowingTopN, } = useHoverActions({ dataProvider, hideTopN, @@ -307,7 +307,7 @@ const DraggableOnWrapperComponent: React.FC = ({ return ( = ({ hoverContent, onCloseRequested, setContainerRef, - showTopN, + isShowingTopN, } = useHoverActions({ dataProvider, hideTopN, @@ -372,7 +372,7 @@ const DraggableWrapperComponent: React.FC = ({ if (!isDraggable) { return ( = React.memo( values, }); + const { closeTopN, toggleTopN, isShowingTopN } = useTopNPopOver(setIsPopoverVisible); const { aggregatable, type } = fieldFromBrowserField || { aggregatable: false, type: '' }; - - const [showTopN, setShowTopN] = useState(false); const { timelineId: timelineIdFind } = useContext(TimelineContext); - const [hoverActionsOwnFocus] = useState(false); - const toggleTopN = useCallback(() => { - setShowTopN((prevShowTopN) => { - const newShowTopN = !prevShowTopN; - if (setIsPopoverVisible) setIsPopoverVisible(newShowTopN); - return newShowTopN; - }); - }, [setIsPopoverVisible]); - - const closeTopN = useCallback(() => { - setShowTopN(false); - }, []); return ( = React.memo( hideAddToTimeline={hideAddToTimeline} isObjectArray={data.isObjectArray} onFilterAdded={onFilterAdded} - ownFocus={hoverActionsOwnFocus} - showTopN={showTopN} + ownFocus={false} + showTopN={isShowingTopN} scopeId={scopeId ?? timelineIdFind} toggleColumn={toggleColumn} toggleTopN={toggleTopN} diff --git a/x-pack/plugins/security_solution/public/common/components/hover_actions/index.tsx b/x-pack/plugins/security_solution/public/common/components/hover_actions/index.tsx index 4e31d2b64f837..978ccad664e28 100644 --- a/x-pack/plugins/security_solution/public/common/components/hover_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/hover_actions/index.tsx @@ -16,6 +16,7 @@ import type { ColumnHeaderOptions, DataProvider } from '../../../../common/types import { TimelineId } from '../../../../common/types/timeline'; import { SHOW_TOP_N_KEYBOARD_SHORTCUT } from './keyboard_shortcut_constants'; import { useHoverActionItems } from './use_hover_action_items'; +import { SecurityPageName } from '../../../app/types'; export const YOU_ARE_IN_A_DIALOG_CONTAINING_OPTIONS = (fieldName: string) => i18n.translate( @@ -217,10 +218,12 @@ export const HoverActions: React.FC = React.memo( const isCaseView = scopeId === TimelineId.casePage; const isTimelineView = scopeId === TimelineId.active; const isAlertDetailsView = scopeId === TimelineId.detectionsAlertDetailsPage; + // TODO Provide a list of disabled/enabled actions as props + const isEntityAnalyticsPage = scopeId === SecurityPageName.entityAnalytics; const hideFilters = useMemo( - () => isAlertDetailsView && !isTimelineView, - [isTimelineView, isAlertDetailsView] + () => (isAlertDetailsView || isEntityAnalyticsPage) && !isTimelineView, + [isTimelineView, isAlertDetailsView, isEntityAnalyticsPage] ); const hiddenActionsCount = useMemo(() => { diff --git a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_actions.tsx b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_actions.tsx index 811d698382c69..5848303957027 100644 --- a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_actions.tsx @@ -14,6 +14,7 @@ import { HoverActions } from '.'; import type { DataProvider } from '../../../../common/types'; import { ProviderContentWrapper } from '../drag_and_drop/draggable_wrapper'; import { getDraggableId } from '../drag_and_drop/helpers'; +import { useTopNPopOver } from './utils'; const draggableContainsLinks = (draggableElement: HTMLDivElement | null) => { const links = draggableElement?.querySelectorAll('.euiLink') ?? []; @@ -55,7 +56,6 @@ export const useHoverActions = ({ const containerRef = useRef(null); const keyboardHandlerRef = useRef(null); const [closePopOverTrigger, setClosePopOverTrigger] = useState(false); - const [showTopN, setShowTopN] = useState(false); const [hoverActionsOwnFocus, setHoverActionsOwnFocus] = useState(false); const id = useMemo( () => (!scopeId ? timelineIdFind ?? tableIdFind : scopeId), @@ -78,25 +78,13 @@ export const useHoverActions = ({ }, 0); // invoked on the next tick, because we want to restore focus first }, [keyboardHandlerRef]); - const toggleTopN = useCallback(() => { - setShowTopN((prevShowTopN) => { - const newShowTopN = !prevShowTopN; - if (newShowTopN === false) { - handleClosePopOverTrigger(); - } - return newShowTopN; - }); - }, [handleClosePopOverTrigger]); - - const closeTopN = useCallback(() => { - setShowTopN(false); - }, []); + const { closeTopN, toggleTopN, isShowingTopN } = useTopNPopOver(handleClosePopOverTrigger); const hoverContent = useMemo(() => { // display links as additional content in the hover menu to enable keyboard // navigation of links (when the draggable contains them): const additionalContent = - hoverActionsOwnFocus && !showTopN && draggableContainsLinks(containerRef.current) ? ( + hoverActionsOwnFocus && !isShowingTopN && draggableContainsLinks(containerRef.current) ? ( @@ -119,7 +107,7 @@ export const useHoverActions = ({ onFilterAdded={onFilterAdded} ownFocus={hoverActionsOwnFocus} showOwnFocus={false} - showTopN={showTopN} + showTopN={isShowingTopN} scopeId={id} toggleTopN={toggleTopN} values={ @@ -131,7 +119,7 @@ export const useHoverActions = ({ ); }, [ hoverActionsOwnFocus, - showTopN, + isShowingTopN, dataProvider, render, closeTopN, @@ -156,7 +144,7 @@ export const useHoverActions = ({ }, [hoverActionsOwnFocus, keyboardHandlerRef]); const onCloseRequested = useCallback(() => { - setShowTopN(false); + closeTopN(); if (hoverActionsOwnFocus) { setHoverActionsOwnFocus(false); @@ -165,7 +153,7 @@ export const useHoverActions = ({ onFocus(); // return focus to this draggable on the next tick, because we owned focus }, 0); } - }, [onFocus, hoverActionsOwnFocus]); + }, [onFocus, hoverActionsOwnFocus, closeTopN]); const openPopover = useCallback(() => { setHoverActionsOwnFocus(true); @@ -182,7 +170,7 @@ export const useHoverActions = ({ onFocus, openPopover, setContainerRef, - showTopN, + isShowingTopN, }), [ closePopOverTrigger, @@ -193,7 +181,7 @@ export const useHoverActions = ({ onFocus, openPopover, setContainerRef, - showTopN, + isShowingTopN, ] ); }; diff --git a/x-pack/plugins/security_solution/public/common/components/hover_actions/utils.ts b/x-pack/plugins/security_solution/public/common/components/hover_actions/utils.ts index abac36d5b8a74..b3b8262d9f23a 100644 --- a/x-pack/plugins/security_solution/public/common/components/hover_actions/utils.ts +++ b/x-pack/plugins/security_solution/public/common/components/hover_actions/utils.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { useCallback, useState } from 'react'; + export const getAdditionalScreenReaderOnlyContext = ({ field, value, @@ -18,3 +20,20 @@ export const getAdditionalScreenReaderOnlyContext = ({ return Array.isArray(value) ? `${field} ${value.join(' ')}` : `${field} ${value}`; }; + +export const useTopNPopOver = (setIsPopoverVisible?: (isVisible: boolean) => void) => { + const [isShowingTopN, setShowTopN] = useState(false); + const toggleTopN = useCallback(() => { + setShowTopN((prevShowTopN) => { + const newShowTopN = !prevShowTopN; + if (setIsPopoverVisible) setIsPopoverVisible(newShowTopN); + return newShowTopN; + }); + }, [setIsPopoverVisible]); + + const closeTopN = useCallback(() => { + setShowTopN(false); + }, []); + + return { closeTopN, toggleTopN, isShowingTopN }; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx index a5dbc91d1709b..9b2ebe46ce2d1 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx @@ -18,7 +18,8 @@ import React, { useCallback, useRef, useState, useMemo, useEffect } from 'react' import styled from 'styled-components'; import type { DataViewListItem } from '@kbn/data-views-plugin/common'; -import { isThreatMatchRule } from '../../../../../common/detection_engine/utils'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { isMlRule, isThreatMatchRule } from '../../../../../common/detection_engine/utils'; import { useCreateRule } from '../../../rule_management/logic'; import type { RuleCreateProps } from '../../../../../common/detection_engine/rule_schema'; import { useListsConfig } from '../../../../detections/containers/detection_engine/lists/use_lists_config'; @@ -30,7 +31,6 @@ import { getRulesUrl, } from '../../../../common/components/link_to/redirect_to_detection_engine'; import { SecuritySolutionPageWrapper } from '../../../../common/components/page_wrapper'; -import { displaySuccessToast, useStateToaster } from '../../../../common/components/toasters'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { useUserData } from '../../../../detections/components/user_info'; import { AccordionTitle } from '../../../../detections/components/rules/accordion_title'; @@ -71,6 +71,7 @@ import { import { useKibana, useUiSetting$ } from '../../../../common/lib/kibana'; import { HeaderPage } from '../../../../common/components/header_page'; import { PreviewFlyout } from '../../../../detections/pages/detection_engine/rules/preview'; +import { useStartMlJobs } from '../../../rule_management/logic/use_start_ml_jobs'; const formHookNoop = async (): Promise => undefined; @@ -114,10 +115,10 @@ const CreateRulePageComponent: React.FC = () => { ] = useUserData(); const { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration } = useListsConfig(); + const { addSuccess } = useAppToasts(); const { navigateToApp } = useKibana().services.application; const { data: dataServices } = useKibana().services; const loading = userInfoLoading || listsConfigLoading; - const [, dispatchToaster] = useStateToaster(); const [activeStep, setActiveStep] = useState(RuleStep.defineRule); const getNextStep = (step: RuleStep): RuleStep | undefined => ruleStepsOrder[ruleStepsOrder.indexOf(step) + 1]; @@ -206,6 +207,8 @@ const CreateRulePageComponent: React.FC = () => { [activeStep] ); + const { starting: isStartingJobs, startMlJobs } = useStartMlJobs(); + useEffect(() => { const fetchDataViews = async () => { const dataViewsRefs = await dataServices.dataViews.getIdsWithTitle(); @@ -285,16 +288,26 @@ const CreateRulePageComponent: React.FC = () => { stepIsValid(scheduleStep) && stepIsValid(actionsStep) ) { - const createdRule = await createRule( - formatRule( - defineStep.data, - aboutStep.data, - scheduleStep.data, - actionsStep.data - ) - ); - - displaySuccessToast(i18n.SUCCESSFULLY_CREATED_RULES(createdRule.name), dispatchToaster); + const startMlJobsIfNeeded = async () => { + if (!isMlRule(defineStep.data.ruleType) || !actionsStep.data.enabled) { + return; + } + await startMlJobs(defineStep.data.machineLearningJobId); + }; + const [, createdRule] = await Promise.all([ + startMlJobsIfNeeded(), + createRule( + formatRule( + defineStep.data, + aboutStep.data, + scheduleStep.data, + actionsStep.data + ) + ), + ]); + + addSuccess(i18n.SUCCESSFULLY_CREATED_RULES(createdRule.name)); + navigateToApp(APP_UI_ID, { deepLinkId: SecurityPageName.rules, path: getRuleDetailsUrl(createdRule.id), @@ -303,7 +316,7 @@ const CreateRulePageComponent: React.FC = () => { } } }, - [updateCurrentDataState, goToStep, createRule, dispatchToaster, navigateToApp] + [updateCurrentDataState, goToStep, createRule, navigateToApp, startMlJobs, addSuccess] ); const getAccordionType = useCallback( @@ -533,7 +546,7 @@ const CreateRulePageComponent: React.FC = () => { addPadding={true} defaultValues={stepsData.current[RuleStep.ruleActions].data} isReadOnlyView={activeStep !== RuleStep.ruleActions} - isLoading={isLoading || loading} + isLoading={isLoading || loading || isStartingJobs} setForm={setFormHook} onSubmit={() => submitStep(RuleStep.ruleActions)} actionMessageParams={actionMessageParams} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx index 5e7bf4a7019a7..0aa6fa9c20875 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx @@ -132,6 +132,7 @@ import { HeaderPage } from '../../../../common/components/header_page'; import { ExceptionsViewer } from '../../../rule_exceptions/components/all_exception_items_table'; import type { NavTab } from '../../../../common/components/navigation/types'; import { EditRuleSettingButtonLink } from '../../../../detections/pages/detection_engine/rules/details/components/edit_rule_settings_button_link'; +import { useStartMlJobs } from '../../../rule_management/logic/use_start_ml_jobs'; /** * Need a 100% height here to account for the graph/analyze tool, which sets no explicit height parameters, but fills the available space. @@ -239,6 +240,11 @@ const RuleDetailsPageComponent: React.FC = ({ const [rule, setRule] = useState(null); const isLoading = ruleLoading && rule == null; + const { starting: isStartingJobs, startMlJobs } = useStartMlJobs(); + const startMlJobsIfNeeded = useCallback(async () => { + await startMlJobs(rule?.machine_learning_job_id); + }, [rule, startMlJobs]); + const ruleDetailTabs = useMemo( (): Record => ({ [RuleDetailTabs.alerts]: { @@ -696,6 +702,7 @@ const RuleDetailsPageComponent: React.FC = ({ (isMlRule(rule?.type) && !hasMlPermissions) } enabled={isExistingRule && (rule?.enabled ?? false)} + startMlJobsIfNeeded={startMlJobsIfNeeded} onChange={handleOnChangeEnabledRule} /> {i18n.ENABLE_RULE} @@ -754,7 +761,7 @@ const RuleDetailsPageComponent: React.FC = ({ loading={isLoading || isSavedQueryLoading} title={ruleI18n.DEFINITION} > - {defineRuleData != null && !isSavedQueryLoading && ( + {defineRuleData != null && !isSavedQueryLoading && !isStartingJobs && ( Promise; +} + +export const useStartMlJobs = (): ReturnUseStartMlJobs => { + const { enableDatafeed, isLoading: isLoadingEnableDataFeed } = useEnableDataFeed(); + const { loading: isLoadingJobs, jobs: mlJobs, refetch: refetchJobs } = useSecurityJobs(); + const [isStartingJobs, setIsStartingJobs] = useState(false); + const startMlJobs = useCallback( + async (jobIds: string[] | undefined) => { + if (isLoadingJobs || isLoadingEnableDataFeed) { + return; + } + + if (!jobIds || !jobIds.length) { + return; + } + + // The error handling happens inside `enableDatafeed`, so no need to do try/catch here + setIsStartingJobs(true); + const ruleJobs = mlJobs.filter((job) => jobIds.includes(job.id)); + await Promise.all( + ruleJobs.map(async (job) => { + if (isJobStarted(job.jobState, job.datafeedState)) { + return true; + } + + const latestTimestampMs = job.latestTimestampMs ?? 0; + await enableDatafeed(job, latestTimestampMs, true); + }) + ); + refetchJobs(); + setIsStartingJobs(false); + }, + [enableDatafeed, isLoadingEnableDataFeed, isLoadingJobs, mlJobs, refetchJobs] + ); + + return { loading: isLoadingJobs, jobs: mlJobs, starting: isStartingJobs, startMlJobs }; +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/ml_rule_warning_popover.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/ml_rule_warning_popover.tsx new file mode 100644 index 0000000000000..85768f2bbc5ed --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/ml_rule_warning_popover.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + EuiPopover, + EuiText, + EuiPopoverTitle, + EuiSpacer, + EuiPopoverFooter, + EuiButtonIcon, +} from '@elastic/eui'; + +import { RuleExecutionStatus } from '../../../../../common/detection_engine/rule_monitoring'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +import * as i18n from './translations'; + +import { useBoolState } from '../../../../common/hooks/use_bool_state'; +import { getRuleDetailsTabUrl } from '../../../../common/components/link_to/redirect_to_detection_engine'; +import { SecurityPageName } from '../../../../../common/constants'; +import { SecuritySolutionLinkButton } from '../../../../common/components/links'; +import { isMlRule } from '../../../../../common/detection_engine/utils'; +import { getCapitalizedStatusText } from '../../../../detections/components/rules/rule_execution_status/utils'; +import type { Rule } from '../../../rule_management/logic'; +import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import { RuleDetailTabs } from '../../../rule_details_ui/pages/rule_details'; + +const POPOVER_WIDTH = '340px'; + +interface MlRuleWarningPopoverComponentProps { + rule: Rule; + loadingJobs: boolean; + jobs: SecurityJob[]; +} + +const MlRuleWarningPopoverComponent: React.FC = ({ + rule, + loadingJobs, + jobs, +}) => { + const [isPopoverOpen, , closePopover, togglePopover] = useBoolState(); + + if (!isMlRule(rule.type) || loadingJobs || !rule.machine_learning_job_id) { + return null; + } + + const jobIds = rule.machine_learning_job_id; + const notRunningJobs = jobs.filter( + (job) => jobIds.includes(job.id) && !isJobStarted(job.jobState, job.datafeedState) + ); + if (!notRunningJobs.length) { + return null; + } + + const button = ( + + ); + const popoverTitle = getCapitalizedStatusText(RuleExecutionStatus['partial failure']); + + return ( + + {popoverTitle} +
    + +

    {i18n.ML_RULE_JOBS_WARNING_DESCRIPTION}

    +
    +
    + + {notRunningJobs.map((job) => ( + {job.id} + ))} + + + {i18n.ML_RULE_JOBS_WARNING_BUTTON_LABEL} + + +
    + ); +}; + +export const MlRuleWarningPopover = React.memo(MlRuleWarningPopoverComponent); + +MlRuleWarningPopover.displayName = 'MlRuleWarningPopover'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx index 4379674c9738f..163402ac7bfd7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_tables.tsx @@ -36,6 +36,7 @@ import { RulesTableUtilityBar } from './rules_table_utility_bar'; import { useMonitoringColumns, useRulesColumns } from './use_columns'; import { useUserData } from '../../../../detections/components/user_info'; import { hasUserCRUDPermission } from '../../../../common/utils/privileges'; +import { useStartMlJobs } from '../../../rule_management/logic/use_start_ml_jobs'; const INITIAL_SORT_FIELD = 'enabled'; @@ -140,8 +141,19 @@ export const RulesTables = React.memo(({ selectedTab }) => { [setPage, setPerPage, setSortingOptions] ); - const rulesColumns = useRulesColumns({ hasCRUDPermissions: hasPermissions }); - const monitoringColumns = useMonitoringColumns({ hasCRUDPermissions: hasPermissions }); + const { loading: isLoadingJobs, jobs: mlJobs, startMlJobs } = useStartMlJobs(); + const rulesColumns = useRulesColumns({ + hasCRUDPermissions: hasPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, + }); + const monitoringColumns = useMonitoringColumns({ + hasCRUDPermissions: hasPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, + }); const isSelectAllCalled = useRef(false); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/translations.ts new file mode 100644 index 0000000000000..52b4a5d4ba622 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/translations.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const ML_RULE_JOBS_WARNING_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleManagementUi.rulesTable.mlJobsWarning.popover.description', + { + defaultMessage: + 'The following jobs are not running and might cause the rule to generate wrong results:', + } +); + +export const ML_RULE_JOBS_WARNING_BUTTON_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleManagementUi.rulesTable.mlJobsWarning.popover.buttonLabel', + { + defaultMessage: 'Visit rule details page to investigate', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx index d0e6c0198ad70..4c59c4133f704 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/use_columns.tsx @@ -6,10 +6,11 @@ */ import type { EuiBasicTableColumn, EuiTableActionsColumnType } from '@elastic/eui'; -import { EuiBadge, EuiLink, EuiText, EuiToolTip } from '@elastic/eui'; +import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiLink, EuiText, EuiToolTip } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import moment from 'moment'; import React, { useMemo } from 'react'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; import { DEFAULT_RELATIVE_DATE_THRESHOLD, SecurityPageName, @@ -43,14 +44,18 @@ import { TableHeaderTooltipCell } from './table_header_tooltip_cell'; import { useHasActionsPrivileges } from './use_has_actions_privileges'; import { useHasMlPermissions } from './use_has_ml_permissions'; import { useRulesTableActions } from './use_rules_table_actions'; +import { MlRuleWarningPopover } from './ml_rule_warning_popover'; export type TableColumn = EuiBasicTableColumn | EuiTableActionsColumnType; interface ColumnsProps { hasCRUDPermissions: boolean; + isLoadingJobs: boolean; + mlJobs: SecurityJob[]; + startMlJobs: (jobIds: string[] | undefined) => Promise; } -const useEnabledColumn = ({ hasCRUDPermissions }: ColumnsProps): TableColumn => { +const useEnabledColumn = ({ hasCRUDPermissions, startMlJobs }: ColumnsProps): TableColumn => { const hasMlPermissions = useHasMlPermissions(); const hasActionsPrivileges = useHasActionsPrivileges(); const { loadingRulesAction, loadingRuleIds } = useRulesTableContext().state; @@ -77,6 +82,7 @@ const useEnabledColumn = ({ hasCRUDPermissions }: ColumnsProps): TableColumn => startMlJobs(rule.machine_learning_job_id)} isDisabled={ !canEditRuleWithActions(rule, hasActionsPrivileges) || !hasCRUDPermissions || @@ -89,7 +95,7 @@ const useEnabledColumn = ({ hasCRUDPermissions }: ColumnsProps): TableColumn => width: '95px', sortable: true, }), - [hasActionsPrivileges, hasMlPermissions, hasCRUDPermissions, loadingIds] + [hasMlPermissions, hasActionsPrivileges, hasCRUDPermissions, loadingIds, startMlJobs] ); }; @@ -121,6 +127,44 @@ const useRuleNameColumn = (): TableColumn => { ); }; +const useRuleExecutionStatusColumn = ({ + sortable, + width, + isLoadingJobs, + mlJobs, +}: { + sortable: boolean; + width: string; + isLoadingJobs: boolean; + mlJobs: SecurityJob[]; +}): TableColumn => { + return useMemo( + () => ({ + field: 'execution_summary.last_execution.status', + name: i18n.COLUMN_LAST_RESPONSE, + render: (value: RuleExecutionSummary['last_execution']['status'] | undefined, item: Rule) => { + return ( + + + + + + + + + ); + }, + sortable, + truncateText: true, + width, + }), + [isLoadingJobs, mlJobs, sortable, width] + ); +}; + const TAGS_COLUMN: TableColumn = { field: 'tags', name: null, @@ -171,12 +215,28 @@ const useActionsColumn = (): EuiTableActionsColumnType => { return useMemo(() => ({ actions, width: '40px' }), [actions]); }; -export const useRulesColumns = ({ hasCRUDPermissions }: ColumnsProps): TableColumn[] => { +export const useRulesColumns = ({ + hasCRUDPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, +}: ColumnsProps): TableColumn[] => { const actionsColumn = useActionsColumn(); - const enabledColumn = useEnabledColumn({ hasCRUDPermissions }); const ruleNameColumn = useRuleNameColumn(); const { isInMemorySorting } = useRulesTableContext().state; const [showRelatedIntegrations] = useUiSetting$(SHOW_RELATED_INTEGRATIONS_SETTING); + const enabledColumn = useEnabledColumn({ + hasCRUDPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, + }); + const executionStatusColumn = useRuleExecutionStatusColumn({ + sortable: !!isInMemorySorting, + width: '16%', + isLoadingJobs, + mlJobs, + }); return useMemo( () => [ @@ -222,16 +282,7 @@ export const useRulesColumns = ({ hasCRUDPermissions }: ColumnsProps): TableColu truncateText: true, width: '16%', }, - { - field: 'execution_summary.last_execution.status', - name: i18n.COLUMN_LAST_RESPONSE, - render: (value: RuleExecutionSummary['last_execution']['status'] | undefined) => ( - - ), - sortable: !!isInMemorySorting, - truncateText: true, - width: '16%', - }, + executionStatusColumn, { field: 'updated_at', name: i18n.COLUMN_LAST_UPDATE, @@ -273,6 +324,7 @@ export const useRulesColumns = ({ hasCRUDPermissions }: ColumnsProps): TableColu [ actionsColumn, enabledColumn, + executionStatusColumn, hasCRUDPermissions, isInMemorySorting, ruleNameColumn, @@ -281,13 +333,29 @@ export const useRulesColumns = ({ hasCRUDPermissions }: ColumnsProps): TableColu ); }; -export const useMonitoringColumns = ({ hasCRUDPermissions }: ColumnsProps): TableColumn[] => { +export const useMonitoringColumns = ({ + hasCRUDPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, +}: ColumnsProps): TableColumn[] => { const docLinks = useKibana().services.docLinks; const actionsColumn = useActionsColumn(); - const enabledColumn = useEnabledColumn({ hasCRUDPermissions }); const ruleNameColumn = useRuleNameColumn(); const { isInMemorySorting } = useRulesTableContext().state; const [showRelatedIntegrations] = useUiSetting$(SHOW_RELATED_INTEGRATIONS_SETTING); + const enabledColumn = useEnabledColumn({ + hasCRUDPermissions, + isLoadingJobs, + mlJobs, + startMlJobs, + }); + const executionStatusColumn = useRuleExecutionStatusColumn({ + sortable: !!isInMemorySorting, + width: '12%', + isLoadingJobs, + mlJobs, + }); return useMemo( () => [ @@ -371,16 +439,7 @@ export const useMonitoringColumns = ({ hasCRUDPermissions }: ColumnsProps): Tabl truncateText: true, width: '14%', }, - { - field: 'execution_summary.last_execution.status', - name: i18n.COLUMN_LAST_RESPONSE, - render: (value: RuleExecutionSummary['last_execution']['status'] | undefined) => ( - - ), - sortable: !!isInMemorySorting, - truncateText: true, - width: '12%', - }, + executionStatusColumn, { field: 'execution_summary.last_execution.date', name: i18n.COLUMN_LAST_COMPLETE_RUN, @@ -407,6 +466,7 @@ export const useMonitoringColumns = ({ hasCRUDPermissions }: ColumnsProps): Tabl actionsColumn, docLinks.links.siem.troubleshootGaps, enabledColumn, + executionStatusColumn, hasCRUDPermissions, isInMemorySorting, ruleNameColumn, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx index d29bdc13498a3..0dc7b14ea8e1e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.test.tsx @@ -8,14 +8,16 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { mockOpenedJob } from '../../../../common/components/ml_popover/api.mock'; +import { mockOpenedJob, mockSecurityJobs } from '../../../../common/components/ml_popover/api.mock'; import { MlJobDescription, AuditIcon, JobStatusBadge } from './ml_job_description'; jest.mock('../../../../common/lib/kibana'); describe('MlJobDescription', () => { it('renders correctly', () => { - const wrapper = shallow(); + const wrapper = shallow( + {}} /> + ); expect(wrapper.find('[data-test-subj="machineLearningJobId"]')).toHaveLength(1); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx index b5342934302b3..780998d904c8f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/ml_job_description.tsx @@ -5,17 +5,20 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import styled from 'styled-components'; -import { EuiBadge, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui'; +import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui'; import type { MlSummaryJob } from '@kbn/ml-plugin/public'; import { ML_PAGES, useMlHref } from '@kbn/ml-plugin/public'; import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import { useEnableDataFeed } from '../../../../common/components/ml_popover/hooks/use_enable_data_feed'; +import type { SecurityJob } from '../../../../common/components/ml_popover/types'; +import { JobSwitch } from '../../../../common/components/ml_popover/jobs_table/job_switch'; import { useSecurityJobs } from '../../../../common/components/ml_popover/hooks/use_security_jobs'; import { useKibana } from '../../../../common/lib/kibana'; import type { ListItems } from './types'; -import { ML_JOB_STARTED, ML_JOB_STOPPED } from './translations'; +import * as i18n from './translations'; enum MessageLevels { info = 'info', @@ -53,7 +56,7 @@ export const AuditIcon = React.memo(AuditIconComponent); const JobStatusBadgeComponent: React.FC<{ job: MlSummaryJob }> = ({ job }) => { const isStarted = isJobStarted(job.jobState, job.datafeedState); const color = isStarted ? 'success' : 'danger'; - const text = isStarted ? ML_JOB_STARTED : ML_JOB_STOPPED; + const text = isStarted ? i18n.ML_JOB_STARTED : i18n.ML_JOB_STOPPED; return ( @@ -72,11 +75,16 @@ const Wrapper = styled.div` overflow: hidden; `; -const MlJobDescriptionComponent: React.FC<{ jobId: string }> = ({ jobId }) => { - const { jobs } = useSecurityJobs(); +const MlJobDescriptionComponent: React.FC<{ + job: SecurityJob; + loading: boolean; + refreshJob: (job: SecurityJob) => void; +}> = ({ job, loading, refreshJob }) => { const { services: { http, ml }, } = useKibana(); + const { enableDatafeed, isLoading: isLoadingEnableDataFeed } = useEnableDataFeed(); + const jobId = job.id; const jobUrl = useMlHref(ml, http.basePath.get(), { page: ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE, pageState: { @@ -84,10 +92,16 @@ const MlJobDescriptionComponent: React.FC<{ jobId: string }> = ({ jobId }) => { }, }); - const job = jobs.find(({ id }) => id === jobId); - const jobIdSpan = {jobId}; + const handleJobStateChange = useCallback( + async (_, latestTimestampMs: number, enable: boolean) => { + await enableDatafeed(job, latestTimestampMs, enable); + refreshJob(job); + }, + [enableDatafeed, job, refreshJob] + ); + return job != null ? (
    @@ -96,7 +110,21 @@ const MlJobDescriptionComponent: React.FC<{ jobId: string }> = ({ jobId }) => {
    - + + + + + + + + + {i18n.ML_RUN_JOB_LABEL} + +
    ) : ( jobIdSpan @@ -105,13 +133,17 @@ const MlJobDescriptionComponent: React.FC<{ jobId: string }> = ({ jobId }) => { export const MlJobDescription = React.memo(MlJobDescriptionComponent); -const MlJobsDescription: React.FC<{ jobIds: string[] }> = ({ jobIds }) => ( - <> - {jobIds.map((jobId) => ( - - ))} - -); +const MlJobsDescription: React.FC<{ jobIds: string[] }> = ({ jobIds }) => { + const { loading, jobs, refetch: refreshJobs } = useSecurityJobs(); + const relevantJobs = jobs.filter((job) => jobIds.includes(job.id)); + return ( + <> + {relevantJobs.map((job) => ( + + ))} + + ); +}; export const buildMlJobsDescription = (jobIds: string[], label: string): ListItems => ({ title: label, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx index 9917f34ac9bf8..acd2040ad3e27 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx @@ -91,6 +91,13 @@ export const NEW_TERMS_TYPE_DESCRIPTION = i18n.translate( } ); +export const ML_RUN_JOB_LABEL = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDescription.mlRunJobLabel', + { + defaultMessage: 'Run job', + } +); + export const ML_JOB_STARTED = i18n.translate( 'xpack.securitySolution.detectionEngine.ruleDescription.mlJobStartedDescription', { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx index a067930ca78ed..5bce4dae67903 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useMemo } from 'react'; import type { EuiComboBoxOptionOption } from '@elastic/eui'; import { + EuiButton, EuiComboBox, EuiFlexGroup, EuiFlexItem, @@ -25,6 +26,8 @@ import { useKibana } from '../../../../common/lib/kibana'; import { ML_JOB_SELECT_PLACEHOLDER_TEXT } from '../step_define_rule/translations'; import { HelpText } from './help_text'; +import * as i18n from './translations'; + interface MlJobValue { id: string; description: string; @@ -43,6 +46,10 @@ const MlJobSelectEuiFlexGroup = styled(EuiFlexGroup)` margin-bottom: 5px; `; +const MlJobEuiButton = styled(EuiButton)` + margin-top: 20px; +`; + const JobDisplay: React.FC = ({ id, description }) => ( {id} @@ -68,7 +75,8 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f const jobIds = field.value as string[]; const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); const { loading, jobs } = useSecurityJobs(); - const mlUrl = useKibana().services.application.getUrlForApp('ml'); + const { getUrlForApp, navigateToApp } = useKibana().services.application; + const mlUrl = getUrlForApp('ml'); const handleJobSelect = useCallback( (selectedJobOptions: MlJobOption[]): void => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -99,8 +107,8 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f }, [jobs, jobIds]); return ( - - + + } @@ -124,6 +132,15 @@ export const MlJobSelect: React.FC = ({ describedByIds = [], f
    + + navigateToApp('ml', { openInNewTab: true })} + > + {i18n.CREATE_CUSTOM_JOB_BUTTON_TITLE} + + ); }; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/translations.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/translations.tsx new file mode 100644 index 0000000000000..470f0a9b66394 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/translations.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const CREATE_CUSTOM_JOB_BUTTON_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.mlSelectJob.createCustomJobButtonTitle', + { + defaultMessage: 'Create custom job', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_badge.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_badge.tsx index bb3f7360892e6..b80445403959f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_badge.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_badge.tsx @@ -11,22 +11,26 @@ import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { HealthTruncateText } from '../../../../common/components/health_truncate_text'; import { getCapitalizedStatusText, getStatusColor } from './utils'; -import type { RuleExecutionStatus } from '../../../../../common/detection_engine/rule_monitoring'; +import { RuleExecutionStatus } from '../../../../../common/detection_engine/rule_monitoring'; interface RuleStatusBadgeProps { status: RuleExecutionStatus | null | undefined; + message?: string; } /** * Shows rule execution status * @param status - rule execution status */ -const RuleStatusBadgeComponent = ({ status }: RuleStatusBadgeProps) => { +const RuleStatusBadgeComponent = ({ status, message }: RuleStatusBadgeProps) => { + const isFailedStatus = + status === RuleExecutionStatus.failed || status === RuleExecutionStatus['partial failure']; const statusText = getCapitalizedStatusText(status); + const statusTooltip = isFailedStatus && message ? message : statusText; const statusColor = getStatusColor(status); return ( diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_switch/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_switch/index.tsx index 32db7db2d5093..fbeee877775b2 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_switch/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_switch/index.tsx @@ -29,6 +29,7 @@ export interface RuleSwitchProps { enabled: boolean; isDisabled?: boolean; isLoading?: boolean; + startMlJobsIfNeeded?: () => Promise; onChange?: (enabled: boolean) => void; } @@ -40,6 +41,7 @@ export const RuleSwitchComponent = ({ isDisabled, isLoading, enabled, + startMlJobsIfNeeded, onChange, }: RuleSwitchProps) => { const [myIsLoading, setMyIsLoading] = useState(false); @@ -53,8 +55,12 @@ export const RuleSwitchComponent = ({ startTransaction({ name: enabled ? SINGLE_RULE_ACTIONS.DISABLE : SINGLE_RULE_ACTIONS.ENABLE, }); + const enableRule = event.target.checked; + if (enableRule) { + await startMlJobsIfNeeded?.(); + } const bulkActionResponse = await executeBulkAction({ - type: event.target.checked ? BulkActionType.enable : BulkActionType.disable, + type: enableRule ? BulkActionType.enable : BulkActionType.disable, ids: [id], }); if (bulkActionResponse?.attributes.results.updated.length) { @@ -63,7 +69,7 @@ export const RuleSwitchComponent = ({ } setMyIsLoading(false); }, - [enabled, executeBulkAction, id, onChange, startTransaction] + [enabled, executeBulkAction, id, onChange, startMlJobsIfNeeded, startTransaction] ); const showLoader = useMemo((): boolean => { diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/integration_tests/get_file_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/integration_tests/get_file_action.test.tsx index d6cb46de63698..d62738896b3c2 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/integration_tests/get_file_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/command_render_components/integration_tests/get_file_action.test.tsx @@ -156,7 +156,7 @@ describe('When using get-file action from response actions console', () => { await waitFor(() => { expect(renderResult.getByTestId('getFileSuccess').textContent).toEqual( - 'File retrieved from the host.Click here to download(ZIP file passcode: elastic)' + 'File retrieved from the host.Click here to download(ZIP file passcode: elastic).Files are periodically deleted to clear storage space. Download and save file locally if needed.' ); }); }); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx index 8d9c2ae8ec60c..a5d05026d30d0 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx @@ -464,7 +464,7 @@ describe('Response actions history', () => { const downloadLink = getByTestId(`${testPrefix}-getFileDownloadLink`); expect(downloadLink).toBeTruthy(); expect(downloadLink.textContent).toEqual( - 'Click here to download(ZIP file passcode: elastic)' + 'Click here to download(ZIP file passcode: elastic).Files are periodically deleted to clear storage space. Download and save file locally if needed.' ); }); diff --git a/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.test.tsx b/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.test.tsx index 83f314c0d9857..cceb17148f868 100644 --- a/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.test.tsx @@ -66,6 +66,9 @@ describe('When using the `ResponseActionFileDownloadLink` component', () => { expect(renderResult.getByTestId('test-passcodeMessage')).toHaveTextContent( '(ZIP file passcode: elastic)' ); + expect(renderResult.getByTestId('test-fileDeleteMessage')).toHaveTextContent( + 'Files are periodically deleted to clear storage space. Download and save file locally if needed.' + ); }); it('should display custom button label', async () => { diff --git a/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.tsx b/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.tsx index 66b12604a160d..8ad0a968188a2 100644 --- a/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.tsx +++ b/x-pack/plugins/security_solution/public/management/components/response_action_file_download_link/response_action_file_download_link.tsx @@ -6,15 +6,10 @@ */ import React, { memo, useMemo, type CSSProperties } from 'react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiButtonEmpty, - EuiLoadingContent, - EuiText, -} from '@elastic/eui'; +import { EuiButtonEmpty, EuiLoadingContent, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; +import styled from 'styled-components'; import { resolvePathVariables } from '../../../common/utils/resolve_path_variables'; import { FormattedError } from '../formatted_error'; import { useGetFileInfo } from '../../hooks/response_actions/use_get_file_info'; @@ -38,6 +33,12 @@ export const FILE_NO_LONGER_AVAILABLE_MESSAGE = i18n.translate( { defaultMessage: 'File has expired and is no longer available for download.' } ); +const FileDownloadLinkContainer = styled.div` + & > * { + vertical-align: middle; + } +`; + export interface ResponseActionFileDownloadLinkProps { action: MaybeImmutable; /** If left undefined, the first agent that the action was sent to will be used */ @@ -103,32 +104,38 @@ export const ResponseActionFileDownloadLink = memo - - - {buttonTitle} - - - - - - - - + + + {buttonTitle} + + + + + + + + ); } ); diff --git a/x-pack/plugins/security_solution/public/management/links.test.ts b/x-pack/plugins/security_solution/public/management/links.test.ts index 8ac24fe4ed098..4992b32cef81b 100644 --- a/x-pack/plugins/security_solution/public/management/links.test.ts +++ b/x-pack/plugins/security_solution/public/management/links.test.ts @@ -60,6 +60,7 @@ describe('links', () => { (calculateEndpointAuthz as jest.Mock).mockReturnValue({ canIsolateHost: true, canUnIsolateHost: true, + canAccessEndpointManagement: true, canReadActionsLogManagement: true, }); @@ -75,6 +76,7 @@ describe('links', () => { (calculateEndpointAuthz as jest.Mock).mockReturnValue({ canIsolateHost: true, canUnIsolateHost: true, + canAccessEndpointManagement: true, canReadActionsLogManagement: false, }); fakeHttpServices.get.mockResolvedValue({ total: 0 }); @@ -95,6 +97,7 @@ describe('links', () => { (calculateEndpointAuthz as jest.Mock).mockReturnValue({ canIsolateHost: false, canUnIsolateHost: false, + canAccessEndpointManagement: true, canReadActionsLogManagement: true, }); @@ -112,6 +115,7 @@ describe('links', () => { (calculateEndpointAuthz as jest.Mock).mockReturnValue({ canIsolateHost: false, canUnIsolateHost: true, + canAccessEndpointManagement: true, canReadActionsLogManagement: true, }); fakeHttpServices.get.mockResolvedValue({ total: 0 }); @@ -126,10 +130,30 @@ describe('links', () => { }); }); + it('should return all but HIE when HAS isolation permission AND has HIE entry but not superuser', async () => { + (calculateEndpointAuthz as jest.Mock).mockReturnValue({ + canIsolateHost: false, + canUnIsolateHost: true, + canAccessEndpointManagement: false, + canReadActionsLogManagement: true, + }); + fakeHttpServices.get.mockResolvedValue({ total: 1 }); + + const filteredLinks = await getManagementFilteredLinks( + coreMockStarted, + getPlugins(['superuser']) + ); + expect(filteredLinks).toEqual({ + ...links, + links: links.links?.filter((link) => link.id !== SecurityPageName.hostIsolationExceptions), + }); + }); + it('should return all when NO isolation permission due to license but HAS at least one host isolation exceptions entry', async () => { (calculateEndpointAuthz as jest.Mock).mockReturnValue({ canIsolateHost: false, canUnIsolateHost: true, + canAccessEndpointManagement: true, canReadActionsLogManagement: true, }); fakeHttpServices.get.mockResolvedValue({ total: 1 }); diff --git a/x-pack/plugins/security_solution/public/management/links.ts b/x-pack/plugins/security_solution/public/management/links.ts index 22ad1a374a11b..d2e8b6b708948 100644 --- a/x-pack/plugins/security_solution/public/management/links.ts +++ b/x-pack/plugins/security_solution/public/management/links.ts @@ -244,19 +244,26 @@ export const getManagementFilteredLinks = async ( plugins: StartPlugins ): Promise => { const fleetAuthz = plugins.fleet?.authz; - const { endpointRbacEnabled, endpointRbacV1Enabled } = ExperimentalFeaturesService.get(); - const endpointPermissions = calculatePermissionsFromCapabilities(core.application.capabilities); + const { endpointRbacV1Enabled } = ExperimentalFeaturesService.get(); + const hasPermissionsForSecuritySolution = calculatePermissionsFromCapabilities( + core.application.capabilities + ); const linksToExclude: SecurityPageName[] = []; try { const currentUserResponse = await plugins.security.authc.getCurrentUser(); - const { canReadActionsLogManagement, canIsolateHost, canUnIsolateHost } = fleetAuthz + const { + canReadActionsLogManagement, + canUnIsolateHost, + canIsolateHost, + canAccessEndpointManagement, + } = fleetAuthz ? calculateEndpointAuthz( licenseService, fleetAuthz, currentUserResponse.roles, - endpointRbacEnabled || endpointRbacV1Enabled, - endpointPermissions + endpointRbacV1Enabled, + hasPermissionsForSecuritySolution ) : getEndpointAuthzInitialState(); @@ -265,18 +272,19 @@ export const getManagementFilteredLinks = async ( } if (!canIsolateHost && canUnIsolateHost) { - let shouldSeeHIEToBeAbleToDeleteEntries: boolean; + let shouldBeAbleToDeleteEntries: boolean; try { const hostExceptionCount = await getHostIsolationExceptionTotal(core.http); - shouldSeeHIEToBeAbleToDeleteEntries = hostExceptionCount !== 0; + // has an HIE entry and is a super user then set to TRUE + shouldBeAbleToDeleteEntries = hostExceptionCount !== 0 && canAccessEndpointManagement; } catch { - shouldSeeHIEToBeAbleToDeleteEntries = false; + shouldBeAbleToDeleteEntries = false; } - if (!shouldSeeHIEToBeAbleToDeleteEntries) { + if (!shouldBeAbleToDeleteEntries) { linksToExclude.push(SecurityPageName.hostIsolationExceptions); } - } else if (!canIsolateHost) { + } else if (!canIsolateHost || !canAccessEndpointManagement) { linksToExclude.push(SecurityPageName.hostIsolationExceptions); } } catch { diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.test.ts b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.test.ts index 3990683a781c5..e20c17ad60809 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.test.ts @@ -36,16 +36,33 @@ describe('host isolation exceptions hooks', () => { useEndpointPrivilegesMock.mockReset(); }); - it('should return true if has the correct privileges', () => { - useEndpointPrivilegesMock.mockReturnValue({ canIsolateHost: true }); + it('should return TRUE if IS superuser AND canIsolateHost', () => { + useEndpointPrivilegesMock.mockReturnValue({ + canIsolateHost: true, + canAccessEndpointManagement: true, + }); const { result } = renderHook(() => useCanSeeHostIsolationExceptionsMenu(), { wrapper: TestProviders, }); expect(result.current).toBe(true); }); - it('should return false if does not have privileges and there are not existing host isolation items', () => { - useEndpointPrivilegesMock.mockReturnValue({ canIsolateHost: false }); + it('should return FALSE if NOT superuser AND canIsolateHost', () => { + useEndpointPrivilegesMock.mockReturnValue({ + canIsolateHost: true, + canAccessEndpointManagement: false, + }); + const { result } = renderHook(() => useCanSeeHostIsolationExceptionsMenu(), { + wrapper: TestProviders, + }); + expect(result.current).toBe(false); + }); + + it('should return FALSE if IS superuser AND and !canIsolateHost and there are no existing host isolation items', () => { + useEndpointPrivilegesMock.mockReturnValue({ + canIsolateHost: false, + canAccessEndpointManagement: true, + }); mockedApis.responseProvider.exceptionsSummary.mockReturnValue({ total: 0, linux: 0, @@ -58,8 +75,11 @@ describe('host isolation exceptions hooks', () => { expect(result.current).toBe(false); }); - it('should return true if does not have privileges and there are existing host isolation items', async () => { - useEndpointPrivilegesMock.mockReturnValue({ canIsolateHost: false }); + it('should return TRUE if IS superuser AND and !canIsolateHost and there are existing host isolation items', async () => { + useEndpointPrivilegesMock.mockReturnValue({ + canIsolateHost: false, + canAccessEndpointManagement: true, + }); const { result, waitForNextUpdate } = renderHook( () => useCanSeeHostIsolationExceptionsMenu(), { diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.ts b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.ts index 5e4c26e099428..09bc1f27593c4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/hooks.ts @@ -30,8 +30,11 @@ export function useCanSeeHostIsolationExceptionsMenu(): boolean { const { data: summary, isFetching, refetch: checkIfHasExceptions, isFetched } = apiQuery; const canSeeMenu = useMemo(() => { - return privileges.canIsolateHost || Boolean(summary?.total); - }, [privileges.canIsolateHost, summary?.total]); + return ( + privileges.canAccessEndpointManagement && + (privileges.canIsolateHost || Boolean(summary?.total)) + ); + }, [privileges.canIsolateHost, privileges.canAccessEndpointManagement, summary?.total]); useEffect(() => { if (!privileges.canIsolateHost && !privileges.loading && !isFetched && !isFetching) { diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/integration_tests/host_isolation_exceptions_list.test.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/integration_tests/host_isolation_exceptions_list.test.tsx index 435178f2a0252..699b0eb900685 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/integration_tests/host_isolation_exceptions_list.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/integration_tests/host_isolation_exceptions_list.test.tsx @@ -105,4 +105,48 @@ describe('When on the host isolation exceptions page', () => { expect(getByTestId('hostIsolationExceptionsListPage-card-cardDeleteAction')).toBeTruthy(); expect(queryByTestId('hostIsolationExceptionsListPage-card-cardEditAction')).toBeNull(); }); + + it('should allow Delete action', async () => { + // Use case: license downgrade scenario, where user still has entries defined, but no longer + // able to create or edit them (only Delete them) + const existingPrivileges = useUserPrivilegesMock(); + useUserPrivilegesMock.mockReturnValue({ + ...existingPrivileges, + endpointPrivileges: { + ...existingPrivileges.endpointPrivileges, + canIsolateHost: false, + canUnIsolateHost: true, + }, + }); + + const { findAllByTestId, getByTestId } = await render(); + + await waitFor(async () => { + await expect(findAllByTestId('hostIsolationExceptionsListPage-card')).resolves.toHaveLength( + 10 + ); + }); + await getFirstCard(renderResult, { + showActions: true, + testId: 'hostIsolationExceptionsListPage', + }); + + const deleteButton = getByTestId('hostIsolationExceptionsListPage-card-cardDeleteAction'); + expect(deleteButton).toBeTruthy(); + + userEvent.click(deleteButton); + const confirmDeleteButton = getByTestId( + 'hostIsolationExceptionsListPage-deleteModal-submitButton' + ); + userEvent.click(confirmDeleteButton); + await waitFor(() => { + expect(apiMocks.responseProvider.exceptionDelete).toHaveReturnedWith( + expect.objectContaining({ + namespace_type: 'agnostic', + os_types: ['windows'], + tags: ['policy:all'], + }) + ); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index 8b183f6659b55..600683fce9025 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -31,6 +31,7 @@ import { useUserPrivileges } from '../../common/components/user_privileges'; import { HostIsolationExceptionsContainer } from './host_isolation_exceptions'; import { BlocklistContainer } from './blocklist'; import { ResponseActionsContainer } from './response_actions'; +import { useCanSeeHostIsolationExceptionsMenu } from './host_isolation_exceptions/view/hooks'; import { PrivilegedRoute } from '../components/privileged_route'; const EndpointTelemetry = () => ( @@ -86,6 +87,8 @@ export const ManagementContainer = memo(() => { canReadEndpointList, } = useUserPrivileges().endpointPrivileges; + const canSeeHostIsolationExceptionsPage = useCanSeeHostIsolationExceptionsMenu(); + // Lets wait until we can verify permissions if (loading) { return ; @@ -113,9 +116,10 @@ export const ManagementContainer = memo(() => { component={EventFilterTelemetry} hasPrivilege={canReadEventFilters} /> - { +// FLAKY: https://github.com/elastic/kibana/issues/143436 +describe.skip('When on the policy list page', () => { let render: () => ReturnType; let renderResult: ReturnType; let history: AppContextTestRender['history']; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.test.tsx new file mode 100644 index 0000000000000..a37233c8dd734 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.test.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { useKibana as mockUseKibana } from '../../../../common/lib/kibana/__mocks__'; +import { TestProviders } from '../../../../common/mock'; +import { EntityAnalyticsHoverActions } from './entity_hover_actions'; + +const mockedUseKibana = mockUseKibana(); + +jest.mock('../../../../common/lib/kibana', () => { + const original = jest.requireActual('../../../../common/lib/kibana'); + return { + ...original, + useKibana: () => mockedUseKibana, + }; +}); + +describe('EntityAnalyticsHoverActions', () => { + it('it renders "add to timeline" and "copy" hover action', () => { + const { getByTestId } = render( + , + { wrapper: TestProviders } + ); + + expect(getByTestId('test-add-to-timeline')).toBeInTheDocument(); + expect(getByTestId('test-copy-button')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.tsx new file mode 100644 index 0000000000000..44c2b93308226 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/entity_hover_actions.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { noop } from 'lodash/fp'; +import type { DataProvider } from '../../../../../common/types'; +import { IS_OPERATOR } from '../../../../../common/types'; +import { escapeDataProviderId } from '../../../../common/components/drag_and_drop/helpers'; +import { SecurityPageName } from '../../../../app/types'; +import { HoverActions } from '../../../../common/components/hover_actions'; + +interface Props { + onFilterAdded?: () => void; + fieldName: string; + fieldValue: string; + idPrefix: string; +} + +export const EntityAnalyticsHoverActions: React.FC = ({ + fieldName, + fieldValue, + idPrefix, + onFilterAdded, +}) => { + const id = useMemo( + () => escapeDataProviderId(`${idPrefix}-${fieldName}-${fieldValue}`), + [idPrefix, fieldName, fieldValue] + ); + const dataProvider: DataProvider = useMemo( + () => ({ + and: [], + enabled: true, + id, + name: fieldValue, + excluded: false, + kqlQuery: '', + queryMatch: { + field: fieldName, + value: fieldValue, + displayValue: fieldValue, + operator: IS_OPERATOR, + }, + }), + [fieldName, fieldValue, id] + ); + + return ( + + ); +}; + +EntityAnalyticsHoverActions.displayName = 'EntityAnalyticsHoverActions'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/basic_table_without_border_bottom.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/styled_basic_table.tsx similarity index 51% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/basic_table_without_border_bottom.tsx rename to x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/styled_basic_table.tsx index 10d0d89319090..ddeadc4aa7538 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/basic_table_without_border_bottom.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/styled_basic_table.tsx @@ -8,10 +8,30 @@ import styled from 'styled-components'; import { EuiBasicTable } from '@elastic/eui'; // @ts-expect-error TS2769 -export const BasicTableWithoutBorderBottom = styled(EuiBasicTable)` +export const StyledBasicTable = styled(EuiBasicTable)` .euiTableRow { .euiTableRowCell { border-bottom: none !important; } } + + .timelines__hoverActionButton { + opacity: 0; + } + + .EntityAnalyticsTableHoverActions { + .hoverActions-active { + .timelines__hoverActionButton, + .securitySolution__hoverActionButton { + opacity: 1; + } + } + + &:hover { + .timelines__hoverActionButton, + .securitySolution__hoverActionButton { + opacity: 1; + } + } + } `; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx index 78ded5e6fc941..1bf08749f980d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.tsx @@ -31,6 +31,7 @@ import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml import { useQueryInspector } from '../../../../common/components/page/manage_query'; import { ENTITY_ANALYTICS_ANOMALIES_PANEL } from '../anomalies'; import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import { FormattedCount } from '../../../../common/components/formatted_number'; const StyledEuiTitle = styled(EuiTitle)` color: ${({ theme: { eui } }) => eui.euiColorDanger}; @@ -150,7 +151,7 @@ export const EntityAnalyticsHeader = () => { ); const totalAnomalies = useMemo( - () => (areJobsEnabled ? sumBy('count', data) : '-'), + () => (areJobsEnabled ? : '-'), [data, areJobsEnabled] ); @@ -165,14 +166,18 @@ export const EntityAnalyticsHeader = () => { return ( - + {isPlatinumOrTrialLicense && ( - + - {hostsSeverityCount ? hostsSeverityCount[RiskSeverity.critical] : '-'} + {hostsSeverityCount ? ( + + ) : ( + '-' + )} @@ -190,11 +195,15 @@ export const EntityAnalyticsHeader = () => { )} {isPlatinumOrTrialLicense && ( - + - {usersSeverityCount ? usersSeverityCount[RiskSeverity.critical] : '-'} + {usersSeverityCount ? ( + + ) : ( + '-' + )} @@ -212,7 +221,7 @@ export const EntityAnalyticsHeader = () => { )} - + {totalAnomalies} diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx index e9fd68dabd4d2..3b3a361e23daf 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx @@ -22,6 +22,7 @@ import type { import { RiskScoreEntity, RiskScoreFields } from '../../../../../common/search_strategy'; import * as i18n from './translations'; import { FormattedCount } from '../../../../common/components/formatted_number'; +import { EntityAnalyticsHoverActions } from '../common/entity_hover_actions'; type HostRiskScoreColumns = Array>; @@ -37,9 +38,23 @@ export const getRiskScoreColumns = ( render: (entityName: string) => { if (entityName != null && entityName.length > 0) { return riskEntity === RiskScoreEntity.host ? ( - + <> + + + ) : ( - + <> + + + ); } return getEmptyTagValue(); @@ -50,6 +65,7 @@ export const getRiskScoreColumns = ( riskEntity === RiskScoreEntity.host ? RiskScoreFields.hostRiskScore : RiskScoreFields.userRiskScore, + width: '15%', name: i18n.RISK_SCORE_TITLE(riskEntity), truncateText: true, mobileOptions: { show: true }, @@ -57,7 +73,7 @@ export const getRiskScoreColumns = ( if (riskScore != null) { return ( - {riskScore.toFixed(2)} + {Math.round(riskScore)} ); } @@ -67,6 +83,7 @@ export const getRiskScoreColumns = ( { field: riskEntity === RiskScoreEntity.host ? RiskScoreFields.hostRisk : RiskScoreFields.userRisk, + width: '30%', name: ( <> @@ -86,7 +103,7 @@ export const getRiskScoreColumns = ( }, { field: RiskScoreFields.alertsCount, - width: '15%', + width: '10%', name: i18n.ALERTS, truncateText: false, mobileOptions: { show: true }, diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx index 2222fbebf2dfa..eb6120088247b 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx @@ -52,6 +52,8 @@ jest.mock('../../detection_response/hooks/use_navigate_to_timeline', () => { }; }); +jest.mock('../../../../common/components/hover_actions', () => ({ HoverActions: () => null })); + describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( 'EntityAnalyticsRiskScores entityType: %s', (riskEntity) => { diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx index f3410e7e7b4b1..5e2b8992a22d9 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx @@ -31,7 +31,7 @@ import { InspectButtonContainer } from '../../../../common/components/inspect'; import { useQueryToggle } from '../../../../common/containers/query_toggle'; import { hostsActions } from '../../../../hosts/store'; import { RiskScoreDonutChart } from '../common/risk_score_donut_chart'; -import { BasicTableWithoutBorderBottom } from '../common/basic_table_without_border_bottom'; +import { StyledBasicTable } from '../common/styled_basic_table'; import { RISKY_HOSTS_DOC_LINK, RISKY_USERS_DOC_LINK } from '../../../../../common/constants'; import { RiskScoreHeaderTitle } from '../../../../risk_score/components/risk_score_onboarding/risk_score_header_title'; import { RiskScoresNoDataDetected } from '../../../../risk_score/components/risk_score_onboarding/risk_score_no_data_detected'; @@ -273,12 +273,15 @@ const EntityAnalyticsRiskScoresComponent = ({ riskEntity }: { riskEntity: RiskSc - diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.test.ts index ac6865554b36a..042073005e4a1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.test.ts @@ -22,6 +22,8 @@ jest.mock('../bulk_create_ml_signals'); describe('ml_executor', () => { let jobsSummaryMock: jest.Mock; + let forceStartDatafeedsMock: jest.Mock; + let stopDatafeedsMock: jest.Mock; let mlMock: ReturnType; let alertServices: RuleExecutorServicesMock; let ruleExecutionLogger: ReturnType; @@ -39,6 +41,8 @@ describe('ml_executor', () => { mlMock = mlPluginServerMock.createSetupContract(); mlMock.jobServiceProvider.mockReturnValue({ jobsSummary: jobsSummaryMock, + forceStartDatafeeds: forceStartDatafeedsMock, + stopDatafeeds: stopDatafeedsMock, }); alertServices = alertsMock.createRuleExecutorServices(); ruleExecutionLogger = ruleExecutionLogMock.forExecutors.create({ diff --git a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts index b20a6db4c046c..f2ff6e5074fd8 100644 --- a/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts +++ b/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts @@ -60,18 +60,20 @@ export class HostIsolationExceptionsValidator extends BaseValidator { return item.listId === ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID; } - protected async validateHasWritePrivilege(): Promise { - return super.validateHasPrivilege('canWriteHostIsolationExceptions'); - } + // TODO: 8.7 rbac + // protected async validateHasWritePrivilege(): Promise { + // return super.validateHasPrivilege('canWriteHostIsolationExceptions'); + // } - protected async validateHasReadPrivilege(): Promise { - return super.validateHasPrivilege('canReadHostIsolationExceptions'); - } + // TODO: 8.7 rbac + // protected async validateHasReadPrivilege(): Promise { + // return super.validateHasPrivilege('canReadHostIsolationExceptions'); + // } async validatePreCreateItem( item: CreateExceptionListItemOptions ): Promise { - await this.validateHasWritePrivilege(); + // TODO add this to 8.7 rbac await this.validateHasWritePrivilege(); await this.validateCanIsolateHosts(); await this.validateHostIsolationData(item); await this.validateByPolicyItem(item); @@ -84,7 +86,8 @@ export class HostIsolationExceptionsValidator extends BaseValidator { ): Promise { const updatedItem = _updatedItem as ExceptionItemLikeOptions; - await this.validateHasWritePrivilege(); + // TODO add this to 8.7 rbac add + // await this.validateHasWritePrivilege(); await this.validateCanIsolateHosts(); await this.validateHostIsolationData(updatedItem); await this.validateByPolicyItem(updatedItem); @@ -93,27 +96,39 @@ export class HostIsolationExceptionsValidator extends BaseValidator { } async validatePreGetOneItem(): Promise { - await this.validateHasReadPrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasReadPrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreSummary(): Promise { - await this.validateHasReadPrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasReadPrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreDeleteItem(): Promise { - await this.validateHasWritePrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasWritePrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreExport(): Promise { - await this.validateHasReadPrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasReadPrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreSingleListFind(): Promise { - await this.validateHasReadPrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasReadPrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreMultiListFind(): Promise { - await this.validateHasReadPrivilege(); + // TODO: for 8.7 rbac replace with + // await this.validateHasReadPrivilege(); + await this.validateCanManageEndpointArtifacts(); } async validatePreImport(): Promise { diff --git a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts index 9c40d662544c1..afed10119756e 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/get_metrics.test.ts @@ -15,6 +15,8 @@ import { import { mlServicesMock } from '../../lib/machine_learning/mocks'; import { getMockMlJobSummaryResponse, + getMockMlForceStartDatafeedsResponse, + getMockMlStopDatafeedsResponse, getMockListModulesResponse, getMockMlJobDetailsResponse, getMockMlJobStatsResponse, @@ -273,12 +275,18 @@ describe('Detections Usage and Metrics', () => { it('returns an ml job telemetry object from anomaly detectors provider', async () => { const logger = loggingSystemMock.createLogger(); const mockJobSummary = jest.fn().mockResolvedValue(getMockMlJobSummaryResponse()); + const mockForceStartDatafeeds = jest + .fn() + .mockResolvedValue(getMockMlForceStartDatafeedsResponse()); + const mockStopDatafeeds = jest.fn().mockResolvedValue(getMockMlStopDatafeedsResponse()); const mockListModules = jest.fn().mockResolvedValue(getMockListModulesResponse()); mlClient.modulesProvider.mockReturnValue({ listModules: mockListModules, } as unknown as ReturnType); mlClient.jobServiceProvider.mockReturnValue({ jobsSummary: mockJobSummary, + forceStartDatafeeds: mockForceStartDatafeeds, + stopDatafeeds: mockStopDatafeeds, }); const mockJobsResponse = jest.fn().mockResolvedValue(getMockMlJobDetailsResponse()); const mockJobStatsResponse = jest.fn().mockResolvedValue(getMockMlJobStatsResponse()); diff --git a/x-pack/plugins/security_solution/server/usage/detections/ml_jobs/get_metrics.mocks.ts b/x-pack/plugins/security_solution/server/usage/detections/ml_jobs/get_metrics.mocks.ts index 4ad8f2213a682..3fc5a8f9267e9 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/ml_jobs/get_metrics.mocks.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/ml_jobs/get_metrics.mocks.ts @@ -163,6 +163,14 @@ export const getMockMlJobSummaryResponse = () => [ }, ]; +export const getMockMlForceStartDatafeedsResponse = () => ({ + linux_anomalous_network_activity_ecs: { started: true }, +}); + +export const getMockMlStopDatafeedsResponse = () => ({ + linux_anomalous_network_activity_ecs: { stopped: true }, +}); + export const getMockMlJobDetailsResponse = () => ({ count: 20, jobs: [ diff --git a/x-pack/plugins/session_view/common/constants.ts b/x-pack/plugins/session_view/common/constants.ts index 9938076a6c9e1..f6b713f9283fd 100644 --- a/x-pack/plugins/session_view/common/constants.ts +++ b/x-pack/plugins/session_view/common/constants.ts @@ -67,3 +67,10 @@ export const TTY_LINE_SPLITTER_REGEX = /(\r?\n|\r\n?|\x1b\[\d+;\d*[Hf]?)/gi; // when showing the count of alerts in details panel tab, if the number // exceeds ALERT_COUNT_THRESHOLD we put a + next to it, e.g 999+ export const ALERT_COUNT_THRESHOLD = 999; +export const ALERT_ICONS: { [key: string]: string } = { + process: 'gear', + file: 'document', + network: 'globe', +}; +export const DEFAULT_ALERT_FILTER_VALUE = 'all'; +export const ALERT = 'alert'; diff --git a/x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts b/x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts index 1b8ffbea1f93d..5f1b5a25cc565 100644 --- a/x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts +++ b/x-pack/plugins/session_view/common/mocks/constants/session_view_process.mock.ts @@ -13,6 +13,8 @@ import { EventAction, EventKind, ProcessMap, + AlertTypeCount, + ProcessEventAlertCategory, } from '../../types/process_tree'; export const mockEvents: ProcessEvent[] = [ @@ -158,7 +160,7 @@ export const mockEvents: ProcessEvent[] = [ }, event: { action: EventAction.fork, - category: 'process', + category: ['process'], kind: EventKind.event, id: '1', }, @@ -316,7 +318,7 @@ export const mockEvents: ProcessEvent[] = [ }, event: { action: EventAction.exec, - category: 'process', + category: ['process'], kind: EventKind.event, id: '2', }, @@ -459,7 +461,7 @@ export const mockEvents: ProcessEvent[] = [ }, event: { action: EventAction.end, - category: 'process', + category: ['process'], kind: EventKind.event, id: '3', }, @@ -622,7 +624,7 @@ export const mockEvents: ProcessEvent[] = [ }, event: { action: EventAction.end, - category: 'process', + category: ['process'], kind: EventKind.event, id: '4', }, @@ -645,6 +647,12 @@ export const mockEvents: ProcessEvent[] = [ }, ] as ProcessEvent[]; +export const mockAlertTypeCounts: AlertTypeCount[] = [ + { category: ProcessEventAlertCategory.file, count: 0 }, + { category: ProcessEventAlertCategory.network, count: 2 }, + { category: ProcessEventAlertCategory.process, count: 1 }, +]; + export const mockAlerts: ProcessEvent[] = [ { kibana: { @@ -797,7 +805,7 @@ export const mockAlerts: ProcessEvent[] = [ }, }, }, - name: '', + name: 'vi', args_count: 2, args: ['vi', 'cmd/config.ini'], working_directory: '/home/vagrant', @@ -811,7 +819,7 @@ export const mockAlerts: ProcessEvent[] = [ }, event: { action: EventAction.exec, - category: 'process', + category: ['process'], kind: EventKind.signal, id: '5', }, @@ -998,7 +1006,7 @@ export const mockAlerts: ProcessEvent[] = [ }, event: { action: EventAction.end, - category: 'process', + category: ['process'], kind: EventKind.signal, id: '6', }, @@ -1021,6 +1029,402 @@ export const mockAlerts: ProcessEvent[] = [ }, ]; +export const mockFileAlert = { + kibana: { + alert: { + rule: { + category: 'Custom Query Rule', + consumer: 'siem', + name: 'File telemetry', + uuid: '709d3890-4c71-11ec-8c67-01ccde9db9bf', + enabled: true, + description: 'File telemetry', + risk_score: 21, + severity: 'low', + query: "process.executable: '/usr/bin/vi'", + }, + status: 'active', + workflow_status: 'open', + reason: 'process event created low alert File telemetry.', + original_time: '2021-11-23T15:25:05.202Z', + original_event: { + action: 'exit', + }, + uuid: '2873463965b70d37ab9b2b3a90ac5a03b88e76e94ad33568285cadcefc38ed75', + }, + }, + '@timestamp': '2021-11-23T15:26:34.860Z', + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + process: { + pid: 3535, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + exit_code: 137, + executable: '/usr/bin/vi', + command_line: 'bash', + interactive: true, + entity_id: '8e4daeb2-4a4e-56c4-980e-f0dcfdbc3726', + parent: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + session_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + entry_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + group_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + file: { + path: '/home/jon/new_file.txt', + extension: 'txt', + name: 'new_file.txt', + }, + event: { + action: EventAction.exec, + category: ['file'], + kind: EventKind.signal, + id: '6', + }, + host: { + architecture: 'x86_64', + hostname: 'james-fleet-714-2', + id: '48c1b3f1ac5da4e0057fc9f60f4d1d5d', + ip: ['127.0.0.1', '::1', '10.132.0.50', 'fe80::7d39:3147:4d9a:f809'], + mac: ['42:01:0a:84:00:32'], + name: 'james-fleet-714-2', + os: { + family: 'centos', + full: 'CentOS 7.9.2009', + kernel: '3.10.0-1160.31.1.el7.x86_64 #1 SMP Thu Jun 10 13:32:12 UTC 2021', + name: 'Linux', + platform: 'centos', + version: '7.9.2009', + }, + }, +}; + +export const mockNetworkAlert = { + kibana: { + alert: { + rule: { + category: 'Custom Query Rule', + consumer: 'siem', + name: 'Network telemetry', + uuid: '709d3890-4c71-11ec-8c67-01ccde9db9bf', + enabled: true, + description: 'Network telemetry', + risk_score: 21, + severity: 'low', + query: "process.executable: '/usr/bin/vi'", + }, + status: 'active', + workflow_status: 'open', + reason: 'process event created low alert File telemetry.', + original_time: '2021-11-23T15:25:05.202Z', + original_event: { + action: 'exit', + }, + uuid: '2873463965b70d37ab9b2b3a90ac5a03b88e76e94ad33568285cadcefc38ed75', + }, + }, + '@timestamp': '2021-11-23T15:26:34.860Z', + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + process: { + pid: 3535, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + exit_code: 137, + executable: '/usr/bin/vi', + command_line: 'bash', + interactive: true, + entity_id: '8e4daeb2-4a4e-56c4-980e-f0dcfdbc3726', + parent: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + session_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + entry_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + group_leader: { + pid: 2442, + user: { + name: 'vagrant', + id: '1000', + }, + group: { + id: '1000', + name: 'vagrant', + }, + executable: '/usr/bin/bash', + command_line: 'bash', + interactive: true, + entity_id: '3d0192c6-7c54-5ee6-a110-3539a7cf42bc', + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + name: '', + args_count: 2, + args: ['vi', 'cmd/config.ini'], + working_directory: '/home/vagrant', + start: '2021-11-23T15:26:34.860Z', + tty: { + char_device: { + major: 8, + minor: 1, + }, + }, + }, + network: { + transport: 'TCP', + protocol: 'http', + type: 'IP4', + }, + destination: { + address: '127.0.0.1', + ip: '127.0.0.1', + port: 2222, + }, + source: { + address: '128.32.0.1', + ip: '128.32.0.1', + port: 1111, + }, + event: { + action: EventAction.exec, + category: ['network'], + kind: EventKind.signal, + id: '6', + }, + host: { + architecture: 'x86_64', + hostname: 'james-fleet-714-2', + id: '48c1b3f1ac5da4e0057fc9f60f4d1d5d', + ip: ['127.0.0.1', '::1', '10.132.0.50', 'fe80::7d39:3147:4d9a:f809'], + mac: ['42:01:0a:84:00:32'], + name: 'james-fleet-714-2', + os: { + family: 'centos', + full: 'CentOS 7.9.2009', + kernel: '3.10.0-1160.31.1.el7.x86_64 #1 SMP Thu Jun 10 13:32:12 UTC 2021', + name: 'Linux', + platform: 'centos', + version: '7.9.2009', + }, + }, +}; + export const mockData: ProcessEventsPage[] = [ { events: mockEvents, @@ -1278,7 +1682,7 @@ export const childProcessMock: Process = { '@timestamp': '2021-11-23T15:25:05.210Z', event: { kind: EventKind.event, - category: 'process', + category: ['process'], action: EventAction.exec, id: '1', }, @@ -1364,7 +1768,7 @@ export const processMock: Process = { '@timestamp': '2021-11-23T15:25:04.210Z', event: { kind: EventKind.event, - category: 'process', + category: ['process'], action: EventAction.exec, id: '2', }, diff --git a/x-pack/plugins/session_view/common/translations.ts b/x-pack/plugins/session_view/common/translations.ts new file mode 100644 index 0000000000000..e27d46e0dc9cf --- /dev/null +++ b/x-pack/plugins/session_view/common/translations.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; + +export const ALERT_TYPE_TOOLTIP_PROCESS = i18n.translate('xpack.sessionView.processTooltip', { + defaultMessage: 'Process alert', +}); + +export const ALERT_TYPE_TOOLTIP_NETWORK = i18n.translate('xpack.sessionView.networkTooltip', { + defaultMessage: 'Network alert', +}); + +export const ALERT_TYPE_TOOLTIP_FILE = i18n.translate('xpack.sessionView.fileTooltip', { + defaultMessage: 'File alert', +}); diff --git a/x-pack/plugins/session_view/common/types/process_tree/index.ts b/x-pack/plugins/session_view/common/types/process_tree/index.ts index b228502f61a54..07a17fe43d01f 100644 --- a/x-pack/plugins/session_view/common/types/process_tree/index.ts +++ b/x-pack/plugins/session_view/common/types/process_tree/index.ts @@ -12,6 +12,19 @@ export interface AlertStatusEventEntityIdMap { }; } +export const enum ProcessEventAlertCategory { + all = 'all', + file = 'file', + network = 'network', + process = 'process', +} + +export interface AlertTypeCount { + category: ProcessEventAlertCategory; + count: number; +} +export type DefaultAlertFilterType = 'all'; + export const enum EventKind { event = 'event', signal = 'signal', @@ -156,14 +169,34 @@ export interface ProcessEventAlert { rule?: ProcessEventAlertRule; } +export interface ProcessEventIPAddress { + address?: string; + ip?: string; + port?: number; +} + +export interface ProcessEventNetwork { + type?: string; + transport?: string; + protocol?: string; +} + export interface ProcessEvent { '@timestamp'?: string; event?: { kind?: EventKind; - category?: string; + category?: string[]; action?: EventAction; id?: string; }; + file?: { + extension?: string; + path?: string; + name?: string; + }; + network?: ProcessEventNetwork; + destination?: ProcessEventIPAddress; + source?: ProcessEventIPAddress; user?: User; group?: Group; host?: ProcessEventHost; diff --git a/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts b/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts new file mode 100644 index 0000000000000..53125d0b7f383 --- /dev/null +++ b/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ProcessEventAlertCategory } from '../types/process_tree'; +import { getAlertIconTooltipContent } from './alert_icon_tooltip_content'; + +describe('getAlertTypeTooltipContent(category)', () => { + it('should display `File alert` for tooltip content', () => { + expect(getAlertIconTooltipContent(ProcessEventAlertCategory.file)).toEqual('File alert'); + }); + + it('should display `Process alert` for tooltip content', () => { + expect(getAlertIconTooltipContent(ProcessEventAlertCategory.process)).toEqual('Process alert'); + }); + + it('should display `Network alert` for tooltip content', () => { + expect(getAlertIconTooltipContent(ProcessEventAlertCategory.network)).toEqual('Network alert'); + }); +}); diff --git a/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.ts b/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.ts new file mode 100644 index 0000000000000..9eb85ed6b665b --- /dev/null +++ b/x-pack/plugins/session_view/common/utils/alert_icon_tooltip_content.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ProcessEventAlertCategory } from '../types/process_tree'; +import * as i18n from '../translations'; + +export const getAlertIconTooltipContent = (processEventAlertCategory: string) => { + let tooltipContent = ''; + switch (processEventAlertCategory) { + case ProcessEventAlertCategory.file: + tooltipContent = i18n.ALERT_TYPE_TOOLTIP_FILE; + break; + case ProcessEventAlertCategory.network: + tooltipContent = i18n.ALERT_TYPE_TOOLTIP_NETWORK; + break; + default: + tooltipContent = i18n.ALERT_TYPE_TOOLTIP_PROCESS; + } + return tooltipContent; +}; diff --git a/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx b/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx index d452163be7f49..e6f68ce6ae230 100644 --- a/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx +++ b/x-pack/plugins/session_view/public/components/detail_panel_alert_list_item/index.tsx @@ -16,15 +16,19 @@ import { EuiPanel, EuiHorizontalRule, formatDate, + EuiToolTip, } from '@elastic/eui'; -import { ProcessEvent } from '../../../common/types/process_tree'; +import { getAlertIconTooltipContent } from '../../../common/utils/alert_icon_tooltip_content'; +import { ALERT_ICONS } from '../../../common/constants'; +import { ProcessEvent, ProcessEventAlertCategory } from '../../../common/types/process_tree'; import { useStyles } from './styles'; import { DetailPanelAlertActions } from '../detail_panel_alert_actions'; import { dataOrDash } from '../../utils/data_or_dash'; import { useDateFormat } from '../../hooks'; - +import { getAlertCategoryDisplayText } from '../../utils/alert_category_display_text'; export const ALERT_LIST_ITEM_TEST_ID = 'sessionView:detailPanelAlertListItem'; export const ALERT_LIST_ITEM_ARGS_TEST_ID = 'sessionView:detailPanelAlertListItemArgs'; +export const ALERT_LIST_ITEM_FILE_PATH_TEST_ID = 'sessionView:detailPanelAlertListItemFilePath'; export const ALERT_LIST_ITEM_TIMESTAMP_TEST_ID = 'sessionView:detailPanelAlertListItemTimestamp'; interface DetailPanelAlertsListItemDeps { @@ -57,9 +61,16 @@ export const DetailPanelAlertListItem = ({ const uuid = rule?.uuid || ''; const name = rule?.name || ''; - const { args } = event.process ?? {}; - + const { args, name: processName } = event.process ?? {}; + const { event: processEvent } = event; const forceState = !isInvestigated ? 'open' : undefined; + const category = processEvent?.category?.[0]; + const processEventAlertCategory = category ?? ProcessEventAlertCategory.process; + const alertCategoryDetailDisplayText = + category !== ProcessEventAlertCategory.process + ? `${dataOrDash(processName)} ${getAlertCategoryDisplayText(event, category)}` + : dataOrDash(args?.join(' ')); + const alertIconTooltipContent = getAlertIconTooltipContent(processEventAlertCategory); return minimal ? (
    @@ -86,7 +97,9 @@ export const DetailPanelAlertListItem = ({ hasShadow={false} borderRadius="m" > - {dataOrDash(args?.join(' '))} + + {alertCategoryDetailDisplayText} +
    @@ -98,7 +111,14 @@ export const DetailPanelAlertListItem = ({ buttonContent={

    - + + + + {dataOrDash(name)}

    @@ -126,7 +146,7 @@ export const DetailPanelAlertListItem = ({ borderRadius="m" > - {dataOrDash(args?.join(' '))} + {alertCategoryDetailDisplayText}
    {isInvestigated && ( diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap b/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap index a15f72d1cab4f..618b60a2e7088 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/__snapshots__/index.test.tsx.snap @@ -34,17 +34,26 @@ Object { class="euiFlexItem euiFlexItem--flexGrowZero" > + class="euiToolTipAnchor emotion-euiToolTipAnchor-inlineBlock" + > + +
    - cmd test alert +
    + cmd test alert +
    + class="euiToolTipAnchor emotion-euiToolTipAnchor-inlineBlock" + > + +
    - cmd test alert +
    + cmd test alert +
    { expect(selectAlert).toHaveBeenCalledTimes(1); }); + it('should get alert rule name text content when alert category is process', async () => { + renderResult = mockedContext.render(); + const alertText = renderResult.queryByTestId( + `sessionView:sessionViewAlertDetailRuleName-${mockAlert.kibana?.alert?.uuid}-text` + ); + + const categoryDetailPanel = renderResult.queryByTestId( + `sessionView:sessionViewAlertDetail-${mockFileAlert.kibana?.alert?.uuid}-text` + ); + + expect(alertText).toBeTruthy(); + expect(alertText).toHaveTextContent('cmd test alert'); + expect(categoryDetailPanel).toBeNull(); + }); + + it('should get file path for text content when alert category is file', async () => { + renderResult = mockedContext.render(); + const fileAlertText = renderResult.queryByTestId( + `sessionView:sessionViewAlertDetail-${mockFileAlert.kibana?.alert?.uuid}-text` + ); + expect(fileAlertText).toBeTruthy(); + expect(fileAlertText).toHaveTextContent('/home/jon/new_file.txt'); + }); + + it('should get network display text for text content when alert category is network', async () => { + renderResult = mockedContext.render(); + + const networkAlertText = renderResult.queryByTestId( + `sessionView:sessionViewAlertDetail-${mockNetworkAlert.kibana?.alert?.uuid}-text` + ); + expect(networkAlertText).toBeTruthy(); + + expect(networkAlertText).toHaveTextContent( + `${mockNetworkAlert?.destination?.address}:${mockNetworkAlert?.destination?.port}` + ); + }); + it('should execute onShowAlertDetails callback when clicking on expand button', async () => { const onShowAlertDetails = jest.fn(); renderResult = mockedContext.render( diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx index 77fce97b5167c..a73265ddf37e6 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/index.tsx @@ -5,13 +5,28 @@ * 2.0. */ -import React, { useEffect, useCallback } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiBadge, EuiIcon, EuiText, EuiButtonIcon } from '@elastic/eui'; -import { ProcessEvent, ProcessEventAlert } from '../../../common/types/process_tree'; +import React, { useEffect, useCallback, useMemo } from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiBadge, + EuiIcon, + EuiText, + EuiButtonIcon, + EuiToolTip, + EuiPanel, +} from '@elastic/eui'; +import { ALERT_ICONS } from '../../../common/constants'; +import { + ProcessEvent, + ProcessEventAlert, + ProcessEventAlertCategory, +} from '../../../common/types/process_tree'; import { dataOrDash } from '../../utils/data_or_dash'; import { getBadgeColorFromAlertStatus } from './helpers'; import { useStyles } from './styles'; - +import { getAlertCategoryDisplayText } from '../../utils/alert_category_display_text'; +import { getAlertIconTooltipContent } from '../../../common/utils/alert_icon_tooltip_content'; export interface ProcessTreeAlertDeps { alert: ProcessEvent; isInvestigated: boolean; @@ -32,7 +47,13 @@ export const ProcessTreeAlert = ({ const styles = useStyles({ isInvestigated, isSelected }); const { event } = alert; + const { uuid, rule, workflow_status: status } = alert.kibana?.alert || {}; + const category = event?.category?.[0]; + const alertIconType = useMemo(() => { + if (category && category in ALERT_ICONS) return ALERT_ICONS[category]; + return ALERT_ICONS.process; + }, [category]); useEffect(() => { if (isInvestigated && uuid) { @@ -55,8 +76,10 @@ export const ProcessTreeAlert = ({ if (!(alert.kibana && rule)) { return null; } - const { name } = rule; + const processEventAlertCategory = category ?? ProcessEventAlertCategory.process; + const alertCategoryDetailDisplayText = getAlertCategoryDisplayText(alert, category); + const alertIconTooltipContent = getAlertIconTooltipContent(processEventAlertCategory); return (
    @@ -76,12 +99,37 @@ export const ProcessTreeAlert = ({ /> - + + + - - {dataOrDash(name)} - +
    + + {dataOrDash(name)} + + {alertCategoryDetailDisplayText && ( + + + {alertCategoryDetailDisplayText} + + + )} +
    diff --git a/x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts b/x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts index 6659028df8867..de3dc797e3351 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts +++ b/x-pack/plugins/session_view/public/components/process_tree_alert/styles.ts @@ -19,7 +19,7 @@ export const useStyles = ({ isInvestigated, isSelected }: StylesDeps) => { const { euiTheme, euiVars } = useEuiTheme(); const cached = useMemo(() => { - const { size, colors, font } = euiTheme; + const { size, colors, font, border } = euiTheme; const getHighlightColors = () => { let bgColor = 'none'; @@ -69,19 +69,36 @@ export const useStyles = ({ isInvestigated, isSelected }: StylesDeps) => { textTransform: 'capitalize', }; + const processAlertDisplayContainer: CSSObject = { + display: 'flex', + alignItems: 'center', + }; + const alertName: CSSObject = { color: colors.title, + '& .alertCategoryDetailText': { + fontSize: size.m, + }, }; const actionBadge: CSSObject = { textTransform: 'capitalize', }; + const processPanel: CSSObject = { + marginLeft: '8px', + border: `${border.width.thin} solid ${colors.lightShade}`, + fontFamily: font.familyCode, + padding: `${size.xs} ${size.s}`, + }; + return { alert, alertStatus, alertName, actionBadge, + processPanel, + processAlertDisplayContainer, }; }, [euiTheme, isInvestigated, isSelected, euiVars]); diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx b/x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx index b0ec485ab5662..caad36ac7eab5 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts/index.test.tsx @@ -6,7 +6,10 @@ */ import React from 'react'; -import { mockAlerts } from '../../../common/mocks/constants/session_view_process.mock'; +import { + mockAlerts, + mockAlertTypeCounts, +} from '../../../common/mocks/constants/session_view_process.mock'; import { AppContextTestRender, createAppRootMockRenderer } from '../../test'; import { ProcessTreeAlertsDeps, ProcessTreeAlerts } from '.'; @@ -14,8 +17,9 @@ describe('ProcessTreeAlerts component', () => { let render: () => ReturnType; let renderResult: ReturnType; let mockedContext: AppContextTestRender; - const props: ProcessTreeAlertsDeps = { + const processTreeAlertsProps: ProcessTreeAlertsDeps = { alerts: mockAlerts, + alertTypeCounts: mockAlertTypeCounts, onAlertSelected: jest.fn(), onShowAlertDetails: jest.fn(), }; @@ -26,13 +30,15 @@ describe('ProcessTreeAlerts component', () => { describe('When ProcessTreeAlerts is mounted', () => { it('should return null if no alerts', async () => { - renderResult = mockedContext.render(); + renderResult = mockedContext.render( + + ); expect(renderResult.queryByTestId('sessionView:sessionViewAlertDetails')).toBeNull(); }); it('should return an array of alert details', async () => { - renderResult = mockedContext.render(); + renderResult = mockedContext.render(); expect(renderResult.queryByTestId('sessionView:sessionViewAlertDetails')).toBeTruthy(); mockAlerts.forEach((alert) => { @@ -50,7 +56,7 @@ describe('ProcessTreeAlerts component', () => { it('should execute onAlertSelected when clicking on an alert', async () => { const mockFn = jest.fn(); renderResult = mockedContext.render( - + ); expect(renderResult.queryByTestId('sessionView:sessionViewAlertDetails')).toBeTruthy(); @@ -63,4 +69,18 @@ describe('ProcessTreeAlerts component', () => { expect(mockFn).toHaveBeenCalledTimes(1); }); }); + + describe('ProcessTreeAlertsFilter Render', () => { + it('should return ProcessTreeAlertsFilter component when alerts exist', async () => { + renderResult = mockedContext.render(); + expect(renderResult.queryByTestId('sessionView:sessionViewAlertDetailsFilter')).toBeTruthy(); + }); + + it('should not return ProcessTreeAlertsFilter when no alerts exist', async () => { + renderResult = mockedContext.render( + + ); + expect(renderResult.queryByTestId('sessionView:sessionViewAlertDetailsFilter')).toBeNull(); + }); + }); }); diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx index 92581c8654bc6..0630616f27c8e 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts/index.tsx @@ -5,16 +5,24 @@ * 2.0. */ -import React, { useState, useEffect, useRef, MouseEvent, useCallback } from 'react'; +import React, { useState, useEffect, useRef, MouseEvent, useCallback, useMemo } from 'react'; import { useStyles } from './styles'; -import { ProcessEvent, ProcessEventAlert } from '../../../common/types/process_tree'; +import { + ProcessEventAlertCategory, + DefaultAlertFilterType, + ProcessEvent, + ProcessEventAlert, + AlertTypeCount, +} from '../../../common/types/process_tree'; import { ProcessTreeAlert } from '../process_tree_alert'; -import { MOUSE_EVENT_PLACEHOLDER } from '../../../common/constants'; +import { DEFAULT_ALERT_FILTER_VALUE, MOUSE_EVENT_PLACEHOLDER } from '../../../common/constants'; +import { ProcessTreeAlertsFilter } from '../process_tree_alerts_filter'; export interface ProcessTreeAlertsDeps { alerts: ProcessEvent[]; investigatedAlertId?: string; isProcessSelected?: boolean; + alertTypeCounts: AlertTypeCount[]; onAlertSelected: (e: MouseEvent) => void; onShowAlertDetails: (alertUuid: string) => void; } @@ -23,10 +31,14 @@ export function ProcessTreeAlerts({ alerts, investigatedAlertId, isProcessSelected = false, + alertTypeCounts, onAlertSelected, onShowAlertDetails, }: ProcessTreeAlertsDeps) { const [selectedAlert, setSelectedAlert] = useState(null); + const [selectedProcessEventAlertCategory, setSelectedProcessEventAlertCategory] = useState< + ProcessEventAlertCategory | DefaultAlertFilterType + >(DEFAULT_ALERT_FILTER_VALUE); const styles = useStyles(); useEffect(() => { @@ -70,6 +82,24 @@ export function ProcessTreeAlerts({ [onAlertSelected] ); + const handleProcessEventAlertCategorySelected = useCallback((eventCategory) => { + if (ProcessEventAlertCategory.hasOwnProperty(eventCategory)) { + setSelectedProcessEventAlertCategory(eventCategory); + } else { + setSelectedProcessEventAlertCategory(ProcessEventAlertCategory.all); + } + }, []); + + const filteredProcessEventAlerts = useMemo(() => { + return alerts?.filter((processEventAlert: ProcessEvent) => { + const processEventAlertCategory = processEventAlert.event?.category?.[0]; + if (selectedProcessEventAlertCategory === DEFAULT_ALERT_FILTER_VALUE) { + return true; + } + return processEventAlertCategory === selectedProcessEventAlertCategory; + }); + }, [selectedProcessEventAlertCategory, alerts]); + if (alerts.length === 0) { return null; } @@ -80,7 +110,14 @@ export function ProcessTreeAlerts({ css={styles.container} data-test-subj="sessionView:sessionViewAlertDetails" > - {alerts.map((alert: ProcessEvent, idx: number) => { + + + {filteredProcessEventAlerts.map((alert: ProcessEvent, idx: number) => { const alertUuid = alert.kibana?.alert?.uuid || null; return ( diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx new file mode 100644 index 0000000000000..45ced9a4b7c18 --- /dev/null +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.test.tsx @@ -0,0 +1,290 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { mockAlertTypeCounts } from '../../../common/mocks/constants/session_view_process.mock'; +import { AppContextTestRender, createAppRootMockRenderer } from '../../test'; +import { ProcessTreeAlertsFilter, ProcessTreeAlertsFilterDeps } from '.'; +import userEvent from '@testing-library/user-event'; +import { DEFAULT_ALERT_FILTER_VALUE } from '../../../common/constants'; + +describe('ProcessTreeAlertsFiltersFilter component', () => { + let render: () => ReturnType; + let renderResult: ReturnType; + let mockedContext: AppContextTestRender; + const props: ProcessTreeAlertsFilterDeps = { + totalAlertsCount: 3, + alertTypeCounts: mockAlertTypeCounts, + filteredAlertsCount: 2, + onAlertEventCategorySelected: jest.fn(), + }; + + beforeEach(() => { + mockedContext = createAppRootMockRenderer(); + }); + + describe('When ProcessTreeAlertsFiltersFilter is mounted', () => { + it('should filter alerts count of out total alerts count when filtered alerts count and total alerts count are not equal', async () => { + renderResult = mockedContext.render(); + + const filterCountStatus = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterStatus' + ); + + expect(filterCountStatus).toBeTruthy(); + expect(filterCountStatus).toHaveTextContent('Showing 2 of 3 alerts'); + }); + + it('should show only total alert counts when filtered and total count are equal', async () => { + renderResult = mockedContext.render( + + ); + + const filterCountStatus = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterStatus' + ); + + expect(filterCountStatus).toHaveTextContent('Showing 3 alerts'); + expect(filterCountStatus).not.toHaveTextContent('Showing 2 of 3 alerts'); + expect(filterCountStatus).toBeTruthy(); + }); + + it('should call onAlertEventCategorySelected with alert category when filter item is clicked ', () => { + const mockAlertEventCategorySelectedEvent = jest.fn(); + renderResult = mockedContext.render( + + ); + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + userEvent.click(filterButton); + + renderResult.getByTestId('sessionView:sessionViewAlertDetailsFilterItem-network').click(); + + expect(mockAlertEventCategorySelectedEvent).toHaveBeenCalledTimes(1); + expect(mockAlertEventCategorySelectedEvent).toHaveBeenCalledWith('network'); + }); + + describe(' EuiFlexItem filter selector container ', () => { + it('should alerts filter dropdown when at least two alerts categories exist', async () => { + renderResult = mockedContext.render(); + + const filterSelection = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterSelectorContainer' + ); + + expect(filterSelection).toBeTruthy(); + }); + + it('should not show alerts filter selector container when there is only one alert category ', async () => { + const alertTypeCountsUpdated = mockAlertTypeCounts.map((alertType) => + alertType.category === 'process' ? { ...alertType, count: 1 } : { ...alertType, count: 0 } + ); + renderResult = mockedContext.render( + + ); + + const filterSelection = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterSelectorContainer' + ); + + expect(filterSelection).toBeNull(); + }); + + it('should open filter menu popover', async () => { + renderResult = mockedContext.render(); + + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenu = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterSelectorContainerMenu' + ); + + expect(filterMenu).toBeTruthy(); + }); + }); + + describe('EuiContextMenuItem filter when two alert categories exists', () => { + it('should display network option in filter menu', async () => { + renderResult = mockedContext.render(); + + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-network' + ); + + expect(filterMenuItem).toHaveTextContent('View network alerts'); + expect(filterMenuItem).toBeTruthy(); + }); + + it('should display process option in filter menu', async () => { + renderResult = mockedContext.render(); + + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-process' + ); + + expect(filterMenuItem).toHaveTextContent('View process alerts'); + expect(filterMenuItem).toBeTruthy(); + }); + + it('should not display file option in filter menu', async () => { + renderResult = mockedContext.render(); + + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-file' + ); + + expect(filterMenuItem).toBeNull(); + }); + }); + + describe('EuiContextMenuItem filter when all alert categories exist', () => { + const alertTypeCountsUpdated = mockAlertTypeCounts.map((alertType) => ({ + ...alertType, + count: 1, + })); + beforeEach(() => { + renderResult = mockedContext.render( + + ); + }); + + it('should display network option in filter menu', async () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-network' + ); + + expect(filterMenuItem).toHaveTextContent('View network alerts'); + expect(filterMenuItem).toBeTruthy(); + }); + + it('should display process option in filter menu', async () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-process' + ); + + expect(filterMenuItem).toHaveTextContent('View process alerts'); + expect(filterMenuItem).toBeTruthy(); + }); + + it('should display file option in filter menu', async () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + + userEvent.click(filterButton); + + const filterMenuItem = renderResult.queryByTestId( + 'sessionView:sessionViewAlertDetailsFilterItem-file' + ); + + expect(filterMenuItem).toHaveTextContent('View file alerts'); + expect(filterMenuItem).toBeTruthy(); + }); + }); + + describe('EmptyFilterButton display text', () => { + const alertTypeCountsUpdated = mockAlertTypeCounts.map((alertType) => ({ + ...alertType, + count: 1, + })); + + beforeEach(() => { + renderResult = mockedContext.render( + + ); + }); + it('should set the EmptyFilterButton text content to display "View: all alerts" by default ', () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + expect(filterButton).toHaveTextContent('View: all alerts'); + }); + + it('should set the EmptyFilterButton text content to display "View: file alerts" when file alert option is clicked', () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + userEvent.click(filterButton); + + renderResult.getByTestId('sessionView:sessionViewAlertDetailsFilterItem-file').click(); + + expect(filterButton).toHaveTextContent('View: file alerts'); + }); + + it('should set the EmptyFilterButton text content to display "View: all alerts" when default filter option is clicked', () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + userEvent.click(filterButton); + + renderResult.getByTestId('sessionView:sessionViewAlertDetailsFilterItem-default').click(); + + expect(filterButton).toHaveTextContent(`View: ${DEFAULT_ALERT_FILTER_VALUE} alerts`); + }); + + it('should set the EmptyFilterButton text content to display "View: process alerts" when process alert option is clicked', () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + userEvent.click(filterButton); + + renderResult.getByTestId('sessionView:sessionViewAlertDetailsFilterItem-process').click(); + + expect(filterButton).toHaveTextContent('View: process alerts'); + }); + + it('should set the EmptyFilterButton text content to display "View: network alerts" when network alert option is clicked', () => { + const filterButton = renderResult.getByTestId( + 'sessionView:sessionViewAlertDetailsEmptyFilterButton' + ); + userEvent.click(filterButton); + + renderResult.getByTestId('sessionView:sessionViewAlertDetailsFilterItem-network').click(); + + expect(filterButton).toHaveTextContent('View: network alerts'); + }); + }); + }); +}); diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx new file mode 100644 index 0000000000000..bbf0928281d75 --- /dev/null +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/index.tsx @@ -0,0 +1,179 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useCallback, useMemo } from 'react'; +import { + EuiContextMenuItem, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiContextMenuPanel, + EuiPopover, + EuiText, + EuiHorizontalRule, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { DEFAULT_ALERT_FILTER_VALUE } from '../../../common/constants'; +import { + ProcessEventAlertCategory, + DefaultAlertFilterType, + AlertTypeCount, +} from '../../../common/types/process_tree'; +import { useStyles } from './styles'; +import { FILTER_MENU_OPTIONS, SELECTED_PROCESS } from './translations'; + +export interface ProcessTreeAlertsFilterDeps { + totalAlertsCount: number; + alertTypeCounts: AlertTypeCount[]; + filteredAlertsCount: number; + onAlertEventCategorySelected: (value: ProcessEventAlertCategory | DefaultAlertFilterType) => void; +} + +export const ProcessTreeAlertsFilter = ({ + totalAlertsCount, + alertTypeCounts, + filteredAlertsCount, + onAlertEventCategorySelected, +}: ProcessTreeAlertsFilterDeps) => { + const { filterStatus, popover } = useStyles(); + + const [selectedProcessEventAlertCategory, setSelectedProcessEventAlertCategory] = + useState(ProcessEventAlertCategory.all); + + const [isPopoverOpen, setPopover] = useState(false); + + const onButtonClick = () => { + setPopover(!isPopoverOpen); + }; + + const closePopover = () => { + setPopover(false); + }; + + const onSelectedProcessEventAlertCategory = useCallback( + (event) => { + const [_, selectedAlertEvent] = event.target.textContent.split(' '); + setSelectedProcessEventAlertCategory(selectedAlertEvent); + onAlertEventCategorySelected(selectedAlertEvent); + closePopover(); + }, + [onAlertEventCategorySelected] + ); + + const doesMultipleAlertTypesExist = useMemo(() => { + // Check if alerts consist of at least two alert event types + const multipleAlertTypeCount = alertTypeCounts.reduce((sumOfAlertTypes, { count }) => { + if (count > 0) { + return (sumOfAlertTypes += 1); + } + return 0; + }, 0); + return multipleAlertTypeCount > 1; + }, [alertTypeCounts]); + + const alertEventCategoryFilterMenuButton = ( + + {SELECTED_PROCESS[selectedProcessEventAlertCategory]} + + ); + + const alertEventCategoryFilterMenuItems = useMemo(() => { + const getIconType = (eventCategory: ProcessEventAlertCategory | DefaultAlertFilterType) => { + return eventCategory === selectedProcessEventAlertCategory ? 'check' : 'empty'; + }; + + const alertEventFilterMenuItems = alertTypeCounts + .filter(({ count }) => count > 0) + .map(({ category: processEventAlertCategory }) => { + return ( + + {FILTER_MENU_OPTIONS[processEventAlertCategory]} + + ); + }); + + return [ + + {FILTER_MENU_OPTIONS[ProcessEventAlertCategory.all]} + , + ...alertEventFilterMenuItems, + ]; + }, [selectedProcessEventAlertCategory, alertTypeCounts, onSelectedProcessEventAlertCategory]); + + return ( +
    + + + + {totalAlertsCount === filteredAlertsCount && ( + {totalAlertsCount}, + }} + /> + )} + + {totalAlertsCount !== filteredAlertsCount && ( + + {filteredAlertsCount} of {totalAlertsCount} + + ), + }} + /> + )} + + + {doesMultipleAlertTypesExist && ( + + + + + + )} + + +
    + ); +}; diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts new file mode 100644 index 0000000000000..e10a602cfac6e --- /dev/null +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/styles.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { CSSObject } from '@emotion/react'; + +export const useStyles = () => { + const cached = useMemo(() => { + const filterStatus: CSSObject = { + paddingLeft: '16px', + '& .text': { + fontWeight: 600, + }, + }; + + const popover: CSSObject = { + paddingRight: '16px', + '& .filterMenu': { + width: '180px', + }, + }; + + return { + filterStatus, + popover, + }; + }, []); + + return cached; +}; diff --git a/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts new file mode 100644 index 0000000000000..f0bd510dd2da4 --- /dev/null +++ b/x-pack/plugins/session_view/public/components/process_tree_alerts_filter/translations.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const SELECTED_PROCESS = { + all: i18n.translate('xpack.sessionView.alertDetailsAllSelectedCategory', { + defaultMessage: 'View: all alerts', + }), + process: i18n.translate('xpack.sessionView.alertDetailsProcessSelectedCategory', { + defaultMessage: 'View: process alerts', + }), + network: i18n.translate('xpack.sessionView.alertDetailsNetworkSelectedCategory', { + defaultMessage: 'View: network alerts', + }), + file: i18n.translate('xpack.sessionView.alertDetailsFileSelectedCategory', { + defaultMessage: 'View: file alerts', + }), +}; + +export const FILTER_MENU_OPTIONS = { + all: i18n.translate('xpack.sessionView.alertDetailsAllFilterItem', { + defaultMessage: 'View all alerts', + }), + process: i18n.translate('xpack.sessionView.alertDetailsProcessFilterItem', { + defaultMessage: 'View process alerts', + }), + network: i18n.translate('xpack.sessionView.alertDetailsNetworkFilterItem', { + defaultMessage: 'View network alerts', + }), + file: i18n.translate('xpack.sessionView.alertDetailsFileFilterItem', { + defaultMessage: 'View file alerts', + }), +}; diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx b/x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx index 609a7320a19ae..554f6ba0e2ab4 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_node/buttons.tsx @@ -4,10 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiButton, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { AlertTypeCount } from '../../../common/types/process_tree'; import { useButtonStyles } from './use_button_styles'; +import { ALERT_ICONS } from '../../../common/constants'; const MAX_ALERT_COUNT = 99; @@ -53,15 +55,25 @@ export const ChildrenProcessesButton = ({ export const AlertButton = ({ isExpanded, + alertTypeCounts, onToggle, alertsCount, }: { isExpanded: boolean; + alertTypeCounts: AlertTypeCount[]; onToggle: () => void; alertsCount: number; }) => { const { alertButton, buttonArrow } = useButtonStyles(); + const alertIcons: string[] = useMemo( + () => + alertTypeCounts + ?.filter((alertTypeCount) => alertTypeCount.count > 0) + ?.map(({ category }, i) => ALERT_ICONS[category]), + [alertTypeCounts] + ); + return ( 1 ? ALERTS : ALERT} {alertsCount > 1 && (alertsCount > MAX_ALERT_COUNT ? ` (${MAX_ALERT_COUNT}+)` : ` (${alertsCount})`)} + {alertIcons?.map((icon: string) => ( + + ))} ); diff --git a/x-pack/plugins/session_view/public/components/process_tree_node/index.tsx b/x-pack/plugins/session_view/public/components/process_tree_node/index.tsx index cd3c87debf990..8994f01790bf1 100644 --- a/x-pack/plugins/session_view/public/components/process_tree_node/index.tsx +++ b/x-pack/plugins/session_view/public/components/process_tree_node/index.tsx @@ -23,7 +23,12 @@ import React, { import { EuiButton, EuiIcon, EuiToolTip, formatDate } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { Process } from '../../../common/types/process_tree'; +import { chain } from 'lodash'; +import { + AlertTypeCount, + Process, + ProcessEventAlertCategory, +} from '../../../common/types/process_tree'; import { dataOrDash } from '../../utils/data_or_dash'; import { useVisible } from '../../hooks/use_visible'; import { ProcessTreeAlerts } from '../process_tree_alerts'; @@ -126,6 +131,18 @@ export function ProcessTreeNode({ shouldAddListener: hasInvestigatedAlert, }); + const alertTypeCounts = useMemo(() => { + const alertCounts: AlertTypeCount[] = chain(alerts) + .groupBy((alert) => alert.event?.category?.[0]) + .map((processAlerts, alertCategory) => ({ + category: alertCategory as ProcessEventAlertCategory, + count: processAlerts.length, + })) + .value(); + + return alertCounts; + }, [alerts]); + useEffect(() => { if (process.id === selectedProcess?.id && nodeRef.current?.scrollIntoView) { nodeRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); @@ -301,6 +318,7 @@ export function ProcessTreeNode({ {hasAlerts && ( @@ -312,6 +330,7 @@ export function ProcessTreeNode({ {alertsExpanded && ( { background: transparentize(euiVars.euiColorVis6, 0.12), textDecoration: 'none', }, - '&.isExpanded > span svg': { + '&.isExpanded > span svg:not(.alertIcon)': { transform: `rotate(180deg)`, }, '&.isExpanded': { @@ -55,7 +55,6 @@ export const useButtonStyles = () => { const buttonArrow: CSSObject = { marginLeft: size.xs, }; - const alertButton: CSSObject = { ...button, color: euiVars.euiColorDanger, @@ -72,6 +71,14 @@ export const useButtonStyles = () => { background: `${euiVars.euiColorDanger}`, }, }, + + '& .euiButton__text': { + display: 'flex', + alignItems: 'center', + ' .alertIcon': { + marginLeft: '4px', + }, + }, }; const outputButton: CSSObject = { diff --git a/x-pack/plugins/session_view/public/utils/alert_category_display_test.test.ts b/x-pack/plugins/session_view/public/utils/alert_category_display_test.test.ts new file mode 100644 index 0000000000000..24b474111b860 --- /dev/null +++ b/x-pack/plugins/session_view/public/utils/alert_category_display_test.test.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + mockAlerts, + mockFileAlert, + mockNetworkAlert, +} from '../../common/mocks/constants/session_view_process.mock'; +import { getAlertCategoryDisplayText, getAlertNetworkDisplay } from './alert_category_display_text'; +import { ProcessEventAlertCategory } from '../../common/types/process_tree'; + +describe('getAlertCategoryDisplayText(alert, category)', () => { + it('should display file path when alert category is file', () => { + expect(getAlertCategoryDisplayText(mockFileAlert, ProcessEventAlertCategory?.file)).toEqual( + mockFileAlert?.file?.path + ); + }); + + it('should display rule name when alert category is process', () => { + expect(getAlertCategoryDisplayText(mockAlerts[0], ProcessEventAlertCategory.process)).toEqual( + undefined + ); + }); + + it('should display rule name when alert category is undefined', () => { + expect(getAlertCategoryDisplayText(mockAlerts[0], undefined)).toEqual(undefined); + }); + + it('should display rule name when file path is undefined', () => { + const fileAlert = { ...mockFileAlert, file: {} }; + expect(getAlertCategoryDisplayText(fileAlert, ProcessEventAlertCategory.file)).toEqual( + undefined + ); + }); + it('should display rule name when destination address is undefined and alert category is network', () => { + const networkAlert = { ...mockNetworkAlert, destination: undefined }; + expect(getAlertCategoryDisplayText(networkAlert, ProcessEventAlertCategory.network)).toEqual( + undefined + ); + }); +}); + +describe('getAlertNetworkDisplay(destination)', () => { + it('should show destination address and port', () => { + const text = `${mockNetworkAlert.destination.address}:${mockNetworkAlert.destination.port}`; + expect(getAlertNetworkDisplay(mockNetworkAlert.destination)).toEqual(text); + }); + + it('should show only ip address when port does not exist', () => { + const text = `${mockNetworkAlert?.destination?.address}`; + expect( + getAlertNetworkDisplay({ + ...mockNetworkAlert.destination, + port: undefined, + }) + ).toEqual(text); + }); +}); diff --git a/x-pack/plugins/session_view/public/utils/alert_category_display_text.ts b/x-pack/plugins/session_view/public/utils/alert_category_display_text.ts new file mode 100644 index 0000000000000..3ac2658f37e28 --- /dev/null +++ b/x-pack/plugins/session_view/public/utils/alert_category_display_text.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ProcessEvent, + ProcessEventAlertCategory, + ProcessEventIPAddress, +} from '../../common/types/process_tree'; +import { dataOrDash } from './data_or_dash'; + +export const getAlertCategoryDisplayText = (alert: ProcessEvent, category: string | undefined) => { + const destination = alert?.destination; + const filePath = alert?.file?.path; + + if (filePath && category === ProcessEventAlertCategory.file) return dataOrDash(filePath); + if (destination?.address && category === ProcessEventAlertCategory.network) + return dataOrDash(getAlertNetworkDisplay(destination)); + return; +}; + +export const getAlertNetworkDisplay = (destination: ProcessEventIPAddress) => { + const hasIpAddressPort = !!destination?.address && !!destination?.port; + const ipAddressPort = `${destination?.address}:${destination?.port}`; + return `${hasIpAddressPort ? ipAddressPort : destination?.address}`; +}; diff --git a/x-pack/plugins/synthetics/e2e/journeys/synthetics/add_monitor.journey.ts b/x-pack/plugins/synthetics/e2e/journeys/synthetics/add_monitor.journey.ts index 881e562d56dd8..41251d819e616 100644 --- a/x-pack/plugins/synthetics/e2e/journeys/synthetics/add_monitor.journey.ts +++ b/x-pack/plugins/synthetics/e2e/journeys/synthetics/add_monitor.journey.ts @@ -167,8 +167,17 @@ const createMonitorJourney = ({ expect(isSuccessful).toBeTruthy(); }); - step(`create ${monitorName}`, async () => { + step('handles validation', async () => { await syntheticsApp.navigateToAddMonitor(); + await syntheticsApp.ensureIsOnMonitorConfigPage(); + await syntheticsApp.clickByTestSubj('syntheticsMonitorConfigSubmitButton'); + await page.waitForSelector('text=Monitor name is required'); + await page.waitForSelector('text=Monitor script is required'); + const success = page.locator('text=Monitor added successfully.'); + expect(await success.count()).toBe(0); + }); + + step(`create ${monitorName}`, async () => { await syntheticsApp.createMonitor({ monitorConfig, monitorType }); const isSuccessful = await syntheticsApp.confirmAndSave(); expect(isSuccessful).toBeTruthy(); @@ -190,6 +199,15 @@ const createMonitorJourney = ({ expect(hasFailure).toBeFalsy(); }); + step('cannot save monitor with the same name', async () => { + await syntheticsApp.navigateToAddMonitor(); + await syntheticsApp.createMonitor({ monitorConfig, monitorType }); + await page.waitForSelector('text=Monitor name already exists'); + await syntheticsApp.clickByTestSubj('syntheticsMonitorConfigSubmitButton'); + const success = page.locator('text=Monitor added successfully.'); + expect(await success.count()).toBe(0); + }); + step('delete monitor', async () => { await syntheticsApp.navigateToMonitorManagement(); await syntheticsApp.findByText('Monitor name'); diff --git a/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts b/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts index 0f82d872c9dcd..08cc0a14a0973 100644 --- a/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts +++ b/x-pack/plugins/synthetics/e2e/journeys/synthetics/index.ts @@ -6,8 +6,7 @@ */ export * from './getting_started.journey'; -// TODO: Fix this test -// export * from './add_monitor.journey'; +export * from './add_monitor.journey'; export * from './monitor_selector.journey'; export * from './overview_sorting.journey'; // TODO: Fix this test diff --git a/x-pack/plugins/synthetics/e2e/page_objects/synthetics_app.tsx b/x-pack/plugins/synthetics/e2e/page_objects/synthetics_app.tsx index 71c4dafe5f07f..944919732b458 100644 --- a/x-pack/plugins/synthetics/e2e/page_objects/synthetics_app.tsx +++ b/x-pack/plugins/synthetics/e2e/page_objects/synthetics_app.tsx @@ -86,6 +86,7 @@ export function syntheticsAppPageProvider({ page, kibanaUrl }: { page: Page; kib }, async navigateToEditMonitor() { + await page.waitForSelector('text=Showing'); await this.clickByTestSubj('syntheticsMonitorListActions'); await page.click('text=Edit', { timeout: 2 * 60 * 1000, delay: 800 }); await this.findByText('Edit monitor'); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/pages/synthetics_page_template.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/pages/synthetics_page_template.tsx index 8558770193ae2..be330ceb997ce 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/common/pages/synthetics_page_template.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/common/pages/synthetics_page_template.tsx @@ -5,9 +5,8 @@ * 2.0. */ -import React, { useEffect, useMemo } from 'react'; -import styled from 'styled-components'; -import { EuiPageHeaderProps, EuiPageTemplateProps, useIsWithinMaxBreakpoint } from '@elastic/eui'; +import React, { useEffect } from 'react'; +import { EuiPageHeaderProps, EuiPageTemplateProps } from '@elastic/eui'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { useInspectorContext } from '@kbn/observability-plugin/public'; import { useSyntheticsDataView } from '../../../contexts'; @@ -20,12 +19,6 @@ interface Props { pageHeader?: EuiPageHeaderProps; } -const mobileCenteredHeader = ` - .euiPageHeaderContent > .euiFlexGroup > .euiFlexItem { - align-items: center; - } -`; - export const SyntheticsPageTemplateComponent: React.FC = ({ path, pageHeader, @@ -35,18 +28,8 @@ export const SyntheticsPageTemplateComponent: React.FC(); - const isMobile = useIsWithinMaxBreakpoint('s'); const PageTemplateComponent = observability.navigation.PageTemplate; - const StyledPageTemplateComponent = useMemo(() => { - return styled(PageTemplateComponent)<{ isMobile: boolean }>` - .euiPageHeaderContent > .euiFlexGroup { - flex-wrap: wrap; - } - - ${(props) => (props.isMobile ? mobileCenteredHeader : '')} - `; - }, [PageTemplateComponent]); const { loading, error, hasData } = useSyntheticsDataView(); const { inspectorAdapters } = useInspectorContext(); @@ -63,8 +46,7 @@ export const SyntheticsPageTemplateComponent: React.FC - {showLoading && }
    {children}
    -
    + ); }; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/controlled_field.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/controlled_field.tsx index 8248500d351c5..59ecdd39617a4 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/controlled_field.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/controlled_field.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { useEffect } from 'react'; import { EuiFormRow, EuiFormRowProps } from '@elastic/eui'; import { useSelector } from 'react-redux'; import { @@ -44,7 +44,7 @@ export const ControlledField = ({ dependenciesValues, dependenciesFieldMeta, }: Props) => { - const { setValue, reset, formState } = useFormContext(); + const { setValue, reset, formState, setError, clearErrors } = useFormContext(); const noop = () => {}; let hook: Function = noop; let hookProps; @@ -71,7 +71,21 @@ export const ControlledField = ({ }) : {}; const isInvalid = hookResult || Boolean(fieldState.error); + const hookErrorContent = hookProps?.error; const hookError = hookResult ? hookProps?.error : undefined; + + useEffect(() => { + if (!customHook) { + return; + } + + if (hookResult && !fieldState.error) { + setError(fieldKey, { type: 'custom', message: hookErrorContent as string }); + } else if (!hookResult && fieldState.error?.message === hookErrorContent) { + clearErrors(fieldKey); + } + }, [setError, fieldKey, clearErrors, fieldState, customHook, hookResult, hookErrorContent]); + return ( { const history = useHistory(); const editRouteMatch = useRouteMatch({ path: MONITOR_EDIT_ROUTE }); const isEdit = editRouteMatch?.isExact; - const { handleSubmit } = useFormContext(); + const { + handleSubmit, + formState: { errors }, + } = useFormContext(); const [monitorData, setMonitorData] = useState(undefined); @@ -60,7 +63,9 @@ export const ActionBar = () => { }, [data, status, monitorId, loading]); const formSubmitter = (formData: Record) => { - setMonitorData(format(formData) as SyntheticsMonitor); + if (!Object.keys(errors).length) { + setMonitorData(format(formData) as SyntheticsMonitor); + } }; return status === FETCH_STATUS.SUCCESS ? ( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_page_title.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_page_title.tsx index abe1a496df1a6..7e083fabc314f 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_page_title.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_details_page_title.tsx @@ -14,7 +14,7 @@ export const MonitorDetailsPageTitle = () => { const { monitor } = useSelectedMonitor(); return ( - + {monitor?.name} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_history/monitor_history.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_history/monitor_history.tsx index e0ed2162e6f1b..be6d3b4d47e1f 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_history/monitor_history.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_history/monitor_history.tsx @@ -4,17 +4,34 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { EuiFlexGrid, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React, { useCallback } from 'react'; -import { EuiSpacer } from '@elastic/eui'; import { useUrlParams } from '../../../hooks'; +import { useDimensions } from '../../../hooks'; import { SyntheticsDatePicker } from '../../common/date_picker/synthetics_date_picker'; +import { AvailabilityPanel } from '../monitor_summary/availability_panel'; +import { DurationPanel } from '../monitor_summary/duration_panel'; +import { MonitorDurationTrend } from '../monitor_summary/duration_trend'; +import { TestRunsTable } from '../monitor_summary/test_runs_table'; +import { MonitorErrorsCount } from '../monitor_summary/monitor_errors_count'; +import { MonitorCompleteCount } from '../monitor_summary/monitor_complete_count'; +import { MonitorTotalRunsCount } from '../monitor_summary/monitor_total_runs_count'; +import { MonitorErrorSparklines } from '../monitor_summary/monitor_error_sparklines'; +import { AvailabilitySparklines } from '../monitor_summary/availability_sparklines'; +import { DurationSparklines } from '../monitor_summary/duration_sparklines'; +import { MonitorCompleteSparklines } from '../monitor_summary/monitor_complete_sparklines'; import { MonitorStatusPanel } from '../monitor_status/monitor_status_panel'; +const STATS_WIDTH_SINGLE_COLUMN_THRESHOLD = 360; // ✨ determined by trial and error + export const MonitorHistory = () => { const [useGetUrlParams, updateUrlParams] = useUrlParams(); const { dateRangeStart, dateRangeEnd } = useGetUrlParams(); + const { elementRef: statsRef, width: statsWidth } = useDimensions(); + const statsColumns = statsWidth && statsWidth < STATS_WIDTH_SINGLE_COLUMN_THRESHOLD ? 1 : 2; + const handleStatusChartBrushed = useCallback( ({ fromUtc, toUtc }) => { updateUrlParams({ dateRangeStart: fromUtc, dateRangeEnd: toUtc }); @@ -23,18 +40,96 @@ export const MonitorHistory = () => { ); return ( - <> - - - - - + + + + + + + + {/* @ts-expect-error Current @elastic/eui has the wrong types for the ref */} + + +

    {STATS_LABEL}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +

    {DURATION_TREND_LABEL}

    +
    + +
    +
    +
    +
    + + + + + + +
    ); }; + +const STATS_LABEL = i18n.translate('xpack.synthetics.historyPanel.stats', { + defaultMessage: 'Stats', +}); + +const DURATION_TREND_LABEL = i18n.translate('xpack.synthetics.historyPanel.durationTrends', { + defaultMessage: 'Duration trends', +}); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/monitor_selector.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/monitor_selector.tsx index 3fb4ff71aaf74..6b5dc92941a71 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/monitor_selector.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/monitor_selector.tsx @@ -65,7 +65,12 @@ export const MonitorSelector = () => { }; const button = ( - + ); return ( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_panel.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_panel.tsx index 14fe439556ca2..f1bf2bf65ba5d 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_panel.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_panel.tsx @@ -10,6 +10,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ReportTypes } from '@kbn/observability-plugin/public'; import { ClientPluginsStart } from '../../../../../plugin'; import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface AvailabilityPanelprops { from: string; @@ -22,11 +23,17 @@ export const AvailabilityPanel = (props: AvailabilityPanelprops) => { observability: { ExploratoryViewEmbeddable }, }, } = useKibana(); + const selectedLocation = useSelectedLocation(); const monitorId = useMonitorQueryId(); + if (!selectedLocation) { + return null; + } + return ( { name: 'Monitor availability', dataType: 'synthetics', selectedMetricField: 'monitor_availability', - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, }, ]} /> diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_sparklines.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_sparklines.tsx index 8691b0d176613..905c7c899b6e8 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_sparklines.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/availability_sparklines.tsx @@ -10,6 +10,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ReportTypes, useTheme } from '@kbn/observability-plugin/public'; import { ClientPluginsStart } from '../../../../../plugin'; import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface AvailabilitySparklinesProps { from: string; @@ -26,6 +27,12 @@ export const AvailabilitySparklines = (props: AvailabilitySparklinesProps) => { const theme = useTheme(); + const selectedLocation = useSelectedLocation(); + + if (!selectedLocation) { + return null; + } + return ( { name: 'Monitor availability', dataType: 'synthetics', selectedMetricField: 'monitor_availability', - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, color: theme.eui.euiColorVis1, }, ]} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_panel.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_panel.tsx index 6a5d3c813ffee..21e9f7fd9ed96 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_panel.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_panel.tsx @@ -9,8 +9,8 @@ import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ReportTypes } from '@kbn/observability-plugin/public'; import { ClientPluginsStart } from '../../../../../plugin'; - import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface DurationPanelProps { from: string; @@ -23,10 +23,17 @@ export const DurationPanel = (props: DurationPanelProps) => { observability: { ExploratoryViewEmbeddable }, }, } = useKibana(); + const selectedLocation = useSelectedLocation(); + const monitorId = useMonitorQueryId(); + if (!selectedLocation) { + return null; + } + return ( { name: 'Monitor duration', dataType: 'synthetics', selectedMetricField: 'monitor_duration', - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, }, ]} /> diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_sparklines.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_sparklines.tsx index eee490054a298..dfdba4dc11a93 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_sparklines.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_sparklines.tsx @@ -10,6 +10,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ReportTypes, useTheme } from '@kbn/observability-plugin/public'; import { useParams } from 'react-router-dom'; import { ClientPluginsStart } from '../../../../../plugin'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface DurationSparklinesProps { from: string; @@ -26,6 +27,12 @@ export const DurationSparklines = (props: DurationSparklinesProps) => { const theme = useTheme(); + const selectedLocation = useSelectedLocation(); + + if (!selectedLocation) { + return null; + } + return ( <> { name: 'Monitor duration', dataType: 'synthetics', selectedMetricField: 'monitor.duration.us', - reportDefinitions: { config_id: [monitorId] }, + reportDefinitions: { + config_id: [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, color: theme.eui.euiColorVis1, }, ]} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_trend.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_trend.tsx index cd26118009e56..e104eeb87abdd 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_trend.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/duration_trend.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ClientPluginsStart } from '../../../../../plugin'; import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface MonitorDurationTrendProps { from: string; @@ -21,9 +22,14 @@ export const MonitorDurationTrend = (props: MonitorDurationTrendProps) => { const { ExploratoryViewEmbeddable } = observability; const monitorId = useMonitorQueryId(); + const selectedLocation = useSelectedLocation(); const metricsToShow = ['min', 'max', 'median', '25th', '75th']; + if (!selectedLocation) { + return null; + } + return ( { time: props, name: metric + ' Series', selectedMetricField: 'monitor.duration.us', - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, seriesType: 'line', operationType: metric, }))} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_count.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_count.tsx new file mode 100644 index 0000000000000..7740ba9ce0670 --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_count.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import React from 'react'; +import { ReportTypes } from '@kbn/observability-plugin/public'; +import { ClientPluginsStart } from '../../../../../plugin'; +import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; + +interface MonitorCompleteCountProps { + from: string; + to: string; +} + +export const MonitorCompleteCount = (props: MonitorCompleteCountProps) => { + const { observability } = useKibana().services; + + const { ExploratoryViewEmbeddable } = observability; + + const monitorId = useMonitorQueryId(); + + return ( + + ); +}; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_sparklines.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_sparklines.tsx new file mode 100644 index 0000000000000..8318c699b0410 --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_complete_sparklines.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import React from 'react'; +import { useEuiTheme } from '@elastic/eui'; +import { ClientPluginsStart } from '../../../../../plugin'; +import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; + +interface Props { + from: string; + to: string; +} +export const MonitorCompleteSparklines = (props: Props) => { + const { observability } = useKibana().services; + + const { ExploratoryViewEmbeddable } = observability; + + const monitorId = useMonitorQueryId(); + + const { euiTheme } = useEuiTheme(); + + return ( + + ); +}; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_error_sparklines.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_error_sparklines.tsx index 515d338b4c33a..6d96e8e39e966 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_error_sparklines.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_error_sparklines.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { useParams } from 'react-router-dom'; import { useEuiTheme } from '@elastic/eui'; import { ClientPluginsStart } from '../../../../../plugin'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface Props { from: string; @@ -24,6 +25,12 @@ export const MonitorErrorSparklines = (props: Props) => { const { euiTheme } = useEuiTheme(); + const selectedLocation = useSelectedLocation(); + + if (!selectedLocation) { + return null; + } + return ( { { seriesType: 'area', time: props, - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, dataType: 'synthetics', - selectedMetricField: 'state.id', + selectedMetricField: 'state.up', name: 'Monitor errors', color: euiTheme.colors.danger, operationType: 'unique_count', diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_errors_count.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_errors_count.tsx index c4740a74f889f..b430ac206315b 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_errors_count.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/monitor_errors_count.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { ReportTypes } from '@kbn/observability-plugin/public'; import { ClientPluginsStart } from '../../../../../plugin'; import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; +import { useSelectedLocation } from '../hooks/use_selected_location'; interface MonitorErrorsCountProps { from: string; @@ -23,14 +24,24 @@ export const MonitorErrorsCount = (props: MonitorErrorsCountProps) => { const monitorId = useMonitorQueryId(); + const selectedLocation = useSelectedLocation(); + + if (!selectedLocation) { + return null; + } + return ( { + const { observability } = useKibana().services; + + const { ExploratoryViewEmbeddable } = observability; + + const monitorId = useMonitorQueryId(); + + return ( + + ); +}; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/step_duration_panel.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/step_duration_panel.tsx index e4ae46a2368f6..9292b5955727f 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/step_duration_panel.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_details/monitor_summary/step_duration_panel.tsx @@ -15,6 +15,7 @@ import { Position } from '@elastic/charts/dist/utils/common'; import { useMonitorQueryId } from '../hooks/use_monitor_query_id'; import { useSelectedMonitor } from '../hooks/use_selected_monitor'; import { ClientPluginsStart } from '../../../../../plugin'; +import { useSelectedLocation } from '../hooks/use_selected_location'; export const StepDurationPanel = ({ legendPosition }: { legendPosition?: Position }) => { const { observability } = useKibana().services; @@ -25,8 +26,14 @@ export const StepDurationPanel = ({ legendPosition }: { legendPosition?: Positio const monitorId = useMonitorQueryId(); + const selectedLocation = useSelectedLocation(); + const isBrowser = monitor?.type === 'browser'; + if (!selectedLocation) { + return null; + } + return ( @@ -50,7 +57,10 @@ export const StepDurationPanel = ({ legendPosition }: { legendPosition?: Positio attributes={[ { name: DURATION_BY_STEP_LABEL, - reportDefinitions: { 'monitor.id': [monitorId] }, + reportDefinitions: { + 'monitor.id': [monitorId], + 'observer.geo.name': [selectedLocation?.label], + }, selectedMetricField: isBrowser ? 'synthetics.step.duration.us' : 'monitor.duration.us', dataType: 'synthetics', time: { from: 'now-24h/h', to: 'now' }, diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/create_monitor_button.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/create_monitor_button.tsx new file mode 100644 index 0000000000000..a476662f9ad8c --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/create_monitor_button.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { useContext } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiButton } from '@elastic/eui'; +import { useEnablement } from '../../hooks'; +import { MONITOR_ADD_ROUTE } from '../../../../../common/constants'; + +import { SyntheticsSettingsContext } from '../../contexts/synthetics_settings_context'; + +export const CreateMonitorButton: React.FC = () => { + const { basePath } = useContext(SyntheticsSettingsContext); + + const { + enablement: { isEnabled }, + } = useEnablement(); + + return ( + + + + ); +}; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/page_header/monitors_page_header.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/page_header/monitors_page_header.tsx index 763965b0af17a..8fd9f969d8e98 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/page_header/monitors_page_header.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/page_header/monitors_page_header.tsx @@ -5,53 +5,21 @@ * 2.0. */ -import React, { useContext } from 'react'; +import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiBetaBadge, EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; - -import { useEnablement } from '../../../../hooks'; -import { MONITOR_ADD_ROUTE } from '../../../../../../../common/constants'; - -import { SyntheticsSettingsContext } from '../../../../contexts/synthetics_settings_context'; +import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { BETA_TOOLTIP_MESSAGE } from '../labels'; -export const MonitorsPageHeader = () => { - const { basePath } = useContext(SyntheticsSettingsContext); - - const { - enablement: { isEnabled }, - } = useEnablement(); - - return ( - - - - - -
    - -
    -
    - - - - - -
    - ); -}; +export const MonitorsPageHeader = () => ( + + + + + +
    + +
    +
    +
    +); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx index c9abcf852c421..0b3c1cf701278 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item.tsx @@ -46,14 +46,10 @@ export const MetricItem = ({ const theme = useTheme(); return ( -
    +
    {loaded ? ( { if (!isMouseOver) { setIsMouseOver(true); @@ -65,7 +61,6 @@ export const MetricItem = ({ } }} style={{ - padding: '0px', height: '100%', overflow: 'hidden', }} @@ -88,7 +83,7 @@ export const MetricItem = ({ extra: ( {i18n.translate('xpack.synthetics.overview.duration.label', { - defaultMessage: 'Duration', + defaultMessage: 'Duration Avg.', })} ), diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx index be5a979bc6e77..b448f98c3cfd5 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx @@ -10,7 +10,6 @@ import { EuiBadgeGroup, EuiButton, EuiButtonEmpty, - EuiButtonIcon, EuiContextMenu, EuiDescriptionList, EuiDescriptionListDescription, @@ -24,6 +23,7 @@ import { EuiFlyoutFooter, EuiFlyoutHeader, EuiHealth, + EuiIcon, EuiLink, EuiLoadingSpinner, EuiPageSection, @@ -31,6 +31,7 @@ import { EuiPopover, EuiSpacer, EuiTitle, + useIsWithinMaxBreakpoint, } from '@elastic/eui'; import { SavedObject } from '@kbn/core/public'; import { FetcherResult } from '@kbn/observability-plugin/public/hooks/use_fetcher'; @@ -175,30 +176,26 @@ function LocationSelect({ const [isOpen, setIsOpen] = useState(false); const isDown = !!locations.find((l) => l.observer?.geo?.name === currentLocation)?.summary?.down; return ( - - - - {ENABLED_ITEM_TEXT} - - - - - + {LOCATION_TITLE_TEXT} - {currentLocation} setIsOpen(!isOpen)} - size="xs" - /> + <> + setIsOpen(!isOpen)} + > + + {currentLocation} + + + + + + } isOpen={isOpen} closePopover={() => setIsOpen(false)} @@ -239,6 +236,24 @@ function LocationSelect({ + + + {ENABLED_ITEM_TEXT} + + + + + + + ); +} + +function LoadingState() { + return ( + + + + ); } @@ -278,15 +293,22 @@ export function MonitorDetailFlyout(props: Props) { const locationStatuses = useStatusByLocation(id); const locations = locationStatuses.locations?.filter((l: any) => !!l?.observer?.geo?.name) ?? []; + const isOverlay = useIsWithinMaxBreakpoint('xl'); + return ( - + {status === FETCH_STATUS.FAILURE && {error?.message}} - {status === FETCH_STATUS.LOADING && } + {status === FETCH_STATUS.LOADING && } {status === FETCH_STATUS.SUCCESS && monitorSavedObject && ( <> - +

    {monitorSavedObject?.attributes[ConfigKey.NAME]}

    @@ -403,6 +425,7 @@ export function MonitorDetailFlyout(props: Props) { href={detailLink} iconType="sortRight" iconSide="right" + fill > {GO_TO_MONITOR_LINK_TEXT} @@ -551,11 +574,11 @@ const GO_TO_LOCATIONS_LABEL = i18n.translate( } ); -const LOCATION_SELECT_POPOVER_ICON_BUTTON_LABEL = i18n.translate( +const LOCATION_SELECT_POPOVER_LINK_LABEL = i18n.translate( 'xpack.synthetics.monitorList.flyout.locationSelect.iconButton.label', { defaultMessage: - "This icon button opens a context menu that will allow you to change the monitor's selected location. If you change the location, the flyout will display metrics for the monitor's performance in that location.", + "This button opens a context menu that will allow you to change the monitor's selected location. If you change the location, the flyout will display metrics for the monitor's performance in that location.", } ); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx index 4f1c05e92e1bc..649cb1048af35 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_grid.tsx @@ -100,7 +100,7 @@ export const OverviewGrid = memo(() => { return ( <> - + { setPage(1)} /> - + {loaded && currentMonitors.length ? ( - + {currentMonitors.map((monitor) => ( { return ( - + ); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_loader.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_loader.tsx index 92cb67187b5bb..80fdf130313d3 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_loader.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/overview_loader.tsx @@ -15,7 +15,7 @@ export const OverviewLoader = () => { const loaders = Array(ROWS * COLUMNS).fill(null); return ( <> - + {loaders.map((_, i) => ( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_fields.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_fields.tsx index 5bd3dfd44dd33..007e0b1e1cc82 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_fields.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_fields.tsx @@ -146,7 +146,7 @@ const getOrderContent = (sortField: string) => { }; const SORT_TITLE = i18n.translate('xpack.synthetics.overview.sortPopover.sort.title', { - defaultMessage: 'Sort', + defaultMessage: 'Sort by', }); const SORT_ALPHABETICAL_ASC = i18n.translate( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_menu.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_menu.tsx index c512fcb0bf388..b7c7fc0c21361 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_menu.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/sort_menu.tsx @@ -84,7 +84,7 @@ export const SortMenu = ({ sortOptions, orderOptions, sortField }: Props) => { panelPaddingSize="none" anchorPosition="downLeft" > - + ); }; @@ -102,15 +102,16 @@ const ContextMenuItem = ({ return ( { onClosePopover(); option.onClick(); }} - style={{ - marginRight: 24, - }} + // style={{ + // marginRight: 24, + // }} > {option.label} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/index.ts b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/index.ts index 7ec5fccf3d6e4..8909b0d373472 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/index.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/index.ts @@ -15,3 +15,4 @@ export * from './use_last_50_duration_chart'; export * from './use_location_name'; export * from './use_status_by_location'; export * from './use_composite_image'; +export * from './use_dimensions'; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_dimensions.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_dimensions.tsx new file mode 100644 index 0000000000000..25e76b0358aa6 --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_dimensions.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useRef, useState } from 'react'; + +/** Returns a `ref` to attach to a DOM element, and its dimensions. */ +export function useDimensions() { + const [dimensions, setDimensions] = useState<{ width: number; height: number } | undefined>(); + const elementRef = useRef(); + + const resizeObserverInstance = useRef( + new ResizeObserver((entries) => { + if (entries && entries[0]) { + setDimensions({ + width: entries[0].contentRect.width, + height: entries[0].contentRect.height, + }); + } + }) + ); + + useEffect(() => { + // This makes ESLint happy. The cleanup function cannot point to the + // `.current` property of a ref. + const ref = elementRef.current; + const resizeObserver = resizeObserverInstance.current; + + if (ref) { + resizeObserver.observe(ref); + } + + return () => { + if (ref) { + resizeObserver.unobserve(ref); + } + }; + + // ESlint complains about this dependencies not triggering `useEffect` + // because they are mutable. This is not a problem for our case. We don't + // care if the attached DOM node mutates. We only want to know when the node + // gets attached to the ref. + // + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [elementRef.current, resizeObserverInstance.current]); + + return { elementRef, ...dimensions }; +} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/routes.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/routes.tsx index 950e41652059e..fb28f293ae6ae 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/routes.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/routes.tsx @@ -7,14 +7,7 @@ import { EuiThemeComputed } from '@elastic/eui/src/services/theme/types'; import React, { FC, useEffect } from 'react'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiLink, - EuiPageHeaderProps, - useEuiTheme, -} from '@elastic/eui'; +import { EuiIcon, EuiLink, EuiPageHeaderProps, useEuiTheme } from '@elastic/eui'; import { Route, Switch, useHistory, useRouteMatch } from 'react-router-dom'; import { OutPortal } from 'react-reverse-portal'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -33,6 +26,7 @@ import { MonitorDetailsPageTitle } from './components/monitor_details/monitor_de import { MonitorDetailsPage } from './components/monitor_details/monitor_details_page'; import { GettingStartedPage } from './components/getting_started/getting_started_page'; import { MonitorsPageHeader } from './components/monitors_page/management/page_header/monitors_page_header'; +import { CreateMonitorButton } from './components/monitors_page/create_monitor_button'; import { OverviewPage } from './components/monitors_page/overview/overview_page'; import { SyntheticsPageTemplateComponent } from './components/common/pages/synthetics_page_template'; import { NotFoundPage } from './components/common/pages/not_found'; @@ -155,19 +149,8 @@ const getRoutes = ( component: OverviewPage, dataTestSubj: 'syntheticsOverviewPage', pageHeader: { - pageTitle: ( - - - - - - ), - rightSideItems: [ - /* */ - ], + pageTitle: , + rightSideItems: [], tabs: [ { label: ( @@ -206,6 +189,7 @@ const getRoutes = ( dataTestSubj: 'syntheticsMonitorManagementPage', pageHeader: { pageTitle: , + rightSideItems: [], tabs: [ { label: ( @@ -240,6 +224,7 @@ const getRoutes = ( ), dataTestSubj: 'syntheticsMonitorAddPage', + restrictWidth: true, pageHeader: { pageTitle: ( ), dataTestSubj: 'syntheticsMonitorEditPage', + restrictWidth: true, pageHeader: { pageTitle: ( { return encryptedSavedObjects.createMigration< @@ -31,5 +32,6 @@ export const migration860 = (encryptedSavedObjects: EncryptedSavedObjectsPluginS }, }; }, + migratedType: SYNTHETICS_MONITOR_ENCRYPTED_TYPE, }); }; diff --git a/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/saved_objects.ts b/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/saved_objects.ts index 24d3cc03b6ca2..6ddf333a8c5f1 100644 --- a/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/saved_objects.ts +++ b/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/saved_objects.ts @@ -10,12 +10,14 @@ import { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-p import { privateLocationsSavedObject } from './private_locations'; import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants'; -import { secretKeys } from '../../../../common/constants/monitor_management'; import { DynamicSettings } from '../../../../common/runtime_types'; import { UMSavedObjectsQueryFn } from '../adapters'; import { UptimeConfig } from '../../../../common/config'; import { settingsObjectId, umDynamicSettings } from './uptime_settings'; -import { syntheticsMonitorType, getSyntheticsMonitorSavedObjectType } from './synthetics_monitor'; +import { + getSyntheticsMonitorSavedObjectType, + SYNTHETICS_MONITOR_ENCRYPTED_TYPE, +} from './synthetics_monitor'; import { syntheticsServiceApiKey } from './service_api_key'; export const registerUptimeSavedObjects = ( @@ -33,19 +35,7 @@ export const registerUptimeSavedObjects = ( attributesToEncrypt: new Set(['apiKey']), }); - encryptedSavedObjects.registerType({ - type: syntheticsMonitorType, - attributesToEncrypt: new Set([ - 'secrets', - /* adding secretKeys to the list of attributes to encrypt ensures - * that secrets are never stored on the resulting saved object, - * even in the presence of developer error. - * - * In practice, all secrets should be stored as a single JSON - * payload on the `secrets` key. This ensures performant decryption. */ - ...secretKeys, - ]), - }); + encryptedSavedObjects.registerType(SYNTHETICS_MONITOR_ENCRYPTED_TYPE); }; export interface UMSavedObjectsAdapter { diff --git a/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/synthetics_monitor.ts b/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/synthetics_monitor.ts index 6d7996bbff8a3..4967ebb5af446 100644 --- a/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/synthetics_monitor.ts +++ b/x-pack/plugins/synthetics/server/legacy_uptime/lib/saved_objects/synthetics_monitor.ts @@ -7,10 +7,25 @@ import { EncryptedSavedObjectsPluginSetup } from '@kbn/encrypted-saved-objects-plugin/server'; import { SavedObjectsType } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; +import { secretKeys } from '../../../../common/constants/monitor_management'; import { monitorMigrations } from './migrations/monitors'; export const syntheticsMonitorType = 'synthetics-monitor'; +export const SYNTHETICS_MONITOR_ENCRYPTED_TYPE = { + type: syntheticsMonitorType, + attributesToEncrypt: new Set([ + 'secrets', + /* adding secretKeys to the list of attributes to encrypt ensures + * that secrets are never stored on the resulting saved object, + * even in the presence of developer error. + * + * In practice, all secrets should be stored as a single JSON + * payload on the `secrets` key. This ensures performant decryption. */ + ...secretKeys, + ]), +}; + export const getSyntheticsMonitorSavedObjectType = ( encryptedSavedObjects: EncryptedSavedObjectsPluginSetup ): SavedObjectsType => { diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts index 1634f3f18a67f..4c893d1abd18b 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts @@ -152,7 +152,6 @@ export class SyntheticsService { description: 'This task periodically pushes saved monitors to Synthetics Service.', timeout: '1m', maxAttempts: 3, - maxConcurrency: 1, createTaskRunner: ({ taskInstance }: { taskInstance: ConcreteTaskInstance }) => { return { diff --git a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts index c5f23c2b6d39b..4b405b35d26f6 100644 --- a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts +++ b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts @@ -67,7 +67,7 @@ export const FLYOUT_TITLE = `[data-test-subj="tiIndicatorFlyoutTitle"]`; export const FLYOUT_TABS = `[data-test-subj="tiIndicatorFlyoutTabs"]`; -export const FLYOUT_TABLE = `[data-test-subj="tiFlyoutTableTabRow"]`; +export const FLYOUT_TABLE = `[data-test-subj="tiFlyoutTable"]`; export const FLYOUT_JSON = `[data-test-subj="tiFlyoutJsonCodeBlock"]`; @@ -99,13 +99,13 @@ export const FLYOUT_BLOCK_MORE_ACTIONS_BUTTON = '[data-test-subj="tiFlyoutOverviewHighLevelBlocksPopoverButton"] button'; export const FLYOUT_TABLE_TAB_ROW_TIMELINE_BUTTON = - '[data-test-subj="tiFlyoutTableTabRowTimelineButton"]'; + '[data-test-subj="tiFlyoutTableTimelineButton"]'; export const FLYOUT_TABLE_TAB_ROW_FILTER_IN_BUTTON = - '[data-test-subj="tiFlyoutTableTabRowFilterInButton"]'; + '[data-test-subj="tiFlyoutTableFilterInButton"]'; export const FLYOUT_TABLE_TAB_ROW_FILTER_OUT_BUTTON = - '[data-test-subj="tiFlyoutTableTabRowFilterOutButton"]'; + '[data-test-subj="tiFlyoutTableFilterOutButton"]'; /* Field selector */ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/table_tab/table_tab.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/table_tab/table_tab.tsx index 0f0a699733ccb..e1d588b9959e1 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/table_tab/table_tab.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/table_tab/table_tab.tsx @@ -10,7 +10,7 @@ import { Indicator } from '../../../../../../common/types/indicator'; import { IndicatorEmptyPrompt } from '../empty_prompt'; import { IndicatorFieldsTable } from '../fields_table'; -export const TABLE_TEST_ID = 'tiFlyoutTableTabRow'; +export const TABLE_TEST_ID = 'tiFlyoutTable'; const search = { box: { diff --git a/x-pack/plugins/timelines/public/container/index.tsx b/x-pack/plugins/timelines/public/container/index.tsx index 7378c874558f3..8acc00d6d0004 100644 --- a/x-pack/plugins/timelines/public/container/index.tsx +++ b/x-pack/plugins/timelines/public/container/index.tsx @@ -347,6 +347,7 @@ export const useTimelineEventsHandler = ({ from: startDate, to: endDate, }, + filterStatus, }; const newActivePage = deepEqual(prevSearchParameters, currentSearchParameters) @@ -450,6 +451,7 @@ export const useTimelineEvents = ({ indexNames, fields, filterQuery, + filterStatus, startDate, language = 'kuery', limit, @@ -465,6 +467,7 @@ export const useTimelineEvents = ({ endDate, entityType, excludeEcsData, + filterStatus, id, indexNames, fields, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 4d771e2f3dfdd..c8cbb70072d23 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -23358,7 +23358,6 @@ "xpack.observability.enableComparisonByDefaultDescription": "Activer la fonctionnalité de comparaison dans l’application APM", "xpack.observability.enableInspectEsQueriesExperimentDescription": "Inspectez les recherches Elasticsearch dans les réponses API.", "xpack.observability.enableInspectEsQueriesExperimentName": "Inspecter les recherches ES", - "xpack.observability.enableNewSyntheticsViewExperimentDescription": "Activez la nouvelle application de monitoring synthétique dans Observability. Actualisez la page pour appliquer le paramètre.", "xpack.observability.enableNewSyntheticsViewExperimentName": "Activer la nouvelle application de monitoring synthétique", "xpack.observability.exp.breakDownFilter.noBreakdown": "Pas de répartition", "xpack.observability.exp.breakDownFilter.unavailable": "La répartition par nom d'étape n'est pas disponible pour l'indicateur de durée de monitoring. Utilisez l'indicateur de durée d'étape pour répartir par nom d'étape.", @@ -31210,7 +31209,6 @@ "xpack.synthetics.overview.duration.label": "Durée", "xpack.synthetics.overview.heading": "Moniteurs", "xpack.synthetics.overview.monitors.label": "Moniteurs", - "xpack.synthetics.overview.pageHeader.title": "Aperçu", "xpack.synthetics.overviewPage.overviewCrumb": "Aperçu", "xpack.synthetics.overviewPageLink.disabled.ariaLabel": "Bouton de pagination désactivé indiquant qu'aucune autre navigation ne peut être effectuée dans la liste des moniteurs.", "xpack.synthetics.overviewPageLink.next.ariaLabel": "Page de résultats suivante", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cea28573ffa7b..4d7f13bdd9aaa 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -23337,7 +23337,6 @@ "xpack.observability.enableComparisonByDefaultDescription": "APMアプリで比較機能を有効にする", "xpack.observability.enableInspectEsQueriesExperimentDescription": "API応答でElasticsearchクエリを調査します。", "xpack.observability.enableInspectEsQueriesExperimentName": "ESクエリを調査", - "xpack.observability.enableNewSyntheticsViewExperimentDescription": "オブザーバビリティで新しい合成監視アプリケーションを有効にします。設定を適用するにはページを更新してください。", "xpack.observability.enableNewSyntheticsViewExperimentName": "新しい合成監視アプリケーションを有効にする", "xpack.observability.exp.breakDownFilter.noBreakdown": "内訳なし", "xpack.observability.exp.breakDownFilter.unavailable": "モニター期間メトリックでは、ステップ名内訳を使用できません。ステップ期間メトリックを使用して、ステップ名で分解します。", @@ -31186,7 +31185,6 @@ "xpack.synthetics.overview.duration.label": "期間", "xpack.synthetics.overview.heading": "監視", "xpack.synthetics.overview.monitors.label": "監視", - "xpack.synthetics.overview.pageHeader.title": "概要", "xpack.synthetics.overviewPage.overviewCrumb": "概要", "xpack.synthetics.overviewPageLink.disabled.ariaLabel": "無効になったページ付けボタンです。モニターリストがこれ以上ナビゲーションできないことを示しています。", "xpack.synthetics.overviewPageLink.next.ariaLabel": "次の結果ページ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a870f3bba1c68..0d1d73517f78b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -23368,7 +23368,6 @@ "xpack.observability.enableComparisonByDefaultDescription": "在 APM 应用中启用对比功能", "xpack.observability.enableInspectEsQueriesExperimentDescription": "检查 API 响应中的 Elasticsearch 查询。", "xpack.observability.enableInspectEsQueriesExperimentName": "检查 ES 查询", - "xpack.observability.enableNewSyntheticsViewExperimentDescription": "在 Observability 中启用新的组合监测应用程序。刷新页面可应用该设置。", "xpack.observability.enableNewSyntheticsViewExperimentName": "启用新的组合监测应用程序", "xpack.observability.exp.breakDownFilter.noBreakdown": "无细目", "xpack.observability.exp.breakDownFilter.unavailable": "步骤名称细目不可用于监测持续时间指标。使用步骤持续时间指标以按步骤名称细分。", @@ -31221,7 +31220,6 @@ "xpack.synthetics.overview.duration.label": "持续时间", "xpack.synthetics.overview.heading": "监测", "xpack.synthetics.overview.monitors.label": "监测", - "xpack.synthetics.overview.pageHeader.title": "概览", "xpack.synthetics.overviewPage.overviewCrumb": "概览", "xpack.synthetics.overviewPageLink.disabled.ariaLabel": "禁用的分页按钮表示在监测列表中无法进行进一步导航。", "xpack.synthetics.overviewPageLink.next.ariaLabel": "下页结果", diff --git a/x-pack/test/api_integration/apis/management/index_management/indices.js b/x-pack/test/api_integration/apis/management/index_management/indices.js index 02b391bf1a2d6..b617a1ba14f4a 100644 --- a/x-pack/test/api_integration/apis/management/index_management/indices.js +++ b/x-pack/test/api_integration/apis/management/index_management/indices.js @@ -33,7 +33,8 @@ export default function ({ getService }) { clearCache, } = registerHelpers({ supertest }); - describe('indices', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/145022 + describe.skip('indices', () => { after(() => Promise.all([cleanUpEsResources()])); describe('clear cache', () => { diff --git a/x-pack/test/api_integration/apis/metrics_ui/inventory_threshold_alert.ts b/x-pack/test/api_integration/apis/metrics_ui/inventory_threshold_alert.ts index 077d362960259..8fc78999ae590 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/inventory_threshold_alert.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/inventory_threshold_alert.ts @@ -630,7 +630,7 @@ export default function ({ getService }: FtrProviderContext) { context: { cloud: undefined, host: undefined, - container: undefined, + container: [], orchestrator: undefined, labels: undefined, tags: undefined, @@ -651,7 +651,7 @@ export default function ({ getService }: FtrProviderContext) { context: { cloud: undefined, host: undefined, - container: undefined, + container: [], orchestrator: undefined, labels: undefined, tags: undefined, @@ -689,7 +689,14 @@ export default function ({ getService }: FtrProviderContext) { context: { cloud: undefined, host: undefined, - container: undefined, + container: [ + { + id: 'container-03', + }, + { + id: 'container-04', + }, + ], orchestrator: undefined, labels: undefined, tags: undefined, @@ -710,7 +717,14 @@ export default function ({ getService }: FtrProviderContext) { context: { cloud: undefined, host: undefined, - container: undefined, + container: [ + { + id: 'container-01', + }, + { + id: 'container-02', + }, + ], orchestrator: undefined, labels: undefined, tags: undefined, diff --git a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts index e4835644bd935..f8131592c399f 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_monitor_private_location.ts @@ -222,7 +222,8 @@ export default function ({ getService }: FtrProviderContext) { ); const packagePolicy = apiResponsePolicy.body.items.find( - (pkgPolicy: PackagePolicy) => pkgPolicy.id === newMonitorId + '-' + testFleetPolicyID + (pkgPolicy: PackagePolicy) => + pkgPolicy.id === newMonitorId + '-' + testFleetPolicyID + '-default' ); expect(packagePolicy).eql(undefined); @@ -307,10 +308,74 @@ export default function ({ getService }: FtrProviderContext) { formatKibanaNamespace(SPACE_ID) ) ); + await supertestWithoutAuth + .delete(`/s/${SPACE_ID}${API_URLS.SYNTHETICS_MONITORS}/${monitorId}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send() + .expect(200); } finally { await security.user.delete(username); await security.role.delete(roleName); } }); + + it('handles auto upgrading policies', async () => { + let monitorId = ''; + + const monitor = { + ...httpMonitorJson, + name: `Test monitor ${uuid.v4()}`, + [ConfigKey.NAMESPACE]: 'default', + locations: [ + { + id: testFleetPolicyID, + label: 'Test private location 0', + isServiceManaged: false, + }, + ], + }; + + try { + const apiResponse = await supertestAPI + .post(API_URLS.SYNTHETICS_MONITORS) + .set('kbn-xsrf', 'true') + .send(monitor); + + monitorId = apiResponse.body.id; + + const policyResponse = await supertestAPI.get( + '/api/fleet/package_policies?page=1&perPage=2000&kuery=ingest-package-policies.package.name%3A%20synthetics' + ); + + const packagePolicy = policyResponse.body.items.find( + (pkgPolicy: PackagePolicy) => + pkgPolicy.id === monitorId + '-' + testFleetPolicyID + `-default` + ); + + expect(packagePolicy.package.version).eql('0.10.3'); + + await supertestAPI + .post('/api/fleet/epm/packages/synthetics/0.11.2') + .set('kbn-xsrf', 'true') + .send({ force: true }); + + await supertestAPI.post('/api/fleet/setup').set('kbn-xsrf', 'true').send().expect(200); + const policyResponseAfterUpgrade = await supertestAPI.get( + '/api/fleet/package_policies?page=1&perPage=2000&kuery=ingest-package-policies.package.name%3A%20synthetics' + ); + const packagePolicyAfterUpgrade = policyResponseAfterUpgrade.body.items.find( + (pkgPolicy: PackagePolicy) => + pkgPolicy.id === monitorId + '-' + testFleetPolicyID + `-default` + ); + expect(packagePolicyAfterUpgrade.package.version).eql('0.11.2'); + } finally { + await supertestAPI + .delete(API_URLS.SYNTHETICS_MONITORS + '/' + monitorId) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + } + }); }); } diff --git a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts index c492f7af04a6d..61c2501e9c4ec 100644 --- a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts +++ b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts @@ -18,22 +18,35 @@ import type { APIEndpoint } from '@kbn/apm-plugin/server'; export function createApmApiClient(st: supertest.SuperTest) { return async ( options: { + type?: 'form-data'; endpoint: TEndpoint; } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } ): Promise> => { - const { endpoint } = options; + const { endpoint, type } = options; const params = 'params' in options ? (options.params as Record) : {}; const { method, pathname } = parseEndpoint(endpoint, params?.path); const url = format({ pathname, query: params?.query }); - const res = params.body - ? await st[method](url).send(params.body).set('kbn-xsrf', 'foo') - : await st[method](url).set('kbn-xsrf', 'foo'); + let res: request.Response; + if (type === 'form-data') { + const fields: Array<[string, any]> = Object.entries(params.body); + const formDataRequest = st[method](url) + .set('kbn-xsrf', 'foo') + .set('Content-type', 'multipart/form-data'); + for (const field of fields) { + formDataRequest.field(field[0], field[1]); + } + res = await formDataRequest; + } else if (params.body) { + res = await st[method](url).send(params.body).set('kbn-xsrf', 'foo'); + } else { + res = await st[method](url).set('kbn-xsrf', 'foo'); + } // supertest doesn't throw on http errors - if (res.status !== 200) { + if (res?.status !== 200) { throw new ApmApiError(res, endpoint); } diff --git a/x-pack/test/apm_api_integration/tests/sourcemaps/sourcemaps.ts b/x-pack/test/apm_api_integration/tests/sourcemaps/sourcemaps.ts new file mode 100644 index 0000000000000..44a9eae45b5f1 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/sourcemaps/sourcemaps.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { APIReturnType } from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import type { SourceMap } from '@kbn/apm-plugin/server/routes/source_maps/route'; +import expect from '@kbn/expect'; +import { times } from 'lodash'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const apmApiClient = getService('apmApiClient'); + + async function uploadSourcemap({ + bundleFilePath, + serviceName, + serviceVersion, + sourcemap, + }: { + bundleFilePath: string; + serviceName: string; + serviceVersion: string; + sourcemap: SourceMap; + }) { + const response = await apmApiClient.writeUser({ + endpoint: 'POST /api/apm/sourcemaps', + type: 'form-data', + params: { + body: { + bundle_filepath: bundleFilePath, + service_name: serviceName, + service_version: serviceVersion, + sourcemap: JSON.stringify(sourcemap), + }, + }, + }); + return response.body; + } + + async function deleteSourcemap(id: string) { + await apmApiClient.writeUser({ + endpoint: 'DELETE /api/apm/sourcemaps/{id}', + params: { path: { id } }, + }); + } + + async function listSourcemaps() { + const response = await apmApiClient.readUser({ + endpoint: 'GET /api/apm/sourcemaps', + }); + return response.body.artifacts; + } + + registry.when('source maps', { config: 'basic', archives: [] }, () => { + let resp: APIReturnType<'POST /api/apm/sourcemaps'>; + describe('upload source map', () => { + after(async () => { + await apmApiClient.writeUser({ + endpoint: 'DELETE /api/apm/sourcemaps/{id}', + params: { path: { id: resp.id } }, + }); + }); + + it('can upload a source map', async () => { + resp = await uploadSourcemap({ + serviceName: 'foo', + serviceVersion: '1.0.0', + bundleFilePath: 'bar', + sourcemap: { + version: 123, + sources: [''], + mappings: '', + }, + }); + expect(resp).to.not.empty(); + }); + }); + + describe('list source maps', () => { + const uploadedSourcemapIds: string[] = []; + before(async () => { + const sourcemapCount = times(2); + for (const i of sourcemapCount) { + const sourcemap = await uploadSourcemap({ + serviceName: 'foo', + serviceVersion: `1.0.${i}`, + bundleFilePath: 'bar', + sourcemap: { + version: 123, + sources: [''], + mappings: '', + }, + }); + uploadedSourcemapIds.push(sourcemap.id); + await sleep(100); + } + }); + + after(async () => { + await Promise.all(uploadedSourcemapIds.map((id) => deleteSourcemap(id))); + }); + + it('can list source maps', async () => { + const sourcemaps = await listSourcemaps(); + expect(sourcemaps).to.not.empty(); + }); + + it('returns newest source maps first', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /api/apm/sourcemaps', + }); + + const timestamps = response.body.artifacts.map((a) => new Date(a.created).getTime()); + expect(timestamps[0]).to.be.greaterThan(timestamps[1]); + }); + }); + + describe('delete source maps', () => { + it('can delete a source map', async () => { + const sourcemap = await uploadSourcemap({ + serviceName: 'foo', + serviceVersion: '1.0.0', + bundleFilePath: 'bar', + sourcemap: { + version: 123, + sources: [''], + mappings: '', + }, + }); + + await deleteSourcemap(sourcemap.id); + const sourcemaps = await listSourcemaps(); + expect(sourcemaps).to.be.empty(); + }); + }); + }); +} + +function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts index d1e7cd8d999c6..3d72d01cc3224 100644 --- a/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts +++ b/x-pack/test/fleet_api_integration/apis/fleet_telemetry.ts @@ -81,9 +81,14 @@ export default function (providerContext: FtrProviderContext) { } await supertest - .put(`/api/fleet/settings`) + .post(`/api/fleet/fleet_server_hosts`) .set('kbn-xsrf', 'xxxx') - .send({ fleet_server_hosts: ['https://test1.fr', 'https://test2.fr'] }) + .send({ + id: 'test-default-123', + name: 'Default', + is_default: true, + host_urls: ['https://test.com:8080', 'https://test.com:8081'], + }) .expect(200); // Default Fleet Server diff --git a/x-pack/test/fleet_api_integration/apis/settings/get.ts b/x-pack/test/fleet_api_integration/apis/settings/get.ts new file mode 100644 index 0000000000000..3d6a3adb394c2 --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/settings/get.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +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 esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + + describe('Settings - get', async function () { + skipIfNoDockerRegistry(providerContext); + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + }); + setupFleetAndAgents(providerContext); + + after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + }); + + it('should respond with fleet_server_hosts', async function () { + // Create a fleet server host + await supertest + .post(`/api/fleet/fleet_server_hosts`) + .set('kbn-xsrf', 'xxxx') + .send({ + id: 'test-default-123', + name: 'Default', + is_default: true, + host_urls: ['https://test.com:8080', 'https://test.com:8081'], + }) + .expect(200); + + // Assert that the hosts appear in the setting response + const response = await supertest + .get(`/api/fleet/settings`) + .set('kbn-xsrf', 'xxxx') + .expect(200); + + expect(response.body.item.fleet_server_hosts).to.eql([ + 'https://test.com:8080', + 'https://test.com:8081', + ]); + }); + }); +} diff --git a/x-pack/test/fleet_api_integration/apis/settings/index.js b/x-pack/test/fleet_api_integration/apis/settings/index.js index 30e5538622e20..3b5ecb6359b19 100644 --- a/x-pack/test/fleet_api_integration/apis/settings/index.js +++ b/x-pack/test/fleet_api_integration/apis/settings/index.js @@ -7,6 +7,7 @@ export default function loadTests({ loadTestFile }) { describe('Settings Endpoints', () => { + loadTestFile(require.resolve('./get')); loadTestFile(require.resolve('./update')); }); } diff --git a/x-pack/test/fleet_api_integration/apis/settings/update.ts b/x-pack/test/fleet_api_integration/apis/settings/update.ts index 0398d9155a07a..cc9f499967055 100644 --- a/x-pack/test/fleet_api_integration/apis/settings/update.ts +++ b/x-pack/test/fleet_api_integration/apis/settings/update.ts @@ -18,7 +18,8 @@ export default function (providerContext: FtrProviderContext) { const esClient = getService('es'); const esArchiver = getService('esArchiver'); - describe('Settings - update', async function () { + // Skipped as the Fleet Server hosts settings values are no longer used as of https://github.com/elastic/kibana/issues/137785 + describe.skip('Settings - update', async function () { skipIfNoDockerRegistry(providerContext); before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); diff --git a/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/data.json.gz b/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/data.json.gz index 9be2c1128a382..636b4d64ddeb4 100644 Binary files a/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/data.json.gz and b/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/data.json.gz differ diff --git a/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/mappings.json b/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/mappings.json index d979f8968937c..95e2020980887 100644 --- a/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/mappings.json +++ b/x-pack/test/functional/es_archives/infra/8.0.0/pods_only/mappings.json @@ -229,6 +229,37 @@ "type": "keyword" } } + }, + "container": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + } + } } } }, diff --git a/x-pack/test/reporting_functional/reporting_and_timeout/index.ts b/x-pack/test/reporting_functional/reporting_and_timeout/index.ts index a6e100ca707c7..c420c76d77304 100644 --- a/x-pack/test/reporting_functional/reporting_and_timeout/index.ts +++ b/x-pack/test/reporting_functional/reporting_and_timeout/index.ts @@ -22,7 +22,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const config = getService('config'); const screenshotDir = config.get('screenshots.directory'); - describe('Reporting Functional Tests with forced timeout', function () { + // FLAKY: https://github.com/elastic/kibana/issues/135309 + describe.skip('Reporting Functional Tests with forced timeout', function () { const dashboardTitle = 'Ecom Dashboard Hidden Panel Titles'; const sessionPngFullPage = 'warnings_capture_session_a'; const sessionPngCropped = 'warnings_capture_session_b'; diff --git a/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/index.ts b/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/index.ts new file mode 100644 index 0000000000000..a103189a32886 --- /dev/null +++ b/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { FtrProviderContext } from '../../../functional/ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Saved objects upgrade tests', function () { + loadTestFile(require.resolve('./upgraded_dashboards')); + }); +} diff --git a/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/upgraded_dashboards.ts b/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/upgraded_dashboards.ts new file mode 100644 index 0000000000000..eb756ffaf8b2d --- /dev/null +++ b/x-pack/test/stack_functional_integration/apps/savedobjects_upgrade_testing/upgraded_dashboards.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 '../../../functional/ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + describe('Verify upgraded dashboards', function () { + const PageObjects = getPageObjects(['common', 'dashboard', 'timePicker']); + const renderService = getService('renderable'); + before(async () => { + await PageObjects.common.navigateToApp('management', { insertTimestamp: false }); + }); + + it('should be able to verify that dashboards rendered correctly in 6.x space', async function () { + await PageObjects.common.navigateToUrl('dashboard', undefined, { + basePath: `/s/6x`, + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + shouldUseHashForSubUrl: false, + }); + await PageObjects.dashboard.loadSavedDashboard('shakespeare_dashboard'); + await PageObjects.dashboard.expectOnDashboard('shakespeare_dashboard'); + + await renderService.waitForRender(6); + + await PageObjects.dashboard.verifyNoRenderErrors(); + + await PageObjects.timePicker.setDefaultAbsoluteRange(); + + await PageObjects.dashboard.loadSavedDashboard('logstash_dashboardwithfilters'); + await PageObjects.dashboard.expectOnDashboard('logstash_dashboardwithfilters'); + + await renderService.waitForRender(20); + + await PageObjects.dashboard.verifyNoRenderErrors(); + }); + + it('should be able to verify that dashboards rendered correctly in 7.x space', async function () { + await PageObjects.common.navigateToUrl('dashboard', undefined, { + basePath: `/s/7x`, + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + shouldUseHashForSubUrl: false, + }); + await PageObjects.dashboard.loadSavedDashboard('nontimebased_shakespeare_drilldown'); + await PageObjects.dashboard.expectOnDashboard('nontimebased_shakespeare_drilldown'); + + await renderService.waitForRender(2); + + await PageObjects.dashboard.verifyNoRenderErrors(); + + await PageObjects.timePicker.setDefaultAbsoluteRange(); + + await PageObjects.dashboard.loadSavedDashboard('by_reference_drilldown'); + await PageObjects.dashboard.expectOnDashboard('by_reference_drilldown'); + + await renderService.waitForRender(4); + + await PageObjects.dashboard.verifyNoRenderErrors(); + }); + }); +} diff --git a/yarn.lock b/yarn.lock index f618ddaf5732e..8169a937a3540 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1455,10 +1455,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@50.0.2": - version "50.0.2" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-50.0.2.tgz#45d37544d57af8d67a1033bbd78ebe3f58d9f662" - integrity sha512-Q2fPS/bwKCYfTE7/dFO9OdlFtQQ7NMhflbl4WnHjpBcDeqUsqE/6cHd8XyvY/+WFhH9fkyCzBlO/eRBA3KatmA== +"@elastic/charts@50.2.1": + version "50.2.1" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-50.2.1.tgz#3dde69125fb181306129a48b73bce1f5823d0cad" + integrity sha512-LA9EcW1LGAIrlhro3P2Fgtj0BkHQV1ArHCEdJ43EjgaNpJsKaWnFSeYcbuXiUEyLtXbF4Sv6Di90qDppwThu6Q== dependencies: "@popperjs/core" "^2.4.0" bezier-easing "^2.1.0"