diff --git a/.buildkite/pipelines/artifacts.yml b/.buildkite/pipelines/artifacts.yml index 64ebe01e9227b..ccef23374d91b 100644 --- a/.buildkite/pipelines/artifacts.yml +++ b/.buildkite/pipelines/artifacts.yml @@ -88,7 +88,7 @@ steps: - exit_status: -1 agents: queue: n2-2 - timeout_in_minutes: 30 + timeout_in_minutes: 60 if: "build.env('RELEASE_BUILD') == null || build.env('RELEASE_BUILD') == '' || build.env('RELEASE_BUILD') == 'false'" retry: automatic: diff --git a/.buildkite/scripts/steps/checks/yarn_deduplicate.sh b/.buildkite/scripts/steps/checks/yarn_deduplicate.sh index ce62b2312c034..22bf115aad9c0 100755 --- a/.buildkite/scripts/steps/checks/yarn_deduplicate.sh +++ b/.buildkite/scripts/steps/checks/yarn_deduplicate.sh @@ -7,4 +7,4 @@ source .buildkite/scripts/common/util.sh echo "--- Check yarn.lock for duplicated modules" node scripts/yarn_deduplicate -check_for_changed_files 'node scripts/yarn_deduplicate && yarn kbn bootstrap' false +check_for_changed_files 'node scripts/yarn_deduplicate' false 'TO FIX: Run node '"'"'scripts/yarn_deduplicate && yarn kbn bootstrap'"'"' locally, or add an exception to src/dev/yarn_deduplicate/index.ts and then commit the changes and push to your branch' diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7d95257248bfc..b3d2e9cf82ad4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -486,6 +486,7 @@ src/plugins/kibana_utils @elastic/appex-sharedux x-pack/plugins/kubernetes_security @elastic/kibana-cloud-security-posture packages/kbn-language-documentation-popover @elastic/kibana-visualizations packages/kbn-lens-embeddable-utils @elastic/obs-ux-infra_services-team @elastic/kibana-visualizations +packages/kbn-lens-formula-docs @elastic/kibana-visualizations x-pack/plugins/lens @elastic/kibana-visualizations x-pack/plugins/license_api_guard @elastic/platform-deployment-management x-pack/plugins/license_management @elastic/platform-deployment-management diff --git a/.i18nrc.json b/.i18nrc.json index 1af130820cd36..119c072688489 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -79,6 +79,7 @@ "kibana_utils": "src/plugins/kibana_utils", "kibana-react": "src/plugins/kibana_react", "kibanaOverview": "src/plugins/kibana_overview", + "lensFormulaDocs": "packages/kbn-lens-formula-docs", "lists": "packages/kbn-securitysolution-list-utils/src", "exceptionList-components": "packages/kbn-securitysolution-exception-list-components/src", "management": [ diff --git a/.node-version b/.node-version index 87ec8842b158d..d5a159609d095 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18.18.2 +20.10.0 diff --git a/.nvmrc b/.nvmrc index 87ec8842b158d..d5a159609d095 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.18.2 +20.10.0 diff --git a/NOTICE.txt b/NOTICE.txt index 45af6e5231783..d02031c4b5a2b 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Kibana source code with Kibana X-Pack source code -Copyright 2012-2023 Elasticsearch B.V. +Copyright 2012-2024 Elasticsearch B.V. --- Pretty handling of logarithmic axes. diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 49623728f1afe..5f8cce19705d4 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -22,13 +22,13 @@ load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install # Setup the Node.js toolchain for the architectures we want to support node_repositories( node_repositories = { - "18.18.2-darwin_amd64": ("node-v18.18.2-darwin-x64.tar.gz", "node-v18.18.2-darwin-x64", "5bb8da908ed590e256a69bf2862238c8a67bc4600119f2f7721ca18a7c810c0f"), - "18.18.2-darwin_arm64": ("node-v18.18.2-darwin-arm64.tar.gz", "node-v18.18.2-darwin-arm64", "9f982cc91b28778dd8638e4f94563b0c2a1da7aba62beb72bd427721035ab553"), - "18.18.2-linux_arm64": ("node-v18.18.2-linux-arm64.tar.xz", "node-v18.18.2-linux-arm64", "8a5a03f6a742159c9aa0ae3a99b368cd938cf62f3a5522a2e5acbe6313710efe"), - "18.18.2-linux_amd64": ("node-v18.18.2-linux-x64.tar.xz", "node-v18.18.2-linux-x64", "f7cf590bc7153f3beaa9e1138d00e50d74df223f0bec61f63e7df65f7315b76a"), - "18.18.2-windows_amd64": ("node-v18.18.2-win-x64.zip", "node-v18.18.2-win-x64", "3bb0e51e579a41a22b3bf6cb2f3e79c03801aa17acbe0ca00fc555d1282e7acd"), + "20.10.0-darwin_amd64": ("node-v20.10.0-darwin-x64.tar.gz", "node-v20.10.0-darwin-x64", "5ff5e8abd3eea6e5f507eb6677554f5b2188eedef654096aa4168a9941e91a32"), + "20.10.0-darwin_arm64": ("node-v20.10.0-darwin-arm64.tar.gz", "node-v20.10.0-darwin-arm64", "68b93099451d77aac116cf8fce179cabcf53fec079508dc6b39d3a086fb461a8"), + "20.10.0-linux_arm64": ("node-v20.10.0-linux-arm64.tar.xz", "node-v20.10.0-linux-arm64", "a5c22683890d5d244f3afd488ef44e573b5b8287f8911b9a1b061ed3f20a5e6d"), + "20.10.0-linux_amd64": ("node-v20.10.0-linux-x64.tar.xz", "node-v20.10.0-linux-x64", "9c0fbc8cc7be9a6543af4b9afb05759c538c0f81015c388d63277b0158507697"), + "20.10.0-windows_amd64": ("node-v20.10.0-win-x64.zip", "node-v20.10.0-win-x64", "e5b861814a97e28ae7ac06a34e88fd5e0565b447d270c26e20b5ef60bf0aaaf9"), }, - node_version = "18.18.2", + node_version = "20.10.0", node_urls = [ "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v{version}/{filename}", ], diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 3fb689275fa04..281a4e1348185 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-12-31 +date: 2024-01-03 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 676858ba658ec..3648f99ea4831 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_observability.mdx b/api_docs/ai_assistant_management_observability.mdx index a8a782cf9d77c..d3331b027d951 100644 --- a/api_docs/ai_assistant_management_observability.mdx +++ b/api_docs/ai_assistant_management_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementObservability title: "aiAssistantManagementObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementObservability plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementObservability'] --- import aiAssistantManagementObservabilityObj from './ai_assistant_management_observability.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index bb6297359c53e..163f5204f7e78 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 16d4669399110..75b3c06d42d6b 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-12-31 +date: 2024-01-03 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 6c7c4fd50f476..89309bed8376f 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-12-31 +date: 2024-01-03 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 26b3b63dedace..b380c619d5e67 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index ea7ef072eef7c..79422355cd46e 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 2311fc75255a2..7aace57deee4f 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 2a36b8939631b..4fd665cd9b20a 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-12-31 +date: 2024-01-03 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 9581603f53c5e..433f90a1053b0 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-12-31 +date: 2024-01-03 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 dad4cd246d613..89ab8a4a91808 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-12-31 +date: 2024-01-03 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 cb0aeaa3c4ebf..45c579f7fdd87 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-12-31 +date: 2024-01-03 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 3f79712490701..6d413558acb67 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-12-31 +date: 2024-01-03 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 f59576040c1b5..2b09b8b7f4692 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index e22c5e24b2c35..09c76a68af874 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index df6cea1439229..dd178b545e280 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index c710e6d1f4672..3145d19a29f5e 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-12-31 +date: 2024-01-03 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 e624b9b861fde..37b3e4d8903c1 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-12-31 +date: 2024-01-03 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 709fab05446ff..1be971ab4f9d9 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 5920a55f1215f..f6f169a648d3b 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 63d3199b48b38..de441c85f5298 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 475511fc503d6..6cbf150bab20b 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-12-31 +date: 2024-01-03 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 da1960af3d22b..d0022ed7d4937 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-12-31 +date: 2024-01-03 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 5ad41489ae3fe..98fcf5ca3a078 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-12-31 +date: 2024-01-03 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 6a33621c16c41..9d1902cbc0db8 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-12-31 +date: 2024-01-03 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 ccd2faa4e3d6e..6c126a001865f 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-12-31 +date: 2024-01-03 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 2a4c0b969ea38..ac0e8a0add0a5 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: 2023-12-31 +date: 2024-01-03 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 7c3186c82925b..0f6f82176a98f 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: 2023-12-31 +date: 2024-01-03 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 5e49adc999499..776605a08a29a 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: 2023-12-31 +date: 2024-01-03 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 dd6e9f9154e66..8213fc9c72b7e 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: 2023-12-31 +date: 2024-01-03 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 0e4345567ddbc..e9fe566a53bd3 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: 2023-12-31 +date: 2024-01-03 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 bf370afadf45f..e6219e5675d7d 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: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 35a0fcae7fb05..44a4654eb5e2e 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 838810da73b87..ef17fb470eee4 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: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 9ffd2429a0544..2648ec6df8172 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 9e14f25e6a0e3..765dc2a38f65c 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 03100f1831e48..6a4bc5a428642 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-12-31 +date: 2024-01-03 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 9d30a0b2061d0..8f9a0054a494f 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-12-31 +date: 2024-01-03 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 9df8bca7e2e56..6cd00b2a94c00 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 8c6c8b5c286b7..83f31d4fa967d 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index a7e0741db238f..0b2670a8873a2 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 302a9edbf43c6..7aa3a7d6758ec 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-12-31 +date: 2024-01-03 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 abf6015a59d6c..321d251c575e3 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-12-31 +date: 2024-01-03 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 f015fef6370bb..9647227264dc0 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-12-31 +date: 2024-01-03 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 a24f06b548929..13b7b18c900d2 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-12-31 +date: 2024-01-03 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 0a9d57807e96b..233eb29c2c756 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-12-31 +date: 2024-01-03 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 f0190f790335c..365f107bb7dfe 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 5bd542ea722df..4b91172377f37 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 8317ea91e395e..3fd5ddbcfaf58 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 647d677a3ddce..437aa907c5539 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index ca0f5ae6eb344..7b351931acbe1 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-12-31 +date: 2024-01-03 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 a63f84387ac85..88cc7b5f39438 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-12-31 +date: 2024-01-03 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 ef5c30000e455..9cafdd4bfd20a 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-12-31 +date: 2024-01-03 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 32d1348cbd1fb..49d21cd89648f 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-12-31 +date: 2024-01-03 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 21247901087ca..2693102013cb8 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-12-31 +date: 2024-01-03 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 31fb11037a4d2..0094d6bded0f8 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-12-31 +date: 2024-01-03 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 6814a0c0a53af..2ea41a3b7d7f5 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-12-31 +date: 2024-01-03 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 f4cfb673e5016..fd0055b84b469 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-12-31 +date: 2024-01-03 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 4e66e2c2f4755..f24cf0f3fc50d 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-12-31 +date: 2024-01-03 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 8ce7e4e54383e..3ec151c84ff9d 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-12-31 +date: 2024-01-03 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 a7a5b9c34fe87..fe9166cafc00f 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-12-31 +date: 2024-01-03 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 ebec63ea16a16..65c4039788709 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-12-31 +date: 2024-01-03 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 f4e943d94b000..f51e647e6d816 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-12-31 +date: 2024-01-03 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 e92eb346755be..cbc90e0b5197e 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-12-31 +date: 2024-01-03 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 c6eabedf2eaf6..90433a5e9110e 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-12-31 +date: 2024-01-03 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 68441b2e02b16..859c789455f15 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-12-31 +date: 2024-01-03 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 1eab3826b62cc..57bff5b1b69c8 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-12-31 +date: 2024-01-03 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 aaf3805d8b3bf..66fc660112973 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 163b7727bc956..53660e5ab6727 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index ff2b20d47aa5b..d581b113fb519 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index b5bd56dad4dea..898af943a8029 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-12-31 +date: 2024-01-03 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 8d2348ef5689b..c3edd4dbe4079 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-12-31 +date: 2024-01-03 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 edee74918ad26..0ce444c73b495 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index d425c2b266e3e..6fe87e2bd16ce 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 3340134603c43..f35ddb73641a7 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-12-31 +date: 2024-01-03 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 eaadf325959a5..bdb4ea347757d 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-12-31 +date: 2024-01-03 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 ee41b51e26f92..78449bd7a1927 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-12-31 +date: 2024-01-03 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 8d831921b8d65..94bcac34fe032 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-12-31 +date: 2024-01-03 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 5f98be94a6f37..53d6e671698bb 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-12-31 +date: 2024-01-03 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 ced29652106e5..e6bd17a2da1bc 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 96eebc7347bde..be5ddfeece0d6 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 8859781c6c4c8..957ed4277ea4c 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-12-31 +date: 2024-01-03 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 b3965f257ce74..fce03996d1fd3 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index d34f7f92df4e5..4a329e2ad5eaa 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 1e865cc127322..625f69b41f813 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index e674866293df7..9df1a5e0eba48 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index cb4c01d5156e8..d3cdedd416f89 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index b17cab8f88748..6c0b274a863b0 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 141a293e9f484..33bb144d96e85 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-12-31 +date: 2024-01-03 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 bb0cc457465f8..136e3802b11aa 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 79c1d37738489..b415312f60bd2 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 709b156296e72..c96ba8475c350 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 a7be91b7ffc02..8f19d26485744 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-12-31 +date: 2024-01-03 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 fbd620d0fa93c..b5773b652cbf3 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-12-31 +date: 2024-01-03 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 97f4f6a861ece..7f28e363b0a88 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-12-31 +date: 2024-01-03 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 80f206ecd2e20..2a65f9c6ef18e 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-12-31 +date: 2024-01-03 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 f8a962b6e4797..eaa5699ba4e85 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-12-31 +date: 2024-01-03 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 94631df9956cd..f30c027fd5da3 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index e06ddc87b001b..dd7ac7b7ac758 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 57149cae5a118..fecd230bae721 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 bea15b7b5f874..76b68d7e8a8ab 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index e7d5e15f5e7ad..60870f01959fa 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 7b3746b9d4a69..a125de923f214 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 35ce3f3a89e64..8b10cb871b976 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index ee9472b06d220..59d5bdd4b056e 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 72e2aac31438f..c32de33ae36d2 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 5ab3dbf775494..def9203b5df07 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 6867aa6b785a7..380dfe6305806 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-12-31 +date: 2024-01-03 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 e9fe001510d49..5a5b23f29794c 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-12-31 +date: 2024-01-03 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 9d1b3678d526f..50d5f231553e9 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-12-31 +date: 2024-01-03 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 2cceb6667a9f6..4578b10c12a3c 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-12-31 +date: 2024-01-03 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 0790ce7b84735..d63fd39ae8920 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index f05934a289723..f3c88feafb8fb 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 63c020a025fb0..27900a811c078 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 0a403233f18e0..cc7ae2a291ac3 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-12-31 +date: 2024-01-03 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 331123fc1dd62..e088532380eef 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-12-31 +date: 2024-01-03 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 8d77ce3b32553..0d9234edd43d2 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 a0219f0e7d840..27978886440f5 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 25391fff77afd..52168398d455e 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index b6599e79bc790..2f86930f47883 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 5b7f32f8e2d93..ca1ef88a1a84f 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 238808d81df15..954c6639e5880 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index d914ce2978e55..1d98bfb99c974 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index f7db2d5ed6f96..f8ff902603871 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 73f2aeff03fc1..fb67afa9f68f9 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 f0cd6235f7d38..084a2064caa70 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 6a47e4e93c78a..2c296064cc413 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2e560081f0ccd..820b9b50a857e 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-12-31 +date: 2024-01-03 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 9ee92bf88207a..ed9ddf9ba7278 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 26010e3625472..8895890bbda27 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 63c36ccbfe3d9..69e7a953b57cb 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 35739fd3a3963..dc8042fc624b2 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e90d2a1ed43ba..010704177b189 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 abd67e25bea6a..ce9452d1b6d25 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-12-31 +date: 2024-01-03 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 e25025f5855b5..8dd653db6a14a 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e91dfa709d9cf..b7a5f1b773856 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 3df7d565fb1b0..62693c356c349 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 784bdc851f2e7..a2857301c2ee2 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 9bc9678a345b3..12d84e7534fb2 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-12-31 +date: 2024-01-03 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 15d9a8aeb47e0..a4315c041bc38 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 edce609ec5ea9..1f46f664c85d7 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 61e1d0e5320d8..93ee246b6daed 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 dc7aefb652d52..e93970c01e89f 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-12-31 +date: 2024-01-03 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 7c5f3f0c131c8..18b16da16a429 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-12-31 +date: 2024-01-03 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 327305d2c02eb..2a9a67281fd56 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 426200129b4d7..d48b8db85e8b8 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 6c2b8812db7c6..a501da2a419de 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2ea544468fe79..e21bed9178568 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index fe7a8ec558e01..b3ffb68bfc9a3 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 23bedae6fcb8e..11f476d661dc6 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 7dca3ddd451a1..c31ef8466be22 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 38b14d1289526..7b46e4bda2bdd 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 4b7a5625e2256..2ac5f5a0f3f99 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 70c1bb4a2787e..2975a2dd8f608 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index cfec83b1297a1..408a458442a2c 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 7138c6c853dce..d0d0dc5db65cc 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 d8013f72b5d42..eb3d82b08be26 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 a245645c4b047..3454f526a4658 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 97e4d8be6523b..745db2ae5330c 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-12-31 +date: 2024-01-03 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 e36e5dffee291..6ef3177e1992b 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-12-31 +date: 2024-01-03 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 1796ad5c323bd..c0399a7f4d096 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 7a9e9bb2ae3e8..09d119948c21a 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 9870b0c63b9dc..ac09858373c69 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 7c7d94ca84086..26b8565018958 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 55d6f532b039c..4c4ad04ae1639 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-12-31 +date: 2024-01-03 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 e96b36b07c547..4c7257ac2ac36 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 a001c81d68889..fec986b99d1fd 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 d3c13fbec1c34..c6850b2c70007 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2c46cdb602999..346ca2d190bbf 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-12-31 +date: 2024-01-03 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 3f7ef3574a0fa..39479af5f1377 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e6f01b3b1a0bb..d5d27043ce5c4 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 d730121eb0521..1b2e8908f0a0f 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 1dab775012cb6..ce72221f86261 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 a6d8159100789..e11b99119989a 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 fa18cbe797e64..5f2630e38c80c 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 f1bc1c8e5647b..e1ed98c3c2126 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 14dfe853febe1..4749de418f516 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-12-31 +date: 2024-01-03 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 66d423b3523df..65ef3da10669f 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-12-31 +date: 2024-01-03 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 396957631e1a8..9a70bce6e3102 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 3d02a9a5754c4..415460c1a58c7 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 744768a8132bf..84e518b002b46 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 1005c74743258..c30e71484c941 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2cd13f446aeff..af017fb002122 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 7d74f34616628..82de69c4be7ea 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 8fb25bdca9be7..276d926365c69 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 baf0087a312d4..2fc031418675d 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-12-31 +date: 2024-01-03 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 7d55b80b96b7a..ef4c144548594 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 8ffbac6acbb75..e1c2cc8c7ae18 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-12-31 +date: 2024-01-03 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 086a66ef28ab0..e8f02b23c9f33 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-12-31 +date: 2024-01-03 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 15fb36136ee4c..43ed60b3ba322 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 74e931c727ff6..931293c715b06 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2f7d723dcc18a..69a2492af2c24 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 424d723c97a5e..d5aa6a118e180 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 0e4184d908b09..4ab26d2d59bc6 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-12-31 +date: 2024-01-03 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 0fe50689700ea..1df81d16867d5 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 d8cdebe37ec09..263279611b441 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 c848e5d320538..514b6aa871ad0 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 6138910864391..8093ac0446912 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 ea14f6b51c59b..09aec2547a4ac 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-12-31 +date: 2024-01-03 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 6871d1b6cef6d..c7c33a5b6118e 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 dc2c163dcde23..5fb00144b8c78 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index daf8160be61dd..dbc63a501a5fd 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 8a657ed63cfeb..6ceb5a9662846 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 37f9c175339de..09c38f28a542b 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 87e2d916acc7e..dd98257acd82e 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 62afc19629df1..f3acecd69cd42 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 47c41b507cf3b..dea4a77a2b4de 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-12-31 +date: 2024-01-03 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 a5953176aa0ff..c12bd0a09e3af 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 34402ae7088fc..40e5d02a8ad58 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 b798b84ce86f4..e8722874c4686 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e13bf181ed255..a51553a551049 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-12-31 +date: 2024-01-03 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 3cdb799d5ccc3..9c2c844dff888 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 4dc0d4422edd4..7b7ccf141fe28 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 92581cc5f7880..c414274124d1e 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e8f6345b66bdb..35d68f65b5e58 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 e5b2de979d4b9..4ee47e2d8dd60 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-12-31 +date: 2024-01-03 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 f1d58397a23cd..9aacfa448896c 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 d3a252f7bab65..0e1baa15d4200 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 c12696f6109fb..4752700e1c99d 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 9b18de965acd0..60f5ae32452b2 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-12-31 +date: 2024-01-03 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 67c1f1ed40b62..f7dc3c3ddc4f8 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 da4560a3af3d3..d63b0def5c05b 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 b1261b7676ae9..e1bb395d680b5 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 1d1962422fcbe..8b67baca1c60a 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 2eb971b8a35a0..5b153a5f41f39 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 d57d220d58b7d..f4b82cc736f55 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 746dfa4079ba2..fd1f986e4c439 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 4f7f7fe6ca709..abbfa4511d9f1 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 59f240e7ff94d..da897df7ec3b9 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 799e00eaefd59..a2a0aaf9118c7 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 49d77ccc16239..d040203085f15 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index c256e9acdf8d9..49e8c56fb4b5b 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index a0a52e9696fa6..1854c6fa54dce 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-12-31 +date: 2024-01-03 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 638eba6e03388..cc53b2eaaec33 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 4b78a61d3db30..4ad04774e3d68 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-12-31 +date: 2024-01-03 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 2510b53345b28..a23b044901e0e 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 6e9d373e68894..40c49d0116428 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 27bba0efa3392..bfd50e040c375 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 d6c7eb26e32d7..dcdb95e7bbcee 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 2ea6e9b73b67b..66684b6ad5075 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 923cab96690f7..e584098dad104 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 fc859cbe18a80..92d730df53d96 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 6452ae200b150..21829e8279486 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 56a6acb0e2c33..418fd4ac62c68 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 2d75552384dea..7bd30b20d2e47 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 5a6cc51228b91..41e78996ea96d 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 930df7339e9cf..cb0fb3f6baa9e 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 e2ac7ea3e7349..a16963f102bfc 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 b40d75d87d207..5031e809ed813 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-12-31 +date: 2024-01-03 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 d77a52859c824..da7613f02bbd1 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 211619def808e..9a4668c1262c4 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 0a6dc9af8546e..3eacc30df4fdb 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 249a874d58430..9ca3561cc5916 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 a0e77c33a8fd0..5945e190b4691 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-12-31 +date: 2024-01-03 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 9be0d70a010dd..26180f76794cd 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 96ffa8b824ff3..626cf4f89b04f 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 bae44f0e1e31d..34d470522d22e 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-12-31 +date: 2024-01-03 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 7b9a7926579a1..18fcfbb094b01 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-12-31 +date: 2024-01-03 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 e03f3f7acf923..bf766399819b4 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 5ec0c1348c685..34beba74de29f 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-12-31 +date: 2024-01-03 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 fa7143413101e..2866e403ef49d 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 d2e6c46390b7a..2c962ca195ee4 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 20a2f6e7013d0..46528c170ec7d 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-12-31 +date: 2024-01-03 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 ea30aaa79bc67..41a589bc5ac10 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index aece1e532e9f2..13061b14ec965 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index dc8cbf344305f..7d924c455d36c 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 2d4fe18b58b46..e90d6e84ae5b5 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-12-31 +date: 2024-01-03 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 a719e08fa89f8..69498c46d3d14 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 a410f9ab23fba..2cecef44b7aa4 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 91092dfd05c4a..2d1e6cb70ad1f 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 b121770a261eb..c0615e03e7124 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-12-31 +date: 2024-01-03 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 0c254f376480a..7d1e4ae48cfd3 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 cd4f3c9b6114a..1189bbd4e76f6 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 e862aa83a93bd..c00ea25223ac0 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-12-31 +date: 2024-01-03 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 b45f863a85d96..f377f812c53b7 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-12-31 +date: 2024-01-03 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 f8e197348bcf2..9577d99b879e7 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 28a8c15ff9593..a9747955ced7d 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2b83022344566..30a5f4f911ebd 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-12-31 +date: 2024-01-03 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 147d5d17ed258..c8f403350217a 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 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 66fc78135fcef..9deb4e9043a4f 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index c8ba674d14cf8..6d40f3e613b6b 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index da524300470b8..77a75b4c31f80 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 4e0df183d6708..e3362ebb5c110 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index bbcdc11398079..9782f7bcc7385 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-12-31 +date: 2024-01-03 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 75d9483a083b1..c906455a6b7dc 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index b043c54c82dd8..70392256f5d0a 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 307796e913b5f..2160f14689d94 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index b80627c6f05fb..d67b6d92f1713 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 7656052466eb2..71a723d246023 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 4e3cf4ae189ef..535720cf4e94a 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index be2b1eca95b78..9d322f0778f15 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 89127e5ace494..7a96972afca3f 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index ad00b1089fa50..d4ba2283f9b33 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index b4354397b3b55..c8652fba0e7bb 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 963096d3ec043..a369a14687d79 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 41c3d53e710ba..b95bad9a2e80a 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 36e1947bf6ea0..017d76bdbb719 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index d998ab8f2c0f8..a1440065b3f50 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 15a47eff78852..c7bf147d812b2 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index eb8711a812ff3..16526a11f6bba 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 50c0bfc55b1d8..e5974cd2ed6eb 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-12-31 +date: 2024-01-03 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 74edfb844973f..63e79c1b93307 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-12-31 +date: 2024-01-03 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 ab9c1b947600d..17453f780b438 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-12-31 +date: 2024-01-03 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 4ee06f69107be..dd10715c25188 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 10d378fd78367..7a69e749fe9f2 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 6db8a4679d6ce..5e9bd89ba93b7 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -952,7 +952,7 @@ "label": "serverlessSearch", "description": [], "signature": [ - "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsLogstash: string; }" + "{ readonly gettingStartedExplore: string; readonly gettingStartedIngest: string; readonly gettingStartedSearch: string; readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; readonly integrationsConnectorClientRunFromSource: string; readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 088614b9c7721..dbb26e025754b 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-12-31 +date: 2024-01-03 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 5b19f7b9483f9..ebb45c1079ca8 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 013bd45bef523..c94f5987750c9 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 2ed9d16af9a2f..9543c83cdbb3d 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index 5562e72971965..935959878e454 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index f2e7b4d26f402..689a27844fad4 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 5283fe75b0336..1670c41dae040 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 21af5bc4d85b3..2f4fc945428b0 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index c154d832bb64a..9c944f0bf5b28 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index b261198445370..df177dc44a94c 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-12-31 +date: 2024-01-03 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 dad68409561a3..426fbe2e3f71a 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-12-31 +date: 2024-01-03 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 4db73e7b163e9..4b4d5ee0d43b9 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-12-31 +date: 2024-01-03 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 a00eb32c31478..04ef6c7b6d3f0 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-12-31 +date: 2024-01-03 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 f076852abc3ba..b970c49d3c813 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-12-31 +date: 2024-01-03 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 f60f668b9396e..8f725923411af 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 798c2de6be5f9..e4c0f7b5a4437 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 9ca6aaf5dbdeb..ff1517ae1b59d 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 92b1bc95c3477..9c140e044bba4 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 51d32f9b1358c..22c559f70a6f0 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 8a637315273f8..02c6f4bd66adf 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 16f413de4933d..de6b1fdee5f49 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-12-31 +date: 2024-01-03 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 0f7b9a6899ec3..1410ce0b1edbc 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index f0074000c06f0..c0447d91a8980 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index c34956861df84..a7d1a12c44a9c 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 7cca7b975f186..bf03bd157f8f9 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index a9c9abae16451..7236b8c2a2055 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index e085c9c08eb37..87e92255ec291 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-12-31 +date: 2024-01-03 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 d135dece6e7e8..ece5567608b1b 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-12-31 +date: 2024-01-03 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 85c3fcf804311..17bb23390b867 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 049a2abd037f5..2e58c2b0c74c4 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-12-31 +date: 2024-01-03 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 2f90e5433c14a..1dfc83f6a280b 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-12-31 +date: 2024-01-03 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 9e335b09b91f2..7374f07335517 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-12-31 +date: 2024-01-03 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 cf3fd1c88ec21..5c87c1bd9a073 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-12-31 +date: 2024-01-03 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 e6bfeb8bba4de..2f9dfe84b2fa6 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-12-31 +date: 2024-01-03 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 aaf1647bb6dc8..9c5ae7112f347 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index c6b1e35fbcc13..9a28f3cc28a04 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 7ecbd52c8622c..04232da34b033 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-12-31 +date: 2024-01-03 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 bd662dcd764bf..95303c94ee32f 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 0005b97f5b96e..bc27368ebfe3f 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-12-31 +date: 2024-01-03 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 734bbf055ffc8..1a3289e17468a 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index dcf8aed9c1bdf..1be271e7fb49a 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 7e84b8ea19b8b..883ec22a62a8b 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-12-31 +date: 2024-01-03 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 07d59187ef7ca..ec6def5b60bd8 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index ffcf97e36aeca..e02c88f3ee05d 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.devdocs.json b/api_docs/kbn_lens_formula_docs.devdocs.json new file mode 100644 index 0000000000000..ffc386fb21ff5 --- /dev/null +++ b/api_docs/kbn_lens_formula_docs.devdocs.json @@ -0,0 +1,2298 @@ +{ + "id": "@kbn/lens-formula-docs", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.getTypeI18n", + "type": "Function", + "tags": [], + "label": "getTypeI18n", + "description": [], + "signature": [ + "(type: string) => string" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.getTypeI18n.$1", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.AVG_ID", + "type": "string", + "tags": [], + "label": "AVG_ID", + "description": [], + "signature": [ + "\"average\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.AVG_NAME", + "type": "string", + "tags": [], + "label": "AVG_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.CARDINALITY_ID", + "type": "string", + "tags": [], + "label": "CARDINALITY_ID", + "description": [], + "signature": [ + "\"unique_count\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/cardinality.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.CARDINALITY_NAME", + "type": "string", + "tags": [], + "label": "CARDINALITY_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/cardinality.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.COUNT_ID", + "type": "string", + "tags": [], + "label": "COUNT_ID", + "description": [], + "signature": [ + "\"count\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/count.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.COUNT_NAME", + "type": "string", + "tags": [], + "label": "COUNT_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/count.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.COUNTER_RATE_ID", + "type": "string", + "tags": [], + "label": "COUNTER_RATE_ID", + "description": [], + "signature": [ + "\"counter_rate\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/counter_rate.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.COUNTER_RATE_NAME", + "type": "string", + "tags": [], + "label": "COUNTER_RATE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/counter_rate.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.CUMULATIVE_SUM_ID", + "type": "string", + "tags": [], + "label": "CUMULATIVE_SUM_ID", + "description": [], + "signature": [ + "\"cumulative_sum\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.CUMULATIVE_SUM_NAME", + "type": "string", + "tags": [], + "label": "CUMULATIVE_SUM_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.DIFFERENCES_ID", + "type": "string", + "tags": [], + "label": "DIFFERENCES_ID", + "description": [], + "signature": [ + "\"differences\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/differences.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.DIFFERENCES_NAME", + "type": "string", + "tags": [], + "label": "DIFFERENCES_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/differences.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.INTERVAL_ID", + "type": "string", + "tags": [], + "label": "INTERVAL_ID", + "description": [], + "signature": [ + "\"interval\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/interval.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.INTERVAL_NAME", + "type": "string", + "tags": [], + "label": "INTERVAL_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/interval.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.LAST_VALUE_ID", + "type": "string", + "tags": [], + "label": "LAST_VALUE_ID", + "description": [], + "signature": [ + "\"last_value\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/last_value.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.LAST_VALUE_NAME", + "type": "string", + "tags": [], + "label": "LAST_VALUE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/last_value.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MAX_ID", + "type": "string", + "tags": [], + "label": "MAX_ID", + "description": [], + "signature": [ + "\"max\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/max.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MAX_NAME", + "type": "string", + "tags": [], + "label": "MAX_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/max.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MEDIAN_ID", + "type": "string", + "tags": [], + "label": "MEDIAN_ID", + "description": [], + "signature": [ + "\"median\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/median.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MEDIAN_NAME", + "type": "string", + "tags": [], + "label": "MEDIAN_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/median.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MIN_ID", + "type": "string", + "tags": [], + "label": "MIN_ID", + "description": [], + "signature": [ + "\"min\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/min.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MIN_NAME", + "type": "string", + "tags": [], + "label": "MIN_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/min.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MOVING_AVERAGE_ID", + "type": "string", + "tags": [], + "label": "MOVING_AVERAGE_ID", + "description": [], + "signature": [ + "\"moving_average\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/moving_average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MOVING_AVERAGE_NAME", + "type": "string", + "tags": [], + "label": "MOVING_AVERAGE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/moving_average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.MOVING_AVERAGE_WINDOW_DEFAULT_VALUE", + "type": "number", + "tags": [], + "label": "MOVING_AVERAGE_WINDOW_DEFAULT_VALUE", + "description": [], + "signature": [ + "5" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/moving_average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.NORMALIZE_BY_UNIT_ID", + "type": "string", + "tags": [], + "label": "NORMALIZE_BY_UNIT_ID", + "description": [], + "signature": [ + "\"normalize_by_unit\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.NORMALIZE_BY_UNIT_NAME", + "type": "string", + "tags": [], + "label": "NORMALIZE_BY_UNIT_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.NOW_ID", + "type": "string", + "tags": [], + "label": "NOW_ID", + "description": [], + "signature": [ + "\"now\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/now.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.NOW_NAME", + "type": "string", + "tags": [], + "label": "NOW_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/now.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_AVERAGE_ID", + "type": "string", + "tags": [], + "label": "OVERALL_AVERAGE_ID", + "description": [], + "signature": [ + "\"overall_average\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_AVERAGE_NAME", + "type": "string", + "tags": [], + "label": "OVERALL_AVERAGE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_average.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_MAX_ID", + "type": "string", + "tags": [], + "label": "OVERALL_MAX_ID", + "description": [], + "signature": [ + "\"overall_max\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_max.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_MAX_NAME", + "type": "string", + "tags": [], + "label": "OVERALL_MAX_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_max.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_MIN_ID", + "type": "string", + "tags": [], + "label": "OVERALL_MIN_ID", + "description": [], + "signature": [ + "\"overall_min\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_min.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_MIN_NAME", + "type": "string", + "tags": [], + "label": "OVERALL_MIN_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_min.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_SUM_ID", + "type": "string", + "tags": [], + "label": "OVERALL_SUM_ID", + "description": [], + "signature": [ + "\"overall_sum\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.OVERALL_SUM_NAME", + "type": "string", + "tags": [], + "label": "OVERALL_SUM_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/overall_sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.PERCENTILE_ID", + "type": "string", + "tags": [], + "label": "PERCENTILE_ID", + "description": [], + "signature": [ + "\"percentile\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/percentile.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.PERCENTILE_NAME", + "type": "string", + "tags": [], + "label": "PERCENTILE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/percentile.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.PERCENTILE_RANK_ID", + "type": "string", + "tags": [], + "label": "PERCENTILE_RANK_ID", + "description": [], + "signature": [ + "\"percentile_rank\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.PERCENTILE_RANK_NAME", + "type": "string", + "tags": [], + "label": "PERCENTILE_RANK_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.STD_DEVIATION_ID", + "type": "string", + "tags": [], + "label": "STD_DEVIATION_ID", + "description": [], + "signature": [ + "\"standard_deviation\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/std_deviation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.STD_DEVIATION_NAME", + "type": "string", + "tags": [], + "label": "STD_DEVIATION_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/std_deviation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.SUM_ID", + "type": "string", + "tags": [], + "label": "SUM_ID", + "description": [], + "signature": [ + "\"sum\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.SUM_NAME", + "type": "string", + "tags": [], + "label": "SUM_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/sum.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.TIME_RANGE_ID", + "type": "string", + "tags": [], + "label": "TIME_RANGE_ID", + "description": [], + "signature": [ + "\"time_range\"" + ], + "path": "packages/kbn-lens-formula-docs/src/operations/time_range.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.TIME_RANGE_NAME", + "type": "string", + "tags": [], + "label": "TIME_RANGE_NAME", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/operations/time_range.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.documentationMap", + "type": "Object", + "tags": [], + "label": "documentationMap", + "description": [], + "signature": [ + "{ [x: string]: ", + "OperationDocumentationType", + "; }" + ], + "path": "packages/kbn-lens-formula-docs/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections", + "type": "Object", + "tags": [], + "label": "sections", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.howTo", + "type": "string", + "tags": [], + "label": "howTo", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.elasticsearch", + "type": "Object", + "tags": [], + "label": "elasticsearch", + "description": [], + "signature": [ + "{ label: string; description: string; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.common", + "type": "Object", + "tags": [], + "label": "common", + "description": [], + "signature": [ + "{ label: string; description: string; items: { label: string; description: string; }[]; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.comparison", + "type": "Object", + "tags": [], + "label": "comparison", + "description": [], + "signature": [ + "{ label: string; description: string; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.math", + "type": "Object", + "tags": [], + "label": "math", + "description": [], + "signature": [ + "{ label: string; description: string; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.calculations", + "type": "Object", + "tags": [], + "label": "calculations", + "description": [], + "signature": [ + "{ label: string; description: string; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.sections.context", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "{ label: string; description: string; }" + ], + "path": "packages/kbn-lens-formula-docs/src/sections/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions", + "type": "Object", + "tags": [], + "label": "tinymathFunctions", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.add", + "type": "Object", + "tags": [], + "label": "add", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.add.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.add.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.add.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.subtract", + "type": "Object", + "tags": [], + "label": "subtract", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.subtract.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.subtract.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.subtract.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.multiply", + "type": "Object", + "tags": [], + "label": "multiply", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.multiply.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.multiply.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.multiply.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.divide", + "type": "Object", + "tags": [], + "label": "divide", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.divide.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.divide.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.divide.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.abs", + "type": "Object", + "tags": [], + "label": "abs", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.abs.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.abs.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.abs.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cbrt", + "type": "Object", + "tags": [], + "label": "cbrt", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cbrt.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cbrt.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cbrt.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ceil", + "type": "Object", + "tags": [], + "label": "ceil", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ceil.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ceil.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ceil.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.clamp", + "type": "Object", + "tags": [], + "label": "clamp", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.clamp.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.clamp.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "({ name: string; type: string; } | { name: string; type: string; alternativeWhenMissing: string; })[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.clamp.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cube", + "type": "Object", + "tags": [], + "label": "cube", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cube.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cube.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.cube.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.exp", + "type": "Object", + "tags": [], + "label": "exp", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.exp.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.exp.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.exp.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.fix", + "type": "Object", + "tags": [], + "label": "fix", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.fix.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.fix.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.fix.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.floor", + "type": "Object", + "tags": [], + "label": "floor", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.floor.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.floor.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.floor.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.log", + "type": "Object", + "tags": [], + "label": "log", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.log.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.log.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "({ name: string; type: string; } | { name: string; optional: true; defaultValue: string; type: string; })[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.log.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.mod", + "type": "Object", + "tags": [], + "label": "mod", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.mod.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.mod.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.mod.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pow", + "type": "Object", + "tags": [], + "label": "pow", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pow.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pow.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pow.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.round", + "type": "Object", + "tags": [], + "label": "round", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.round.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.round.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "({ name: string; type: string; } | { name: string; optional: true; defaultValue: number; type: string; })[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.round.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.sqrt", + "type": "Object", + "tags": [], + "label": "sqrt", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.sqrt.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.sqrt.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.sqrt.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.square", + "type": "Object", + "tags": [], + "label": "square", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.square.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.square.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.square.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_max", + "type": "Object", + "tags": [], + "label": "pick_max", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_max.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_max.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_max.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_min", + "type": "Object", + "tags": [], + "label": "pick_min", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_min.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_min.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.pick_min.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.defaults", + "type": "Object", + "tags": [], + "label": "defaults", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.defaults.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"math\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.defaults.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.defaults.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lt", + "type": "Object", + "tags": [], + "label": "lt", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lt.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lt.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lt.outputType", + "type": "string", + "tags": [], + "label": "outputType", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lt.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gt", + "type": "Object", + "tags": [], + "label": "gt", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gt.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gt.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gt.outputType", + "type": "string", + "tags": [], + "label": "outputType", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gt.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.eq", + "type": "Object", + "tags": [], + "label": "eq", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.eq.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.eq.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.eq.outputType", + "type": "string", + "tags": [], + "label": "outputType", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.eq.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lte", + "type": "Object", + "tags": [], + "label": "lte", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lte.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lte.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lte.outputType", + "type": "string", + "tags": [], + "label": "outputType", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.lte.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gte", + "type": "Object", + "tags": [], + "label": "gte", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gte.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gte.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gte.outputType", + "type": "string", + "tags": [], + "label": "outputType", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.gte.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ifelse", + "type": "Object", + "tags": [], + "label": "ifelse", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ifelse.section", + "type": "string", + "tags": [], + "label": "section", + "description": [], + "signature": [ + "\"comparison\"" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ifelse.positionalArguments", + "type": "Array", + "tags": [], + "label": "positionalArguments", + "description": [], + "signature": [ + "{ name: string; type: string; }[]" + ], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-formula-docs", + "id": "def-common.tinymathFunctions.ifelse.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "path": "packages/kbn-lens-formula-docs/src/math/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx new file mode 100644 index 0000000000000..5d63a5d0cce64 --- /dev/null +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnLensFormulaDocsPluginApi +slug: /kibana-dev-docs/api/kbn-lens-formula-docs +title: "@kbn/lens-formula-docs" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/lens-formula-docs plugin +date: 2024-01-03 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] +--- +import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; + + + +Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 172 | 0 | 172 | 1 | + +## Common + +### Objects + + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 2e307587bc5d2..0aad7f0b31b60 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-12-31 +date: 2024-01-03 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 d2a66e2695fda..608f5e661b253 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 bd1a6627f8570..0e76dcfee8184 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index ca871c9965442..3b7c3219f961c 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 6c0c1faf66978..89e1034ca738b 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index b2b784f48af4f..74809bc030a97 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index a8b1d7331ec3e..bd4a5ce1f8c46 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 307e65633da3b..6a2b8f7df7556 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 8a103637a3687..7ef6f131a7201 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 63c3099e87288..4868c02e24d88 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 235aa650f0872..db3f309da4413 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 4a3c7ba9f28b0..14daebc7a1ef0 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index d890d209d09d6..46fe06d3202fa 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 65e0bb2400ad3..d83cd2ed75991 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 02df389aecfc1..12aed4a625022 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 6b654b56188f0..13562d6da3e93 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 9975c8e751bee..6afb6f2796da8 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 67d30151d579f..bce484f2a3ba9 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 90731aabf4379..f555b04985d4c 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 6f6514b43facf..7844c32ad787c 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index ed3ed00125700..32843c50baf6d 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index d29a14307d81a..2a237add5bb32 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 3d89190e1f4c5..7050f7dccb806 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 09999772e1c6a..b49a49b6197d2 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 057119df3d55a..c590ad4216cc2 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 964bbeda41b29..d8ca772173fca 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index b5a0d33820fb1..aa56ebf03fd15 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 2c2ea85fd3688..a21fc6b630fc1 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index fa67b240c412c..ca8f6f8dabee1 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 562c73d8bcc46..55e6b1a595d3a 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 94d1efb9a8629..c81a827f09ba7 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 59bdb5b558a11..5fcbbce949ab2 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 83fc84cf0155a..549b31f6914df 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 7ca12b75f2365..7b6d8e7ba6737 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 50226ab3c6c26..79bccf79b8e18 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 355a1e8e1bbbf..5a686d30db186 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index fd9948b411517..30ad12e967919 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 106e33d230f97..34f8d460992c3 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 5ec7817913944..02e93e5198380 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 34da105020061..be58f24546153 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 1a781646a1390..49ff37164b4cd 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 6e7196612c5ff..81cc6961a3dfd 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 106cbca21f571..cb1ef42476df8 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 80d088fd4dbd4..54645dda86e93 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index b61f9378b481a..529085337a743 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index dc07f138d5232..9bddb8fc65312 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 3d70afae3ec41..2e474066f282f 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 4ddb5f1383143..92dc147c6dfe3 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index ebbe86e9e7dd4..2fe16fd4e8bbc 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-12-31 +date: 2024-01-03 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 7ba6233a4fa4f..95da111246b73 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-12-31 +date: 2024-01-03 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 8d232ecf2155b..428b1988c5266 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index eb729f5c65e38..c1be463949bc5 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 5decfb0ea9646..43b7ecb46c378 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-12-31 +date: 2024-01-03 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 27226cb2e9c21..2de8e21c2b5dd 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-12-31 +date: 2024-01-03 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 719b481360d41..daa193082d6fa 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 2b57a3b0fa680..18436bcedaea1 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 05953fa3e8ce7..420fa81ed4057 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 00b7542a58517..ef1d5e1575d16 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 250eff3e0ee46..09218d858f4a4 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index b229d12b73481..315a71dd74f08 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 819446e7b5425..74e588dcd6974 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index b4e8950b86b95..7ce89ba190aa5 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index ef33067cc59e4..05e5c7aecedc6 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 22666c5f1d41e..fb18a053e3ffa 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index b4c575099b53e..415c2cea3cf7c 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 65b5731d28f37..7282467a965ce 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 3bf7298a8684d..f148614157a0b 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index c04d216248d5c..4bc6616c3081b 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index e356469317e99..da5c09a6d0c8f 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index ffa411c59062a..f5e18c1615ac7 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index dc99786de452a..e8481d356dabb 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 2f8a1abd2b5dc..42ff98e422988 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index afa06009f2599..2252fb1d7977b 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 5fbca796b70ac..8176c546a0fe0 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 0b8a36b34d3bd..f39d7e111bc91 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index fca161b54171a..0061529c8c618 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 31b5b6dd56934..a052bd3626774 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 24b4f956b5bc5..8bfe06034f44e 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index f58daf99c47f8..64399026f1acc 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 377b74564177c..97cf0ad255b20 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 17a66293747e9..1d208bc86fcb0 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 40cbf2b41c92f..e32b7867319ec 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index af67329fb635b..6af048a8e4864 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 3b3ad174f262b..b99395bfe0711 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2d785a03c45a1..b728a36f9c936 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 3bf5c2d5cbd13..a9f69c48340be 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 43144e46dbfab..d4942841b3e92 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index ce78512a85875..bf8f93490d97a 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 49c0098dedcc9..524bbb2ba17d5 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 8c6bdab985545..da636b1c1eb17 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 6a72b849d70bd..adc89d81337bc 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 4d6c687f15740..00c15e7cccb6c 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index b7319f2c5433e..cadcb170ebc94 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 9b5946dbd3960..566e682d55ee9 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index a3ac02e2f90fa..6b2e00f57c6ea 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index b4f948454518f..834885381eda9 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 1732335b50e50..e10ab24287a01 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index e859a8e424ae3..2f6b6b2851d8c 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 083054eb5d56b..bd1e25d126795 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index f72986dd2988e..a9d6f110a244b 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 8a5f4c6c5a0e4..f437cefd7525b 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 183a5aa4e70e8..7ad7facc591d5 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 97967d486f74a..efeb0e6fe16a1 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 f74f3d410f75e..520f50d1154c7 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-12-31 +date: 2024-01-03 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 c585b9322c38a..83b2bc0d036f5 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-12-31 +date: 2024-01-03 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 6c5519ac168a4..d8a27520e0ec8 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-12-31 +date: 2024-01-03 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 3bbe94c4819a2..57966232ac0ed 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 4cdab21247149..ca14c731fa9ec 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-12-31 +date: 2024-01-03 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 25654b8f226f6..9abe4ac959005 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-12-31 +date: 2024-01-03 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 7be0d64c58e10..28e949d75ba67 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-12-31 +date: 2024-01-03 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 39f8cdd3906cd..5ce57dbadb96f 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 33f79f364ea53..3ae83f273eec8 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-12-31 +date: 2024-01-03 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 ce94b2ca83c7a..373d807dc9d11 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-12-31 +date: 2024-01-03 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 07c966bff6e04..6d17995911366 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-12-31 +date: 2024-01-03 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 9e3a42234d8f9..455ddc5f82b63 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-12-31 +date: 2024-01-03 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 b9d460954fe7e..d29cce7f05c69 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index c7bd56e2670d7..e9433cf3b698d 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 29612b5ff8950..a1660b4bd7e88 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 0b8131ee3a598..93523f759f581 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 7752ab874d8ce..cc0f78b5a522e 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 2abf38061ac8f..67423f625ef46 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 1ac633e6b420f..c8925d6bf6fb7 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 7e5b2ccd5ecff..7c922d1e2b589 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-12-31 +date: 2024-01-03 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 82325e55a6239..796bcda6e0e9b 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index fa18a9a584a16..de736c1d7f90f 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 77ab3ed44d6af..58a5ab4b38f8f 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-12-31 +date: 2024-01-03 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 2f5dd3bd34d7e..90d1f72419326 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-12-31 +date: 2024-01-03 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 80e4332f80ed3..fd3e522119dbe 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index e0891af4636e1..224a41536790b 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index de4cc308617a1..248fd2e12c3b4 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 84849ac720183..f6f66007e3ab5 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 31f8207ca4472..61eae0e2d5d6e 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index dc869555f72fa..1ae453e2c3a63 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index f79d06b1c0395..bef9e26fb6764 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 905a440d5cdcc..3650f4ac8270d 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index bfc6ec5596d77..e6a8523cba6b7 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 3faf60d4ce8dd..9912cf8d22e9c 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 0c1e1105beb51..494f4af5b8330 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 2cb6c290d427a..132b156c677ba 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-12-31 +date: 2024-01-03 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 f2318c0a4d8be..4f0a1d6d682a2 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 72b09b83eeea5..564a99f44d3af 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-12-31 +date: 2024-01-03 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 14404512e25a5..14043b1af7ccd 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 9f58a56d33e5b..76ecc24e5c503 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-12-31 +date: 2024-01-03 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 dc67c0477b908..5952a742ad198 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 7e93274d0096f..a19f29ae4197d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-12-31 +date: 2024-01-03 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 458d8a603c6c8..6edab56b60236 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 19ca607f3c40b..6846a3f39744a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-12-31 +date: 2024-01-03 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 1ef1cafdf18e3..2a1d929f82bc2 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2206781190dd6..8f7d5e9972bed 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-12-31 +date: 2024-01-03 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 72b3ba864428a..ccca99c9c473f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-12-31 +date: 2024-01-03 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 aaaaaa13c11ce..aa615696e5bca 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 2f0e8e2d03f54..803059f6fa37b 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 e4372af929990..0c13af1740585 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-12-31 +date: 2024-01-03 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 f09407ee01327..cc38c174485a1 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-12-31 +date: 2024-01-03 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 3361ad2f3062c..2673bb590a21b 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 2306ba1d0c5bd..68513b4bdc5bd 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index e0b621dbac9ee..a1921cc39f3ce 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-12-31 +date: 2024-01-03 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 05dc4b995edaf..8d3c93253e39a 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-12-31 +date: 2024-01-03 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 bfff9eea960f4..5b90814ed5685 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-12-31 +date: 2024-01-03 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 47c5ff97f24b0..d69ac1205fe9d 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-12-31 +date: 2024-01-03 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 345f3fb398369..4cb6047f567a5 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 7514c6f315c83..89dbd5e19d512 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index ace0ddf69aa81..dd6d1cd901524 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 844999586b238..2c8d82b3d13ce 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-12-31 +date: 2024-01-03 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 ba031e5445d07..4dab60cc6a5b0 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-12-31 +date: 2024-01-03 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 8162527e1412f..915c6a4406be4 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-12-31 +date: 2024-01-03 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 eb78e602bcc1d..c88538f066da9 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-12-31 +date: 2024-01-03 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 453cc95b0c288..8a458402df9d3 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-12-31 +date: 2024-01-03 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 5c633399e82a0..80aa7c0b186fc 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-12-31 +date: 2024-01-03 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 6fcdb863fc6cb..3d129388e8d9b 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index a2c409dd9baa3..03bf2b4697f27 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 2fddcf08c2960..653a918f3428c 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 558b67c87dd68..4f57c9886f97c 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index b52e4add6a452..4ba0d12a8120d 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 0d5519e1fc125..e71fb6b97df1b 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 59e4b1ffd2cc3..a8c13d1fb6c78 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 9bedf6f75294b..04c5a4630b4e1 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-12-31 +date: 2024-01-03 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 62b500858b9a0..05444f50727f5 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index e45d0e6278421..27c0944ded0b7 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index a02b217381d8a..2cd19b347d1ee 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index c4f72384e6d26..941aa79576c78 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index c1482e39e46fd..54cf31b1cfa91 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index c7226ca805cba..92172339b303d 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 46b4fbf6479e5..f1a231f2edd3b 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 118e205485ca6..61c7ded7ee365 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-12-31 +date: 2024-01-03 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 98f14b80d5a94..3c1c971dc9643 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-12-31 +date: 2024-01-03 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 43686d5adfae9..fe8b3fa0b2eae 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-12-31 +date: 2024-01-03 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 75d1698ca1489..870a70ccc59a0 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index b6e4a4b225820..4457643c9d519 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 4e3cdc6b6f544..83120f04b39b1 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index a4539a9d5f834..068712904f1f3 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index b00b6e3bd829f..5bc2ac9d9b274 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 1b99459a62004..30d93558b2aab 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 0db3f10e66244..900c0050bccc1 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-12-31 +date: 2024-01-03 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 abf9907a4b518..f062f7a1978ef 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.devdocs.json b/api_docs/kibana_utils.devdocs.json index 936391892cf5b..5e1c4d861f7cf 100644 --- a/api_docs/kibana_utils.devdocs.json +++ b/api_docs/kibana_utils.devdocs.json @@ -6941,57 +6941,6 @@ "initialIsOpen": false } ], - "setup": { - "parentPluginId": "kibanaUtils", - "id": "def-public.KibanaUtilsPublicSetup", - "type": "Interface", - "tags": [], - "label": "KibanaUtilsPublicSetup", - "description": [], - "path": "src/plugins/kibana_utils/public/plugin.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "kibanaUtils", - "id": "def-public.KibanaUtilsPublicSetup.setVersion", - "type": "Function", - "tags": [], - "label": "setVersion", - "description": [], - "signature": [ - "(history: Pick<", - "History", - ", \"replace\" | \"location\">) => void" - ], - "path": "src/plugins/kibana_utils/public/plugin.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "kibanaUtils", - "id": "def-public.KibanaUtilsPublicSetup.setVersion.$1", - "type": "Object", - "tags": [], - "label": "history", - "description": [], - "signature": [ - "Pick<", - "History", - ", \"replace\" | \"location\">" - ], - "path": "src/plugins/kibana_utils/public/plugin.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "lifecycle": "setup", - "initialIsOpen": true - }, "start": { "parentPluginId": "kibanaUtils", "id": "def-public.KibanaUtilsPublicStart", diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 6a1be8d70ef6c..51a97b2547ba7 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; @@ -21,13 +21,10 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 611 | 3 | 418 | 9 | +| 609 | 3 | 416 | 9 | ## Client -### Setup - - ### Start diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index f9f357339c3f5..ddd27527049c5 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 127d6201d44b4..77b173434d849 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 37542c5c0cafd..dd62dc6469ab8 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-12-31 +date: 2024-01-03 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 5887fbc5677b9..22ba90cd24a27 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-12-31 +date: 2024-01-03 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 0cfffbd99316e..cc0934bb97f61 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 7bef84c417a39..cd5906c590ddc 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 13136dcdfb1d3..459851d88d76a 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 852079251d576..0f86843637c18 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 95c8969bb4279..8b6055b3dc3f0 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 818deca8ce433..21d1f4112a115 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-12-31 +date: 2024-01-03 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 67ec05824575c..b38008b55d907 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-12-31 +date: 2024-01-03 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 38cf308015a6e..11ea4193bf725 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 3fee2e63121b7..0c4cfa7f55142 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 6c439a1d6ffee..bbb4846ee65ec 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 7d50cbc4e3639..80aac90bc6263 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 6f663d80b8aaa..0b77040cf831e 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-12-31 +date: 2024-01-03 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 e6dd1dbd18727..4e375924fb996 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-12-31 +date: 2024-01-03 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 ebff258a039a2..53f14005f29da 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-12-31 +date: 2024-01-03 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 af5e441a81862..1a184b5a94b66 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index aa944beea0a87..08b58bf9ae33f 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index fa38506627b43..502d1e6ac2292 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index a4f2eb51086f0..d468bbe94eafc 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 9d3e36465047c..9f6c3916d3271 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -799,7 +799,7 @@ "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; }; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/chat\": { endpoint: \"POST /internal/observability_ai_assistant/chat\"; params?: ", @@ -865,7 +865,7 @@ "[]; connectorId: string; functions: { name: string; description: string; parameters: any; }[]; } & { functionCall?: string | undefined; }; } & { query?: { stream: boolean; } | undefined; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }, TEndpoint> & Omit & { signal: AbortSignal | null; }>) => Promise<", @@ -1305,7 +1305,7 @@ "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; }; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/chat\": { endpoint: \"POST /internal/observability_ai_assistant/chat\"; params?: ", @@ -1371,7 +1371,7 @@ "[]; connectorId: string; functions: { name: string; description: string; parameters: any; }[]; } & { functionCall?: string | undefined; }; } & { query?: { stream: boolean; } | undefined; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }, TEndpoint>>" @@ -2051,7 +2051,7 @@ "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; }; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/chat\": { endpoint: \"POST /internal/observability_ai_assistant/chat\"; params?: ", @@ -2117,7 +2117,7 @@ "[]; connectorId: string; functions: { name: string; description: string; parameters: any; }[]; } & { functionCall?: string | undefined; }; } & { query?: { stream: boolean; } | undefined; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", @@ -2566,7 +2566,7 @@ "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; }; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/chat\": { endpoint: \"POST /internal/observability_ai_assistant/chat\"; params?: ", @@ -2632,7 +2632,7 @@ "[]; connectorId: string; functions: { name: string; description: string; parameters: any; }[]; } & { functionCall?: string | undefined; }; } & { query?: { stream: boolean; } | undefined; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT | undefined; handler: ({}: any) => Promise; } & ", @@ -3217,7 +3217,7 @@ "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; }; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; \"POST /internal/observability_ai_assistant/chat\": { endpoint: \"POST /internal/observability_ai_assistant/chat\"; params?: ", @@ -3283,7 +3283,7 @@ "[]; connectorId: string; functions: { name: string; description: string; parameters: any; }[]; } & { functionCall?: string | undefined; }; } & { query?: { stream: boolean; } | undefined; }; }) => Promise<", "Readable", " | ", - "CreateChatCompletionResponse", + "ChatCompletion", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", "; }" diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 74a8f2db1253f..d7ce131b6a005 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index 8af2d2b922984..9c960bc052bf9 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index c47e6643985c3..0e5003d939247 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 8b3e406e4a14f..4f59ae57937f2 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 426969efc0574..609775afeb479 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 36f60ac394fc4..a5e6430fdf179 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index e95f18b2879d2..81175579f00cd 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 738 | 628 | 41 | +| 739 | 629 | 41 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 77972 | 234 | 66691 | 1695 | +| 78142 | 234 | 66861 | 1696 | ## Plugin Directory @@ -118,7 +118,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 163 | 0 | 129 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 611 | 3 | 418 | 9 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 609 | 3 | 416 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | | | [@elastic/kibana-visualizations](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. | 644 | 0 | 545 | 60 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | @@ -491,6 +491,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 108 | 0 | 107 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 7 | 0 | 5 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 181 | 0 | 178 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 172 | 0 | 172 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 27 | 0 | 1 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 1 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 4624344da0606..e56d71cb98bcc 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-12-31 +date: 2024-01-03 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 f9aabdf2452a8..f39051a371ff7 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index b7e6818fe05fa..d7f8672329881 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 6287749e951e3..b109b3446cecf 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-12-31 +date: 2024-01-03 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 ede42289f64e7..31a3da2b5ab6d 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-12-31 +date: 2024-01-03 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 f4ff7e1779844..cea802f9971f4 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 4927f473c6f5b..b870959636a99 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 054f2c31424c5..69eb6b0b86f3e 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-12-31 +date: 2024-01-03 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 4db334cbf252f..6bb60e236065f 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-12-31 +date: 2024-01-03 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 20a8551a89ab4..e4f06dedc68c9 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-12-31 +date: 2024-01-03 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 c50e634560c65..240f5379146d0 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-12-31 +date: 2024-01-03 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 27c29f7ecdcc0..5f0850edfd8ba 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-12-31 +date: 2024-01-03 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 414068f5f040b..b8fd6f76fcc4a 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-12-31 +date: 2024-01-03 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 9e85544697e2a..60ed1196eb3fc 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-12-31 +date: 2024-01-03 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 ed82ce28ac95f..ab659d230c860 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-12-31 +date: 2024-01-03 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 007e7e4521654..cfd2c82a6d31a 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-12-31 +date: 2024-01-03 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 5ad843770b28f..4bf743a49f344 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index c22d74cdd9d0e..c50901f256cad 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -114,7 +114,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false, @@ -568,7 +568,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -648,7 +648,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"assistantStreamingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"entityAnalyticsAssetCriticalityEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1913,7 +1913,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3018,7 +3018,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3194,7 +3194,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3243,7 +3243,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly assistantStreamingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly entityAnalyticsAssetCriticalityEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index de3826500d44b..5d631622d3c55 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 6c3458713d809..496db05fd9caa 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 0bea74a412f12..29c98b16a0679 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 8f8621e0f93e5..59b23a3c31a25 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 6b1267730063a..b351d1f0b1287 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 1e27b58b8bcbf..65a73bf283578 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c9aea59dbfaaa..9957256613981 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-12-31 +date: 2024-01-03 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 f9d65aa17da3b..8df6e5a837baa 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-12-31 +date: 2024-01-03 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 2a9a878b77366..8a9b27fb11cbb 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-12-31 +date: 2024-01-03 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 5e6526d0239f4..e59ab271b2634 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-12-31 +date: 2024-01-03 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 915ebc51ca109..af43ca66522ed 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-12-31 +date: 2024-01-03 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 ab2a9de4d8fb7..ae06061a2d8cb 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-12-31 +date: 2024-01-03 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 d8f84f4cad42d..500e303d69b67 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-12-31 +date: 2024-01-03 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 000cbc54a2752..0264fb525ecbd 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-12-31 +date: 2024-01-03 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 03308fd827333..9575f4a0718ff 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-12-31 +date: 2024-01-03 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 b20bf705241e9..88a0e0ef99f32 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-12-31 +date: 2024-01-03 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 a256bec7a1b82..82c661cf3473b 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 163ef544336f8..927887f108372 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 40fe836bb547d..fa99d8b38f8c6 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-12-31 +date: 2024-01-03 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 aa9724c195d35..05668cbb7ddd4 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-12-31 +date: 2024-01-03 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 f67c8b57b1767..c04d00490bd4b 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-12-31 +date: 2024-01-03 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 7d5fab951038c..351e8d3a65a35 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-12-31 +date: 2024-01-03 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 ff163fb7b1dcc..7d24106350bb3 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-12-31 +date: 2024-01-03 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 b71dc32b73eaa..2897f21dfafb7 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index f10671dac676b..70d55981c9fdb 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index fdd3e1c10e047..b841711c08667 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-12-31 +date: 2024-01-03 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 ff45a9af4652e..890f5712ce2f7 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-12-31 +date: 2024-01-03 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 c76779c934b41..6014e6f7cb259 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index d9d943e4cc91f..5089071b68843 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 89d490871c1eb..857b1c234e058 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-12-31 +date: 2024-01-03 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 29a85c19a73fc..898b58dc778f0 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-12-31 +date: 2024-01-03 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 5e3068f148319..4242c83addcbd 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-12-31 +date: 2024-01-03 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 baa56f8577bcf..f32d6d222012f 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-12-31 +date: 2024-01-03 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 fc6252faa4cc4..8240fbbe9d4da 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-12-31 +date: 2024-01-03 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 dfbaf3976ba62..ea235c34b46b8 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-12-31 +date: 2024-01-03 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 84c25340bc244..f9b3982af9cc7 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-12-31 +date: 2024-01-03 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 05832fa9087e9..cf87397eb440d 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-12-31 +date: 2024-01-03 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 c9fde9ce64568..d88e8087f2288 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-12-31 +date: 2024-01-03 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 b85047716df44..9208339d2cec7 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-12-31 +date: 2024-01-03 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 00d0ea93a4aa6..de9e191a9a6ee 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-12-31 +date: 2024-01-03 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 04207fb4b0a54..9277efa317640 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-12-31 +date: 2024-01-03 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 b979a8d267014..123ecf53cf5e3 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 9d0ae7429925f..180108f0dc59c 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-12-31 +date: 2024-01-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/fleet_packages.json b/fleet_packages.json index 9d3a9d77b68c6..0a9a4546e8750 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -24,21 +24,21 @@ [ { "name": "apm", - "version": "8.12.0-preview-1696560930", + "version": "8.13.0-preview-1701948405", "forceAlignStackVersion": true, "allowSyncToPrerelease": true }, { "name": "elastic_agent", - "version": "1.15.0" + "version": "1.18.0" }, { "name": "endpoint", - "version": "8.11.0" + "version": "8.11.1" }, { "name": "fleet_server", - "version": "1.4.0" + "version": "1.5.0" }, { "name": "profiler_symbolizer", @@ -52,10 +52,10 @@ }, { "name": "synthetics", - "version": "1.1.0" + "version": "1.1.1" }, { "name": "security_detection_engine", - "version": "8.11.2" + "version": "8.12.1" } ] \ No newline at end of file diff --git a/package.json b/package.json index 800d511122f2a..68122ca59fc5b 100644 --- a/package.json +++ b/package.json @@ -74,12 +74,12 @@ "url": "https://github.com/elastic/kibana.git" }, "engines": { - "node": "18.18.2", + "node": "20.10.0", "yarn": "^1.22.19" }, "resolutions": { "**/@hello-pangea/dnd": "16.2.0", - "**/@types/node": "18.18.5", + "**/@types/node": "20.10.5", "**/@typescript-eslint/utils": "5.62.0", "**/chokidar": "^3.5.3", "**/globule/minimatch": "^3.1.2", @@ -508,6 +508,7 @@ "@kbn/kubernetes-security-plugin": "link:x-pack/plugins/kubernetes_security", "@kbn/language-documentation-popover": "link:packages/kbn-language-documentation-popover", "@kbn/lens-embeddable-utils": "link:packages/kbn-lens-embeddable-utils", + "@kbn/lens-formula-docs": "link:packages/kbn-lens-formula-docs", "@kbn/lens-plugin": "link:x-pack/plugins/lens", "@kbn/license-api-guard-plugin": "link:x-pack/plugins/license_api_guard", "@kbn/license-management-plugin": "link:x-pack/plugins/license_management", @@ -864,7 +865,7 @@ "@opentelemetry/sdk-metrics-base": "^0.31.0", "@opentelemetry/semantic-conventions": "^1.4.0", "@reduxjs/toolkit": "1.7.2", - "@slack/webhook": "^5.0.4", + "@slack/webhook": "^7.0.1", "@smithy/eventstream-codec": "^2.0.12", "@smithy/util-utf8": "^2.0.0", "@tanstack/react-query": "^4.29.12", @@ -1009,7 +1010,7 @@ "normalize-path": "^3.0.0", "object-hash": "^1.3.1", "object-path-immutable": "^3.1.1", - "openai": "^3.3.0", + "openai": "^4.24.1", "openpgp": "5.10.1", "opn": "^5.5.0", "ora": "^4.0.4", @@ -1412,7 +1413,7 @@ "@types/multistream": "^4.1.0", "@types/mustache": "^0.8.31", "@types/nock": "^10.0.3", - "@types/node": "18.18.5", + "@types/node": "20.10.5", "@types/node-fetch": "2.6.4", "@types/node-forge": "^1.3.10", "@types/nodemailer": "^6.4.0", diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts index f940e49805cd5..202cef2ca09d4 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugin_manifest_parser.test.ts @@ -59,7 +59,7 @@ test('return error when manifest content is not a valid JSON', async () => { }); await expect(parseManifest(pluginPath, packageInfo)).rejects.toMatchObject({ - message: `Unexpected token o in JSON at position 1 (invalid-manifest, ${pluginManifestPath})`, + message: `Unexpected token 'o', "not-json" is not valid JSON (invalid-manifest, ${pluginManifestPath})`, type: PluginDiscoveryErrorType.InvalidManifest, path: pluginManifestPath, }); diff --git a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts index 9ab50d8786cca..93657a1f2533e 100644 --- a/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts +++ b/packages/core/plugins/core-plugins-server-internal/src/discovery/plugins_discovery.test.ts @@ -278,7 +278,7 @@ describe('plugins discovery system', () => { .toPromise(); expect(errors).toContain( - `Error: Unexpected token o in JSON at position 1 (invalid-manifest, ${manifestPath( + `Error: Unexpected token 'o', "not-json" is not valid JSON (invalid-manifest, ${manifestPath( 'plugin_a' )})` ); diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a259d76c6affb..8016b5aaee223 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -877,7 +877,9 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D integrations: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-your-data`, integrationsLogstash: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-logstash`, integrationsBeats: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-beats`, - integrationsConnectorClient: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-your-data`, + integrationsConnectorClient: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client`, + integrationsConnectorClientRunFromSource: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-from-source`, + integrationsConnectorClientRunWithDocker: `${SERVERLESS_ELASTICSEARCH_DOCS}ingest-data-through-integrations-connector-client#run-with-docker`, gettingStartedExplore: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, gettingStartedIngest: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, gettingStartedSearch: `${SERVERLESS_ELASTICSEARCH_DOCS}get-started`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 910c0c218dcc5..e48f7327984b9 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -623,6 +623,8 @@ export interface DocLinks { readonly integrations: string; readonly integrationsBeats: string; readonly integrationsConnectorClient: string; + readonly integrationsConnectorClientRunFromSource: string; + readonly integrationsConnectorClientRunWithDocker: string; readonly integrationsLogstash: string; }; readonly serverlessSecurity: { diff --git a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts index b87e6f71400e0..9e0d5c02238b8 100644 --- a/packages/kbn-es-archiver/src/lib/archives/parse.test.ts +++ b/packages/kbn-es-archiver/src/lib/archives/parse.test.ts @@ -98,7 +98,7 @@ describe('esArchiver createParseArchiveStreams', () => { ] as [Readable, ...Writable[]]); throw new Error('should have failed'); } catch (err) { - expect(err.message).toEqual(expect.stringContaining('Unexpected number')); + expect(err.message).toEqual(`Expected property name or '}' in JSON at position 1`); } }); }); diff --git a/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js b/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js index 5ef6145698811..0d44b8a775b25 100644 --- a/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js +++ b/packages/kbn-es/src/integration_tests/__fixtures__/es_bin.js @@ -87,11 +87,11 @@ const { ES_KEY_PATH, ES_CERT_PATH } = require('@kbn/dev-utils'); } ); - // setup server auto close after 1 second of silence + // setup server auto close after 5 second of silence let serverCloseTimer; const delayServerClose = () => { clearTimeout(serverCloseTimer); - serverCloseTimer = setTimeout(() => server.close(), 1000); + serverCloseTimer = setTimeout(() => server.close(), 5000); }; server.on('request', delayServerClose); server.on('listening', delayServerClose); diff --git a/packages/kbn-es/src/utils/docker.test.ts b/packages/kbn-es/src/utils/docker.test.ts index d877e5bdf8261..122914c3fa667 100644 --- a/packages/kbn-es/src/utils/docker.test.ts +++ b/packages/kbn-es/src/utils/docker.test.ts @@ -7,8 +7,7 @@ */ import mockFs from 'mock-fs'; -import { existsSync } from 'fs'; -import { stat } from 'fs/promises'; +import Fsp from 'fs/promises'; import { basename } from 'path'; import { @@ -115,7 +114,7 @@ const volumeCmdTest = async (volumeCmd: string[]) => { // extract only permission from mode // eslint-disable-next-line no-bitwise - expect((await stat(serverlessObjectStorePath)).mode & 0o777).toBe(0o777); + expect((await Fsp.stat(serverlessObjectStorePath)).mode & 0o777).toBe(0o777); }; describe('resolveDockerImage()', () => { @@ -508,7 +507,7 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath }); volumeCmdTest(volumeCmd); - expect(existsSync(serverlessObjectStorePath)).toBe(true); + await expect(Fsp.access(serverlessObjectStorePath)).resolves.not.toThrow(); }); test('should use an existing object store', async () => { @@ -517,7 +516,9 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath }); volumeCmdTest(volumeCmd); - expect(existsSync(`${serverlessObjectStorePath}/cluster_state/lease`)).toBe(true); + await expect( + Fsp.access(`${serverlessObjectStorePath}/cluster_state/lease`) + ).resolves.not.toThrow(); }); test('should remove an existing object store when clean is passed', async () => { @@ -526,7 +527,9 @@ describe('setupServerlessVolumes()', () => { const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath, clean: true }); volumeCmdTest(volumeCmd); - expect(existsSync(`${serverlessObjectStorePath}/cluster_state/lease`)).toBe(false); + await expect( + Fsp.access(`${serverlessObjectStorePath}/cluster_state/lease`) + ).rejects.toThrowError(); }); test('should add SSL and IDP metadata volumes when ssl and kibanaUrl are passed', async () => { diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 31c00beb7a71f..8273d0267b319 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -542,12 +542,19 @@ export async function setupServerlessVolumes(log: ToolingLog, options: Serverles log.info(chalk.bold(`Checking for local serverless ES object store at ${objectStorePath}`)); log.indent(4); - if (clean && fs.existsSync(objectStorePath)) { + let exists = null; + try { + await Fsp.access(objectStorePath); + exists = true; + } catch (e) { + exists = false; + } + if (clean && exists) { log.info('Cleaning existing object store.'); await Fsp.rm(objectStorePath, { recursive: true, force: true }); } - if (clean || !fs.existsSync(objectStorePath)) { + if (clean || !exists) { await Fsp.mkdir(objectStorePath, { recursive: true }).then(() => log.info('Created new object store.') ); diff --git a/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts b/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts index 8b131db4c05e5..088f6fedc85f7 100644 --- a/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts +++ b/packages/kbn-ftr-common-functional-services/services/retry/retry_for_success.ts @@ -52,12 +52,16 @@ export async function retryForSuccess(log: ToolingLog, options: Options) { const start = Date.now(); const retryDelay = 502; + const criticalWebDriverErrors = ['NoSuchSessionError', 'NoSuchWindowError']; let lastError; while (true) { if (Date.now() - start > timeout) { await onFailure(lastError); throw new Error('expected onFailure() option to throw an error'); + } else if (lastError && criticalWebDriverErrors.includes(lastError.name)) { + // Aborting retry since WebDriver session is invalid or browser window is closed + throw new Error('WebDriver session is invalid, retry was aborted'); } else if (lastError && onFailureBlock) { const before = await runAttempt(onFailureBlock); if ('error' in before) { diff --git a/packages/kbn-i18n/GUIDELINE.md b/packages/kbn-i18n/GUIDELINE.md index 98f6f176d0be8..983515a16c737 100644 --- a/packages/kbn-i18n/GUIDELINE.md +++ b/packages/kbn-i18n/GUIDELINE.md @@ -128,7 +128,7 @@ Here's a rule of id naming: 'kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch' 'kbn.management.editIndexPattern.wrongTypeErrorMessage' 'kbn.management.editIndexPattern.scripted.table.nameDescription' - 'xpack.lens.formulaDocumentation.filterRatioDescription.markdown' + 'lensFormulaDocs.documentation.filterRatioDescription.markdown' ``` - For complex messages, which are divided into several parts, use the following approach: @@ -183,7 +183,7 @@ Each message id should end with a type of the message. | tooltip | `kbn.management.editIndexPattern.removeTooltip` | | error message | `kbn.management.createIndexPattern.step.invalidCharactersErrorMessage` | | toggleSwitch | `kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch` | -| markdown | `xpack.lens.formulaDocumentation.filterRatioDescription.markdown` | +| markdown | `lensFormulaDocs.documentation.filterRatioDescription.markdown` | For example: @@ -278,7 +278,7 @@ For example: = [ + average, + count, + cardinality, + counterRate, + cumulativeSum, + differences, + interval, + lastValue, + max, + median, + min, + movingAverage, + normalizeByUnit, + now, + overallAverge, + overallMax, + overallMin, + overallSum, + percentileRank, + percentile, + stdDeviation, + sum, + timeRange, +].reduce((memo: Record, op: OperationDocumentationType) => { + memo[op.id] = op; + return memo; +}, {}); + +export { tinymathFunctions, getTypeI18n } from './src/math'; +export { sections } from './src/sections'; diff --git a/packages/kbn-lens-formula-docs/jest.config.js b/packages/kbn-lens-formula-docs/jest.config.js new file mode 100644 index 0000000000000..65a09b087a8e7 --- /dev/null +++ b/packages/kbn-lens-formula-docs/jest.config.js @@ -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 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-lens-formula-docs'], +}; diff --git a/packages/kbn-lens-formula-docs/kibana.jsonc b/packages/kbn-lens-formula-docs/kibana.jsonc new file mode 100644 index 0000000000000..11135fcff7d7e --- /dev/null +++ b/packages/kbn-lens-formula-docs/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/lens-formula-docs", + "owner": ["@elastic/kibana-visualizations"] +} diff --git a/packages/kbn-lens-formula-docs/package.json b/packages/kbn-lens-formula-docs/package.json new file mode 100644 index 0000000000000..c9494c6248a90 --- /dev/null +++ b/packages/kbn-lens-formula-docs/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/lens-formula-docs", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false + } \ No newline at end of file diff --git a/packages/kbn-lens-formula-docs/src/math/index.ts b/packages/kbn-lens-formula-docs/src/math/index.ts new file mode 100644 index 0000000000000..5ce1c12e0a5ba --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/math/index.ts @@ -0,0 +1,640 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; + +export function getTypeI18n(type: string) { + if (type === 'number') { + return i18n.translate('lensFormulaDocs.number', { defaultMessage: 'number' }); + } + if (type === 'string') { + return i18n.translate('lensFormulaDocs.string', { defaultMessage: 'string' }); + } + if (type === 'boolean') { + return i18n.translate('lensFormulaDocs.boolean', { defaultMessage: 'boolean' }); + } + return ''; +} + +export const tinymathFunctions: Record< + string, + { + section: 'math' | 'comparison'; + positionalArguments: Array<{ + name: string; + optional?: boolean; + defaultValue?: string | number; + type?: string; + alternativeWhenMissing?: string; + }>; + // Help is in Markdown format + help: string; + // When omitted defaults to "number". + // Used for comparison functions return type + outputType?: string; + } +> = { + add: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.addFunction.markdown', { + defaultMessage: ` +Adds up two numbers. +Also works with \`+\` symbol. + +Example: Calculate the sum of two fields + +\`sum(price) + sum(tax)\` + +Example: Offset count by a static value + +\`add(count(), 5)\` + `, + }), + }, + subtract: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.subtractFunction.markdown', { + defaultMessage: ` +Subtracts the first number from the second number. +Also works with \`-\` symbol. + +Example: Calculate the range of a field +\`subtract(max(bytes), min(bytes))\` + `, + }), + }, + multiply: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.multiplyFunction.markdown', { + defaultMessage: ` +Multiplies two numbers. +Also works with \`*\` symbol. + +Example: Calculate price after current tax rate +\`sum(bytes) * last_value(tax_rate)\` + +Example: Calculate price after constant tax rate +\`multiply(sum(price), 1.2)\` + `, + }), + }, + divide: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.divideFunction.markdown', { + defaultMessage: ` +Divides the first number by the second number. +Also works with \`/\` symbol + +Example: Calculate profit margin +\`sum(profit) / sum(revenue)\` + +Example: \`divide(sum(bytes), 2)\` + `, + }), + }, + abs: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.absFunction.markdown', { + defaultMessage: ` +Calculates absolute value. A negative value is multiplied by -1, a positive value stays the same. + +Example: Calculate average distance to sea level \`abs(average(altitude))\` + `, + }), + }, + cbrt: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.cbrtFunction.markdown', { + defaultMessage: ` +Cube root of value. + +Example: Calculate side length from volume +\`cbrt(last_value(volume))\` + `, + }), + }, + ceil: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.ceilFunction.markdown', { + defaultMessage: ` +Ceiling of value, rounds up. + +Example: Round up price to the next dollar +\`ceil(sum(price))\` + `, + }), + }, + clamp: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.min', { defaultMessage: 'min' }), + type: getTypeI18n('number'), + alternativeWhenMissing: 'pick_max', + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.max', { defaultMessage: 'max' }), + type: getTypeI18n('number'), + alternativeWhenMissing: 'pick_min', + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.clampFunction.markdown', { + defaultMessage: ` +Limits the value from a minimum to maximum. + +Example: Make sure to catch outliers +\`\`\` +clamp( + average(bytes), + percentile(bytes, percentile=5), + percentile(bytes, percentile=95) +) +\`\`\` +`, + }), + }, + cube: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.cubeFunction.markdown', { + defaultMessage: ` +Calculates the cube of a number. + +Example: Calculate volume from side length +\`cube(last_value(length))\` + `, + }), + }, + exp: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.expFunction.markdown', { + defaultMessage: ` +Raises *e* to the nth power. + +Example: Calculate the natural exponential function + +\`exp(last_value(duration))\` + `, + }), + }, + fix: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.fixFunction.markdown', { + defaultMessage: ` +For positive values, takes the floor. For negative values, takes the ceiling. + +Example: Rounding towards zero +\`fix(sum(profit))\` + `, + }), + }, + floor: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.floorFunction.markdown', { + defaultMessage: ` +Round down to nearest integer value + +Example: Round down a price +\`floor(sum(price))\` + `, + }), + }, + log: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + optional: true, + defaultValue: 'e', + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.logFunction.markdown', { + defaultMessage: ` +Logarithm with optional base. The natural base *e* is used as default. + +Example: Calculate number of bits required to store values +\`\`\` +log(sum(bytes)) +log(sum(bytes), 2) +\`\`\` + `, + }), + }, + mod: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.modFunction.markdown', { + defaultMessage: ` +Remainder after dividing the function by a number + +Example: Calculate last three digits of a value +\`mod(sum(price), 1000)\` + `, + }), + }, + pow: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.base', { defaultMessage: 'base' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.powFunction.markdown', { + defaultMessage: ` +Raises the value to a certain power. The second argument is required + +Example: Calculate volume based on side length +\`pow(last_value(length), 3)\` + `, + }), + }, + round: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.decimals', { defaultMessage: 'decimals' }), + optional: true, + defaultValue: 0, + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.roundFunction.markdown', { + defaultMessage: ` +Rounds to a specific number of decimal places, default of 0 + +Examples: Round to the cent +\`\`\` +round(sum(bytes)) +round(sum(bytes), 2) +\`\`\` + `, + }), + }, + sqrt: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.sqrtFunction.markdown', { + defaultMessage: ` +Square root of a positive value only + +Example: Calculate side length based on area +\`sqrt(last_value(area))\` + `, + }), + }, + square: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.squareFunction.markdown', { + defaultMessage: ` +Raise the value to the 2nd power + +Example: Calculate area based on side length +\`square(last_value(length))\` + `, + }), + }, + pick_max: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.maxFunction.markdown', { + defaultMessage: ` +Finds the maximum value between two numbers. + +Example: Find the maximum between two fields averages +\`pick_max(average(bytes), average(memory))\` + `, + }), + }, + pick_min: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.minFunction.markdown', { + defaultMessage: ` +Finds the minimum value between two numbers. + +Example: Find the minimum between two fields averages +\`pick_min(average(bytes), average(memory))\` + `, + }), + }, + defaults: { + section: 'math', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.value', { defaultMessage: 'value' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.defaultValue', { + defaultMessage: 'default', + }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.defaultFunction.markdown', { + defaultMessage: ` +Returns a default numeric value when value is null. + +Example: Return -1 when a field has no data +\`defaults(average(bytes), -1)\` +`, + }), + }, + lt: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.ltFunction.markdown', { + defaultMessage: ` +Performs a lower than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`<\` symbol. + +Example: Returns true if the average of bytes is lower than the average amount of memory +\`average(bytes) <= average(memory)\` + +Example: \`lt(average(bytes), 1000)\` + `, + }), + }, + gt: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.gtFunction.markdown', { + defaultMessage: ` +Performs a greater than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`>\` symbol. + +Example: Returns true if the average of bytes is greater than the average amount of memory +\`average(bytes) > average(memory)\` + +Example: \`gt(average(bytes), 1000)\` + `, + }), + }, + eq: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.eqFunction.markdown', { + defaultMessage: ` +Performs an equality comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`==\` symbol. + +Example: Returns true if the average of bytes is exactly the same amount of average memory +\`average(bytes) == average(memory)\` + +Example: \`eq(sum(bytes), 1000000)\` + `, + }), + }, + lte: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.lteFunction.markdown', { + defaultMessage: ` +Performs a lower than or equal comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`<=\` symbol. + +Example: Returns true if the average of bytes is lower than or equal to the average amount of memory +\`average(bytes) <= average(memory)\` + +Example: \`lte(average(bytes), 1000)\` + `, + }), + }, + gte: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + outputType: getTypeI18n('boolean'), + help: i18n.translate('lensFormulaDocs.tinymath.gteFunction.markdown', { + defaultMessage: ` +Performs a greater than comparison between two values. +To be used as condition for \`ifelse\` comparison function. +Also works with \`>=\` symbol. + +Example: Returns true if the average of bytes is greater than or equal to the average amount of memory +\`average(bytes) >= average(memory)\` + +Example: \`gte(average(bytes), 1000)\` + `, + }), + }, + ifelse: { + section: 'comparison', + positionalArguments: [ + { + name: i18n.translate('lensFormulaDocs.tinymath.condition', { defaultMessage: 'condition' }), + type: getTypeI18n('boolean'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.left', { defaultMessage: 'left' }), + type: getTypeI18n('number'), + }, + { + name: i18n.translate('lensFormulaDocs.tinymath.right', { defaultMessage: 'right' }), + type: getTypeI18n('number'), + }, + ], + help: i18n.translate('lensFormulaDocs.tinymath.ifElseFunction.markdown', { + defaultMessage: ` +Returns a value depending on whether the element of condition is true or false. + +Example: Average revenue per customer but in some cases customer id is not provided which counts as additional customer +\`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/average.ts b/packages/kbn-lens-formula-docs/src/operations/average.ts new file mode 100644 index 0000000000000..84e755be52782 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/average.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const AVG_ID = 'average'; +export const AVG_NAME = i18n.translate('lensFormulaDocs.avg', { + defaultMessage: 'Average', +}); + +export const average = buildMetricDocumentationDefinition({ + id: AVG_ID, + name: AVG_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/cardinality.ts b/packages/kbn-lens-formula-docs/src/operations/cardinality.ts new file mode 100644 index 0000000000000..6bb1ddb9e2889 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/cardinality.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const CARDINALITY_ID = 'unique_count'; +export const CARDINALITY_NAME = i18n.translate('lensFormulaDocs.cardinality', { + defaultMessage: 'Unique Count', +}); + +export const cardinality: OperationDocumentationType = { + id: CARDINALITY_ID, + name: CARDINALITY_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.cardinality.signature', { + defaultMessage: 'field: string', + }), + description: i18n.translate('lensFormulaDocs.cardinality.documentation.markdown', { + defaultMessage: ` +Calculates the number of unique values of a specified field. Works for number, string, date and boolean values. + +Example: Calculate the number of different products: +\`unique_count(product.name)\` + +Example: Calculate the number of different products from the "clothes" group: +\`unique_count(product.name, kql='product.group=clothes')\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/count.ts b/packages/kbn-lens-formula-docs/src/operations/count.ts new file mode 100644 index 0000000000000..db5fdf37df5e1 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/count.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const COUNT_ID = 'count'; +export const COUNT_NAME = i18n.translate('lensFormulaDocs.count', { + defaultMessage: 'Count', +}); + +export const count: OperationDocumentationType = { + id: COUNT_ID, + name: COUNT_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.count.signature', { + defaultMessage: '[field: string]', + }), + description: i18n.translate('lensFormulaDocs.count.documentation.markdown', { + defaultMessage: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted. + +#### Examples + +To calculate the total number of documents, use \`count()\`. + +To calculate the number of products in all orders, use \`count(products.id)\`. + +To calculate the number of documents that match a specific filter, use \`count(kql='price > 500')\`. +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/counter_rate.ts b/packages/kbn-lens-formula-docs/src/operations/counter_rate.ts new file mode 100644 index 0000000000000..7321fb30e354b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/counter_rate.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 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const COUNTER_RATE_ID = 'counter_rate'; +export const COUNTER_RATE_NAME = i18n.translate('lensFormulaDocs.counterRate', { + defaultMessage: 'Counter rate', +}); + +export const counterRate: OperationDocumentationType = { + id: COUNTER_RATE_ID, + name: COUNTER_RATE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.counterRate.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.counterRate.documentation.markdown', { + defaultMessage: ` +Calculates the rate of an ever increasing counter. This function will only yield helpful results on counter metric fields which contain a measurement of some kind monotonically growing over time. +If the value does get smaller, it will interpret this as a counter reset. To get most precise results, \`counter_rate\` should be calculated on the \`max\` of a field. + +This calculation will be done separately for separate series defined by filters or top values dimensions. +It uses the current interval when used in Formula. + +Example: Visualize the rate of bytes received over time by a memcached server: +\`counter_rate(max(memcached.stats.read.bytes))\` + `, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts b/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts new file mode 100644 index 0000000000000..d25b76f3cb5b8 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/cumulative_sum.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const CUMULATIVE_SUM_ID = 'cumulative_sum'; +export const CUMULATIVE_SUM_NAME = i18n.translate('lensFormulaDocs.cumulativeSum', { + defaultMessage: 'Cumulative sum', +}); + +export const cumulativeSum: OperationDocumentationType = { + id: CUMULATIVE_SUM_ID, + name: CUMULATIVE_SUM_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.cumulative_sum.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.cumulativeSum.documentation.markdown', { + defaultMessage: ` +Calculates the cumulative sum of a metric over time, adding all previous values of a series to each value. To use this function, you need to configure a date histogram dimension as well. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Example: Visualize the received bytes accumulated over time: +\`cumulative_sum(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/differences.ts b/packages/kbn-lens-formula-docs/src/operations/differences.ts new file mode 100644 index 0000000000000..ccbf4e091083a --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/differences.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const DIFFERENCES_ID = 'differences'; +export const DIFFERENCES_NAME = i18n.translate('lensFormulaDocs.derivative', { + defaultMessage: 'Differences', +}); + +export const differences: OperationDocumentationType = { + id: DIFFERENCES_ID, + name: DIFFERENCES_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.differences.signature', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.differences.documentation.markdown', { + defaultMessage: ` +Calculates the difference to the last value of a metric over time. To use this function, you need to configure a date histogram dimension as well. +Differences requires the data to be sequential. If your data is empty when using differences, try increasing the date histogram interval. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Example: Visualize the change in bytes received over time: +\`differences(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/helpers.ts b/packages/kbn-lens-formula-docs/src/operations/helpers.ts new file mode 100644 index 0000000000000..0749dcab277b4 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/helpers.ts @@ -0,0 +1,87 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +function buildDocumentationDefinition({ + id, + name, + documentation, + signature, + section, +}: { + id: string; + name: string; + documentation: string; + signature: string; + section: 'elasticsearch' | 'calculation' | 'constants'; +}): OperationDocumentationType { + return { + id, + name, + documentation: { + section, + signature, + description: documentation, + }, + }; +} + +export function buildMetricDocumentationDefinition({ + id, + name, + documentation, +}: { + id: string; + name: string; + documentation?: string; +}): OperationDocumentationType { + return buildDocumentationDefinition({ + id, + name, + documentation: + documentation || + i18n.translate('lensFormulaDocs.metric.documentation.markdown', { + defaultMessage: ` +Returns the {metric} of a field. This function only works for number fields. + +Example: Get the {metric} of price: +\`{metric}(price)\` + +Example: Get the {metric} of price for orders from the UK: +\`{metric}(price, kql='location:UK')\` + `, + values: { + metric: id, + }, + }), + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.metric.signature', { + defaultMessage: 'field: string', + }), + }); +} + +export function buildContextVariableDocumentationDefinition({ + id, + name, + documentation, +}: { + id: string; + name: string; + documentation: string; +}): OperationDocumentationType { + return buildDocumentationDefinition({ + id, + name, + documentation, + section: 'constants', + signature: '', + }); +} diff --git a/packages/kbn-lens-formula-docs/src/operations/interval.ts b/packages/kbn-lens-formula-docs/src/operations/interval.ts new file mode 100644 index 0000000000000..b36f9a34914fc --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/interval.ts @@ -0,0 +1,28 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const INTERVAL_ID = 'interval'; +export const INTERVAL_NAME = i18n.translate('lensFormulaDocs.interval', { + defaultMessage: 'Date histogram interval', +}); + +export const interval = buildContextVariableDocumentationDefinition({ + id: INTERVAL_ID, + name: INTERVAL_NAME, + documentation: i18n.translate('lensFormulaDocs.interval.help', { + defaultMessage: ` +The specified minimum interval for the date histogram, in milliseconds (ms). + +Example: Dynamically normalize the metric based on bucket interval size: +\`sum(bytes) / interval()\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/last_value.ts b/packages/kbn-lens-formula-docs/src/operations/last_value.ts new file mode 100644 index 0000000000000..5705aad8ef090 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/last_value.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const LAST_VALUE_ID = 'last_value'; +export const LAST_VALUE_NAME = i18n.translate('lensFormulaDocs.lastValue', { + defaultMessage: 'Last value', +}); + +export const lastValue: OperationDocumentationType = { + id: LAST_VALUE_ID, + name: LAST_VALUE_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.lastValue.signature', { + defaultMessage: 'field: string', + }), + description: i18n.translate('lensFormulaDocs.lastValue.documentation.markdown', { + defaultMessage: ` +Returns the value of a field from the last document, ordered by the default time field of the data view. + +This function is usefull the retrieve the latest state of an entity. + +Example: Get the current status of server A: +\`last_value(server.status, kql=\'server.name="A"\')\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/max.ts b/packages/kbn-lens-formula-docs/src/operations/max.ts new file mode 100644 index 0000000000000..1068d796f1028 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/max.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MAX_ID = 'max'; +export const MAX_NAME = i18n.translate('lensFormulaDocs.max', { + defaultMessage: 'Maximum', +}); + +export const max = buildMetricDocumentationDefinition({ + id: MAX_ID, + name: MAX_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/median.ts b/packages/kbn-lens-formula-docs/src/operations/median.ts new file mode 100644 index 0000000000000..7dfdaefa9b86c --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/median.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MEDIAN_ID = 'median'; +export const MEDIAN_NAME = i18n.translate('lensFormulaDocs.median', { + defaultMessage: 'Median', +}); + +export const median = buildMetricDocumentationDefinition({ + id: MEDIAN_ID, + name: MEDIAN_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/min.ts b/packages/kbn-lens-formula-docs/src/operations/min.ts new file mode 100644 index 0000000000000..b2f8650d30081 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/min.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const MIN_ID = 'min'; +export const MIN_NAME = i18n.translate('lensFormulaDocs.min', { + defaultMessage: 'Minimum', +}); + +export const min = buildMetricDocumentationDefinition({ + id: MIN_ID, + name: MIN_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/moving_average.ts b/packages/kbn-lens-formula-docs/src/operations/moving_average.ts new file mode 100644 index 0000000000000..4c3177db93b11 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/moving_average.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const MOVING_AVERAGE_ID = 'moving_average'; +export const MOVING_AVERAGE_NAME = i18n.translate('lensFormulaDocs.movingAverage', { + defaultMessage: 'Moving average', +}); +export const MOVING_AVERAGE_WINDOW_DEFAULT_VALUE = 5; + +export const movingAverage: OperationDocumentationType = { + id: MOVING_AVERAGE_ID, + name: MOVING_AVERAGE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.moving_average.signature', { + defaultMessage: 'metric: number, [window]: number', + }), + description: i18n.translate('lensFormulaDocs.movingAverage.documentation.markdown', { + defaultMessage: ` +Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. +The default window value is {defaultValue}. + +This calculation will be done separately for separate series defined by filters or top values dimensions. + +Takes a named parameter \`window\` which specifies how many last values to include in the average calculation for the current value. + +Example: Smooth a line of measurements: +\`moving_average(sum(bytes), window=5)\` +`, + values: { + defaultValue: MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, + }, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts b/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts new file mode 100644 index 0000000000000..f66768f13a2b5 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/normalize_by_unit.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const NORMALIZE_BY_UNIT_ID = 'normalize_by_unit'; +export const NORMALIZE_BY_UNIT_NAME = i18n.translate('lensFormulaDocs.timeScale', { + defaultMessage: 'Normalize by unit', +}); + +export const normalizeByUnit: OperationDocumentationType = { + id: NORMALIZE_BY_UNIT_ID, + name: NORMALIZE_BY_UNIT_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.time_scale', { + defaultMessage: 'metric: number, unit: s|m|h|d|w|M|y', + }), + description: i18n.translate('lensFormulaDocs.time_scale.documentation.markdown', { + defaultMessage: ` +This advanced function is useful for normalizing counts and sums to a specific time interval. It allows for integration with metrics that are stored already normalized to a specific time interval. + +This function can only be used if there's a date histogram function used in the current chart. + +Example: A ratio comparing an already normalized metric to another metric that needs to be normalized. +\`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/now.ts b/packages/kbn-lens-formula-docs/src/operations/now.ts new file mode 100644 index 0000000000000..cb5f1a6686d25 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/now.ts @@ -0,0 +1,28 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const NOW_ID = 'now'; +export const NOW_NAME = i18n.translate('lensFormulaDocs.now', { + defaultMessage: 'Current now', +}); + +export const now = buildContextVariableDocumentationDefinition({ + id: NOW_ID, + name: NOW_NAME, + documentation: i18n.translate('lensFormulaDocs.now.help', { + defaultMessage: ` +The current now moment used in Kibana expressed in milliseconds (ms). + +Example: How long (in ms) has been the server running since the last restart? +\`now() - last_value(start_time)\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_average.ts b/packages/kbn-lens-formula-docs/src/operations/overall_average.ts new file mode 100644 index 0000000000000..328c97fde47d6 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_average.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_AVERAGE_ID = 'overall_average'; +export const OVERALL_AVERAGE_NAME = i18n.translate('lensFormulaDocs.overallAverage', { + defaultMessage: 'Overall average', +}); + +export const overallAverge: OperationDocumentationType = { + id: OVERALL_AVERAGE_ID, + name: OVERALL_AVERAGE_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_average.documentation.markdown', { + defaultMessage: ` +Calculates the average of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_average\` is calculating the average over all dimensions no matter the used function + +Example: Divergence from the mean: +\`sum(bytes) - overall_average(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_max.ts b/packages/kbn-lens-formula-docs/src/operations/overall_max.ts new file mode 100644 index 0000000000000..4da02a7f1265f --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_max.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_MAX_ID = 'overall_max'; +export const OVERALL_MAX_NAME = i18n.translate('lensFormulaDocs.overallMax', { + defaultMessage: 'Overall max', +}); + +export const overallMax: OperationDocumentationType = { + id: OVERALL_MAX_ID, + name: OVERALL_MAX_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_max.documentation.markdown', { + defaultMessage: ` +Calculates the maximum of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_max\` is calculating the maximum over all dimensions no matter the used function + +Example: Percentage of range: +\`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_min.ts b/packages/kbn-lens-formula-docs/src/operations/overall_min.ts new file mode 100644 index 0000000000000..f775f8d8448fa --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_min.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_MIN_ID = 'overall_min'; +export const OVERALL_MIN_NAME = i18n.translate('lensFormulaDocs.overallMin', { + defaultMessage: 'Overall min', +}); + +export const overallMin: OperationDocumentationType = { + id: OVERALL_MIN_ID, + name: OVERALL_MIN_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_min.documentation.markdown', { + defaultMessage: ` +Calculates the minimum of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_min\` is calculating the minimum over all dimensions no matter the used function + +Example: Percentage of range: +\`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts b/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts new file mode 100644 index 0000000000000..b786cda98e4c8 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/overall_sum.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const OVERALL_SUM_ID = 'overall_sum'; +export const OVERALL_SUM_NAME = i18n.translate('lensFormulaDocs.overallSum', { + defaultMessage: 'Overall sum', +}); + +export const overallSum: OperationDocumentationType = { + id: OVERALL_SUM_ID, + name: OVERALL_SUM_NAME, + documentation: { + section: 'calculation', + signature: i18n.translate('lensFormulaDocs.overall_metric', { + defaultMessage: 'metric: number', + }), + description: i18n.translate('lensFormulaDocs.overall_sum.documentation.markdown', { + defaultMessage: ` +Calculates the sum of a metric of all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. +Other dimensions breaking down the data like top values or filter are treated as separate series. + +If no date histograms or interval functions are used in the current chart, \`overall_sum\` is calculating the sum over all dimensions no matter the used function. + +Example: Percentage of total: +\`sum(bytes) / overall_sum(sum(bytes))\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/percentile.ts b/packages/kbn-lens-formula-docs/src/operations/percentile.ts new file mode 100644 index 0000000000000..35c94a0c3d2be --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/percentile.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 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const PERCENTILE_ID = 'percentile'; +export const PERCENTILE_NAME = i18n.translate('lensFormulaDocs.percentile', { + defaultMessage: 'Percentile', +}); + +export const percentile: OperationDocumentationType = { + id: PERCENTILE_ID, + name: PERCENTILE_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.percentile.signature', { + defaultMessage: 'field: string, [percentile]: number', + }), + description: i18n.translate('lensFormulaDocs.percentile.documentation.markdown', { + defaultMessage: ` +Returns the specified percentile of the values of a field. This is the value n percent of the values occuring in documents are smaller. + +Example: Get the number of bytes larger than 95 % of values: +\`percentile(bytes, percentile=95)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts b/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.ts new file mode 100644 index 0000000000000..2131131a2bf00 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/percentile_ranks.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 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 { i18n } from '@kbn/i18n'; +import { OperationDocumentationType } from './types'; + +export const PERCENTILE_RANK_ID = 'percentile_rank'; +export const PERCENTILE_RANK_NAME = i18n.translate('lensFormulaDocs.percentileRank', { + defaultMessage: 'Percentile rank', +}); + +export const percentileRank: OperationDocumentationType = { + id: PERCENTILE_RANK_ID, + name: PERCENTILE_RANK_NAME, + documentation: { + section: 'elasticsearch', + signature: i18n.translate('lensFormulaDocs.percentileRanks.signature', { + defaultMessage: 'field: string, [value]: number', + }), + description: i18n.translate('lensFormulaDocs.percentileRanks.documentation.markdown', { + defaultMessage: ` +Returns the percentage of values which are below a certain value. For example, if a value is greater than or equal to 95% of the observed values it is said to be at the 95th percentile rank + +Example: Get the percentage of values which are below of 100: +\`percentile_rank(bytes, value=100)\` +`, + }), + }, +}; diff --git a/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts b/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts new file mode 100644 index 0000000000000..6c0b0d1604b5b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/std_deviation.ts @@ -0,0 +1,31 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const STD_DEVIATION_ID = 'standard_deviation'; +export const STD_DEVIATION_NAME = i18n.translate('lensFormulaDocs.standardDeviation', { + defaultMessage: 'Standard deviation', +}); + +export const stdDeviation = buildMetricDocumentationDefinition({ + id: STD_DEVIATION_ID, + name: STD_DEVIATION_NAME, + documentation: i18n.translate('lensFormulaDocs.standardDeviation.documentation.markdown', { + defaultMessage: ` +Returns the amount of variation or dispersion of the field. The function works only for number fields. + +#### Examples + +To get the standard deviation of price, use \`standard_deviation(price)\`. + +To get the variance of price for orders from the UK, use \`square(standard_deviation(price, kql='location:UK'))\`. +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/sum.ts b/packages/kbn-lens-formula-docs/src/operations/sum.ts new file mode 100644 index 0000000000000..8c7882b213a09 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/sum.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import { buildMetricDocumentationDefinition } from './helpers'; + +export const SUM_ID = 'sum'; +export const SUM_NAME = i18n.translate('lensFormulaDocs.sum', { + defaultMessage: 'Sum', +}); + +export const sum = buildMetricDocumentationDefinition({ + id: SUM_ID, + name: SUM_NAME, +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/time_range.ts b/packages/kbn-lens-formula-docs/src/operations/time_range.ts new file mode 100644 index 0000000000000..58107cbee1587 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/time_range.ts @@ -0,0 +1,28 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; +import { buildContextVariableDocumentationDefinition } from './helpers'; + +export const TIME_RANGE_ID = 'time_range'; +export const TIME_RANGE_NAME = i18n.translate('lensFormulaDocs.time_range', { + defaultMessage: 'Time range', +}); + +export const timeRange = buildContextVariableDocumentationDefinition({ + id: TIME_RANGE_ID, + name: TIME_RANGE_NAME, + documentation: i18n.translate('lensFormulaDocs.timeRange.help', { + defaultMessage: ` +The specified time range, in milliseconds (ms). + +Example: How long is the current time range? +\`time_range()\` +`, + }), +}); diff --git a/packages/kbn-lens-formula-docs/src/operations/types.ts b/packages/kbn-lens-formula-docs/src/operations/types.ts new file mode 100644 index 0000000000000..1351a9e9db28b --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/operations/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export interface OperationDocumentationType { + id: string; + name: string; + documentation: { + signature: string; + description: string; + section: 'elasticsearch' | 'calculation' | 'constants'; + }; +} diff --git a/packages/kbn-lens-formula-docs/src/sections/calculations.ts b/packages/kbn-lens-formula-docs/src/sections/calculations.ts new file mode 100644 index 0000000000000..824e171087ff3 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/calculations.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const calculationsSection = { + label: i18n.translate('lensFormulaDocs.documentation.columnCalculationSection', { + defaultMessage: 'Column calculations', + }), + description: i18n.translate('lensFormulaDocs.documentation.columnCalculationSectionDescription', { + defaultMessage: + 'These functions are executed for each row, but are provided with the whole column as context. This is also known as a window function.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/common.ts b/packages/kbn-lens-formula-docs/src/sections/common.ts new file mode 100644 index 0000000000000..050b3edc810b9 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/common.ts @@ -0,0 +1,106 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; + +export const commonFormulas = { + label: i18n.translate('lensFormulaDocs.frequentlyUsedHeading', { + defaultMessage: 'Common formulas', + }), + description: i18n.translate('lensFormulaDocs.CommonFormulaDocumentation', { + defaultMessage: `The most common formulas are dividing two values to produce a percent. To display accurately, set "value format" to "percent".`, + }), + items: [ + { + label: i18n.translate('lensFormulaDocs.documentation.filterRatio', { + defaultMessage: 'Filter ratio', + }), + description: i18n.translate('lensFormulaDocs.documentation.filterRatioDescription.markdown', { + defaultMessage: `### Filter ratio: + +Use \`kql=''\` to filter one set of documents and compare it to other documents within the same grouping. +For example, to see how the error rate changes over time: + +\`\`\` +count(kql='response.status_code > 400') / count() +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + }), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.weekOverWeek', { + defaultMessage: 'Week over week', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.weekOverWeekDescription.markdown', + { + defaultMessage: `### Week over week: + +Use \`shift='1w'\` to get the value of each grouping from +the previous week. Time shift should not be used with the *Top values* function. + +\`\`\` +percentile(system.network.in.bytes, percentile=99) / +percentile(system.network.in.bytes, percentile=99, shift='1w') +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.percentOfTotal', { + defaultMessage: 'Percent of total', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.percentOfTotalDescription.markdown', + { + defaultMessage: `### Percent of total + +Formulas can calculate \`overall_sum\` for all the groupings, +which lets you convert each grouping into a percent of total: + +\`\`\` +sum(products.base_price) / overall_sum(sum(products.base_price)) +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + { + label: i18n.translate('lensFormulaDocs.documentation.recentChange', { + defaultMessage: 'Recent change', + }), + description: i18n.translate( + 'lensFormulaDocs.documentation.recentChangeDescription.markdown', + { + defaultMessage: `### Recent change + +Use \`reducedTimeRange='30m'\` to add an additional filter on the time range of a metric aligned with the end of the global time range. This can be used to calculate how much a value changed recently. + +\`\`\` +max(system.network.in.bytes, reducedTimeRange="30m") +- min(system.network.in.bytes, reducedTimeRange="30m") +\`\`\` + `, + + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + } + ), + }, + ], +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/comparison.ts b/packages/kbn-lens-formula-docs/src/sections/comparison.ts new file mode 100644 index 0000000000000..152b521301832 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/comparison.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; + +export const comparisonSection = { + label: i18n.translate('lensFormulaDocs.documentation.comparisonSection', { + defaultMessage: 'Comparison', + }), + description: i18n.translate('lensFormulaDocs.documentation.comparisonSectionDescription', { + defaultMessage: 'These functions are used to perform value comparison.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/context.ts b/packages/kbn-lens-formula-docs/src/sections/context.ts new file mode 100644 index 0000000000000..c4bb989d6b5e7 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/context.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const contextSection = { + label: i18n.translate('lensFormulaDocs.documentation.constantsSection', { + defaultMessage: 'Kibana context', + }), + description: i18n.translate('lensFormulaDocs.documentation.constantsSectionDescription', { + defaultMessage: + 'These functions are used to retrieve Kibana context variables, which are the date histogram `interval`, the current `now` and the selected `time_range` and help you to compute date math operations.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/elasticsearch.ts b/packages/kbn-lens-formula-docs/src/sections/elasticsearch.ts new file mode 100644 index 0000000000000..2570c96f08f70 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/elasticsearch.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const elasticsearchSection = { + label: i18n.translate('lensFormulaDocs.documentation.elasticsearchSection', { + defaultMessage: 'Elasticsearch', + }), + description: i18n.translate('lensFormulaDocs.documentation.elasticsearchSectionDescription', { + defaultMessage: + 'These functions will be executed on the raw documents for each row of the resulting table, aggregating all documents matching the break down dimensions into a single value.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/how_to.ts b/packages/kbn-lens-formula-docs/src/sections/how_to.ts new file mode 100644 index 0000000000000..76eb91023013e --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/how_to.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; + +export const howToSection = i18n.translate('lensFormulaDocs.documentation.markdown', { + defaultMessage: `## How it works + +Lens formulas let you do math using a combination of Elasticsearch aggregations and +math functions. There are three main types of functions: + +* Elasticsearch metrics, like \`sum(bytes)\` +* Time series functions use Elasticsearch metrics as input, like \`cumulative_sum()\` +* Math functions like \`round()\` + +An example formula that uses all of these: + +\`\`\` +round(100 * moving_average( +average(cpu.load.pct), +window=10, +kql='datacenter.name: east*' +)) +\`\`\` + +Elasticsearch functions take a field name, which can be in quotes. \`sum(bytes)\` is the same +as \`sum('bytes')\`. + +Some functions take named arguments, like \`moving_average(count(), window=5)\`. + +Elasticsearch metrics can be filtered using KQL or Lucene syntax. To add a filter, use the named +parameter \`kql='field: value'\` or \`lucene=''\`. Always use single quotes when writing KQL or Lucene +queries. If your search has a single quote in it, use a backslash to escape, like: \`kql='Women's'\' + +Math functions can take positional arguments, like pow(count(), 3) is the same as count() * count() * count() + +Use the symbols +, -, /, and * to perform basic math. +`, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', +}); diff --git a/packages/kbn-lens-formula-docs/src/sections/index.ts b/packages/kbn-lens-formula-docs/src/sections/index.ts new file mode 100644 index 0000000000000..dafa94b8269f0 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { elasticsearchSection } from './elasticsearch'; +import { commonFormulas } from './common'; +import { comparisonSection } from './comparison'; +import { mathSection } from './math'; +import { calculationsSection } from './calculations'; +import { contextSection } from './context'; +import { howToSection } from './how_to'; + +export const sections = { + howTo: howToSection, + elasticsearch: elasticsearchSection, + common: commonFormulas, + comparison: comparisonSection, + math: mathSection, + calculations: calculationsSection, + context: contextSection, +}; diff --git a/packages/kbn-lens-formula-docs/src/sections/math.ts b/packages/kbn-lens-formula-docs/src/sections/math.ts new file mode 100644 index 0000000000000..d3fcaf6a15b93 --- /dev/null +++ b/packages/kbn-lens-formula-docs/src/sections/math.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const mathSection = { + label: i18n.translate('lensFormulaDocs.documentation.mathSection', { + defaultMessage: 'Math', + }), + description: i18n.translate('lensFormulaDocs.documentation.mathSectionDescription', { + defaultMessage: + 'These functions will be executed for reach row of the resulting table using single values from the same row calculated using other functions.', + }), +}; diff --git a/packages/kbn-lens-formula-docs/tsconfig.json b/packages/kbn-lens-formula-docs/tsconfig.json new file mode 100644 index 0000000000000..d28d082af4d18 --- /dev/null +++ b/packages/kbn-lens-formula-docs/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": ["jest", "node"] + }, + "include": ["**/*.ts"], + "exclude": ["target/**/*"], + "kbn_references": [ + "@kbn/i18n", + ] +} diff --git a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts index bfb9ecaee8d80..c6bf698319228 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/autocomplete/autocomplete.test.ts @@ -291,6 +291,7 @@ describe('autocomplete', () => { testSuggestions('from a,', suggestedIndexes); testSuggestions('from a, b ', ['[metadata $0 ]', '|', ',']); testSuggestions('from *,', suggestedIndexes); + testSuggestions('from index', suggestedIndexes, 6 /* index index in from */); }); describe('where', () => { diff --git a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts index 820ab04fea3bf..9d19305a25060 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/definitions/functions.ts @@ -18,9 +18,15 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ }), signatures: [ { - params: [{ name: 'field', type: 'number' }], + params: [ + { name: 'field', type: 'number' }, + { name: 'decimals', type: 'number', optional: true }, + ], returnType: 'number', - examples: [`from index | eval round_value = round(field)`], + examples: [ + `from index | eval round_value = round(field)`, + `from index | eval round_value = round(field, 2)`, + ], }, ], }, diff --git a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts b/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts index 3a51038ec4e92..d175ae1b2f3af 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/shared/context.ts @@ -20,6 +20,7 @@ import { isColumnItem, getLastCharFromTrimmed, getFunctionDefinition, + isSourceItem, } from './helpers'; function findNode(nodes: ESQLAstItem[], offset: number): ESQLSingleAstItem | undefined { @@ -69,7 +70,9 @@ function findOption(nodes: ESQLAstItem[], offset: number): ESQLCommandOption | u } function isMarkerNode(node: ESQLSingleAstItem | undefined): boolean { - return Boolean(node && isColumnItem(node) && node.name === EDITOR_MARKER); + return Boolean( + node && (isColumnItem(node) || isSourceItem(node)) && node.name.endsWith(EDITOR_MARKER) + ); } function cleanMarkerNode(node: ESQLSingleAstItem | undefined): ESQLSingleAstItem | undefined { diff --git a/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx b/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx index fb1ebce945306..b3fc911460bf7 100644 --- a/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx +++ b/packages/kbn-search-connectors/components/configuration/connector_configuration.tsx @@ -118,6 +118,27 @@ export const ConnectorConfigurationComponent: React.FC {children && {children}} + {!uncategorizedDisplayList.length && ( + + + {i18n.translate( + 'searchConnectors.configurationConnector.config.noConfigCallout.description', + { + defaultMessage: + 'This connector has no configuration fields. Has your connector connected successfully to Elasticsearch and set its configuration?', + } + )} + + + )} {isEditing ? ( { * node scripts/find_babel_runtime_helpers_in_use.js */ '@babel/runtime/helpers/assertThisInitialized', - '@babel/runtime/helpers/asyncToGenerator', - '@babel/runtime/helpers/classCallCheck', '@babel/runtime/helpers/classPrivateFieldGet', '@babel/runtime/helpers/classPrivateFieldSet', - '@babel/runtime/helpers/createClass', - '@babel/runtime/helpers/createForOfIteratorHelper', - '@babel/runtime/helpers/createSuper', '@babel/runtime/helpers/defineProperty', '@babel/runtime/helpers/extends', - '@babel/runtime/helpers/inherits', '@babel/runtime/helpers/inheritsLoose', - '@babel/runtime/helpers/interopRequireDefault', - '@babel/runtime/helpers/interopRequireWildcard', - '@babel/runtime/helpers/objectSpread2', - '@babel/runtime/helpers/objectWithoutProperties', - '@babel/runtime/helpers/objectWithoutPropertiesLoose', - '@babel/runtime/helpers/slicedToArray', '@babel/runtime/helpers/taggedTemplateLiteralLoose', - '@babel/runtime/helpers/toConsumableArray', - '@babel/runtime/helpers/typeof', '@babel/runtime/helpers/wrapNativeSuper', - '@babel/runtime/regenerator', // modules from npm '@elastic/charts', diff --git a/src/dev/build/tasks/patch_native_modules_task.ts b/src/dev/build/tasks/patch_native_modules_task.ts index d36fe4eca01ee..df851036b79ed 100644 --- a/src/dev/build/tasks/patch_native_modules_task.ts +++ b/src/dev/build/tasks/patch_native_modules_task.ts @@ -47,8 +47,8 @@ const packages: Package[] = [ extractMethod: 'gunzip', archives: { 'linux-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-x64-108.gz', - sha256: '136b6cf61b54bf610071a950400518add65d44a4923f11ef658769df1a037f0b', + url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-x64-115.gz', + sha256: 'b88183fe7bc8afa260d22cd909f496ab5636aace7075b54ac345d33ea32aedc0', }, // Linux ARM builds are currently done manually as Github Actions used in upstream project // do not natively support an Linux ARM target. @@ -63,20 +63,20 @@ const packages: Package[] = [ // * capture the sha256 with: `shasum -a 256 linux-arm64-*` // * upload the `linux-arm64-*.gz` artifact to the `yarn-prebuilt-artifacts` bucket in GCS using the correct version number 'linux-arm64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-arm64-108.gz', - sha256: '311822ac689bd49a534ecf400b4732a288ad218f711b0e593e41dd3a6b739d97', + url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/linux-arm64-115.gz', + sha256: '6c04136a6658df3dcc5b8ac0041641c227d232bed385fe55f62c8470f8db041d', }, 'darwin-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-x64-108.gz', - sha256: '215b6ffb1e5d124439a7dbdd09e4ed1263e065839354a6ad67091ce00d14ee9b', + url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-x64-115.gz', + sha256: '1e0d79983c94222c414a5410444ec0ccf37614fd0e45187d0f313a19b203702c', }, 'darwin-arm64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-arm64-108.gz', - sha256: '0a8bc28150c9efd04f3b52ac214cc7898bde1b8e1f8e6900ae711b03665ff657', + url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/darwin-arm64-115.gz', + sha256: '192c8e036062504b818941989c44ddb799efe0419d039f7089caedb09d49a597', }, 'win32-x64': { - url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/win32-x64-108.gz', - sha256: '117872144e4a2bb61611aacc51ac9fd24e494c209cf63366f236099a662316eb', + url: 'https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.20.9/win32-x64-115.gz', + sha256: '01ae2df89f976f4097e50e121d7ec6ac62ec8050c838107dcfb976d037a60d59', }, }, }, diff --git a/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts b/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts index fb9db4490144b..f4eeca4bc5ba6 100644 --- a/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts +++ b/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts @@ -744,7 +744,7 @@ describe('createStreamingBatchedFunction()', () => { const [, error1] = await promise1; const [result1] = await promise2; expect(error1).toMatchObject({ - message: 'Unexpected token N in JSON at position 0', + message: `Unexpected token 'N', "Not a JSON\n" is not valid JSON`, code: 'STREAM', }); expect(result1).toMatchObject({ diff --git a/src/plugins/data/public/search/expressions/esdsl.test.ts b/src/plugins/data/public/search/expressions/esdsl.test.ts index 2bf2ef1148507..603dbf1e8f3eb 100644 --- a/src/plugins/data/public/search/expressions/esdsl.test.ts +++ b/src/plugins/data/public/search/expressions/esdsl.test.ts @@ -63,7 +63,7 @@ describe('esdsl', () => { } catch (error) { errorMessage = error.message; } - expect(errorMessage).toEqual('Unexpected token i in JSON at position 0'); + expect(errorMessage).toEqual(`Unexpected token 'i', "invalid json" is not valid JSON`); }); test('adds filters', async () => { diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index 9a717953d60f8..4bf4939714975 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { PluginInitializerContext } from '@kbn/core/public'; import { KibanaUtilsPublicPlugin } from './plugin'; export type { Get, Set } from '../common'; @@ -114,6 +113,6 @@ export { applyDiff } from './state_management/utils/diff_object'; export type { KibanaUtilsPublicSetup as KibanaUtilsSetup, KibanaUtilsPublicStart } from './plugin'; -export function plugin(initializerContext: PluginInitializerContext) { - return new KibanaUtilsPublicPlugin(initializerContext); +export function plugin() { + return new KibanaUtilsPublicPlugin(); } diff --git a/src/plugins/kibana_utils/public/mocks.ts b/src/plugins/kibana_utils/public/mocks.ts index cb872838af4b4..e30587d71772a 100644 --- a/src/plugins/kibana_utils/public/mocks.ts +++ b/src/plugins/kibana_utils/public/mocks.ts @@ -12,9 +12,7 @@ export type Setup = jest.Mocked; export type Start = jest.Mocked; const createSetupContract = (): Setup => { - return { - setVersion: jest.fn(), - }; + return undefined; }; const createStartContract = (): Start => { diff --git a/src/plugins/kibana_utils/public/plugin.ts b/src/plugins/kibana_utils/public/plugin.ts index 05d8ede256498..f9c1e37928ba5 100644 --- a/src/plugins/kibana_utils/public/plugin.ts +++ b/src/plugins/kibana_utils/public/plugin.ts @@ -6,13 +6,9 @@ * Side Public License, v 1. */ -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -import { History } from 'history'; -import { setVersion } from './set_version'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -export interface KibanaUtilsPublicSetup { - setVersion: (history: Pick) => void; -} +export type KibanaUtilsPublicSetup = undefined; export type KibanaUtilsPublicStart = undefined; @@ -31,16 +27,8 @@ export class KibanaUtilsPublicPlugin KibanaUtilsPublicStartDependencies > { - private readonly version: string; - - constructor(initializerContext: PluginInitializerContext) { - this.version = initializerContext.env.packageInfo.version; - } - public setup(_core: CoreSetup): KibanaUtilsPublicSetup { - return { - setVersion: this.setVersion, - }; + return undefined; } public start(_core: CoreStart): KibanaUtilsPublicStart { @@ -48,8 +36,4 @@ export class KibanaUtilsPublicPlugin } public stop() {} - - private setVersion = (history: Pick) => { - setVersion(history, this.version); - }; } diff --git a/src/plugins/kibana_utils/public/set_version.test.ts b/src/plugins/kibana_utils/public/set_version.test.ts deleted file mode 100644 index eb70d889d0f03..0000000000000 --- a/src/plugins/kibana_utils/public/set_version.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { History } from 'history'; -import { setVersion } from './set_version'; - -describe('setVersion', () => { - test('sets version, if one is not set', () => { - const history: Pick = { - location: { - hash: '', - search: '', - pathname: '/', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '1.2.3'); - - expect(history.replace).toHaveBeenCalledTimes(1); - expect(history.replace).toHaveBeenCalledWith('/?_v=1.2.3'); - }); - - test('overwrites, if version already set to a different value', () => { - const history: Pick = { - location: { - hash: '/view/dashboards', - search: 'a=b&_v=7.16.6', - pathname: '/foo/bar', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '8.0.0'); - - expect(history.replace).toHaveBeenCalledTimes(1); - expect(history.replace).toHaveBeenCalledWith('/foo/bar?a=b&_v=8.0.0#/view/dashboards'); - }); - - test('does nothing, if version already set to correct value', () => { - const history: Pick = { - location: { - hash: '/view/dashboards', - search: 'a=b&_v=8.0.0', - pathname: '/foo/bar', - state: {}, - }, - replace: jest.fn(), - }; - setVersion(history, '8.0.0'); - - expect(history.replace).toHaveBeenCalledTimes(0); - }); -}); diff --git a/src/plugins/kibana_utils/public/set_version.ts b/src/plugins/kibana_utils/public/set_version.ts deleted file mode 100644 index b3acb39ed5134..0000000000000 --- a/src/plugins/kibana_utils/public/set_version.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { History } from 'history'; - -export const setVersion = (history: Pick, version: string) => { - const search = new URLSearchParams(history.location.search); - if (search.get('_v') === version) return; - search.set('_v', version); - const path = - history.location.pathname + - '?' + - search.toString() + - (history.location.hash ? '#' + history.location.hash : ''); - history.replace(path); -}; diff --git a/src/setup_node_env/exit_on_warning.js b/src/setup_node_env/exit_on_warning.js index 5e7bae8254c04..dc6e321074224 100644 --- a/src/setup_node_env/exit_on_warning.js +++ b/src/setup_node_env/exit_on_warning.js @@ -46,6 +46,13 @@ var IGNORE_WARNINGS = [ // We need to discard that warning name: 'ProductNotSupportedSecurityError', }, + // https://github.com/browserify/browserify-rsa/pull/20 + { + name: 'DeprecationWarning', + code: 'DEP0170', + message: + 'The URL https://github.com:crypto-browserify/browserify-rsa.git is invalid. Future versions of Node.js will throw an error.', + }, ]; if (process.noProcessWarnings !== true) { diff --git a/src/setup_node_env/heap_snapshot.js b/src/setup_node_env/heap_snapshot.js deleted file mode 100644 index 94e4b35e2f887..0000000000000 --- a/src/setup_node_env/heap_snapshot.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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. - */ - -var getopts = require('getopts'); -var path = require('path'); -var v8 = require('node:v8'); -var worker = require('node:worker_threads'); - -var execOpts = getopts(process.execArgv); -var envOpts = getopts(process.env.NODE_OPTIONS ? process.env.NODE_OPTIONS.split(/\s+/) : []); -var diagnosticDir = execOpts['diagnostic-dir'] || envOpts['diagnostic-dir']; -var heapSnapshotSignal = execOpts['heapsnapshot-signal'] || envOpts['heapsnapshot-signal']; -var heapSnapshotSerial = 0; - -function getHeapSnapshotPath() { - var now = new Date(); - - var year = now.getFullYear(); - var month = String(now.getMonth() + 1).padStart(2, '0'); - var day = String(now.getDate()).padStart(2, '0'); - var hours = String(now.getHours()).padStart(2, '0'); - var minutes = String(now.getMinutes()).padStart(2, '0'); - var seconds = String(now.getSeconds()).padStart(2, '0'); - - var date = `${year}${month}${day}`; - var time = `${hours}${minutes}${seconds}`; - var pid = process.pid; - var threadId = worker.threadId; - var serial = (++heapSnapshotSerial).toString().padStart(3, '0'); - - return path.join(diagnosticDir, `Heap.${date}.${time}.${pid}.${threadId}.${serial}.heapsnapshot`); -} - -if (diagnosticDir && heapSnapshotSignal) { - process.removeAllListeners(heapSnapshotSignal); - - process.on(heapSnapshotSignal, function () { - var heapSnapshotPath = getHeapSnapshotPath(); - v8.writeHeapSnapshot(heapSnapshotPath); - }); -} diff --git a/src/setup_node_env/setup_env.js b/src/setup_node_env/setup_env.js index d3076a2c3b9cf..7b37d98011cfb 100644 --- a/src/setup_node_env/setup_env.js +++ b/src/setup_node_env/setup_env.js @@ -11,8 +11,6 @@ require('./exit_on_warning'); require('./harden'); // The following require statements MUST be executed before any others - END -// @todo Remove when migrated to Node 20 (#162696) -require('./heap_snapshot'); require('symbol-observable'); require('source-map-support').install(); require('./node_version_validator'); diff --git a/test/common/services/security/test_user.ts b/test/common/services/security/test_user.ts index bc5dbf68698bc..e8d88d81bb167 100644 --- a/test/common/services/security/test_user.ts +++ b/test/common/services/security/test_user.ts @@ -61,7 +61,10 @@ export class TestUser extends FtrService { }); if (this.browser && this.testSubjects && !options?.skipBrowserRefresh) { - if (await this.testSubjects.exists('kibanaChrome', { allowHidden: true })) { + if ( + (await this.browser.hasOpenWindow()) && + (await this.testSubjects.exists('kibanaChrome', { allowHidden: true })) + ) { await this.browser.refresh(); // accept alert if it pops up const alert = await this.browser.getAlert(); diff --git a/test/functional/services/remote/remote.ts b/test/functional/services/remote/remote.ts index b3038130b0187..6ee7b6e8d9085 100644 --- a/test/functional/services/remote/remote.ts +++ b/test/functional/services/remote/remote.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { NoSuchSessionError } from 'selenium-webdriver/lib/error'; +import { NoSuchSessionError, NoSuchWindowError } from 'selenium-webdriver/lib/error'; import { FtrProviderContext } from '../../ftr_provider_context'; import { initWebDriver, BrowserConfig } from './webdriver'; import { Browsers } from './browsers'; @@ -37,6 +37,10 @@ export async function RemoteProvider({ getService }: FtrProviderContext) { // Avoid duplicating NoSuchSessionError error output on each hook // https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors/InvalidSessionID log.error('WebDriver session is no longer valid'); + } else if (error instanceof NoSuchWindowError) { + // Avoid duplicating NoSuchWindowError error output on each hook + // https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors + log.error('Browser window is already closed'); } else { throw error; } diff --git a/tsconfig.base.json b/tsconfig.base.json index 178f70c927e28..d241aace37840 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -966,6 +966,8 @@ "@kbn/language-documentation-popover/*": ["packages/kbn-language-documentation-popover/*"], "@kbn/lens-embeddable-utils": ["packages/kbn-lens-embeddable-utils"], "@kbn/lens-embeddable-utils/*": ["packages/kbn-lens-embeddable-utils/*"], + "@kbn/lens-formula-docs": ["packages/kbn-lens-formula-docs"], + "@kbn/lens-formula-docs/*": ["packages/kbn-lens-formula-docs/*"], "@kbn/lens-plugin": ["x-pack/plugins/lens"], "@kbn/lens-plugin/*": ["x-pack/plugins/lens/*"], "@kbn/license-api-guard-plugin": ["x-pack/plugins/license_api_guard"], diff --git a/versions.json b/versions.json index ce91f8f76bb7e..8406528bb4428 100644 --- a/versions.json +++ b/versions.json @@ -13,10 +13,16 @@ "currentMajor": true, "previousMinor": true }, + { + "version": "8.11.4", + "branch": "8.11", + "currentMajor": true, + "previousMinor": true + }, { "version": "7.17.17", "branch": "7.17", "previousMajor": true } ] -} +} \ No newline at end of file diff --git a/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts b/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts index 05f9612bcf73d..02be370d08e25 100644 --- a/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts +++ b/x-pack/examples/gen_ai_streaming_response_example/server/plugin.ts @@ -6,7 +6,7 @@ */ import Boom from '@hapi/boom'; -import { CreateChatCompletionResponse } from 'openai'; +import type OpenAI from 'openai'; import { Readable } from 'stream'; import { Plugin, CoreSetup } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; @@ -112,7 +112,7 @@ export class GenAiStreamingResponseExamplePlugin implements Plugin { } return response.ok({ - body: executeResult.data as CreateChatCompletionResponse | Readable, + body: executeResult.data as OpenAI.ChatCompletion | Readable, }); } ); diff --git a/x-pack/performance/journeys/apm_service_inventory.ts b/x-pack/performance/journeys/apm_service_inventory.ts index 84f2518575df8..cbef53858eea6 100644 --- a/x-pack/performance/journeys/apm_service_inventory.ts +++ b/x-pack/performance/journeys/apm_service_inventory.ts @@ -11,8 +11,6 @@ import { SynthtraceClient } from '../services/synthtrace'; import { generateData } from '../synthtrace_data/apm_data'; export const journey = new Journey({ - // FAILING VERSION BUMP: https://github.com/elastic/kibana/issues/172757 - skipped: true, beforeSteps: async ({ kbnUrl, log, auth, es }) => { // Install APM Package const synthClient = new SynthtraceClient({ diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts index 0091faca468e3..0aa5fca22d0ff 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_openai_stream.ts @@ -9,7 +9,7 @@ import { encode } from 'gpt-tokenizer'; import { isEmpty, omitBy } from 'lodash'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { Logger } from '@kbn/logging'; export async function getTokenCountFromOpenAIStream({ @@ -25,7 +25,9 @@ export async function getTokenCountFromOpenAIStream({ prompt: number; completion: number; }> { - const chatCompletionRequest = JSON.parse(body) as CreateChatCompletionRequest; + const chatCompletionRequest = JSON.parse( + body + ) as OpenAI.ChatCompletionCreateParams.ChatCompletionCreateParamsStreaming; // per https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb const tokensFromMessages = encode( @@ -33,9 +35,9 @@ export async function getTokenCountFromOpenAIStream({ .map( (msg) => `<|start|>${msg.role}\n${msg.content}\n${ - msg.name + 'name' in msg ? msg.name - : msg.function_call + : 'function_call' in msg && msg.function_call ? msg.function_call.name + '\n' + msg.function_call.arguments : '' }<|end|>` diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts index ed43cc40649c6..2ed37837f5100 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/user_actions/connector_id.test.ts @@ -254,7 +254,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token a in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Expected property name or '}' in JSON at position 1", Object { "migrations": Object { "userAction": Object { @@ -448,7 +448,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token b in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Expected property name or '}' in JSON at position 1", Object { "migrations": Object { "userAction": Object { @@ -644,7 +644,7 @@ describe('user action migrations', () => { const log = context.log as jest.Mocked; expect(log.error.mock.calls[0]).toMatchInlineSnapshot(` Array [ - "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token e in JSON at position 1", + "Failed to migrate user action connector with doc id: 1 version: 8.0.0 error: Unexpected token 'e', \\"new json value\\" is not valid JSON", Object { "migrations": Object { "userAction": Object { diff --git a/x-pack/plugins/cloud_security_posture/common/types/rules/v3.ts b/x-pack/plugins/cloud_security_posture/common/types/rules/v3.ts index c2b70352aef9f..fb0310c088a19 100644 --- a/x-pack/plugins/cloud_security_posture/common/types/rules/v3.ts +++ b/x-pack/plugins/cloud_security_posture/common/types/rules/v3.ts @@ -6,7 +6,6 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; -import type { SavedObjectsUpdateResponse } from '@kbn/core-saved-objects-api-server'; import { CSPM_POLICY_TEMPLATE, KSPM_POLICY_TEMPLATE } from '../../constants'; const DEFAULT_BENCHMARK_RULES_PER_PAGE = 25; @@ -136,46 +135,3 @@ export interface FindCspBenchmarkRuleResponse { } export type PageUrlParams = Record<'policyId' | 'packagePolicyId', string>; - -export const rulesToUpdate = schema.arrayOf( - schema.object({ - rule_id: schema.string(), - benchmark_id: schema.string(), - benchmark_version: schema.string(), - rule_number: schema.string(), - }) -); - -export const cspBenchmarkRulesBulkActionRequestSchema = schema.object({ - action: schema.oneOf([schema.literal('mute'), schema.literal('unmute')]), - rules: rulesToUpdate, -}); - -export type RulesToUpdate = TypeOf; - -export type CspBenchmarkRulesBulkActionRequestSchema = TypeOf< - typeof cspBenchmarkRulesBulkActionRequestSchema ->; - -const rulesStates = schema.recordOf( - schema.string(), - schema.object({ - muted: schema.boolean(), - benchmark_id: schema.string(), - benchmark_version: schema.string(), - rule_number: schema.string(), - rule_id: schema.string(), - }) -); - -export const cspSettingsSchema = schema.object({ - rules: rulesStates, -}); - -export type CspBenchmarkRulesStates = TypeOf; -export type CspSettings = TypeOf; - -export interface BulkActionBenchmarkRulesResponse { - newCspSettings: SavedObjectsUpdateResponse; - disabledRulesCounter: number; -} diff --git a/x-pack/plugins/cloud_security_posture/common/types/rules/v4.ts b/x-pack/plugins/cloud_security_posture/common/types/rules/v4.ts index 1ee8c584be770..994e09d9b9c2c 100644 --- a/x-pack/plugins/cloud_security_posture/common/types/rules/v4.ts +++ b/x-pack/plugins/cloud_security_posture/common/types/rules/v4.ts @@ -6,16 +6,14 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; +import { SavedObjectsUpdateResponse } from '@kbn/core-saved-objects-api-server'; import { BenchmarksCisId } from '../latest'; - export type { cspBenchmarkRuleMetadataSchema, CspBenchmarkRuleMetadata, cspBenchmarkRuleSchema, CspBenchmarkRule, FindCspBenchmarkRuleResponse, - CspSettings, - CspBenchmarkRulesStates, } from './v3'; const DEFAULT_BENCHMARK_RULES_PER_PAGE = 25; @@ -113,3 +111,54 @@ export interface PageUrlParams { benchmarkId: BenchmarksCisId; benchmarkVersion: string; } + +export const rulesToUpdate = schema.arrayOf( + schema.object({ + rule_id: schema.string(), + benchmark_id: schema.string(), + benchmark_version: schema.string(), + rule_number: schema.string(), + }) +); + +export const cspBenchmarkRulesBulkActionRequestSchema = schema.object({ + action: schema.oneOf([schema.literal('mute'), schema.literal('unmute')]), + rules: rulesToUpdate, +}); + +export type RulesToUpdate = TypeOf; + +export type CspBenchmarkRulesBulkActionRequestSchema = TypeOf< + typeof cspBenchmarkRulesBulkActionRequestSchema +>; + +export interface CspBenchmarkRulesBulkActionResponse { + updated_benchmark_rules: CspBenchmarkRulesStates; + disabled_detection_rules?: string[]; + message: string; +} + +const ruleStateAttributes = schema.object({ + muted: schema.boolean(), + benchmark_id: schema.string(), + benchmark_version: schema.string(), + rule_number: schema.string(), + rule_id: schema.string(), +}); + +export type RuleStateAttributes = TypeOf; + +const rulesStates = schema.recordOf(schema.string(), ruleStateAttributes); + +export type CspBenchmarkRulesStates = TypeOf; + +export const cspSettingsSchema = schema.object({ + rules: rulesStates, +}); + +export type CspSettings = TypeOf; + +export interface BulkActionBenchmarkRulesResponse { + newCspSettings: SavedObjectsUpdateResponse; + disabledRules: string[]; +} diff --git a/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts b/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts index 86b9692cbfc43..c8e98703cdbf0 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/api/use_latest_findings_data_view.ts @@ -62,15 +62,19 @@ export const useLatestFindingsDataView = (dataView: string) => { } if (dataView === LATEST_FINDINGS_INDEX_PATTERN) { + let shouldUpdate = false; Object.entries(cloudSecurityFieldLabels).forEach(([field, label]) => { if ( !dataViewObj.getFieldAttrs()[field]?.customLabel || dataViewObj.getFieldAttrs()[field]?.customLabel === field ) { dataViewObj.setFieldCustomLabel(field, label); + shouldUpdate = true; } }); - await dataViews.updateSavedObject(dataViewObj); + if (shouldUpdate) { + await dataViews.updateSavedObject(dataViewObj); + } } return dataViewObj; diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts index 0becb56e6ec22..d06e29a95e46d 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_cloud_posture_table/use_cloud_posture_table.ts @@ -40,9 +40,9 @@ export interface CloudPostureTableResult { getRowsFromPages: (data: Array<{ page: DataTableRecord[] }> | undefined) => DataTableRecord[]; } -/* - Hook for managing common table state and methods for Cloud Posture -*/ +/** + * @deprecated will be replaced by useCloudPostureDataTable + */ export const useCloudPostureTable = ({ defaultQuery = getDefaultQuery, dataView, diff --git a/x-pack/plugins/cloud_security_posture/public/common/types.ts b/x-pack/plugins/cloud_security_posture/public/common/types.ts index a4c26643293fd..ac483445407e4 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/types.ts @@ -22,6 +22,8 @@ export interface FindingsBaseURLQuery { export interface FindingsBaseProps { dataView: DataView; + dataViewRefetch?: () => void; + dataViewIsRefetching?: boolean; } export interface FindingsBaseESQueryConfig { diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx new file mode 100644 index 0000000000000..7ddbe28a7da07 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.test.tsx @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { TestProvider } from '../../test/test_provider'; +import { CloudSecurityDataTable, CloudSecurityDataTableProps } from './cloud_security_data_table'; + +const mockDataView = { + fields: { + getAll: () => [ + { id: 'field1', name: 'field1', customLabel: 'Label 1', visualizable: true }, + { id: 'field2', name: 'field2', customLabel: 'Label 2', visualizable: true }, + ], + getByName: (name: string) => ({ id: name }), + }, + getFieldByName: (name: string) => ({ id: name }), + getFormatterForField: (name: string) => ({ + convert: (value: string) => value, + }), +} as any; + +const mockDefaultColumns = [{ id: 'field1' }, { id: 'field2' }]; + +const mockCloudPostureDataTable = { + setUrlQuery: jest.fn(), + columnsLocalStorageKey: 'test', + filters: [], + onSort: jest.fn(), + sort: [], + query: {}, + queryError: undefined, + pageIndex: 0, + urlQuery: {}, + setTableOptions: jest.fn(), + handleUpdateQuery: jest.fn(), + pageSize: 10, + setPageSize: jest.fn(), + onChangeItemsPerPage: jest.fn(), + onChangePage: jest.fn(), + onResetFilters: jest.fn(), + getRowsFromPages: jest.fn(), +} as any; + +const renderDataTable = (props: Partial = {}) => { + const defaultProps: CloudSecurityDataTableProps = { + dataView: mockDataView, + isLoading: false, + defaultColumns: mockDefaultColumns, + rows: [], + total: 0, + flyoutComponent: () => <>, + cloudPostureDataTable: mockCloudPostureDataTable, + loadMore: jest.fn(), + title: 'Test Table', + }; + + return render( + + + + ); +}; + +describe('CloudSecurityDataTable', () => { + it('renders loading state', () => { + const { getByTestId } = renderDataTable({ isLoading: true }); + expect(getByTestId('unifiedDataTableLoading')).toBeInTheDocument(); + }); + + it('renders empty state when no rows are present', () => { + const { getByTestId } = renderDataTable(); + expect(getByTestId('csp:empty-state')).toBeInTheDocument(); + }); + + it('renders data table with rows', async () => { + const mockRows = [ + { + id: '1', + raw: { + field1: 'Label 1', + field2: 'Label 2', + }, + flattened: { + field1: 'Label 1', + field2: 'Label 2', + }, + }, + ] as any; + const { getByTestId, getByText } = renderDataTable({ + rows: mockRows, + total: mockRows.length, + }); + + expect(getByTestId('discoverDocTable')).toBeInTheDocument(); + expect(getByText('Label 1')).toBeInTheDocument(); + expect(getByText('Label 2')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx index 84cea3e64115e..3f0c3da73a986 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/cloud_security_data_table/cloud_security_data_table.tsx @@ -17,7 +17,7 @@ import { generateFilters } from '@kbn/data-plugin/public'; import { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; import useLocalStorage from 'react-use/lib/useLocalStorage'; import { useKibana } from '../../common/hooks/use_kibana'; -import { CloudPostureTableResult } from '../../common/hooks/use_cloud_posture_table'; +import { CloudPostureDataTableResult } from '../../common/hooks/use_cloud_posture_data_table'; import { EmptyState } from '../empty_state'; import { MAX_FINDINGS_TO_LOAD } from '../../common/constants'; import { useStyles } from './use_styles'; @@ -40,7 +40,7 @@ const useNewFieldsApi = true; // Hide Checkbox, enable open details Flyout const controlColumnIds = ['openDetails']; -interface CloudSecurityDataGridProps { +export interface CloudSecurityDataTableProps { dataView: DataView; isLoading: boolean; defaultColumns: CloudSecurityDefaultColumn[]; @@ -52,10 +52,10 @@ interface CloudSecurityDataGridProps { */ flyoutComponent: (hit: DataTableRecord, onCloseFlyout: () => void) => JSX.Element; /** - * This is the object that contains all the data and functions from the useCloudPostureTable hook. + * This is the object that contains all the data and functions from the useCloudPostureDataTable hook. * This is also used to manage the table state from the parent component. */ - cloudPostureTable: CloudPostureTableResult; + cloudPostureDataTable: CloudPostureDataTableResult; title: string; /** * This is a function that returns a map of column ids to custom cell renderers. @@ -78,6 +78,16 @@ interface CloudSecurityDataGridProps { * Height override for the data grid. */ height?: number; + /** + * Callback Function when the DataView field is edited. + * Required to enable editing of the field in the data grid. + */ + dataViewRefetch?: () => void; + /** + * Flag to indicate if the data view is refetching. + * Required for smoothing re-rendering the DataTable columns. + */ + dataViewIsRefetching?: boolean; } export const CloudSecurityDataTable = ({ @@ -87,14 +97,16 @@ export const CloudSecurityDataTable = ({ rows, total, flyoutComponent, - cloudPostureTable, + cloudPostureDataTable, loadMore, title, customCellRenderer, groupSelectorComponent, height, + dataViewRefetch, + dataViewIsRefetching, ...rest -}: CloudSecurityDataGridProps) => { +}: CloudSecurityDataTableProps) => { const { columnsLocalStorageKey, pageSize, @@ -104,7 +116,7 @@ export const CloudSecurityDataTable = ({ onResetFilters, filters, sort, - } = cloudPostureTable; + } = cloudPostureDataTable; const [columns, setColumns] = useLocalStorage( columnsLocalStorageKey, @@ -242,6 +254,9 @@ export const CloudSecurityDataTable = ({ opacity: isLoading ? 1 : 0, }; + const loadingState = + isLoading || dataViewIsRefetching ? DataLoadingState.loading : DataLoadingState.loaded; + return (
diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx index d1b35ab617a96..7b7bd42561204 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.test.tsx @@ -26,7 +26,6 @@ import { render } from '@testing-library/react'; import { expectIdsInDoc } from '../../test/utils'; import { PACKAGE_NOT_INSTALLED_TEST_SUBJECT } from '../../components/cloud_posture_page'; import { useLicenseManagementLocatorApi } from '../../common/api/use_license_management_locator_api'; -import { useCloudPostureTable } from '../../common/hooks/use_cloud_posture_table'; jest.mock('../../common/api/use_latest_findings_data_view'); jest.mock('../../common/api/use_setup_status_api'); @@ -34,7 +33,6 @@ jest.mock('../../common/api/use_license_management_locator_api'); jest.mock('../../common/hooks/use_subscription_status'); jest.mock('../../common/navigation/use_navigate_to_cis_integration_policies'); jest.mock('../../common/navigation/use_csp_integration_link'); -jest.mock('../../common/hooks/use_cloud_posture_table'); const chance = new Chance(); @@ -54,13 +52,6 @@ beforeEach(() => { data: true, }) ); - - (useCloudPostureTable as jest.Mock).mockImplementation(() => ({ - getRowsFromPages: jest.fn(), - columnsLocalStorageKey: 'test', - filters: [], - sort: [], - })); }); const renderFindingsPage = () => { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx index 9e87d1d8eda6d..7e8bbfeedb832 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/configurations.tsx @@ -50,7 +50,11 @@ export const Configurations = () => { path={findingsNavigation.findings_default.path} render={() => ( - + )} /> diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx index 9d536f0f0b180..e070847b6df55 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_container.tsx @@ -18,7 +18,11 @@ import { groupPanelRenderer, groupStatsRenderer } from './latest_findings_group_ import { FindingsDistributionBar } from '../layout/findings_distribution_bar'; import { ErrorCallout } from '../layout/error_callout'; -export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { +export const LatestFindingsContainer = ({ + dataView, + dataViewRefetch, + dataViewIsRefetching, +}: FindingsBaseProps) => { const renderChildComponent = useCallback( (groupFilters: Filter[]) => { return ( @@ -27,10 +31,12 @@ export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { nonPersistedFilters={groupFilters} height={DEFAULT_TABLE_HEIGHT} showDistributionBar={false} + dataViewRefetch={dataViewRefetch} + dataViewIsRefetching={dataViewIsRefetching} /> ); }, - [dataView] + [dataView, dataViewIsRefetching, dataViewRefetch] ); const { @@ -94,7 +100,12 @@ export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { return ( <> - + ); }; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx index be6d34a1df933..3adb10259871d 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_table.tsx @@ -27,6 +27,8 @@ type LatestFindingsTableProps = FindingsBaseProps & { height?: number; showDistributionBar?: boolean; nonPersistedFilters?: Filter[]; + dataViewRefetch?: () => void; + dataViewIsRefetching?: boolean; }; /** @@ -87,9 +89,11 @@ export const LatestFindingsTable = ({ height, showDistributionBar = true, nonPersistedFilters, + dataViewRefetch, + dataViewIsRefetching, }: LatestFindingsTableProps) => { const { - cloudPostureTable, + cloudPostureDataTable, rows, error, isFetching, @@ -134,12 +138,14 @@ export const LatestFindingsTable = ({ rows={rows} total={total} flyoutComponent={flyoutComponent} - cloudPostureTable={cloudPostureTable} + cloudPostureDataTable={cloudPostureDataTable} loadMore={fetchNextPage} title={title} customCellRenderer={customCellRenderer} groupSelectorComponent={groupSelectorComponent} height={height} + dataViewRefetch={dataViewRefetch} + dataViewIsRefetching={dataViewIsRefetching} /> )} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx index 50ebb01f363f0..b60eefac2ac81 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/use_latest_findings_table.tsx @@ -28,7 +28,7 @@ export const useLatestFindingsTable = ({ nonPersistedFilters?: Filter[]; showDistributionBar?: boolean; }) => { - const cloudPostureTable = useCloudPostureDataTable({ + const cloudPostureDataTable = useCloudPostureDataTable({ dataView, paginationLocalStorageKey: LOCAL_STORAGE_DATA_TABLE_PAGE_SIZE_KEY, columnsLocalStorageKey, @@ -36,7 +36,7 @@ export const useLatestFindingsTable = ({ nonPersistedFilters, }); - const { query, sort, queryError, setUrlQuery, filters, getRowsFromPages } = cloudPostureTable; + const { query, sort, queryError, setUrlQuery, filters, getRowsFromPages } = cloudPostureDataTable; const { data, @@ -72,7 +72,7 @@ export const useLatestFindingsTable = ({ const canShowDistributionBar = showDistributionBar && total > 0; return { - cloudPostureTable, + cloudPostureDataTable, rows, error, isFetching, diff --git a/x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts b/x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts index 2f743e2ed8d64..65e2c2fd61cb4 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_indices/benchmark_score_mapping.ts @@ -47,5 +47,8 @@ export const benchmarkScoreMapping: MappingTypeMapping = { low: { type: 'long', }, + is_enabled_rules_score: { + type: 'boolean', + }, }, }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts index 207143e1ef58d..b31bc731e0523 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/bulk_action.ts @@ -10,7 +10,8 @@ import { CspBenchmarkRulesBulkActionRequestSchema, CspBenchmarkRulesStates, cspBenchmarkRulesBulkActionRequestSchema, -} from '../../../../common/types/rules/v3'; + CspBenchmarkRulesBulkActionResponse, +} from '../../../../common/types/rules/v4'; import { CspRouter } from '../../../types'; import { CSP_BENCHMARK_RULES_BULK_ACTION_ROUTE_PATH } from '../../../../common/constants'; @@ -79,13 +80,16 @@ export const defineBulkActionCspBenchmarkRulesRoute = (router: CspRouter) => const updatedBenchmarkRules: CspBenchmarkRulesStates = handlerResponse.newCspSettings.attributes.rules!; - return response.ok({ - body: { - updated_benchmark_rules: updatedBenchmarkRules, - detection_rules: `disabled ${handlerResponse.disabledRulesCounter} detections rules.`, - message: 'The bulk operation has been executed successfully.', - }, - }); + const body: CspBenchmarkRulesBulkActionResponse = { + updated_benchmark_rules: updatedBenchmarkRules, + message: 'The bulk operation has been executed successfully.', + }; + + if (requestBody.action === 'mute' && handlerResponse.disabledRules) { + body.disabled_detection_rules = handlerResponse.disabledRules; + } + + return response.ok({ body }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts index f026e75702c56..5365d476a0e8d 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/utils.ts @@ -16,7 +16,7 @@ import type { RulesToUpdate, CspBenchmarkRulesStates, CspSettings, -} from '../../../../common/types/rules/v3'; +} from '../../../../common/types/rules/v4'; import { convertRuleTagsToKQL, generateBenchmarkRuleTags, @@ -28,7 +28,9 @@ import { INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, } from '../../../../common/constants'; -export const getRuleIdsToDisable = async (detectionRules: Array>) => { +export const getDetectionRuleIdsToDisable = async ( + detectionRules: Array> +) => { const idsToDisable = detectionRules .map((detectionRule) => { return detectionRule.data.map((data) => data.id); @@ -40,10 +42,11 @@ export const getRuleIdsToDisable = async (detectionRules: Array> -) => { - const idsToDisable = await getRuleIdsToDisable(detectionRules); - if (!idsToDisable.length) return; - return await detectionRulesClient.bulkDisableRules({ ids: idsToDisable }); +): Promise => { + const detectionRulesIdsToDisable = await getDetectionRuleIdsToDisable(detectionRules); + if (!detectionRulesIdsToDisable.length) return []; + await detectionRulesClient.bulkDisableRules({ ids: detectionRulesIdsToDisable }); + return detectionRulesIdsToDisable; }; export const getDetectionRules = async ( @@ -87,7 +90,7 @@ export const muteDetectionRules = async ( soClient: SavedObjectsClientContract, detectionRulesClient: RulesClient, rulesIds: string[] -): Promise => { +): Promise => { const benchmarkRules = await getBenchmarkRules(soClient, rulesIds); if (benchmarkRules.includes(undefined)) { throw new Error('At least one of the provided benchmark rule IDs does not exist'); @@ -99,8 +102,7 @@ export const muteDetectionRules = async ( const detectionRules = await getDetectionRules(detectionRulesClient, benchmarkRulesTags); const disabledDetectionRules = await disableDetectionRules(detectionRulesClient, detectionRules); - - return disabledDetectionRules ? disabledDetectionRules.rules.length : 0; + return disabledDetectionRules; }; export const updateRulesStates = async ( diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts index 4a35afd6eb642..a2f5c5c98b72d 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/bulk_action/v1.ts @@ -17,7 +17,7 @@ import { import type { BulkActionBenchmarkRulesResponse, RulesToUpdate, -} from '../../../../common/types/rules/v3'; +} from '../../../../common/types/rules/v4'; const muteStatesMap = { mute: true, @@ -41,12 +41,11 @@ export const bulkActionBenchmarkRulesHandler = async ( const rulesKeys = rulesToUpdate.map((rule) => buildRuleKey(rule.benchmark_id, rule.benchmark_version, rule.rule_number) ); - const newRulesStates = setRulesStates(rulesKeys, muteStatesMap[action], rulesToUpdate); const newCspSettings = await updateRulesStates(encryptedSoClient, newRulesStates); - const disabledRulesCounter = - action === 'mute' ? await muteDetectionRules(soClient, detectionRulesClient, rulesIds) : 0; + const disabledDetectionRules = + action === 'mute' ? await muteDetectionRules(soClient, detectionRulesClient, rulesIds) : []; - return { newCspSettings, disabledRulesCounter }; + return { newCspSettings, disabledRules: disabledDetectionRules }; }; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts index 985be3cb48eeb..e7c28d345c52d 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/get_states.ts @@ -8,7 +8,7 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import { CspRouter } from '../../../types'; import { CSP_GET_BENCHMARK_RULES_STATE_ROUTE_PATH } from '../../../../common/constants'; -import { CspBenchmarkRulesStates } from '../../../../common/types/rules/v3'; +import { CspBenchmarkRulesStates } from '../../../../common/types/rules/v4'; import { getCspBenchmarkRulesStatesHandler } from './v1'; export const defineGetCspBenchmarkRulesStatesRoute = (router: CspRouter) => diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts index 5697841bb3526..bf849be225bc1 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmark_rules/get_states/v1.ts @@ -4,9 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { + ISavedObjectsRepository, + SavedObjectsClientContract, +} from '@kbn/core-saved-objects-api-server'; import { transformError } from '@kbn/securitysolution-es-utils'; -import { CspBenchmarkRulesStates, CspSettings } from '../../../../common/types/rules/v3'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { CspBenchmarkRulesStates, CspSettings } from '../../../../common/types/rules/v4'; import { INTERNAL_CSP_SETTINGS_SAVED_OBJECT_ID, INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, @@ -23,7 +27,7 @@ export const createCspSettingObject = async (soClient: SavedObjectsClientContrac }; export const getCspBenchmarkRulesStatesHandler = async ( - encryptedSoClient: SavedObjectsClientContract + encryptedSoClient: SavedObjectsClientContract | ISavedObjectsRepository ): Promise => { try { const getSoResponse = await encryptedSoClient.get( @@ -43,3 +47,27 @@ export const getCspBenchmarkRulesStatesHandler = async ( ); } }; + +export const buildMutedRulesFilter = async ( + encryptedSoClient: ISavedObjectsRepository +): Promise => { + const rulesStates = await getCspBenchmarkRulesStatesHandler(encryptedSoClient); + const mutedRules = Object.fromEntries( + Object.entries(rulesStates).filter(([key, value]) => value.muted === true) + ); + + const mutedRulesFilterQuery = Object.keys(mutedRules).map((key) => { + const rule = mutedRules[key]; + return { + bool: { + must: [ + { term: { 'rule.benchmark.id': rule.benchmark_id } }, + { term: { 'rule.benchmark.version': rule.benchmark_version } }, + { term: { 'rule.benchmark.rule_number': rule.rule_number } }, + ], + }, + }; + }); + + return mutedRulesFilterQuery; +}; diff --git a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts index f0369dd3a562a..fdd8ed6b709e2 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/compliance_dashboard/get_trends.ts @@ -54,14 +54,19 @@ export const getTrendsQuery = (policyTemplate: PosturePolicyTemplate) => ({ query: { bool: { filter: [{ term: { policy_template: policyTemplate } }], - must: { - range: { - '@timestamp': { - gte: 'now-1d', - lte: 'now', + must: [ + { + range: { + '@timestamp': { + gte: 'now-1d', + lte: 'now', + }, }, }, - }, + { + term: { is_enabled_rules_score: true }, + }, + ], }, }, }); diff --git a/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts b/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts index d163ca6e26f05..77c589edd6d1a 100644 --- a/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts +++ b/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts @@ -7,7 +7,7 @@ import { SavedObjectsType } from '@kbn/core/server'; import { SECURITY_SOLUTION_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; -import { cspSettingsSchema } from '../../common/types/rules/v3'; +import { cspSettingsSchema } from '../../common/types/rules/v4'; import { cspSettingsSavedObjectMapping } from './mappings'; import { INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE } from '../../common/constants'; diff --git a/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts b/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts index 93886c8f8acca..a0727ae4344a7 100644 --- a/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts +++ b/x-pack/plugins/cloud_security_posture/server/tasks/findings_stats_task.ts @@ -13,13 +13,16 @@ import { } from '@kbn/task-manager-plugin/server'; import { SearchRequest } from '@kbn/data-plugin/common'; import { ElasticsearchClient } from '@kbn/core/server'; -import type { Logger } from '@kbn/core/server'; +import { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; +import type { ISavedObjectsRepository, Logger } from '@kbn/core/server'; +import { buildMutedRulesFilter } from '../routes/benchmark_rules/get_states/v1'; import { getSafePostureTypeRuntimeMapping } from '../../common/runtime_mappings/get_safe_posture_type_runtime_mapping'; import { getIdentifierRuntimeMapping } from '../../common/runtime_mappings/get_identifier_runtime_mapping'; import { FindingsStatsTaskResult, ScoreByPolicyTemplateBucket, VulnSeverityAggs } from './types'; import { BENCHMARK_SCORE_INDEX_DEFAULT_NS, CSPM_FINDINGS_STATS_INTERVAL, + INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, LATEST_FINDINGS_INDEX_DEFAULT_NS, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, VULNERABILITIES_SEVERITY, @@ -93,8 +96,13 @@ export function taskRunner(coreStartServices: CspServerPluginStartServices, logg async run(): Promise { try { logger.info(`Runs task: ${CSPM_FINDINGS_STATS_TASK_TYPE}`); - const esClient = (await coreStartServices)[0].elasticsearch.client.asInternalUser; - const status = await aggregateLatestFindings(esClient, logger); + const startServices = await coreStartServices; + const esClient = startServices[0].elasticsearch.client.asInternalUser; + const encryptedSoClient = startServices[0].savedObjects.createInternalRepository([ + INTERNAL_CSP_SETTINGS_SAVED_OBJECT_TYPE, + ]); + + const status = await aggregateLatestFindings(esClient, encryptedSoClient, logger); const updatedState: LatestTaskStateSchema = { runs: state.runs + 1, @@ -119,13 +127,15 @@ export function taskRunner(coreStartServices: CspServerPluginStartServices, logg }; } -const getScoreQuery = (): SearchRequest => ({ +const getScoreQuery = (filteredRules: QueryDslQueryContainer[]): SearchRequest => ({ index: LATEST_FINDINGS_INDEX_DEFAULT_NS, size: 0, // creates the safe_posture_type and asset_identifier runtime fields runtime_mappings: { ...getIdentifierRuntimeMapping(), ...getSafePostureTypeRuntimeMapping() }, query: { - match_all: {}, + bool: { + must_not: filteredRules, + }, }, aggs: { score_by_policy_template: { @@ -271,7 +281,8 @@ const getVulnStatsTrendQuery = (): SearchRequest => ({ const getFindingsScoresDocIndexingPromises = ( esClient: ElasticsearchClient, - scoresByPolicyTemplatesBuckets: ScoreByPolicyTemplateBucket['score_by_policy_template']['buckets'] + scoresByPolicyTemplatesBuckets: ScoreByPolicyTemplateBucket['score_by_policy_template']['buckets'], + isCustomScore: boolean ) => scoresByPolicyTemplatesBuckets.map((policyTemplateTrend) => { // creating score per cluster id objects @@ -321,6 +332,7 @@ const getFindingsScoresDocIndexingPromises = ( total_findings: policyTemplateTrend.total_findings.value, score_by_cluster_id: clustersStats, score_by_benchmark_id: benchmarkStats, + is_enabled_rules_score: isCustomScore, }, }); }); @@ -364,18 +376,27 @@ const getVulnStatsTrendDocIndexingPromises = ( export const aggregateLatestFindings = async ( esClient: ElasticsearchClient, + encryptedSoClient: ISavedObjectsRepository, logger: Logger ): Promise => { try { const startAggTime = performance.now(); - const scoreIndexQueryResult = await esClient.search( - getScoreQuery() + + const rulesFilter = await buildMutedRulesFilter(encryptedSoClient); + + const customScoreIndexQueryResult = await esClient.search( + getScoreQuery(rulesFilter) + ); + + const fullScoreIndexQueryResult = await esClient.search( + getScoreQuery([]) ); + const vulnStatsTrendIndexQueryResult = await esClient.search( getVulnStatsTrendQuery() ); - if (!scoreIndexQueryResult.aggregations && !vulnStatsTrendIndexQueryResult.aggregations) { + if (!customScoreIndexQueryResult.aggregations && !vulnStatsTrendIndexQueryResult.aggregations) { logger.warn(`No data found in latest findings index`); return 'warning'; } @@ -388,13 +409,23 @@ export const aggregateLatestFindings = async ( ); // getting score per policy template buckets - const scoresByPolicyTemplatesBuckets = - scoreIndexQueryResult.aggregations?.score_by_policy_template.buckets || []; + const customScoresByPolicyTemplatesBuckets = + customScoreIndexQueryResult.aggregations?.score_by_policy_template.buckets || []; + + const fullScoresByPolicyTemplatesBuckets = + fullScoreIndexQueryResult.aggregations?.score_by_policy_template.buckets || []; // iterating over the buckets and return promises which will index a modified document into the scores index - const findingsScoresDocIndexingPromises = getFindingsScoresDocIndexingPromises( + const findingsCustomScoresDocIndexingPromises = getFindingsScoresDocIndexingPromises( + esClient, + customScoresByPolicyTemplatesBuckets, + true + ); + + const findingsFullScoresDocIndexingPromises = getFindingsScoresDocIndexingPromises( esClient, - scoresByPolicyTemplatesBuckets + fullScoresByPolicyTemplatesBuckets, + false ); const vulnStatsTrendDocIndexingPromises = getVulnStatsTrendDocIndexingPromises( @@ -406,7 +437,11 @@ export const aggregateLatestFindings = async ( // executing indexing commands await Promise.all( - [...findingsScoresDocIndexingPromises, vulnStatsTrendDocIndexingPromises].filter(Boolean) + [ + ...findingsCustomScoresDocIndexingPromises, + findingsFullScoresDocIndexingPromises, + vulnStatsTrendDocIndexingPromises, + ].filter(Boolean) ); const totalIndexTime = Number(performance.now() - startIndexTime).toFixed(2); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts index 3e39c50ff8de7..925f5af35ff48 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts @@ -404,7 +404,7 @@ describe('DocumentCreationLogic', () => { DocumentCreationLogic.actions.onSubmitJson(); expect(DocumentCreationLogic.actions.setErrors).toHaveBeenCalledWith([ - 'Unexpected token i in JSON at position 0', + `Unexpected token 'i', "invalid JSON" is not valid JSON`, ]); expect(DocumentCreationLogic.actions.uploadDocuments).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts index 1da16c533a337..de7cd30a343ec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/constants.ts @@ -85,6 +85,13 @@ export const CONNECTORS_DICT: Record = { icon: CONNECTOR_ICONS.jira_cloud, platinumOnly: true, }, + microsoft_teams: { + docsUrl: docLinks.connectorsTeams, + externalAuthDocsUrl: '', + externalDocsUrl: '', + icon: CONNECTOR_ICONS.teams, + platinumOnly: true, + }, mongodb: { docsUrl: docLinks.connectorsMongoDB, externalAuthDocsUrl: 'https://www.mongodb.com/docs/atlas/app-services/authentication/', @@ -182,13 +189,6 @@ export const CONNECTORS_DICT: Record = { icon: CONNECTOR_ICONS.slack, platinumOnly: true, }, - teams: { - docsUrl: docLinks.connectorsTeams, - externalAuthDocsUrl: '', - externalDocsUrl: '', - icon: CONNECTOR_ICONS.teams, - platinumOnly: true, - }, zoom: { docsUrl: docLinks.connectorsZoom, externalAuthDocsUrl: '', diff --git a/x-pack/plugins/fleet/common/types/models/agent.ts b/x-pack/plugins/fleet/common/types/models/agent.ts index 1242a61124952..47d9c424ef0e0 100644 --- a/x-pack/plugins/fleet/common/types/models/agent.ts +++ b/x-pack/plugins/fleet/common/types/models/agent.ts @@ -449,5 +449,7 @@ export interface AgentUpgradeDetails { download_rate?: number; // bytes per second failed_state?: AgentUpgradeStateType; error_msg?: string; + retry_error_msg?: string; + retry_until?: string; }; } diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 1a7c4cefca34d..b1bea249ee9de 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -125,6 +125,14 @@ export type DataType = typeof dataTypes; export type MonitoringType = typeof monitoringTypes; export type InstallablePackage = RegistryPackage | ArchivePackage; +export type AssetsMap = Map; + +export interface PackageInstallContext { + packageInfo: InstallablePackage; + assetsMap: AssetsMap; + paths: string[]; +} + export type ArchivePackage = PackageSpecManifest & // should an uploaded package be able to specify `internal`? Pick; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.test.tsx index 59139a09a792f..22d571932c459 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.test.tsx @@ -123,4 +123,13 @@ describe('AgentDetailsIntegrationInputs', () => { component.queryByTestId('agentDetailsIntegrationsInputStatusHealthSuccess') ).not.toBeInTheDocument(); }); + + it('should not throw error when there is no components', () => { + agent.components = undefined; + + const component = renderComponent(); + userEvent.click(component.container.querySelector('#agentIntegrationsInputs')!); + userEvent.click(component.container.querySelector('#endpoint')!); + expect(component.getByText('Endpoint')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.tsx index bb3b6ee5ef701..71b1a1ad6fe3e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_integration_inputs.tsx @@ -128,6 +128,7 @@ export const AgentDetailsIntegrationInputs: React.FunctionComponent<{ current ) => { if (current.enabled) { + const inputStatusFormatter = inputStatusMap.get(current.type); return [ ...acc, { @@ -156,18 +157,20 @@ export const AgentDetailsIntegrationInputs: React.FunctionComponent<{ ), id: current.type, icon: getInputStatusIcon(current.type), - children: [ - { - label: ( - - ), - id: `input-status-${current.type}`, - isExpanded: true, - className: 'input-action-item-expanded', - }, - ], + children: !!inputStatusFormatter + ? [ + { + label: ( + + ), + id: `input-status-${current.type}`, + isExpanded: true, + className: 'input-action-item-expanded', + }, + ] + : [], }, ]; } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx index f27d428bd42cc..45d5ead9909ee 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx @@ -23,7 +23,11 @@ import { FormattedMessage, FormattedRelative } from '@kbn/i18n-react'; import type { Agent, AgentPolicy } from '../../../../../types'; import { useAgentVersion } from '../../../../../hooks'; -import { ExperimentalFeaturesService, isAgentUpgradeable } from '../../../../../services'; +import { + ExperimentalFeaturesService, + isAgentUpgradeable, + getNotUpgradeableMessage, +} from '../../../../../services'; import { AgentPolicySummaryLine } from '../../../../../components'; import { AgentHealth } from '../../../components'; import { Tags } from '../../../components/tags'; @@ -186,6 +190,7 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{ agentUpgradeStartedAt={agent.upgrade_started_at} agentUpgradedAt={agent.upgraded_at} agentUpgradeDetails={agent.upgrade_details} + notUpgradeableMessage={getNotUpgradeableMessage(agent, latestAgentVersion)} />
diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx index a5f3498fd0b59..1155176bf7915 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx @@ -7,6 +7,7 @@ import { fireEvent, waitFor } from '@testing-library/react'; import React from 'react'; +import moment from 'moment'; import { createFleetTestRendererMock } from '../../../../../../mock'; @@ -176,6 +177,69 @@ describe('AgentUpgradeStatus', () => { await expectTooltip(results, 'Downloading the new agent artifact version (16.4%).'); }); + it('should render UPG_DOWNLOADING with a warning if agent has a retry_message and retry_until', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + retry_until: `${moment().add(10, 'minutes').toISOString()}`, + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + fireEvent.mouseOver(results.getByText('Info')); + await waitFor(() => { + const tooltip = results.getByRole('tooltip'); + expect(tooltip).toHaveTextContent('Upgrade failing: unable to download. Retrying until:'); + expect(tooltip).toHaveTextContent('(00:09 remaining)'); + }); + }); + + it('should not render retry_until if the remaining time is negative', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + retry_until: `${moment().subtract(10, 'minutes').toISOString()}`, + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + fireEvent.mouseOver(results.getByText('Info')); + await waitFor(() => { + const tooltip = results.getByRole('tooltip'); + expect(tooltip).toHaveTextContent('Upgrade failing: unable to download.'); + expect(tooltip).not.toHaveTextContent('remaining'); + }); + }); + + it('should render UPG_DOWNLOADING with a warning if agent has a retry_message', async () => { + const results = render({ + agentUpgradeDetails: { + target_version: 'XXX', + action_id: 'xxx', + state: 'UPG_DOWNLOADING', + metadata: { + download_percent: 16.4, + retry_error_msg: 'unable to download', + }, + }, + }); + + expectUpgradeStatusBadgeLabel(results, 'Upgrade downloading'); + await expectTooltip(results, 'Upgrade failing: unable to download.'); + }); + it('should render UPG_EXTRACTING state correctly', async () => { const results = render({ agentUpgradeDetails: { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx index e5cf2eb7913c6..cf3ad42292533 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx @@ -8,6 +8,7 @@ import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; +import moment from 'moment'; import type { AgentUpgradeDetails } from '../../../../../../../common/types'; @@ -62,6 +63,16 @@ const formatRate = (downloadRate: number) => { } return downloadRate.toFixed(1) + byteUnits[i]; }; +const formatRetryUntil = (retryUntil: string | undefined) => { + if (!retryUntil) return ''; + const eta = new Date(retryUntil).toISOString(); + const remainingTime = Date.parse(retryUntil) - Date.now(); + const duration = moment + .utc(moment.duration(remainingTime, 'milliseconds').asMilliseconds()) + .format('HH:mm'); + + return remainingTime > 0 ? `Retrying until: ${eta} (${duration} remaining)` : ''; +}; function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { switch (agentUpgradeDetails?.state) { @@ -103,6 +114,28 @@ function getStatusComponents(agentUpgradeDetails?: AgentUpgradeDetails) { ), }; case 'UPG_DOWNLOADING': + if (agentUpgradeDetails?.metadata?.retry_error_msg) { + return { + Badge: ( + + + + ), + WarningTooltipText: ( + + ), + }; + } return { Badge: ( @@ -252,24 +285,6 @@ export const AgentUpgradeStatus: React.FC<{ const status = useMemo(() => getStatusComponents(agentUpgradeDetails), [agentUpgradeDetails]); const minVersion = '8.12'; - if (!isAgentUpgradable && notUpgradeableMessage) { - return ( - - } - color="subdued" - /> - ); - } - if (isAgentUpgradable) { return ( @@ -285,9 +300,16 @@ export const AgentUpgradeStatus: React.FC<{ return ( {status.Badge} - - - + {status.TooltipText && ( + + + + )} + {status.WarningTooltipText && ( + + + + )} ); } @@ -310,5 +332,23 @@ export const AgentUpgradeStatus: React.FC<{ ); } + if (!isAgentUpgradable && notUpgradeableMessage) { + return ( + + } + color="subdued" + /> + ); + } + return null; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx index d5da6f553cf89..4352a3a6b8248 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.test.tsx @@ -83,6 +83,12 @@ describe('Output form validation', () => { expect(res).toEqual([{ message: 'URL is required' }]); }); + it('should not work with empty url', () => { + const res = validateESHosts(['']); + + expect(res).toEqual([{ index: 0, message: 'URL is required' }]); + }); + it('should work with valid url', () => { const res = validateESHosts(['https://test.fr:9200']); @@ -117,6 +123,11 @@ describe('Output form validation', () => { { index: 1, message: 'Duplicate URL' }, ]); }); + it('should return an error when invalid protocol', () => { + const res = validateESHosts(['ftp://test.fr']); + + expect(res).toEqual([{ index: 0, message: 'Invalid protocol' }]); + }); }); describe('validateLogstashHosts', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx index 26e63803df0e7..330d5c5d20122 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/output_form_validators.tsx @@ -88,14 +88,29 @@ export function validateKafkaHosts(value: string[]) { export function validateESHosts(value: string[]) { const res: Array<{ message: string; index?: number }> = []; const urlIndexes: { [key: string]: number[] } = {}; + const urlRequiredMessage = i18n.translate( + 'xpack.fleet.settings.outputForm.elasticUrlRequiredError', + { + defaultMessage: 'URL is required', + } + ); value.forEach((val, idx) => { try { if (!val) { - throw new Error('Host URL required'); - } - const urlParsed = new URL(val); - if (!['http:', 'https:'].includes(urlParsed.protocol)) { - throw new Error('Invalid protocol'); + res.push({ + message: urlRequiredMessage, + index: idx, + }); + } else { + const urlParsed = new URL(val); + if (!['http:', 'https:'].includes(urlParsed.protocol)) { + res.push({ + message: i18n.translate('xpack.fleet.settings.outputForm.invalidProtocolError', { + defaultMessage: 'Invalid protocol', + }), + index: idx, + }); + } } } catch (error) { res.push({ @@ -125,9 +140,7 @@ export function validateESHosts(value: string[]) { if (value.length === 0) { res.push({ - message: i18n.translate('xpack.fleet.settings.outputForm.elasticUrlRequiredError', { - defaultMessage: 'URL is required', - }), + message: urlRequiredMessage, }); } diff --git a/x-pack/plugins/fleet/public/services/index.ts b/x-pack/plugins/fleet/public/services/index.ts index 71f5fde90d93a..7b9d5093ed740 100644 --- a/x-pack/plugins/fleet/public/services/index.ts +++ b/x-pack/plugins/fleet/public/services/index.ts @@ -34,6 +34,7 @@ export { isValidNamespace, LicenseService, isAgentUpgradeable, + getNotUpgradeableMessage, doesPackageHaveIntegrations, validatePackagePolicy, validatePackagePolicyConfig, diff --git a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts index bf8e8a22cdbdd..f9021f344c69b 100644 --- a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts @@ -6,6 +6,7 @@ */ import { keyBy, keys, merge } from 'lodash'; import type { RequestHandler } from '@kbn/core/server'; +import pMap from 'p-map'; import type { DataStream } from '../../types'; import { KibanaSavedObjectType } from '../../../common/types'; @@ -120,7 +121,7 @@ export const getListHandler: RequestHandler = async (context, request, response) ); // Query additional information for each data stream - const dataStreamPromises = dataStreamNames.map(async (dataStreamName) => { + const queryDataStreamInfo = async (dataStreamName: string) => { const dataStream = dataStreams[dataStreamName]; const dataStreamResponse: DataStream = { @@ -197,13 +198,18 @@ export const getListHandler: RequestHandler = async (context, request, response) } return dataStreamResponse; - }); + }; // Return final data streams objects sorted by last activity, descending // After filtering out data streams that are missing dataset/namespace/type/package fields - body.data_streams = (await Promise.all(dataStreamPromises)) + body.data_streams = ( + await pMap(dataStreamNames, (dataStreamName) => queryDataStreamInfo(dataStreamName), { + concurrency: 50, + }) + ) .filter(({ dataset, namespace, type }) => dataset && namespace && type) .sort((a, b) => b.last_activity_ms - a.last_activity_ms); + return response.ok({ body, }); diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts index 56d6d8c127bc2..1eb8387f69751 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.test.ts @@ -15,7 +15,7 @@ import { getBundledPackageByPkgKey } from '../../services/epm/packages/bundled_p import { getFile, getInstallation } from '../../services/epm/packages/get'; import type { FleetRequestHandlerContext } from '../..'; import { appContextService } from '../../services'; -import { unpackBufferEntries, getArchiveEntry } from '../../services/epm/archive'; +import { unpackBufferEntries } from '../../services/epm/archive'; import { getAsset } from '../../services/epm/archive/storage'; import { getFileHandler } from './file_handler'; @@ -29,7 +29,6 @@ jest.mock('../../services/epm/packages/get'); const mockedGetBundledPackageByPkgKey = jest.mocked(getBundledPackageByPkgKey); const mockedGetInstallation = jest.mocked(getInstallation); const mockedGetFile = jest.mocked(getFile); -const mockedGetArchiveEntry = jest.mocked(getArchiveEntry); const mockedUnpackBufferEntries = jest.mocked(unpackBufferEntries); const mockedGetAsset = jest.mocked(getAsset); @@ -61,7 +60,6 @@ describe('getFileHandler', () => { mockedUnpackBufferEntries.mockReset(); mockedGetFile.mockReset(); mockedGetInstallation.mockReset(); - mockedGetArchiveEntry.mockReset(); mockedGetAsset.mockReset(); }); @@ -207,7 +205,15 @@ describe('getFileHandler', () => { const context = mockContext(); mockedGetInstallation.mockResolvedValue({ version: '1.0.0' } as any); - mockedGetArchiveEntry.mockReturnValue(Buffer.from('test')); + mockedGetAsset.mockResolvedValue({ + asset_path: '/test/1.0.0/README.md', + data_utf8: 'test', + data_base64: '', + media_type: 'text/markdown; charset=utf-8', + package_name: 'test', + package_version: '1.0.0', + install_source: 'registry', + }); await getFileHandler(context, request, response); diff --git a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts index 4b6b74628aa4e..0f22a31c1aa72 100644 --- a/x-pack/plugins/fleet/server/routes/epm/file_handler.ts +++ b/x-pack/plugins/fleet/server/routes/epm/file_handler.ts @@ -14,7 +14,6 @@ import type { ResponseHeaders, KnownHeaders, HttpResponseOptions } from '@kbn/co import type { GetFileRequestSchema, FleetRequestHandler } from '../../types'; import { getFile, getInstallation } from '../../services/epm/packages'; import { defaultFleetErrorHandler } from '../../errors'; -import { getArchiveEntry } from '../../services/epm/archive'; import { getAsset } from '../../services/epm/archive/storage'; import { getBundledPackageByPkgKey } from '../../services/epm/packages/bundled_packages'; import { pkgToPkgKey } from '../../services/epm/registry'; @@ -31,35 +30,23 @@ export const getFileHandler: FleetRequestHandler< const savedObjectsClient = (await context.fleet).internalSoClient; const installation = await getInstallation({ savedObjectsClient, pkgName }); - const useLocalFile = pkgVersion === installation?.version; + const isPackageInstalled = pkgVersion === installation?.version; const assetPath = `${pkgName}-${pkgVersion}/${filePath}`; - if (useLocalFile) { - const fileBuffer = getArchiveEntry(assetPath); - // only pull local installation if we don't have it cached - const storedAsset = !fileBuffer && (await getAsset({ savedObjectsClient, path: assetPath })); + if (isPackageInstalled) { + const storedAsset = await getAsset({ savedObjectsClient, path: assetPath }); - // error, if neither is available - if (!fileBuffer && !storedAsset) { + if (!storedAsset) { return response.custom({ body: `installed package file not found: ${filePath}`, statusCode: 404, }); } - // if storedAsset is not available, fileBuffer *must* be - // b/c we error if we don't have at least one, and storedAsset is the least likely - const { buffer, contentType } = storedAsset - ? { - contentType: storedAsset.media_type, - buffer: storedAsset.data_utf8 - ? Buffer.from(storedAsset.data_utf8, 'utf8') - : Buffer.from(storedAsset.data_base64, 'base64'), - } - : { - contentType: mime.contentType(path.extname(assetPath)), - buffer: fileBuffer, - }; + const contentType = storedAsset.media_type; + const buffer = storedAsset.data_utf8 + ? Buffer.from(storedAsset.data_utf8, 'utf8') + : Buffer.from(storedAsset.data_base64, 'base64'); if (!contentType) { return response.custom({ diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index 24b35b7b10201..9e40bcd64c8c8 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -16,6 +16,8 @@ import type { KibanaRequest, } from '@kbn/core/server'; +import { CoreKibanaRequest } from '@kbn/core/server'; + import type { PluginStart as DataPluginStart } from '@kbn/data-plugin/server'; import type { EncryptedSavedObjectsClient, @@ -25,7 +27,7 @@ import type { import type { SecurityPluginStart, SecurityPluginSetup } from '@kbn/security-plugin/server'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; - +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import type { SavedObjectTaggingStart } from '@kbn/saved-objects-tagging-plugin/server'; import { SECURITY_EXTENSION_ID } from '@kbn/core-saved-objects-server'; @@ -172,6 +174,23 @@ class AppContextService { } return this.savedObjectsTagging; } + public getInternalUserSOClientForSpaceId(spaceId?: string) { + const request = CoreKibanaRequest.from({ + headers: {}, + path: '/', + route: { settings: {} }, + url: { href: '', hash: '' } as URL, + raw: { req: { url: '/' } } as any, + }); + if (this.httpSetup && spaceId && spaceId !== DEFAULT_SPACE_ID) { + this.httpSetup?.basePath.set(request, `/s/${spaceId}`); + } + + // soClient as kibana internal users, be careful on how you use it, security is not enabled + return appContextService.getSavedObjects().getScopedClient(request, { + excludedExtensions: [SECURITY_EXTENSION_ID], + }); + } public getInternalUserSOClient(request: KibanaRequest) { // soClient as kibana internal users, be careful on how you use it, security is not enabled diff --git a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts index db0b0d709e683..15f38ccc8a68b 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts @@ -8,19 +8,10 @@ import type { ArchivePackage, RegistryPackage, PackageVerificationResult } from '../../../types'; import { appContextService } from '../..'; -import type { ArchiveEntry } from '.'; - type SharedKeyString = string; const sharedKey = ({ name, version }: SharedKey): SharedKeyString => `${name}-${version}`; -const archiveEntryCache: Map = new Map(); -export const getArchiveEntry = (key: string) => archiveEntryCache.get(key); -export const setArchiveEntry = (key: string, value: Buffer) => archiveEntryCache.set(key, value); -export const hasArchiveEntry = (key: string) => archiveEntryCache.has(key); -export const clearArchiveEntries = () => archiveEntryCache.clear(); -export const deleteArchiveEntry = (key: string) => archiveEntryCache.delete(key); - const verificationResultCache: Map = new Map(); export const getVerificationResult = (key: SharedKey) => verificationResultCache.get(sharedKey(key)); @@ -37,36 +28,12 @@ export interface SharedKey { version: string; } -const archiveFilelistCache: Map = new Map(); -export const getArchiveFilelist = (keyArgs: SharedKey) => - archiveFilelistCache.get(sharedKey(keyArgs)); - -export const setArchiveFilelist = (keyArgs: SharedKey, paths: string[]) => { - const logger = appContextService.getLogger(); - logger.debug(`Setting file list to the cache for ${keyArgs.name}-${keyArgs.version}`); - logger.trace(JSON.stringify(paths)); - return archiveFilelistCache.set(sharedKey(keyArgs), paths); -}; - -export const deleteArchiveFilelist = (keyArgs: SharedKey) => - archiveFilelistCache.delete(sharedKey(keyArgs)); - const packageInfoCache: Map = new Map(); export const getPackageInfo = (args: SharedKey) => { return packageInfoCache.get(sharedKey(args)); }; -export const getArchivePackage = (args: SharedKey) => { - const packageInfo = getPackageInfo(args); - const paths = getArchiveFilelist(args); - if (!paths || !packageInfo) return undefined; - return { - paths, - packageInfo, - }; -}; - /* * This cache should only be used to store "full" package info generated from the package archive. * NOT package info from the EPR API. This is because we parse extra fields from the archive @@ -85,11 +52,3 @@ export const setPackageInfo = ({ }; export const deletePackageInfo = (args: SharedKey) => packageInfoCache.delete(sharedKey(args)); - -export const clearPackageFileCache = (args: SharedKey) => { - const fileList = getArchiveFilelist(args) ?? []; - fileList.forEach((filePath) => { - deleteArchiveEntry(filePath); - }); - deleteArchiveFilelist(args); -}; diff --git a/x-pack/plugins/fleet/server/services/epm/archive/index.ts b/x-pack/plugins/fleet/server/services/epm/archive/index.ts index ec19fbba55a19..5943f8f838fcb 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/index.ts @@ -5,23 +5,14 @@ * 2.0. */ -import type { AssetParts } from '../../../../common/types'; +import type { AssetParts, AssetsMap } from '../../../../common/types'; import { PackageInvalidArchiveError, PackageUnsupportedMediaTypeError, PackageNotFoundError, } from '../../../errors'; -import { - getArchiveEntry, - setArchiveEntry, - deleteArchiveEntry, - getArchiveFilelist, - setArchiveFilelist, - deleteArchiveFilelist, - deletePackageInfo, - clearPackageFileCache, -} from './cache'; +import { deletePackageInfo } from './cache'; import type { SharedKey } from './cache'; import { getBufferExtractor } from './extract'; @@ -34,7 +25,7 @@ export interface ArchiveEntry { buffer?: Buffer; } -export async function unpackBufferToCache({ +export async function unpackBufferToAssetsMap({ name, version, contentType, @@ -44,22 +35,20 @@ export async function unpackBufferToCache({ version: string; contentType: string; archiveBuffer: Buffer; -}): Promise { +}): Promise<{ paths: string[]; assetsMap: AssetsMap }> { + const assetsMap = new Map(); + const paths: string[] = []; const entries = await unpackBufferEntries(archiveBuffer, contentType); - // Make sure any buffers from previous installations from registry or upload are deleted first - clearPackageFileCache({ name, version }); - const paths: string[] = []; entries.forEach((entry) => { const { path, buffer } = entry; if (buffer) { - setArchiveEntry(path, buffer); + assetsMap.set(path, buffer); paths.push(path); } }); - setArchiveFilelist({ name, version }, paths); - return paths; + return { assetsMap, paths }; } export async function unpackBufferEntries( @@ -94,16 +83,6 @@ export async function unpackBufferEntries( } export const deletePackageCache = ({ name, version }: SharedKey) => { - // get cached archive filelist - const paths = getArchiveFilelist({ name, version }); - - // delete cached archive filelist - deleteArchiveFilelist({ name, version }); - - // delete cached archive files - // this has been populated in unpackBufferToCache() - paths?.forEach(deleteArchiveEntry); - deletePackageInfo({ name, version }); }; @@ -151,8 +130,8 @@ export function getPathParts(path: string): AssetParts { } as AssetParts; } -export function getAsset(key: string) { - const buffer = getArchiveEntry(key); +export function getAssetFromAssetsMap(assetsMap: AssetsMap, key: string) { + const buffer = assetsMap.get(key); if (buffer === undefined) throw new PackageNotFoundError(`Cannot find asset ${key}`); return buffer; diff --git a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts index 81d55c5fd3138..dd6321445df75 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts @@ -23,7 +23,7 @@ import { PackageInvalidArchiveError, PackageNotFoundError } from '../../../error import { appContextService } from '../../app_context'; -import { getArchiveEntry, setArchiveEntry, setArchiveFilelist, setPackageInfo } from '.'; +import { setPackageInfo } from '.'; import type { ArchiveEntry } from '.'; import { filterAssetPathForParseAndVerifyArchive, parseAndVerifyArchive } from './parse'; @@ -104,16 +104,17 @@ export async function removeArchiveEntries(opts: { ); } -export async function saveArchiveEntries(opts: { +export async function saveArchiveEntriesFromAssetsMap(opts: { savedObjectsClient: SavedObjectsClientContract; paths: string[]; + assetsMap: Map; packageInfo: InstallablePackage; installSource: InstallSource; }) { - const { savedObjectsClient, paths, packageInfo, installSource } = opts; + const { savedObjectsClient, paths, packageInfo, assetsMap, installSource } = opts; const bulkBody = await Promise.all( paths.map((path) => { - const buffer = getArchiveEntry(path); + const buffer = assetsMap.get(path); if (!buffer) throw new PackageNotFoundError(`Could not find ArchiveEntry at ${path}`); const { name, version } = packageInfo; return archiveEntryToBulkCreateObject({ path, buffer, name, version, installSource }); @@ -208,26 +209,26 @@ export const getEsPackage = async ( return undefined; } - const assetsMap: Record = {}; + const parseAndVerifyAssetsMap: Record = {}; + const assetsMap = new Map(); const entries: ArchiveEntry[] = assets.map(packageAssetToArchiveEntry); const paths: string[] = []; entries.forEach(({ path, buffer }) => { if (path && buffer) { - setArchiveEntry(path, buffer); + assetsMap.set(path, buffer); paths.push(path); } if (buffer && filterAssetPathForParseAndVerifyArchive(path)) { - assetsMap[path] = buffer; + parseAndVerifyAssetsMap[path] = buffer; } }); - // Add asset references to cache - setArchiveFilelist({ name: pkgName, version: pkgVersion }, paths); - const packageInfo = parseAndVerifyArchive(paths, assetsMap); + const packageInfo = parseAndVerifyArchive(paths, parseAndVerifyAssetsMap); setPackageInfo({ name: pkgName, version: pkgVersion, packageInfo }); return { packageInfo, paths, + assetsMap, }; }; diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts index c6be2dfedb1df..78db39b48cfd6 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/datastream_ilm/install.ts @@ -7,14 +7,13 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; -import type { - EsAssetReference, - InstallablePackage, - RegistryDataStream, +import { + ElasticsearchAssetType, + type PackageInstallContext, } from '../../../../../common/types/models'; +import type { EsAssetReference, RegistryDataStream } from '../../../../../common/types/models'; import { updateEsAssetReferences } from '../../packages/install'; -import { getAsset } from '../transform/common'; +import { getAssetFromAssetsMap } from '../../archive'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; @@ -32,13 +31,13 @@ interface IlmPathDataset { } export const installIlmForDataStream = async ( - registryPackage: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ) => { + const { packageInfo: registryPackage, paths, assetsMap } = packageInstallContext; const previousInstalledIlmEsAssets = esReferences.filter( ({ type }) => type === ElasticsearchAssetType.dataStreamIlmPolicy ); @@ -100,7 +99,9 @@ export const installIlmForDataStream = async ( const ilmInstallations: IlmInstallation[] = ilmPathDatasets.map( (ilmPathDataset: IlmPathDataset) => { - const content = JSON.parse(getAsset(ilmPathDataset.path).toString('utf-8')); + const content = JSON.parse( + getAssetFromAssetsMap(assetsMap, ilmPathDataset.path).toString('utf-8') + ); content.policy._meta = getESAssetMetadata({ packageName: registryPackage.name }); return { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts index 61a75d28b7999..08feb1e95585a 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts @@ -7,28 +7,31 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; -import type { EsAssetReference, InstallablePackage } from '../../../../types'; +import type { EsAssetReference } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { updateEsAssetReferences } from '../../packages/install'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; import { PackageInvalidArchiveError } from '../../../../errors'; +import type { PackageInstallContext } from '../../../../../common/types'; export async function installILMPolicy( - packageInfo: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ): Promise { - const ilmPaths = paths.filter((path) => isILMPolicy(path)); + const { packageInfo } = packageInstallContext; + const ilmPaths = packageInstallContext.paths.filter((path) => isILMPolicy(path)); if (!ilmPaths.length) return esReferences; const ilmPolicies = ilmPaths.map((path) => { - const body = JSON.parse(getAsset(path).toString('utf-8')); + const body = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8') + ); body.policy._meta = getESAssetMetadata({ packageName: packageInfo.name }); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts index 7ea61bde7a0e8..fb12d58878d1d 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.test.ts @@ -7,19 +7,15 @@ import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { loggerMock } from '@kbn/logging-mocks'; -import { getArchiveEntry } from '../../archive/cache'; - import { prepareToInstallPipelines } from './install'; jest.mock('../../archive/cache'); -const mockedGetArchiveEntry = getArchiveEntry as jest.MockedFunction; - describe('Install pipeline tests', () => { describe('prepareToInstallPipelines', () => { it('should work with datastream without ingest pipeline define in the package', async () => { - const res = prepareToInstallPipelines( - { + const res = prepareToInstallPipelines({ + packageInfo: { version: '1.0.0', data_streams: [ { @@ -29,9 +25,10 @@ describe('Install pipeline tests', () => { path: '/datasettest', }, ], - } as any, - [] - ); + }, + paths: [], + assetsMap: new Map(), + } as any); expect(res.assetsToAdd).toEqual([{ id: 'logs-datasettest-1.0.0', type: 'ingest_pipeline' }]); const esClient = elasticsearchClientMock.createInternalClient(); @@ -50,8 +47,8 @@ describe('Install pipeline tests', () => { }); it('should work with datastream with ingest pipelines define in the package', async () => { - const res = prepareToInstallPipelines( - { + const res = prepareToInstallPipelines({ + packageInfo: { version: '1.0.0', data_streams: [ { @@ -62,12 +59,22 @@ describe('Install pipeline tests', () => { ingest_pipeline: 'default', }, ], - } as any, - [ + }, + paths: [ 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/default.yml', 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/standard.yml', - ] - ); + ], + assetsMap: new Map([ + [ + 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/default.yml', + Buffer.from('description: test'), + ], + [ + 'packagetest-1.0.0/data_stream/datasettest/elasticsearch/ingest_pipeline/standard.yml', + Buffer.from('description: test'), + ], + ]), + } as any); expect(res.assetsToAdd).toEqual([ { id: 'logs-datasettest-1.0.0', type: 'ingest_pipeline' }, { id: 'logs-datasettest-1.0.0-standard', type: 'ingest_pipeline' }, @@ -76,8 +83,6 @@ describe('Install pipeline tests', () => { const esClient = elasticsearchClientMock.createInternalClient(); const logger = loggerMock.create(); - mockedGetArchiveEntry.mockReturnValue(Buffer.from(`description: test`)); - await res.install(esClient, logger); expect(esClient.ingest.putPipeline).toBeCalledTimes(2); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts index e30bc5b32a771..a456734747324 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ingest_pipeline/install.ts @@ -15,7 +15,7 @@ import type { InstallablePackage, PackageInfo, } from '../../../../types'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import type { ArchiveEntry } from '../../archive'; import { FLEET_FINAL_PIPELINE_CONTENT, @@ -23,6 +23,7 @@ import { FLEET_FINAL_PIPELINE_VERSION, } from '../../../../constants'; import { getPipelineNameForDatastream } from '../../../../../common/services'; +import type { PackageInstallContext } from '../../../../../common/types'; import { appendMetadataToIngestPipeline } from '../meta'; import { retryTransientEsErrors } from '../retry'; @@ -36,18 +37,18 @@ import { import type { PipelineInstall, RewriteSubstitution } from './types'; export const prepareToInstallPipelines = ( - installablePackage: InstallablePackage | PackageInfo, - paths: string[], + packageInstallContext: PackageInstallContext, onlyForDataStreams?: RegistryDataStream[] ): { assetsToAdd: EsAssetReference[]; install: (esClient: ElasticsearchClient, logger: Logger) => Promise; } => { + const { packageInfo, paths } = packageInstallContext; // unlike other ES assets, pipeline names are versioned so after a template is updated // it can be created pointing to the new template, without removing the old one and effecting data // so do not remove the currently installed pipelines here - const dataStreams = onlyForDataStreams || installablePackage.data_streams; - const { version: pkgVersion } = installablePackage; + const dataStreams = onlyForDataStreams || packageInfo.data_streams; + const { version: pkgVersion } = packageInfo; const pipelinePaths = paths.filter((path) => isPipeline(path)); const topLevelPipelinePaths = paths.filter((path) => isTopLevelPipeline(path)); @@ -108,7 +109,7 @@ export const prepareToInstallPipelines = ( esClient, logger, paths: pipelinePaths, - installablePackage, + packageInstallContext, }) ); @@ -123,7 +124,7 @@ export const prepareToInstallPipelines = ( esClient, logger, paths: topLevelPipelinePaths, - installablePackage, + packageInstallContext, }) ); } @@ -138,13 +139,13 @@ export async function installAllPipelines({ logger, paths, dataStream, - installablePackage, + packageInstallContext, }: { esClient: ElasticsearchClient; logger: Logger; paths: string[]; dataStream?: RegistryDataStream; - installablePackage: InstallablePackage | PackageInfo; + packageInstallContext: PackageInstallContext; }): Promise { const pipelinePaths = dataStream ? paths.filter((path) => isDataStreamPipeline(path, dataStream.path)) @@ -164,9 +165,9 @@ export async function installAllPipelines({ const nameForInstallation = getPipelineNameForInstallation({ pipelineName: name, dataStream, - packageVersion: installablePackage.version, + packageVersion: packageInstallContext.packageInfo.version, }); - const content = getAsset(path).toString('utf-8'); + const content = getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8'); pipelinesInfos.push({ nameForInstallation, shouldInstallCustomPipelines: dataStream && isMainPipeline, @@ -191,7 +192,7 @@ export async function installAllPipelines({ if (!datastreamPipelineCreated && dataStream) { const nameForInstallation = getPipelineNameForDatastream({ dataStream, - packageVersion: installablePackage.version, + packageVersion: packageInstallContext.packageInfo.version, }); pipelinesToInstall.push({ @@ -204,7 +205,12 @@ export async function installAllPipelines({ } const installationPromises = pipelinesToInstall.map(async (pipeline) => { - return installPipeline({ esClient, pipeline, installablePackage, logger }); + return installPipeline({ + esClient, + pipeline, + packageInfo: packageInstallContext.packageInfo, + logger, + }); }); return Promise.all(installationPromises); @@ -214,18 +220,18 @@ async function installPipeline({ esClient, logger, pipeline, - installablePackage, + packageInfo, shouldAddCustomPipelineProcessor = true, }: { esClient: ElasticsearchClient; logger: Logger; pipeline: PipelineInstall; - installablePackage?: InstallablePackage | PackageInfo; + packageInfo?: InstallablePackage | PackageInfo; shouldAddCustomPipelineProcessor?: boolean; }): Promise { let pipelineToInstall = appendMetadataToIngestPipeline({ pipeline, - packageName: installablePackage?.name, + packageName: packageInfo?.name, }); if (shouldAddCustomPipelineProcessor) { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts index 630433e18ce39..d48a65dc593ef 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/install.ts @@ -8,33 +8,35 @@ import type { ElasticsearchClient, Logger, SavedObjectsClientContract } from '@kbn/core/server'; import { errors } from '@elastic/elasticsearch'; -import { getPathParts } from '../../archive'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; -import type { EsAssetReference, InstallablePackage } from '../../../../../common/types/models'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; +import { + ElasticsearchAssetType, + type PackageInstallContext, +} from '../../../../../common/types/models'; +import type { EsAssetReference } from '../../../../../common/types/models'; import { retryTransientEsErrors } from '../retry'; import { updateEsAssetReferences } from '../../packages/install'; -import { getAsset } from './common'; - interface MlModelInstallation { installationName: string; content: string; } export const installMlModel = async ( - installablePackage: InstallablePackage, - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, savedObjectsClient: SavedObjectsClientContract, logger: Logger, esReferences: EsAssetReference[] ) => { - const mlModelPath = paths.find((path) => isMlModel(path)); + const mlModelPath = packageInstallContext.paths.find((path) => isMlModel(path)); if (mlModelPath !== undefined) { - const content = getAsset(mlModelPath).toString('utf-8'); + const content = getAssetFromAssetsMap(packageInstallContext.assetsMap, mlModelPath).toString( + 'utf-8' + ); const pathParts = mlModelPath.split('/'); const modelId = pathParts[pathParts.length - 1].replace('.json', ''); @@ -46,7 +48,7 @@ export const installMlModel = async ( // get and save ml model refs before installing ml model esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: [mlModelRef] } ); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts index 321e832115cf0..61edf78ec497e 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.test.ts @@ -7,7 +7,7 @@ import { createAppContextStartContractMock } from '../../../../mocks'; import { appContextService } from '../../..'; import { loadFieldsFromYaml } from '../../fields/field'; -import type { ArchivePackage, RegistryDataStream } from '../../../../types'; +import type { PackageInstallContext, RegistryDataStream } from '../../../../../common/types'; import { prepareTemplate, prepareToInstallTemplates } from './install'; @@ -19,6 +19,9 @@ jest.mock('../../fields/field', () => ({ const mockedLoadFieldsFromYaml = loadFieldsFromYaml as jest.MockedFunction< typeof loadFieldsFromYaml >; +const packageInstallContext = { + packageInfo: { name: 'package', version: '0.0.1' }, +} as PackageInstallContext; describe('EPM index template install', () => { beforeEach(async () => { @@ -43,15 +46,12 @@ describe('EPM index template install', () => { path: 'path', ingest_pipeline: 'default', } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixUnset = 'metrics-package.dataset-*'; const templatePriorityDatasetIsPrefixUnset = 200; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixUnset }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixUnset }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixUnset); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixUnset]); }); @@ -67,15 +67,12 @@ describe('EPM index template install', () => { ingest_pipeline: 'default', dataset_is_prefix: false, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixFalse = 'metrics-package.dataset-*'; const templatePriorityDatasetIsPrefixFalse = 200; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixFalse }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixFalse }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixFalse); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixFalse]); @@ -92,15 +89,12 @@ describe('EPM index template install', () => { ingest_pipeline: 'default', dataset_is_prefix: true, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; + const templateIndexPatternDatasetIsPrefixTrue = 'metrics-package.dataset.*-*'; const templatePriorityDatasetIsPrefixTrue = 150; const { indexTemplate: { indexTemplate }, - } = prepareTemplate({ pkg, dataStream: dataStreamDatasetIsPrefixTrue }); + } = prepareTemplate({ packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue }); expect(indexTemplate.priority).toBe(templatePriorityDatasetIsPrefixTrue); expect(indexTemplate.index_patterns).toEqual([templateIndexPatternDatasetIsPrefixTrue]); @@ -120,13 +114,9 @@ describe('EPM index template install', () => { source_mode: 'synthetic', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -154,13 +144,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -188,13 +174,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, experimentalDataStreamFeature: { data_stream: 'metrics-package.dataset', @@ -230,13 +212,9 @@ describe('EPM index template install', () => { source_mode: 'synthetic', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, experimentalDataStreamFeature: { data_stream: 'metrics-package.dataset', @@ -272,13 +250,9 @@ describe('EPM index template install', () => { index_mode: 'time_series', }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; const { indexTemplate } = prepareTemplate({ - pkg, + packageInstallContext, dataStream: dataStreamDatasetIsPrefixTrue, }); @@ -307,13 +281,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -352,13 +321,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -401,13 +365,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -441,13 +400,8 @@ describe('EPM index template install', () => { }, } as RegistryDataStream; - const pkg = { - name: 'package', - version: '0.0.1', - }; - const { componentTemplates } = prepareTemplate({ - pkg, + packageInstallContext, dataStream, }); @@ -469,10 +423,12 @@ describe('EPM index template install', () => { const { assetsToAdd } = prepareToInstallTemplates( { - name: 'package', - version: '0.0.1', - data_streams: [dataStreamDatasetIsPrefixUnset], - } as ArchivePackage, + packageInfo: { + name: 'package', + version: '0.0.1', + data_streams: [dataStreamDatasetIsPrefixUnset], + }, + } as PackageInstallContext, [], [] ); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts index 2e67c70874e4e..d6825668d1a44 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts @@ -23,33 +23,29 @@ import type { RegistryDataStream, IndexTemplateEntry, RegistryElasticsearch, - InstallablePackage, IndexTemplate, IndexTemplateMappings, TemplateMapEntry, TemplateMap, EsAssetReference, - PackageInfo, ExperimentalDataStreamFeature, } from '../../../../types'; import { loadFieldsFromYaml, processFields } from '../../fields/field'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { FLEET_COMPONENT_TEMPLATES, PACKAGE_TEMPLATE_SUFFIX, USER_SETTINGS_TEMPLATE_SUFFIX, STACK_COMPONENT_TEMPLATES, } from '../../../../constants'; - import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; - import { applyDocOnlyValueToMapping, forEachMappings, } from '../../../experimental_datastream_features_helper'; - import { appContextService } from '../../../app_context'; +import type { PackageInstallContext } from '../../../../../common/types'; import { generateMappings, @@ -63,8 +59,7 @@ import { buildDefaultSettings } from './default_settings'; const FLEET_COMPONENT_TEMPLATE_NAMES = FLEET_COMPONENT_TEMPLATES.map((tmpl) => tmpl.name); export const prepareToInstallTemplates = ( - installablePackage: InstallablePackage | PackageInfo, - paths: string[], + packageInstallContext: PackageInstallContext, esReferences: EsAssetReference[], experimentalDataStreamFeatures: ExperimentalDataStreamFeature[] = [], onlyForDataStreams?: RegistryDataStream[] @@ -73,6 +68,7 @@ export const prepareToInstallTemplates = ( assetsToRemove: EsAssetReference[]; install: (esClient: ElasticsearchClient, logger: Logger) => Promise; } => { + const { packageInfo } = packageInstallContext; // remove package installation's references to index templates const assetsToRemove = esReferences.filter( ({ type }) => @@ -81,7 +77,7 @@ export const prepareToInstallTemplates = ( ); // build templates per data stream from yml files - const dataStreams = onlyForDataStreams || installablePackage.data_streams; + const dataStreams = onlyForDataStreams || packageInfo.data_streams; if (!dataStreams) return { assetsToAdd: [], assetsToRemove, install: () => Promise.resolve([]) }; const templates = dataStreams.map((dataStream) => { @@ -90,7 +86,7 @@ export const prepareToInstallTemplates = ( datastreamFeature.data_stream === getRegistryDataStreamAssetBaseName(dataStream) ); - return prepareTemplate({ pkg: installablePackage, dataStream, experimentalDataStreamFeature }); + return prepareTemplate({ packageInstallContext, dataStream, experimentalDataStreamFeature }); }); const assetsToAdd = getAllTemplateRefs(templates.map((template) => template.indexTemplate)); @@ -102,8 +98,8 @@ export const prepareToInstallTemplates = ( // install any pre-built index template assets, // atm, this is only the base package's global index templates // Install component templates first, as they are used by the index templates - await installPreBuiltComponentTemplates(paths, esClient, logger); - await installPreBuiltTemplates(paths, esClient, logger); + await installPreBuiltComponentTemplates(packageInstallContext, esClient, logger); + await installPreBuiltTemplates(packageInstallContext, esClient, logger); await Promise.all( templates.map((template) => @@ -122,15 +118,17 @@ export const prepareToInstallTemplates = ( }; const installPreBuiltTemplates = async ( - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, logger: Logger ) => { - const templatePaths = paths.filter((path) => isTemplate(path)); + const templatePaths = packageInstallContext.paths.filter((path) => isTemplate(path)); const templateInstallPromises = templatePaths.map(async (path) => { const { file } = getPathParts(path); const templateName = file.substr(0, file.lastIndexOf('.')); - const content = JSON.parse(getAsset(path).toString('utf8')); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf8') + ); const esClientParams = { name: templateName, body: content }; const esClientRequestOptions = { ignore: [404] }; @@ -159,15 +157,17 @@ const installPreBuiltTemplates = async ( }; const installPreBuiltComponentTemplates = async ( - paths: string[], + packageInstallContext: PackageInstallContext, esClient: ElasticsearchClient, logger: Logger ) => { - const templatePaths = paths.filter((path) => isComponentTemplate(path)); + const templatePaths = packageInstallContext.paths.filter((path) => isComponentTemplate(path)); const templateInstallPromises = templatePaths.map(async (path) => { const { file } = getPathParts(path); const templateName = file.substr(0, file.lastIndexOf('.')); - const content = JSON.parse(getAsset(path).toString('utf8')); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf8') + ); const esClientParams = { name: templateName, @@ -518,16 +518,16 @@ export async function ensureAliasHasWriteIndex(opts: { } export function prepareTemplate({ - pkg, + packageInstallContext, dataStream, experimentalDataStreamFeature, }: { - pkg: Pick; + packageInstallContext: PackageInstallContext; dataStream: RegistryDataStream; experimentalDataStreamFeature?: ExperimentalDataStreamFeature; }): { componentTemplates: TemplateMap; indexTemplate: IndexTemplateEntry } { - const { name: packageName, version: packageVersion } = pkg; - const fields = loadFieldsFromYaml(pkg, dataStream.path); + const { name: packageName, version: packageVersion } = packageInstallContext.packageInfo; + const fields = loadFieldsFromYaml(packageInstallContext, dataStream.path); const isIndexModeTimeSeries = dataStream.elasticsearch?.index_mode === 'time_series' || diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts index 46e85d7f9df62..b3ee4179d1256 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/common.ts @@ -5,8 +5,6 @@ * 2.0. */ -export { getAsset } from '../../archive'; - // Index alias that points to just one destination index from the latest package version export const TRANSFORM_DEST_IDX_ALIAS_LATEST_SFX = '.latest'; // Index alias that points to all of the destination indices from all the package versions diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts index 984a88d87e61f..2afe341485139 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/install.ts @@ -29,8 +29,11 @@ import { isFields, processFields } from '../../fields/field'; import { generateMappings } from '../template/template'; import { getESAssetMetadata } from '../meta'; import { updateEsAssetReferences } from '../../packages/install'; -import { getPathParts } from '../../archive'; -import { ElasticsearchAssetType } from '../../../../../common/types/models'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; +import { + ElasticsearchAssetType, + type PackageInstallContext, +} from '../../../../../common/types/models'; import type { EsAssetReference, InstallablePackage, @@ -42,7 +45,6 @@ import { getInstallation } from '../../packages'; import { retryTransientEsErrors } from '../retry'; import { deleteTransforms } from './remove'; -import { getAsset } from './common'; import { getDestinationIndexAliases } from './transform_utils'; const DEFAULT_TRANSFORM_TEMPLATES_PRIORITY = 250; @@ -69,7 +71,7 @@ interface TransformInstallation extends TransformModuleBase { } const installLegacyTransformsAssets = async ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], esClient: ElasticsearchClient, @@ -89,7 +91,11 @@ const installLegacyTransformsAssets = async ( if (transformPaths.length > 0) { const transformRefs = transformPaths.reduce((acc, path) => { acc.push({ - id: getLegacyTransformNameForInstallation(installablePackage, path, installNameSuffix), + id: getLegacyTransformNameForInstallation( + packageInstallContext.packageInfo, + path, + installNameSuffix + ), type: ElasticsearchAssetType.transform, }); @@ -99,7 +105,7 @@ const installLegacyTransformsAssets = async ( // get and save transform refs before installing transforms esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: transformRefs, @@ -107,12 +113,14 @@ const installLegacyTransformsAssets = async ( ); const transforms: TransformInstallation[] = transformPaths.map((path: string) => { - const content = JSON.parse(getAsset(path).toString('utf-8')); - content._meta = getESAssetMetadata({ packageName: installablePackage.name }); + const content = JSON.parse( + getAssetFromAssetsMap(packageInstallContext.assetsMap, path).toString('utf-8') + ); + content._meta = getESAssetMetadata({ packageName: packageInstallContext.packageInfo.name }); return { installationName: getLegacyTransformNameForInstallation( - installablePackage, + packageInstallContext.packageInfo, path, installNameSuffix ), @@ -130,7 +138,7 @@ const installLegacyTransformsAssets = async ( if (previousInstalledTransformEsAssets.length > 0) { esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: previousInstalledTransformEsAssets, @@ -142,13 +150,14 @@ const installLegacyTransformsAssets = async ( }; const processTransformAssetsPerModule = ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], previousInstalledTransformEsAssets: EsAssetReference[] = [], force?: boolean, username?: string ) => { + const { assetsMap, packageInfo: installablePackage } = packageInstallContext; const transformsSpecifications = new Map(); const destinationIndexTemplates: DestinationIndexTemplateInstallation[] = []; const transforms: TransformInstallation[] = []; @@ -169,7 +178,7 @@ const processTransformAssetsPerModule = ( } const packageAssets = transformsSpecifications.get(transformModuleId); - const content = safeLoad(getAsset(path).toString('utf-8')); + const content = safeLoad(getAssetFromAssetsMap(assetsMap, path).toString('utf-8')); // Handling fields.yml and all other files within 'fields' folder if (fileName === TRANSFORM_SPECS_TYPES.FIELDS || isFields(path)) { @@ -399,7 +408,7 @@ const processTransformAssetsPerModule = ( }; const installTransformsAssets = async ( - installablePackage: InstallablePackage, + packageInstallContext: PackageInstallContext, installNameSuffix: string, transformPaths: string[], esClient: ElasticsearchClient, @@ -425,7 +434,7 @@ const installTransformsAssets = async ( transformsToRemove, transformsToRemoveWithDestIndex, } = processTransformAssetsPerModule( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, previousInstalledTransformEsAssets, @@ -441,8 +450,8 @@ const installTransformsAssets = async ( ? await generateTransformSecondaryAuthHeaders({ authorizationHeader, logger, - pkgName: installablePackage.name, - pkgVersion: installablePackage.version, + pkgName: packageInstallContext.packageInfo.name, + pkgVersion: packageInstallContext.packageInfo.version, username, }) : // No need to generate api key/secondary auth if all transforms are run as kibana_system user @@ -469,7 +478,7 @@ const installTransformsAssets = async ( // get and save refs associated with the transforms before installing esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToAdd: [ @@ -504,7 +513,7 @@ const installTransformsAssets = async ( mappings: customMappings, templateName: destinationIndexTemplate.installationName, registryElasticsearch, - packageName: installablePackage.name, + packageName: packageInstallContext.packageInfo.name, defaultSettings: { // Adding destination pipeline here because else these templates will be overridden // by index setting @@ -579,7 +588,7 @@ const installTransformsAssets = async ( // get and save refs associated with the transforms before installing esReferences = await updateEsAssetReferences( savedObjectsClient, - installablePackage.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: installedTransforms, @@ -593,8 +602,7 @@ const installTransformsAssets = async ( }; interface InstallTransformsParams { - installablePackage: InstallablePackage; - paths: string[]; + packageInstallContext: PackageInstallContext; esClient: ElasticsearchClient; savedObjectsClient: SavedObjectsClientContract; logger: Logger; @@ -611,8 +619,7 @@ interface InstallTransformsParams { authorizationHeader?: HTTPAuthorizationHeader | null; } export const installTransforms = async ({ - installablePackage, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -620,11 +627,12 @@ export const installTransforms = async ({ esReferences, authorizationHeader, }: InstallTransformsParams) => { + const { paths, packageInfo } = packageInstallContext; const transformPaths = paths.filter((path) => isTransform(path)); const installation = await getInstallation({ savedObjectsClient, - pkgName: installablePackage.name, + pkgName: packageInfo.name, }); esReferences = esReferences ?? installation?.installed_es ?? []; let previousInstalledTransformEsAssets: EsAssetReference[] = []; @@ -641,12 +649,12 @@ export const installTransforms = async ({ } } - const installNameSuffix = `${installablePackage.version}`; + const installNameSuffix = `${packageInfo.version}`; // If package contains legacy transform specifications (i.e. with json instead of yml) if (transformPaths.some((p) => p.endsWith('.json')) || transformPaths.length === 0) { return await installLegacyTransformsAssets( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, esClient, @@ -659,7 +667,7 @@ export const installTransforms = async ({ // If package contains yml transform specifications return await installTransformsAssets( - installablePackage, + packageInstallContext, installNameSuffix, transformPaths, esClient, diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts index c652bee50d815..72474d3081f39 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/legacy_transforms.test.ts @@ -12,12 +12,6 @@ jest.mock('../../packages/get', () => { return { getInstallation: jest.fn(), getInstallationObject: jest.fn() }; }); -jest.mock('./common', () => { - return { - getAsset: jest.fn(), - }; -}); - import { errors } from '@elastic/elasticsearch'; import type { SavedObject, SavedObjectsClientContract } from '@kbn/core/server'; import { loggerMock } from '@kbn/logging-mocks'; @@ -26,15 +20,15 @@ import { savedObjectsClientMock } from '@kbn/core/server/mocks'; import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { getInstallation, getInstallationObject } from '../../packages'; -import type { Installation, RegistryPackage } from '../../../../types'; +import type { Installation } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; import { appContextService } from '../../../app_context'; import { getESAssetMetadata } from '../meta'; +import type { PackageInstallContext } from '../../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../constants'; -import { getAsset } from './common'; import { installTransforms } from './install'; describe('test transform install with legacy schema', () => { @@ -92,10 +86,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')) - .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -123,45 +113,61 @@ describe('test transform install with legacy schema', () => { }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata', }, - path: 'metadata', - }, - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata Current', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata Current', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, + ], + }, + paths: [ + 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', ], - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', - ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', + Buffer.from('{"content": "data"}'), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', + Buffer.from('{"content": "data"}'), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -288,9 +294,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction).mockReturnValueOnce( - Buffer.from('{"content": "data"}', 'utf8') - ); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -304,27 +307,35 @@ describe('test transform install with legacy schema', () => { ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + ], + }, + paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -406,41 +417,43 @@ describe('test transform install with legacy schema', () => { }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata', }, - path: 'metadata', - }, - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata Current', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata Current', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: [], + ], + }, + paths: [], + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -495,9 +508,6 @@ describe('test transform install with legacy schema', () => { }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction).mockReturnValueOnce( - Buffer.from('{"content": "data"}', 'utf8') - ); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -522,27 +532,35 @@ describe('test transform install with legacy schema', () => { ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - data_streams: [ - { - type: 'metrics', - dataset: 'endpoint.metadata_current', - title: 'Endpoint Metadata', - release: 'experimental', - package: 'endpoint', - ingest_pipeline: 'default', - elasticsearch: { - 'index_template.mappings': { - dynamic: false, + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + data_streams: [ + { + type: 'metrics', + dataset: 'endpoint.metadata_current', + title: 'Endpoint Metadata', + release: 'experimental', + package: 'endpoint', + ingest_pipeline: 'default', + elasticsearch: { + 'index_template.mappings': { + dynamic: false, + }, }, + path: 'metadata_current', }, - path: 'metadata_current', - }, - ], - } as unknown as RegistryPackage, - paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + ], + }, + paths: ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json', + Buffer.from('{"content": "data"}'), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts index 6ab6f20669baf..80efd5a08e446 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts @@ -14,7 +14,7 @@ import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-m import { HTTPAuthorizationHeader } from '../../../../../common/http_authorization_header'; import { getInstallation, getInstallationObject } from '../../packages'; -import type { Installation, RegistryPackage } from '../../../../types'; +import type { Installation } from '../../../../types'; import { ElasticsearchAssetType } from '../../../../types'; import { appContextService } from '../../../app_context'; @@ -23,20 +23,14 @@ import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../constants'; import { getESAssetMetadata } from '../meta'; import { createAppContextStartContractMock } from '../../../../mocks'; +import type { PackageInstallContext } from '../../../../../common/types'; import { installTransforms } from './install'; -import { getAsset } from './common'; jest.mock('../../packages/get', () => { return { getInstallation: jest.fn(), getInstallationObject: jest.fn() }; }); -jest.mock('./common', () => { - return { - getAsset: jest.fn(), - }; -}); - const meta = getESAssetMetadata({ packageName: 'endpoint' }); describe('test transform install', () => { @@ -236,13 +230,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.BEATS_FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.AGENT_FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -271,17 +258,41 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/beats.yml', + sourceData.BEATS_FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/agent.yml', + sourceData.AGENT_FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + sourceData.FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -530,10 +541,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -563,15 +570,31 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + Buffer.from(sourceData.FIELDS), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + Buffer.from(sourceData.MANIFEST), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + Buffer.from(sourceData.TRANSFORM), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -810,10 +833,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -842,14 +861,26 @@ _meta: }); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + Buffer.from(sourceData.FIELDS), + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + Buffer.from(sourceData.TRANSFORM), + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1052,9 +1083,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -1069,14 +1097,26 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1134,9 +1174,6 @@ _meta: }, ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) @@ -1162,14 +1199,26 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), @@ -1229,11 +1278,6 @@ _meta: ], } as unknown as Installation; - (getAsset as jest.MockedFunction) - .mockReturnValueOnce(Buffer.from(sourceData.FIELDS, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.MANIFEST, 'utf8')) - .mockReturnValueOnce(Buffer.from(sourceData.TRANSFORM, 'utf8')); - (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); @@ -1247,15 +1291,31 @@ _meta: ); await installTransforms({ - installablePackage: { - name: 'endpoint', - version: '0.16.0-dev.0', - } as unknown as RegistryPackage, - paths: [ - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', - 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', - ], + packageInstallContext: { + packageInfo: { + name: 'endpoint', + version: '0.16.0-dev.0', + }, + paths: [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + ], + assetsMap: new Map([ + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/fields/fields.yml', + sourceData.FIELDS, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/manifest.yml', + sourceData.MANIFEST, + ], + [ + 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/transform.yml', + sourceData.TRANSFORM, + ], + ]), + } as unknown as PackageInstallContext, esClient, savedObjectsClient, logger: loggerMock.create(), diff --git a/x-pack/plugins/fleet/server/services/epm/fields/field.ts b/x-pack/plugins/fleet/server/services/epm/fields/field.ts index 495c0ddcaaf8a..859752d5dead1 100644 --- a/x-pack/plugins/fleet/server/services/epm/fields/field.ts +++ b/x-pack/plugins/fleet/server/services/epm/fields/field.ts @@ -7,8 +7,8 @@ import { safeLoad } from 'js-yaml'; -import type { PackageInfo } from '../../../types'; -import { getAssetsData } from '../packages/assets'; +import type { PackageInstallContext } from '../../../../common/types'; +import { getAssetsDataFromAssetsMap } from '../packages/assets'; // This should become a copy of https://github.com/elastic/beats/blob/d9a4c9c240a9820fab15002592e5bb6db318543b/libbeat/mapping/field.go#L39 export interface Field { @@ -296,11 +296,16 @@ export const isFields = (path: string) => { */ export const loadFieldsFromYaml = ( - pkg: Pick, + packageInstallContext: PackageInstallContext, datasetName?: string ): Field[] => { // Fetch all field definition files - const fieldDefinitionFiles = getAssetsData(pkg, isFields, datasetName); + const fieldDefinitionFiles = getAssetsDataFromAssetsMap( + packageInstallContext.packageInfo, + packageInstallContext.assetsMap, + isFields, + datasetName + ); return fieldDefinitionFiles.reduce((acc, file) => { // Make sure it is defined as it is optional. Should never happen. if (file.buffer) { diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts index 27be17ef2a170..47c4da20b9d05 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts @@ -22,7 +22,7 @@ import { partition } from 'lodash'; import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../../common'; -import { getAsset, getPathParts } from '../../archive'; +import { getAssetFromAssetsMap, getPathParts } from '../../archive'; import { KibanaAssetType, KibanaSavedObjectType } from '../../../../types'; import type { AssetType, @@ -32,6 +32,7 @@ import type { PackageSpecTags, } from '../../../../types'; import { savedObjectTypes } from '../../packages'; +import type { PackageInstallContext } from '../../../../../common/types'; import { indexPatternTypes, getIndexPatternSavedObjects, @@ -88,13 +89,6 @@ const AssetFilters: Record ArchiveAsse [KibanaAssetType.indexPattern]: removeReservedIndexPatterns, }; -export async function getKibanaAsset(key: string): Promise { - const buffer = getAsset(key); - - // cache values are buffers. convert to string / JSON - return JSON.parse(buffer.toString('utf8')); -} - export function createSavedObjectKibanaAsset(asset: ArchiveAsset): SavedObjectToBe { // convert that to an object const so: Partial = { @@ -177,6 +171,7 @@ export async function installKibanaAssetsAndReferences({ logger, pkgName, pkgTitle, + packageInstallContext, paths, installedPkg, spaceId, @@ -189,12 +184,13 @@ export async function installKibanaAssetsAndReferences({ logger: Logger; pkgName: string; pkgTitle: string; + packageInstallContext: PackageInstallContext; paths: string[]; installedPkg?: SavedObject; spaceId: string; assetTags?: PackageSpecTags[]; }) { - const kibanaAssets = await getKibanaAssets(paths); + const kibanaAssets = await getKibanaAssets(packageInstallContext); if (installedPkg) await deleteKibanaSavedObjectsAssets({ savedObjectsClient, installedPkg }); // save new kibana refs before installing the assets const installedKibanaAssetsRefs = await saveKibanaAssetsRefs( @@ -241,7 +237,7 @@ export const deleteKibanaInstalledRefs = async ( }); }; export async function getKibanaAssets( - paths: string[] + packageInstallContext: PackageInstallContext ): Promise> { const kibanaAssetTypes = Object.values(KibanaAssetType); const isKibanaAssetType = (path: string) => { @@ -250,7 +246,7 @@ export async function getKibanaAssets( return parts.service === 'kibana' && (kibanaAssetTypes as string[]).includes(parts.type); }; - const filteredPaths = paths + const filteredPaths = packageInstallContext.paths .filter(isKibanaAssetType) .map<[string, AssetParts]>((path) => [path, getPathParts(path)]); @@ -258,7 +254,16 @@ export async function getKibanaAssets( for (const assetType of kibanaAssetTypes) { const matching = filteredPaths.filter(([path, parts]) => parts.type === assetType); - assetArrays.push(Promise.all(matching.map(([path]) => path).map(getKibanaAsset))); + assetArrays.push( + Promise.all( + matching.map(([path]) => { + const buffer = getAssetFromAssetsMap(packageInstallContext.assetsMap, path); + + // cache values are buffers. convert to string / JSON + return JSON.parse(buffer.toString('utf8')); + }) + ) + ); } const resolvedAssets = await Promise.all(assetArrays); diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts index 9da46439a53c7..8bd2ace1d760c 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.test.ts @@ -34,6 +34,9 @@ import * as epmPackagesInstall from './packages/install'; import * as epmRegistry from './registry'; import * as epmTransformsInstall from './elasticsearch/transform/install'; import * as epmArchiveParse from './archive/parse'; +import { getEsPackage } from './archive/storage'; + +jest.mock('./archive/storage'); const mockGetAuthzFromRequest = getAuthzFromRequest as jest.Mock; const testKeys = [ @@ -141,8 +144,9 @@ function getTest( spy: jest.spyOn(epmTransformsInstall, 'installTransforms'), spyArgs: [ { - installablePackage: pkg, - paths, + packageInstallContext: expect.objectContaining({ + paths, + }), esClient: mocks.esClient, savedObjectsClient: mocks.soClient, logger: mocks.logger, @@ -257,6 +261,12 @@ describe('PackageService', () => { testKey ); spy.mockResolvedValue(spyResponse); + if (testKey === 'reinstallEsAssets') { + jest + .mocked(epmPackagesGet.getInstallation) + .mockResolvedValue({ name: 'package name' } as any); + jest.mocked(getEsPackage).mockResolvedValue({ name: 'package name' } as any); + } await expect(method(...args)).resolves.toEqual(expectedReturnValue); expect(spy).toHaveBeenCalledWith(...spyArgs); @@ -277,6 +287,12 @@ describe('PackageService', () => { testKey ); spy.mockResolvedValue(spyResponse); + if (testKey === 'reinstallEsAssets') { + jest + .mocked(epmPackagesGet.getInstallation) + .mockResolvedValue({ name: 'package name' } as any); + jest.mocked(getEsPackage).mockResolvedValue({ name: 'package name' } as any); + } await expect(method(...args)).resolves.toEqual(expectedReturnValue); expect(spy).toHaveBeenCalledWith(...spyArgs); diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index a535af9636d1a..b7174fa7883e7 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -31,7 +31,7 @@ import type { } from '../../types'; import type { FleetAuthzRouteConfig } from '../security/types'; import { checkSuperuser, doesNotHaveRequiredFleetAuthz, getAuthzFromRequest } from '../security'; -import { FleetError, FleetUnauthorizedError } from '../../errors'; +import { FleetError, FleetUnauthorizedError, PackageNotFoundError } from '../../errors'; import { INSTALL_PACKAGES_AUTHZ, READ_PACKAGE_INFO_AUTHZ } from '../../routes/epm'; import type { InstallResult } from '../../../common'; @@ -43,6 +43,7 @@ import { fetchFindLatestPackageOrThrow, getPackage } from './registry'; import { installTransforms, isTransform } from './elasticsearch/transform/install'; import { ensureInstalledPackage, getInstallation, getPackages, installPackage } from './packages'; import { generatePackageInfoFromArchiveBuffer } from './archive'; +import { getEsPackage } from './archive/storage'; export type InstalledAssetType = EsAssetReference; @@ -265,9 +266,31 @@ class PackageClientImpl implements PackageClient { async #reinstallTransforms(packageInfo: InstallablePackage, paths: string[]) { const authorizationHeader = this.getAuthorizationHeader(); + const installation = await this.getInstallation(packageInfo.name); + + if (!installation) { + throw new PackageNotFoundError(`Installation not found for package: ${packageInfo.name}`); + } + + const esPackage = await getEsPackage( + packageInfo.name, + packageInfo.version, + installation.package_assets ?? [], + this.internalSoClient + ); + + if (!esPackage) { + throw new PackageNotFoundError(`ES package not found for package: ${packageInfo.name}`); + } + + const { assetsMap } = esPackage; + const { installedTransforms } = await installTransforms({ - installablePackage: packageInfo, - paths, + packageInstallContext: { + assetsMap, + packageInfo, + paths, + }, esClient: this.internalEsClient, savedObjectsClient: this.internalSoClient, logger: this.logger, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts index 4402db72b86a9..d6d653fd98c4e 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts @@ -22,7 +22,7 @@ import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../../common'; import { appContextService } from '../../app_context'; import { createAppContextStartContractMock } from '../../../mocks'; -import { saveArchiveEntries } from '../archive/storage'; +import { saveArchiveEntriesFromAssetsMap } from '../archive/storage'; import { installILMPolicy } from '../elasticsearch/ilm/install'; import { installIlmForDataStream } from '../elasticsearch/datastream_ilm/install'; @@ -69,6 +69,9 @@ describe('_installPackage', () => { soClient.update.mockImplementation(async (type, id, attributes) => { return { id, attributes } as any; }); + soClient.get.mockImplementation(async (type, id) => { + return { id, attributes: {} } as any; + }); esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; appContextService.start(createAppContextStartContractMock()); @@ -78,7 +81,7 @@ describe('_installPackage', () => { esReferences: [], installedIlms: [], }); - jest.mocked(saveArchiveEntries).mockResolvedValue({ + jest.mocked(saveArchiveEntriesFromAssetsMap).mockResolvedValue({ saved_objects: [], }); jest.mocked(restartInstallation).mockReset(); @@ -103,18 +106,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + assetsMap: new Map(), + paths: [], + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + }, }, installType: 'install', installSource: 'registry', @@ -160,18 +166,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + assetsMap: new Map(), + paths: [], + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + }, }, installType: 'install', installSource: 'registry', @@ -219,18 +228,21 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - title: 'title', - name: 'xyz', - version: '4.5.6', - description: 'test', - type: 'integration', - categories: ['cloud', 'custom'], - format_version: 'string', - release: 'experimental', - conditions: { kibana: { version: 'x.y.z' } }, - owner: { github: 'elastic/fleet' }, + packageInstallContext: { + packageInfo: { + title: 'title', + name: 'xyz', + version: '4.5.6', + description: 'test', + type: 'integration', + categories: ['cloud', 'custom'], + format_version: 'string', + release: 'experimental', + conditions: { kibana: { version: 'x.y.z' } }, + owner: { github: 'elastic/fleet' }, + } as any, + assetsMap: new Map(), + paths: [], }, installType: 'install', installSource: 'registry', @@ -288,12 +300,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { @@ -319,12 +334,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { @@ -345,12 +363,15 @@ describe('_installPackage', () => { savedObjectsImporter: jest.fn(), esClient, logger: loggerMock.create(), - paths: [], - packageInfo: { - name: mockInstalledPackageSo.attributes.name, - version: mockInstalledPackageSo.attributes.version, - title: mockInstalledPackageSo.attributes.name, - } as any, + packageInstallContext: { + paths: [], + assetsMap: new Map(), + packageInfo: { + name: mockInstalledPackageSo.attributes.name, + version: mockInstalledPackageSo.attributes.version, + title: mockInstalledPackageSo.attributes.name, + } as any, + }, installedPkg: { ...mockInstalledPackageSo, attributes: { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts index 8f45e8eee6b13..6c30d3a8d332d 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts @@ -17,7 +17,7 @@ import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; import type { HTTPAuthorizationHeader } from '../../../../common/http_authorization_header'; - +import type { PackageInstallContext } from '../../../../common/types'; import { getNormalizedDataStreams } from '../../../../common/services'; import { @@ -31,7 +31,6 @@ import type { AssetReference, Installation, InstallType, - InstallablePackage, InstallSource, PackageAssetReference, PackageVerificationResult, @@ -45,7 +44,7 @@ import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; import { installTransforms } from '../elasticsearch/transform/install'; import { installMlModel } from '../elasticsearch/ml_model'; import { installIlmForDataStream } from '../elasticsearch/datastream_ilm/install'; -import { saveArchiveEntries } from '../archive/storage'; +import { saveArchiveEntriesFromAssetsMap } from '../archive/storage'; import { ConcurrentInstallOperationError } from '../../../errors'; import { appContextService, packagePolicyService } from '../..'; @@ -70,8 +69,7 @@ export async function _installPackage({ esClient, logger, installedPkg, - paths, - packageInfo, + packageInstallContext, installType, installSource, spaceId, @@ -88,8 +86,7 @@ export async function _installPackage({ esClient: ElasticsearchClient; logger: Logger; installedPkg?: SavedObject; - paths: string[]; - packageInfo: InstallablePackage; + packageInstallContext: PackageInstallContext; installType: InstallType; installSource: InstallSource; spaceId: string; @@ -99,7 +96,9 @@ export async function _installPackage({ ignoreMappingUpdateErrors?: boolean; skipDataStreamRollover?: boolean; }): Promise { + const { packageInfo, paths } = packageInstallContext; const { name: pkgName, version: pkgVersion, title: pkgTitle } = packageInfo; + try { // if some installation already exists if (installedPkg) { @@ -164,6 +163,7 @@ export async function _installPackage({ savedObjectTagClient, pkgName, pkgTitle, + packageInstallContext, paths, installedPkg, logger, @@ -187,13 +187,12 @@ export async function _installPackage({ appContextService.getConfig()?.internal?.disableILMPolicies ?? false; if (!isILMPoliciesDisabled) { esReferences = await withPackageSpan('Install ILM policies', () => - installILMPolicy(packageInfo, paths, esClient, savedObjectsClient, logger, esReferences) + installILMPolicy(packageInstallContext, esClient, savedObjectsClient, logger, esReferences) ); logger.debug(`Package install - Installing Data Stream ILM policies`); ({ esReferences } = await withPackageSpan('Install Data Stream ILM policies', () => installIlmForDataStream( - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -205,7 +204,7 @@ export async function _installPackage({ // installs ml models logger.debug(`Package install - installing ML models`); esReferences = await withPackageSpan('Install ML models', () => - installMlModel(packageInfo, paths, esClient, savedObjectsClient, logger, esReferences) + installMlModel(packageInstallContext, esClient, savedObjectsClient, logger, esReferences) ); let indexTemplates: IndexTemplateEntry[] = []; @@ -217,8 +216,7 @@ export async function _installPackage({ const { installedTemplates, esReferences: templateEsReferences } = await installIndexTemplatesAndPipelines({ installedPkg: installedPkg ? installedPkg.attributes : undefined, - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -249,8 +247,7 @@ export async function _installPackage({ const { installedTemplates, esReferences: templateEsReferences } = await installIndexTemplatesAndPipelines({ installedPkg: installedPkg ? installedPkg.attributes : undefined, - packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -280,8 +277,7 @@ export async function _installPackage({ logger.debug(`Package install - Installing transforms`); ({ esReferences } = await withPackageSpan('Install transforms', () => installTransforms({ - installablePackage: packageInfo, - paths, + packageInstallContext, esClient, savedObjectsClient, logger, @@ -331,9 +327,10 @@ export async function _installPackage({ const installedKibanaAssetsRefs = await kibanaAssetPromise; logger.debug(`Package install - Updating archive entries`); const packageAssetResults = await withPackageSpan('Update archive entries', () => - saveArchiveEntries({ + saveArchiveEntriesFromAssetsMap({ savedObjectsClient, - paths, + assetsMap: packageInstallContext.assetsMap, + paths: packageInstallContext.paths, packageInfo, installSource, }) @@ -351,7 +348,7 @@ export async function _installPackage({ savedObjectType: PACKAGES_SAVED_OBJECT_TYPE, }); logger.debug(`Package install - Updating install status`); - const updatedPackage = await withPackageSpan('Update install status', () => + await withPackageSpan('Update install status', () => savedObjectsClient.update(PACKAGES_SAVED_OBJECT_TYPE, pkgName, { version: pkgVersion, install_version: pkgVersion, @@ -364,8 +361,13 @@ export async function _installPackage({ ), }) ); - logger.debug(`Package install - Install status ${updatedPackage?.attributes?.install_status}`); + // Need to refetch the installation again to retrieve all the attributes + const updatedPackage = await savedObjectsClient.get( + PACKAGES_SAVED_OBJECT_TYPE, + pkgName + ); + logger.debug(`Package install - Install status ${updatedPackage?.attributes?.install_status}`); // If the package is flagged with the `keep_policies_up_to_date` flag, upgrade its // associated package policies after installation if (updatedPackage.attributes.keep_policies_up_to_date) { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts index 1ed525a71b14f..fdddadddd46ec 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/assets.test.ts @@ -7,19 +7,9 @@ import type { PackageInfo } from '../../../types'; -import { getArchiveFilelist } from '../archive/cache'; +import { getAssetsFromAssetsMap } from './assets'; -import { getAssets } from './assets'; - -jest.mock('../archive/cache', () => { - return { - getArchiveFilelist: jest.fn(), - }; -}); - -const mockedGetArchiveFilelist = getArchiveFilelist as jest.Mock; - -test('testGetAssets integration pkg', () => { +test('test getAssetsFromAssetsMap integration pkg', () => { const tests = [ { package: { @@ -60,27 +50,41 @@ test('testGetAssets integration pkg', () => { }, ]; - mockedGetArchiveFilelist.mockImplementation(() => [ - 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', + const assetsMap = new Map([ + [ + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + Buffer.from('{}'), + ], + [ + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', + Buffer.from('{}'), + ], ]); + for (const value of tests) { // as needed to pretend it is an InstallablePackage - const assets = getAssets(value.package as PackageInfo, value.filter, value.dataset); + const assets = getAssetsFromAssetsMap( + value.package as PackageInfo, + assetsMap, + value.filter, + value.dataset + ); expect(assets).toStrictEqual(value.expected); } }); test('testGetAssets input pkg', () => { - mockedGetArchiveFilelist.mockImplementation(() => [ - 'input_package_upgrade-1.0.0/agent/input/input.yml.hbs', - 'input_package_upgrade-1.0.0/changelog.yml', - 'input_package_upgrade-1.0.0/docs/README.md', - 'input_package_upgrade-1.0.0/fields/input.yml', - 'input_package_upgrade-1.0.0/img/sample-logo.svg', - 'input_package_upgrade-1.0.0/img/sample-screenshot.png', - 'input_package_upgrade-1.0.0/manifest.yml', - ]); + const assetsMap = new Map( + [ + 'input_package_upgrade-1.0.0/agent/input/input.yml.hbs', + 'input_package_upgrade-1.0.0/changelog.yml', + 'input_package_upgrade-1.0.0/docs/README.md', + 'input_package_upgrade-1.0.0/fields/input.yml', + 'input_package_upgrade-1.0.0/img/sample-logo.svg', + 'input_package_upgrade-1.0.0/img/sample-screenshot.png', + 'input_package_upgrade-1.0.0/manifest.yml', + ].map((path) => [path, Buffer.from('{}')]) + ); const tests = [ { @@ -102,7 +106,12 @@ test('testGetAssets input pkg', () => { for (const value of tests) { // as needed to pretend it is an InstallablePackage - const assets = getAssets(value.package as PackageInfo, value.filter, value.dataset); + const assets = getAssetsFromAssetsMap( + value.package as PackageInfo, + assetsMap, + value.filter, + value.dataset + ); expect(assets).toStrictEqual(value.expected); } }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/assets.ts b/x-pack/plugins/fleet/server/services/epm/packages/assets.ts index 89bd9b25af75a..a82b5c0d103b2 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/assets.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/assets.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { PackageInfo } from '../../../types'; -import { getArchiveFilelist, getAsset } from '../archive'; +import type { AssetsMap, PackageInfo } from '../../../types'; +import { getAssetFromAssetsMap } from '../archive'; import type { ArchiveEntry } from '../archive'; const maybeFilterByDataset = @@ -21,18 +21,13 @@ const maybeFilterByDataset = return comparePaths.some((comparePath) => path.includes(comparePath)); }; -// paths from RegistryPackage are routes to the assets on EPR -// e.g. `/package/nginx/1.2.0/data_stream/access/fields/fields.yml` -// paths for ArchiveEntry are routes to the assets in the archive -// e.g. `nginx-1.2.0/data_stream/access/fields/fields.yml` -// RegistryPackage paths have a `/package/` prefix compared to ArchiveEntry paths -// and different package and version structure -export function getAssets( +export function getAssetsFromAssetsMap( packageInfo: Pick, + assetsMap: AssetsMap, filter = (path: string): boolean => true, datasetName?: string ): string[] { - const paths = getArchiveFilelist(packageInfo); + const paths = [...assetsMap.keys()]; if (!paths || paths.length === 0) return []; @@ -46,15 +41,15 @@ export function getAssets( return assets.filter(filter); } -export function getAssetsData( +export function getAssetsDataFromAssetsMap( packageInfo: Pick, + assetsMap: AssetsMap, filter = (path: string): boolean => true, datasetName?: string -): ArchiveEntry[] { - // Gather all asset data - const assets = getAssets(packageInfo, filter, datasetName); +) { + const assets = getAssetsFromAssetsMap(packageInfo, assetsMap, filter, datasetName); const entries: ArchiveEntry[] = assets.map((path) => { - const buffer = getAsset(path); + const buffer = getAssetFromAssetsMap(assetsMap, path); return { path, buffer }; }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts b/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts deleted file mode 100644 index e44f6e2b522d7..0000000000000 --- a/x-pack/plugins/fleet/server/services/epm/packages/custom_integrations/assets/cache.ts +++ /dev/null @@ -1,24 +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 { setArchiveEntry, setArchiveFilelist } from '../../../archive'; - -interface Assets { - path: string; - content: Buffer; -} -export const cacheAssets = (assets: Assets[], name: string, version: string) => { - const paths = assets.map((asset) => asset.path); - - setArchiveFilelist({ name, version }, paths); - - assets.forEach((asset) => { - setArchiveEntry(asset.path, asset.content); - }); - - return paths; -}; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts index b261ccd65b5f9..66e220c328b5f 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts @@ -425,11 +425,53 @@ test: invalid manifest page: 1, }); - soClient.get.mockResolvedValue({ - id: 'elasticsearch', - attributes: {}, - references: [], - type: PACKAGES_SAVED_OBJECT_TYPE, + soClient.get.mockImplementation((type) => { + if (type === 'epm-packages-assets') { + return Promise.resolve({ + attributes: { + data_utf8: ` +name: elasticsearch +version: 0.0.1 +title: Elastic +description: Elasticsearch description`, + }, + } as any); + } else { + return Promise.resolve({ + id: 'elasticsearch', + attributes: { + name: 'elasticsearch', + version: '0.0.1', + install_source: 'upload', + package_assets: [], + data_utf8: ` + name: elasticsearch + version: 0.0.1 + title: Elastic + description: Elasticsearch description`, + }, + }); + } + }); + + soClient.bulkGet.mockResolvedValue({ + saved_objects: [ + { + id: 'test', + references: [], + type: 'epm-package-assets', + attributes: { + asset_path: 'elasticsearch-0.0.1/manifest.yml', + data_utf8: ` +name: elasticsearch +version: 0.0.1 +title: Elastic +description: Elasticsearch description +format_version: 0.0.1 +owner: elastic`, + }, + }, + ], }); await getPackages({ savedObjectsClient: soClient }); @@ -783,6 +825,7 @@ test: invalid manifest } as RegistryPackage); MockRegistry.getPackage.mockResolvedValue({ paths: [], + assetsMap: new Map(), packageInfo: { name: 'my-package', version: '1.0.0', diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.ts index a3ed5f62d7f1e..614fc8d636816 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.ts @@ -33,6 +33,7 @@ import type { PackageList, InstalledPackage, PackageSpecManifest, + AssetsMap, } from '../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants'; import type { @@ -53,7 +54,6 @@ import { appContextService } from '../..'; import * as Registry from '../registry'; import type { PackageAsset } from '../archive/storage'; import { getEsPackage } from '../archive/storage'; -import { getArchivePackage } from '../archive'; import { normalizeKuery } from '../../saved_object'; import { auditLoggingService } from '../../audit_logging'; @@ -289,7 +289,7 @@ export async function getPackageSavedObjects( return result; } -export async function getInstalledPackageSavedObjects( +async function getInstalledPackageSavedObjects( savedObjectsClient: SavedObjectsClientContract, options: Omit ) { @@ -544,16 +544,6 @@ export async function getPackageFromSource(options: { // If the package is installed if (installedPkg && installedPkg.version === pkgVersion) { const { install_source: pkgInstallSource } = installedPkg; - // check cache - res = getArchivePackage({ - name: pkgName, - version: pkgVersion, - }); - - if (res) { - logger.debug(`retrieved installed package ${pkgName}-${pkgVersion} from cache`); - } - if (!res && installedPkg.package_assets) { res = await getEsPackage( pkgName, @@ -582,20 +572,14 @@ export async function getPackageFromSource(options: { } } } else { - res = getArchivePackage({ name: pkgName, version: pkgVersion }); - - if (res) { - logger.debug(`retrieved package ${pkgName}-${pkgVersion} from cache`); - } else { - try { - res = await Registry.getPackage(pkgName, pkgVersion, { ignoreUnverified }); - logger.debug(`retrieved package ${pkgName}-${pkgVersion} from registry`); - } catch (err) { - if (err instanceof RegistryResponseError && err.status === 404) { - res = await Registry.getBundledArchive(pkgName, pkgVersion); - } else { - throw err; - } + try { + res = await Registry.getPackage(pkgName, pkgVersion, { ignoreUnverified }); + logger.debug(`retrieved package ${pkgName}-${pkgVersion} from registry`); + } catch (err) { + if (err instanceof RegistryResponseError && err.status === 404) { + res = await Registry.getBundledArchive(pkgName, pkgVersion); + } else { + throw err; } } } @@ -634,7 +618,7 @@ export async function getInstallationObject(options: { return installation; } -export async function getInstallationObjects(options: { +async function getInstallationObjects(options: { savedObjectsClient: SavedObjectsClientContract; pkgNames: string[]; }) { @@ -665,6 +649,37 @@ export async function getInstallation(options: { return savedObject?.attributes; } +/** + * Return an installed package with his related assets + */ +export async function getInstalledPackageWithAssets(options: { + savedObjectsClient: SavedObjectsClientContract; + pkgName: string; + logger?: Logger; +}) { + const installation = await getInstallation(options); + if (!installation) { + return; + } + const esPackage = await getEsPackage( + installation.name, + installation.version, + installation.package_assets ?? [], + options.savedObjectsClient + ); + + if (!esPackage) { + return; + } + + return { + installation, + assetsMap: esPackage.assetsMap, + packageInfo: esPackage.packageInfo, + paths: esPackage.paths, + }; +} + export async function getInstallationsByName(options: { savedObjectsClient: SavedObjectsClientContract; pkgNames: string[]; @@ -682,3 +697,33 @@ function sortByName(a: { name: string }, b: { name: string }) { return 0; } } + +/** + * Return assets for an installed package from ES or from the registry otherwise + */ +export async function getPackageAssetsMap({ + savedObjectsClient, + packageInfo, + logger, +}: { + savedObjectsClient: SavedObjectsClientContract; + packageInfo: PackageInfo; + logger: Logger; +}) { + const installedPackageWithAssets = await getInstalledPackageWithAssets({ + savedObjectsClient, + pkgName: packageInfo.name, + logger, + }); + + let assetsMap: AssetsMap | undefined; + if (installedPackageWithAssets?.installation.version !== packageInfo.version) { + // Try to get from registry + const pkg = await Registry.getPackage(packageInfo.name, packageInfo.version); + assetsMap = pkg.assetsMap; + } else { + assetsMap = installedPackageWithAssets.assetsMap; + } + + return assetsMap; +} diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts index 04c65535ad0ad..e81e280c4b943 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get_template_inputs.ts @@ -11,7 +11,7 @@ import { safeDump } from 'js-yaml'; import { packageToPackagePolicy } from '../../../../common/services/package_to_package_policy'; import { getInputsWithStreamIds, _compilePackagePolicyInputs } from '../../package_policy'; - +import { appContextService } from '../../app_context'; import type { PackageInfo, NewPackagePolicy, @@ -22,6 +22,7 @@ import type { import { _sortYamlKeys } from '../../../../common/services/full_agent_policy_to_yaml'; import { getPackageInfo } from '.'; +import { getPackageAssetsMap } from './get'; type Format = 'yml' | 'json'; @@ -89,11 +90,16 @@ export async function getTemplateInputs( } const emptyPackagePolicy = packageToPackagePolicy(packageInfo, ''); const inputsWithStreamIds = getInputsWithStreamIds(emptyPackagePolicy, undefined, true); - + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); const compiledInputs = await _compilePackagePolicyInputs( packageInfo, emptyPackagePolicy.vars || {}, - inputsWithStreamIds + inputsWithStreamIds, + assetsMap ); const packagePolicyWithInputs: NewPackagePolicy = { ...emptyPackagePolicy, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts index bfb99d0f17980..fc85609c4703c 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.test.ts @@ -28,6 +28,11 @@ import * as obj from '.'; jest.mock('../../app_context', () => { const logger = { error: jest.fn(), debug: jest.fn(), warn: jest.fn(), info: jest.fn() }; + const mockedSavedObjectTagging = { + createInternalAssignmentService: jest.fn(), + createTagClient: jest.fn(), + }; + return { appContextService: { getLogger: jest.fn(() => { @@ -38,13 +43,12 @@ jest.mock('../../app_context', () => { createImporter: jest.fn(), })), getConfig: jest.fn(() => ({})), - getSavedObjectsTagging: jest.fn(() => ({ - createInternalAssignmentService: jest.fn(), - createTagClient: jest.fn(), - })), + getSavedObjectsTagging: jest.fn(() => mockedSavedObjectTagging), + getInternalUserSOClientForSpaceId: jest.fn(), }, }; }); + jest.mock('.'); jest.mock('../registry', () => { return { @@ -73,7 +77,12 @@ jest.mock('../archive', () => { generatePackageInfoFromArchiveBuffer: jest.fn(() => Promise.resolve({ packageInfo: { name: 'apache', version: '1.3.0' } }) ), - unpackBufferToCache: jest.fn(), + unpackBufferToAssetsMap: jest.fn(() => + Promise.resolve({ + assetsMap: new Map(), + paths: [], + }) + ), setPackageInfo: jest.fn(), deleteVerificationResult: jest.fn(), }; @@ -145,6 +154,7 @@ describe('install', () => { mockGetBundledPackageByPkgKey.mockReset(); (install._installPackage as jest.Mock).mockClear(); + jest.mocked(appContextService.getInternalUserSOClientForSpaceId).mockReset(); }); describe('registry', () => { @@ -348,6 +358,38 @@ describe('install', () => { expect(response.status).toEqual('installed'); }); + + it('should use a scopped to package space soClient for tagging', async () => { + const mockedTaggingSo = savedObjectsClientMock.create(); + jest + .mocked(appContextService.getInternalUserSOClientForSpaceId) + .mockReturnValue(mockedTaggingSo); + jest + .spyOn(obj, 'getInstallationObject') + .mockImplementationOnce(() => Promise.resolve({ attributes: { version: '1.2.0' } } as any)); + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + await installPackage({ + spaceId: 'test', + installSource: 'registry', + pkgkey: 'apache-1.3.0', + savedObjectsClient: savedObjectsClientMock.create(), + esClient: {} as ElasticsearchClient, + }); + + expect(appContextService.getInternalUserSOClientForSpaceId).toBeCalledWith('test'); + expect(appContextService.getSavedObjectsTagging().createTagClient).toBeCalledWith( + expect.objectContaining({ + client: mockedTaggingSo, + }) + ); + expect( + appContextService.getSavedObjectsTagging().createInternalAssignmentService + ).toBeCalledWith( + expect.objectContaining({ + client: mockedTaggingSo, + }) + ); + }); }); describe('upload', () => { @@ -516,7 +558,9 @@ describe('handleInstallPackageFailure', () => { expect(install._installPackage).toBeCalledTimes(1); expect(install._installPackage).toBeCalledWith( expect.objectContaining({ - packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + packageInstallContext: expect.objectContaining({ + packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + }), }) ); }); @@ -560,7 +604,9 @@ describe('handleInstallPackageFailure', () => { expect(install._installPackage).toBeCalledTimes(1); expect(install._installPackage).toBeCalledWith( expect.objectContaining({ - packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + packageInstallContext: expect.objectContaining({ + packageInfo: expect.objectContaining({ name: pkgName, version: '1.0.0' }), + }), }) ); }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 33f1b3a6ab73e..8dc9672f01ffc 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -16,25 +16,16 @@ import type { Logger, } from '@kbn/core/server'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; - import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common/constants'; - import pRetry from 'p-retry'; - import { uniqBy } from 'lodash'; - import type { LicenseType } from '@kbn/licensing-plugin/server'; -import type { PackageDataStreamTypes } from '../../../../common/types'; - +import type { PackageDataStreamTypes, PackageInstallContext } from '../../../../common/types'; import type { HTTPAuthorizationHeader } from '../../../../common/http_authorization_header'; - import { isPackagePrerelease, getNormalizedDataStreams } from '../../../../common/services'; - import { FLEET_INSTALL_FORMAT_VERSION } from '../../../constants/fleet_es_assets'; - import { generateESIndexPatterns } from '../elasticsearch/template/template'; - import type { ArchivePackage, BulkInstallPackageInfo, @@ -62,7 +53,6 @@ import { PackagePolicyValidationError, ConcurrentInstallOperationError, FleetUnauthorizedError, - PackageInvalidArchiveError, PackageNotFoundError, } from '../../../errors'; import { PACKAGES_SAVED_OBJECT_TYPE, MAX_TIME_COMPLETE_INSTALL } from '../../../constants'; @@ -72,29 +62,22 @@ import * as Registry from '../registry'; import { setPackageInfo, generatePackageInfoFromArchiveBuffer, - unpackBufferToCache, deleteVerificationResult, - getArchiveFilelist, + unpackBufferToAssetsMap, } from '../archive'; import { toAssetReference } from '../kibana/assets/install'; import type { ArchiveAsset } from '../kibana/assets/install'; - import type { PackageUpdateEvent } from '../../upgrade_sender'; import { sendTelemetryEvents, UpdateEventType } from '../../upgrade_sender'; - import { prepareToInstallPipelines } from '../elasticsearch/ingest_pipeline'; - import { prepareToInstallTemplates } from '../elasticsearch/template/install'; - import { auditLoggingService } from '../../audit_logging'; - import { getFilteredInstallPackages } from '../filtered_packages'; import { formatVerificationResultForSO } from './package_verification'; - import { getInstallation, getInstallationObject } from '.'; import { removeInstallation } from './remove'; -import { getPackageSavedObjects } from './get'; +import { getInstalledPackageWithAssets, getPackageSavedObjects } from './get'; import { _installPackage } from './_install_package'; import { removeOldAssets } from './cleanup'; import { getBundledPackageByPkgKey } from './bundled_packages'; @@ -102,7 +85,6 @@ import { withPackageSpan } from './utils'; import { convertStringToTitle, generateDescription } from './custom_integrations/utils'; import { INITIAL_VERSION } from './custom_integrations/constants'; import { createAssets } from './custom_integrations'; -import { cacheAssets } from './custom_integrations/assets/cache'; import { generateDatastreamEntries } from './custom_integrations/assets/dataset/utils'; import { checkForNamingCollision } from './custom_integrations/validation/check_naming_collision'; import { checkDatasetsNameFormat } from './custom_integrations/validation/check_dataset_name_format'; @@ -417,12 +399,19 @@ async function installPackageFromRegistry({ } // get latest package version and requested version in parallel for performance - const [latestPackage, { paths, packageInfo, verificationResult }] = await Promise.all([ - latestPkg ? Promise.resolve(latestPkg) : queryLatest(), - Registry.getPackage(pkgName, pkgVersion, { - ignoreUnverified: force && !neverIgnoreVerificationError, - }), - ]); + const [latestPackage, { paths, packageInfo, assetsMap, verificationResult }] = + await Promise.all([ + latestPkg ? Promise.resolve(latestPkg) : queryLatest(), + Registry.getPackage(pkgName, pkgVersion, { + ignoreUnverified: force && !neverIgnoreVerificationError, + }), + ]); + + const packageInstallContext: PackageInstallContext = { + packageInfo, + assetsMap, + paths, + }; // let the user install if using the force flag or needing to reinstall or install a previous version due to failed update const installOutOfDateVersionOk = @@ -453,7 +442,7 @@ async function installPackageFromRegistry({ esClient, spaceId, force, - packageInfo, + packageInstallContext, paths, verificationResult, authorizationHeader, @@ -489,7 +478,7 @@ async function installPackageCommon(options: { esClient: ElasticsearchClient; spaceId: string; force?: boolean; - packageInfo: ArchivePackage; + packageInstallContext: PackageInstallContext; paths: string[]; verificationResult?: PackageVerificationResult; telemetryEvent?: PackageUpdateEvent; @@ -497,6 +486,8 @@ async function installPackageCommon(options: { ignoreMappingUpdateErrors?: boolean; skipDataStreamRollover?: boolean; }): Promise { + const packageInfo = options.packageInstallContext.packageInfo; + const { pkgName, pkgVersion, @@ -507,12 +498,11 @@ async function installPackageCommon(options: { force, esClient, spaceId, - packageInfo, - paths, verificationResult, authorizationHeader, ignoreMappingUpdateErrors, skipDataStreamRollover, + packageInstallContext, } = options; let { telemetryEvent } = options; const logger = appContextService.getLogger(); @@ -578,13 +568,16 @@ async function installPackageCommon(options: { .getSavedObjects() .createImporter(savedObjectsClient, { importSizeLimit: 15_000 }); + // Saved object client need to be scopped with the package space for saved object tagging + const savedObjectClientWithSpace = appContextService.getInternalUserSOClientForSpaceId(spaceId); + const savedObjectTagAssignmentService = appContextService .getSavedObjectsTagging() - .createInternalAssignmentService({ client: savedObjectsClient }); + .createInternalAssignmentService({ client: savedObjectClientWithSpace }); const savedObjectTagClient = appContextService .getSavedObjectsTagging() - .createTagClient({ client: savedObjectsClient }); + .createTagClient({ client: savedObjectClientWithSpace }); // try installing the package, if there was an error, call error handler and rethrow // @ts-expect-error status is string instead of InstallResult.status 'installed' | 'already_installed' @@ -596,8 +589,7 @@ async function installPackageCommon(options: { esClient, logger, installedPkg, - paths, - packageInfo, + packageInstallContext, installType, spaceId, verificationResult, @@ -688,20 +680,28 @@ async function installPackageByUpload({ // as we do not verify uploaded packages, we must invalidate the verification cache deleteVerificationResult(packageInfo); - const paths = await unpackBufferToCache({ + + setPackageInfo({ name: packageInfo.name, version: pkgVersion, - archiveBuffer, - contentType, + packageInfo, }); - setPackageInfo({ + const { assetsMap, paths } = await unpackBufferToAssetsMap({ name: packageInfo.name, version: pkgVersion, - packageInfo, + archiveBuffer, + contentType, }); + const packageInstallContext: PackageInstallContext = { + packageInfo: { ...packageInfo, version: pkgVersion }, + assetsMap, + paths, + }; + return await installPackageCommon({ + packageInstallContext, pkgName, pkgVersion, installSource, @@ -711,7 +711,6 @@ async function installPackageByUpload({ esClient, spaceId, force: true, // upload has implicit force - packageInfo, paths, authorizationHeader, ignoreMappingUpdateErrors, @@ -872,9 +871,20 @@ export async function installCustomPackage( datasets, }); - const paths = cacheAssets(assets, pkgName, INITIAL_VERSION); + const assetsMap = assets.reduce((acc, asset) => { + acc.set(asset.path, asset.content); + return acc; + }, new Map()); + const paths = [...Object.keys(assetsMap)]; + + const packageInstallContext: PackageInstallContext = { + assetsMap, + paths, + packageInfo, + }; return await installPackageCommon({ + packageInstallContext, pkgName, pkgVersion: INITIAL_VERSION, installSource: 'custom', @@ -883,7 +893,6 @@ export async function installCustomPackage( esClient, spaceId, force, - packageInfo, paths, authorizationHeader, }); @@ -1216,8 +1225,7 @@ export async function ensurePackagesCompletedInstall( export async function installIndexTemplatesAndPipelines({ installedPkg, - paths, - packageInfo, + packageInstallContext, esReferences, savedObjectsClient, esClient, @@ -1225,8 +1233,7 @@ export async function installIndexTemplatesAndPipelines({ onlyForDataStreams, }: { installedPkg?: Installation; - paths: string[]; - packageInfo: PackageInfo | InstallablePackage; + packageInstallContext: PackageInstallContext; esReferences: EsAssetReference[]; savedObjectsClient: SavedObjectsClientContract; esClient: ElasticsearchClient; @@ -1244,10 +1251,12 @@ export async function installIndexTemplatesAndPipelines({ */ const experimentalDataStreamFeatures = installedPkg?.experimental_data_stream_features ?? []; - const preparedIngestPipelines = prepareToInstallPipelines(packageInfo, paths, onlyForDataStreams); + const preparedIngestPipelines = prepareToInstallPipelines( + packageInstallContext, + onlyForDataStreams + ); const preparedIndexTemplates = prepareToInstallTemplates( - packageInfo, - paths, + packageInstallContext, esReferences, experimentalDataStreamFeatures, onlyForDataStreams @@ -1265,13 +1274,13 @@ export async function installIndexTemplatesAndPipelines({ // so we need to use optimistic concurrency control newEsReferences = await optimisticallyAddEsAssetReferences( savedObjectsClient, - packageInfo.name, + packageInstallContext.packageInfo.name, [...preparedIngestPipelines.assetsToAdd, ...preparedIndexTemplates.assetsToAdd] ); } else { newEsReferences = await updateEsAssetReferences( savedObjectsClient, - packageInfo.name, + packageInstallContext.packageInfo.name, esReferences, { assetsToRemove: preparedIndexTemplates.assetsToRemove, @@ -1312,9 +1321,6 @@ export async function installAssetsForInputPackagePolicy(opts: { if (pkgInfo.type !== 'input') return; - const paths = await getArchiveFilelist(pkgInfo); - if (!paths) throw new PackageInvalidArchiveError(`No paths found for ${pkgInfo.name}`); - const datasetName = packagePolicy.inputs[0].streams[0].vars?.[DATASET_VAR_NAME]?.value; const [dataStream] = getNormalizedDataStreams(pkgInfo, datasetName); const existingDataStreams = await dataStreamService.getMatchingDataStreams(esClient, { @@ -1370,20 +1376,39 @@ export async function installAssetsForInputPackagePolicy(opts: { } } - const installedPkg = await getInstallation({ + const installedPkgWithAssets = await getInstalledPackageWithAssets({ savedObjectsClient: soClient, pkgName: pkgInfo.name, logger, }); - if (!installedPkg) + let packageInstallContext: PackageInstallContext | undefined; + if (!installedPkgWithAssets) { throw new PackageNotFoundError( `Error while creating index templates: unable to find installed package ${pkgInfo.name}` ); + } + if (installedPkgWithAssets.installation.version !== pkgInfo.version) { + const pkg = await Registry.getPackage(pkgInfo.name, pkgInfo.version, { + ignoreUnverified: force, + }); + + packageInstallContext = { + assetsMap: pkg.assetsMap, + packageInfo: pkg.packageInfo, + paths: pkg.paths, + }; + } else { + packageInstallContext = { + assetsMap: installedPkgWithAssets.assetsMap, + packageInfo: installedPkgWithAssets.packageInfo, + paths: installedPkgWithAssets.paths, + }; + } + await installIndexTemplatesAndPipelines({ - installedPkg, - paths, - packageInfo: pkgInfo, - esReferences: installedPkg.installed_es || [], + installedPkg: installedPkgWithAssets.installation, + packageInstallContext, + esReferences: installedPkgWithAssets.installation.installed_es || [], savedObjectsClient: soClient, esClient, logger, diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index de513062f5873..97402447be716 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -26,16 +26,16 @@ import type { PackageVerificationResult, ArchivePackage, BundledPackage, + AssetsMap, } from '../../../types'; import { - getArchiveFilelist, getPathParts, - unpackBufferToCache, setVerificationResult, - getVerificationResult, getPackageInfo, setPackageInfo, generatePackageInfoFromArchiveBuffer, + unpackBufferToAssetsMap, + getVerificationResult, } from '../archive'; import { streamToBuffer, streamToString } from '../streams'; import { appContextService } from '../..'; @@ -319,16 +319,15 @@ export async function getPackage( ): Promise<{ paths: string[]; packageInfo: ArchivePackage; + assetsMap: AssetsMap; verificationResult?: PackageVerificationResult; }> { const verifyPackage = appContextService.getExperimentalFeatures().packageVerification; - let paths = getArchiveFilelist({ name, version }); - let packageInfo = getPackageInfo({ name, version }); - let verificationResult = verifyPackage ? getVerificationResult({ name, version }) : undefined; + let packageInfo: ArchivePackage | undefined = getPackageInfo({ name, version }); + let verificationResult: PackageVerificationResult | undefined = verifyPackage + ? getVerificationResult({ name, version }) + : undefined; - if (paths && packageInfo) { - return { paths, packageInfo, verificationResult }; - } const { archiveBuffer, archivePath, @@ -346,22 +345,19 @@ export async function getPackage( verificationResult = latestVerificationResult; setVerificationResult({ name, version }, latestVerificationResult); } - if (!paths || paths.length === 0) { - paths = await withPackageSpan('Unpack archive', () => - unpackBufferToCache({ - name, - version, - archiveBuffer, - contentType: ensureContentType(archivePath), - }) - ); - } + + const { assetsMap, paths } = await unpackBufferToAssetsMap({ + name, + version, + archiveBuffer, + contentType: ensureContentType(archivePath), + }); if (!packageInfo) { packageInfo = await getPackageInfoFromArchiveOrCache(name, version, archiveBuffer, archivePath); } - return { paths, packageInfo, verificationResult }; + return { paths, packageInfo, assetsMap, verificationResult }; } function ensureContentType(archivePath: string) { diff --git a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts index 4fb8073ccbf00..fd914e5ce1f80 100644 --- a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.test.ts @@ -12,7 +12,7 @@ import { securityMock } from '@kbn/security-plugin/server/mocks'; import type { NewPackagePolicy, PackagePolicy } from '../../types'; import { appContextService } from '../app_context'; import { updateCurrentWriteIndices } from '../epm/elasticsearch/template/template'; -import { getInstallation } from '../epm/packages'; +import { getInstalledPackageWithAssets } from '../epm/packages/get'; import { handleExperimentalDatastreamFeatureOptIn } from './experimental_datastream_features'; @@ -34,6 +34,35 @@ jest.mock('../epm/packages', () => { }; }); +function mockGetInstalledPackageWithAssets(installation: any) { + jest.mocked(getInstalledPackageWithAssets).mockResolvedValue({ + packageInfo: { + name: 'test', + data_streams: [ + { + dataset: 'test', + type: 'metrics', + }, + ], + }, + installation, + } as any); +} + +jest.mock('../epm/packages/get', () => ({ + getInstalledPackageWithAssets: jest.fn().mockResolvedValue({ + packageInfo: { + name: 'test', + data_streams: [ + { + dataset: 'test', + type: 'metrics', + }, + ], + }, + }), +})); + jest.mock('../app_context'); const mockedAppContextService = appContextService as jest.Mocked; mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ @@ -41,9 +70,6 @@ mockedAppContextService.getSecuritySetup.mockImplementation(() => ({ })); jest.mock('../epm/elasticsearch/template/template'); - -const mockGetInstallation = getInstallation as jest.Mock; - jest.mock('../epm/elasticsearch/template/install', () => { return { prepareTemplate: jest.fn().mockReturnValue({ @@ -214,7 +240,7 @@ describe('experimental_datastream_features', () => { describe('when package policy does not exist (create)', () => { beforeEach(() => { - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -376,7 +402,7 @@ describe('experimental_datastream_features', () => { isDocValueOnlyOther: false, }); - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -404,7 +430,7 @@ describe('experimental_datastream_features', () => { isDocValueOnlyOther: false, }); - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', @@ -426,7 +452,7 @@ describe('experimental_datastream_features', () => { describe('when opt in status is changed', () => { beforeEach(() => { - mockGetInstallation.mockResolvedValueOnce({ + mockGetInstalledPackageWithAssets({ experimental_data_stream_features: [ { data_stream: 'metrics-test.test', diff --git a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts index b700618f44762..edf31991634b9 100644 --- a/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts +++ b/x-pack/plugins/fleet/server/services/package_policies/experimental_datastream_features.ts @@ -13,6 +13,7 @@ import { merge } from 'lodash'; import { getRegistryDataStreamAssetBaseName } from '../../../common/services'; import type { ExperimentalIndexingFeature } from '../../../common/types'; +import { PackageNotFoundError } from '../../errors'; import type { NewPackagePolicy, PackagePolicy, @@ -22,8 +23,9 @@ import type { import { appContextService } from '../app_context'; import { prepareTemplate } from '../epm/elasticsearch/template/install'; import { updateCurrentWriteIndices } from '../epm/elasticsearch/template/template'; -import { getInstallation, getPackageInfo } from '../epm/packages'; +import { getInstalledPackageWithAssets } from '../epm/packages/get'; import { updateDatastreamExperimentalFeatures } from '../epm/packages/update'; + import { applyDocOnlyValueToMapping, forEachMappings, @@ -38,7 +40,10 @@ export async function handleExperimentalDatastreamFeatureOptIn({ esClient: ElasticsearchClient; packagePolicy: PackagePolicy | NewPackagePolicy; }) { - if (!packagePolicy.package?.experimental_data_stream_features) { + if ( + !packagePolicy.package?.experimental_data_stream_features || + (packagePolicy.package?.experimental_data_stream_features?.length ?? 0) === 0 + ) { return; } @@ -49,16 +54,16 @@ export async function handleExperimentalDatastreamFeatureOptIn({ const templateMappings: { [key: string]: any } = {}; if (packagePolicy.package) { - installation = await getInstallation({ + const installedPackageWithAssets = await getInstalledPackageWithAssets({ savedObjectsClient: soClient, pkgName: packagePolicy.package.name, }); - const packageInfo = await getPackageInfo({ - savedObjectsClient: soClient, - pkgName: packagePolicy.package.name, - pkgVersion: packagePolicy.package.version, - }); + if (!installedPackageWithAssets) { + throw new PackageNotFoundError(`package not found with assets ${packagePolicy.package.name}`); + } + installation = installedPackageWithAssets.installation; + const { packageInfo, paths, assetsMap } = installedPackageWithAssets; // prepare template from package spec to find original index:false values const templates = packageInfo.data_streams?.map((dataStream: any) => { @@ -67,7 +72,15 @@ export async function handleExperimentalDatastreamFeatureOptIn({ (datastreamFeature) => datastreamFeature.data_stream === getRegistryDataStreamAssetBaseName(dataStream) ); - return prepareTemplate({ pkg: packageInfo, dataStream, experimentalDataStreamFeature }); + return prepareTemplate({ + packageInstallContext: { + assetsMap, + packageInfo, + paths, + }, + dataStream, + experimentalDataStreamFeature, + }); }); templates?.forEach((template) => { diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 204b3b10e066b..ada094ec9a7d0 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -72,63 +72,56 @@ const mockedSendTelemetryEvents = sendTelemetryEvents as jest.MockedFunction< typeof sendTelemetryEvents >; -async function mockedGetAssetsData(_a: any, _b: any, dataset: string) { - if (dataset === 'dataset1') { - return [ - { - buffer: Buffer.from(` -type: log -metricset: ["dataset1"] -paths: -{{#each paths}} -- {{this}} -{{/each}} -{{#if hosts}} -hosts: -{{#each hosts}} -- {{this}} -{{/each}} -{{/if}} -`), - }, - ]; - } - if (dataset === 'dataset1_level1') { - return [ - { - buffer: Buffer.from(` -type: log -metricset: ["dataset1.level1"] -`), - }, - ]; - } - - return [ - { - buffer: Buffer.from(` -hosts: -{{#each hosts}} -- {{this}} -{{/each}} -`), - }, - ]; -} +const ASSETS_MAP_FIXTURES = new Map([ + [ + '/test-1.0.0/data_stream/dataset1/agent/stream/some_template_path.yml', + Buffer.from(` + type: log + metricset: ["dataset1"] + paths: + {{#each paths}} + - {{this}} + {{/each}} + {{#if hosts}} + hosts: + {{#each hosts}} + - {{this}} + {{/each}} + {{/if}} + `), + ], + [ + '/test-1.0.0/data_stream/dataset1_level1/agent/stream/some_template_path.yml', + Buffer.from(` + type: log + metricset: ["dataset1.level1"] + `), + ], + [ + '/test-1.0.0/agent/input/some_template_path.yml', + Buffer.from(` + hosts: + {{#each hosts}} + - {{this}} + {{/each}} + `), + ], +]); async function mockedGetInstallation(params: any) { let pkg; if (params.pkgName === 'apache') pkg = { version: '1.3.2' }; if (params.pkgName === 'aws') pkg = { version: '0.3.3' }; if (params.pkgName === 'endpoint') pkg = { version: '1.0.0' }; + if (params.pkgName === 'test') pkg = { version: '0.0.1' }; return Promise.resolve(pkg); } async function mockedGetPackageInfo(params: any) { let pkg; if (params.pkgName === 'apache') pkg = { version: '1.3.2' }; - if (params.pkgName === 'aws') pkg = { version: '0.3.3' }; - if (params.pkgName === 'endpoint') pkg = { version: '1.0.0' }; + if (params.pkgName === 'aws') pkg = { name: 'aws', version: '0.3.3' }; + if (params.pkgName === 'endpoint') pkg = { name: 'endpoint', version: params.pkgVersion }; if (params.pkgName === 'test') { pkg = { version: '1.0.2', @@ -162,12 +155,6 @@ async function mockedGetPackageInfo(params: any) { return Promise.resolve(pkg); } -jest.mock('./epm/packages/assets', () => { - return { - getAssetsData: mockedGetAssetsData, - }; -}); - jest.mock('./epm/packages', () => { return { getPackageInfo: jest.fn().mockImplementation(mockedGetPackageInfo), @@ -181,7 +168,13 @@ jest.mock('../../common/services/package_to_package_policy', () => ({ packageToPackagePolicy: jest.fn(), })); -jest.mock('./epm/registry'); +jest.mock('./epm/registry', () => ({ + getPackage: jest.fn().mockResolvedValue({ assetsMap: [] }), +})); + +jest.mock('./epm/packages/get', () => ({ + getPackageAssetsMap: jest.fn().mockResolvedValue(new Map()), +})); jest.mock('./agent_policy'); const mockAgentPolicyService = agentPolicyService as jest.Mocked; @@ -488,6 +481,8 @@ describe('Package policy service', () => { it('should work with config variables from the stream', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { type: 'logs', @@ -520,7 +515,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -551,6 +547,8 @@ describe('Package policy service', () => { it('should work with a two level dataset name', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { type: 'logs', @@ -578,7 +576,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -603,6 +602,8 @@ describe('Package policy service', () => { it('should work with config variables at the input level', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -635,7 +636,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -666,6 +668,8 @@ describe('Package policy service', () => { it('should work with config variables at the package level', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -702,7 +706,8 @@ describe('Package policy service', () => { }, ], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -734,6 +739,8 @@ describe('Package policy service', () => { it('should work with an input with a template and no streams', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [], policy_templates: [ { @@ -753,7 +760,8 @@ describe('Package policy service', () => { }, streams: [], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -776,6 +784,8 @@ describe('Package policy service', () => { it('should work with an input with a template and streams', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', data_streams: [ { dataset: 'package.dataset1', @@ -828,7 +838,8 @@ describe('Package policy service', () => { }, streams: [], }, - ] + ], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([ @@ -881,6 +892,8 @@ describe('Package policy service', () => { it('should work with a package without input', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', policy_templates: [ { inputs: undefined, @@ -888,7 +901,8 @@ describe('Package policy service', () => { ], } as unknown as PackageInfo, {}, - [] + [], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([]); @@ -897,6 +911,8 @@ describe('Package policy service', () => { it('should work with a package with a empty inputs array', async () => { const inputs = await _compilePackagePolicyInputs( { + name: 'test', + version: '1.0.0', policy_templates: [ { inputs: [], @@ -904,7 +920,8 @@ describe('Package policy service', () => { ], } as unknown as PackageInfo, {}, - [] + [], + ASSETS_MAP_FIXTURES ); expect(inputs).toEqual([]); diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index d3d49a7f001fc..3f43aaa2d71f2 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -68,6 +68,7 @@ import type { ExperimentalDataStreamFeature, DeletePackagePoliciesResponse, PolicySecretReference, + AssetsMap, } from '../../common/types'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../constants'; import { @@ -104,7 +105,7 @@ import { storedPackagePolicyToAgentInputs } from './agent_policies'; import { agentPolicyService } from './agent_policy'; import { getDataOutputForAgentPolicy } from './agent_policies'; import { getPackageInfo, getInstallation, ensureInstalledPackage } from './epm/packages'; -import { getAssetsData } from './epm/packages/assets'; +import { getAssetsDataFromAssetsMap } from './epm/packages/assets'; import { compileTemplate } from './epm/agent/agent'; import { escapeSearchQueryPhrase, normalizeKuery } from './saved_object'; import { appContextService } from '.'; @@ -122,6 +123,7 @@ import { deleteSecretsIfNotReferenced as deleteSecrets, isSecretStorageEnabled, } from './secrets'; +import { getPackageAssetsMap } from './epm/packages/get'; export type InputsOverride = Partial & { vars?: Array; @@ -129,6 +131,38 @@ export type InputsOverride = Partial & { const SAVED_OBJECT_TYPE = PACKAGE_POLICY_SAVED_OBJECT_TYPE; +async function getPkgInfoAssetsMap({ + savedObjectsClient, + packageInfos, + logger, +}: { + savedObjectsClient: SavedObjectsClientContract; + packageInfos: PackageInfo[]; + logger: Logger; +}) { + const packageInfosandAssetsMap = new Map< + string, + { assetsMap: AssetsMap; pkgInfo: PackageInfo } + >(); + await pMap( + packageInfos, + async (pkgInfo) => { + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient, + }); + packageInfosandAssetsMap.set(`${pkgInfo.name}-${pkgInfo.version}`, { + assetsMap, + pkgInfo, + }); + }, + { concurrency: 5 } + ); + + return packageInfosandAssetsMap; +} + export const DATA_STREAM_ALLOWED_INDEX_PRIVILEGES = new Set([ 'auto_configure', 'create_doc', @@ -261,7 +295,17 @@ class PackagePolicyClientImpl implements PackagePolicyClient { inputs = enrichedPackagePolicy.inputs as PackagePolicyInput[]; } - inputs = await _compilePackagePolicyInputs(pkgInfo, enrichedPackagePolicy.vars || {}, inputs); + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + enrichedPackagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; @@ -366,6 +410,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { return p; }); + const packageInfosandAssetsMap = await getPkgInfoAssetsMap({ + logger, + packageInfos: [...packageInfos.values()], + savedObjectsClient: soClient, + }); + await pMap(packagePoliciesWithIds, async (packagePolicy) => { try { const packagePolicyId = packagePolicy.id ?? uuidv4(); @@ -377,12 +427,24 @@ class PackagePolicyClientImpl implements PackagePolicyClient { let elasticsearch: PackagePolicy['elasticsearch']; if (packagePolicy.package) { - const pkgInfo = packageInfos.get( + const packageInfoAndAsset = packageInfosandAssetsMap.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); + if (!packageInfoAndAsset) { + throw new FleetError( + `Package info and assets not found: ${packagePolicy.package.name}-${packagePolicy.package.version}` + ); + } + + const { pkgInfo, assetsMap } = packageInfoAndAsset; inputs = pkgInfo - ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs) + ? await _compilePackagePolicyInputs( + pkgInfo, + packagePolicy.vars || {}, + inputs, + assetsMap + ) : inputs; elasticsearch = pkgInfo?.elasticsearch; @@ -475,9 +537,18 @@ class PackagePolicyClientImpl implements PackagePolicyClient { const pkgInfo = packageInfos.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); - + if (!pkgInfo) { + throw new FleetError( + `Package info and assets not found: ${packagePolicy.package.name}-${packagePolicy.package.version}` + ); + } + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); inputs = pkgInfo - ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs) + ? await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs, assetsMap) : inputs; elasticsearch = pkgInfo?.elasticsearch; @@ -770,8 +841,17 @@ class PackagePolicyClientImpl implements PackagePolicyClient { secretsToDelete = secretsRes.secretsToDelete; inputs = restOfPackagePolicy.inputs as PackagePolicyInput[]; } - - inputs = await _compilePackagePolicyInputs(pkgInfo, restOfPackagePolicy.vars || {}, inputs); + const assetsMap = await getPackageAssetsMap({ + logger, + packageInfo: pkgInfo, + savedObjectsClient: soClient, + }); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + restOfPackagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; } @@ -891,6 +971,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { const packageInfos = await getPackageInfoForPackagePolicies(packagePolicyUpdates, soClient); const allSecretsToDelete: PolicySecretReference[] = []; + const packageInfosandAssetsMap = await getPkgInfoAssetsMap({ + logger: appContextService.getLogger(), + packageInfos: [...packageInfos.values()], + savedObjectsClient: soClient, + }); + const policiesToUpdate: Array> = []; const failedPolicies: Array<{ packagePolicy: NewPackagePolicyWithId; @@ -921,10 +1007,11 @@ class PackagePolicyClientImpl implements PackagePolicyClient { inputs = enforceFrozenInputs(oldPackagePolicy.inputs, inputs, options?.force); let elasticsearchPrivileges: NonNullable['privileges']; if (packagePolicy.package?.name) { - const pkgInfo = packageInfos.get( + const pkgInfoAndAsset = packageInfosandAssetsMap.get( `${packagePolicy.package.name}-${packagePolicy.package.version}` ); - if (pkgInfo) { + if (pkgInfoAndAsset) { + const { pkgInfo, assetsMap } = pkgInfoAndAsset; validatePackagePolicyOrThrow(packagePolicy, pkgInfo); if (await isSecretStorageEnabled(esClient, soClient)) { const secretsRes = await extractAndUpdateSecrets({ @@ -939,7 +1026,12 @@ class PackagePolicyClientImpl implements PackagePolicyClient { allSecretsToDelete.push(...secretsRes.secretsToDelete); inputs = restOfPackagePolicy.inputs as PackagePolicyInput[]; } - inputs = await _compilePackagePolicyInputs(pkgInfo, packagePolicy.vars || {}, inputs); + inputs = await _compilePackagePolicyInputs( + pkgInfo, + packagePolicy.vars || {}, + inputs, + assetsMap + ); elasticsearchPrivileges = pkgInfo.elasticsearch?.privileges; } } @@ -1382,10 +1474,16 @@ class PackagePolicyClientImpl implements PackagePolicyClient { packageInfo, packageToPackagePolicyInputs(packageInfo) as InputsOverride[] ); + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); updatePackagePolicy.inputs = await _compilePackagePolicyInputs( packageInfo, updatePackagePolicy.vars || {}, - updatePackagePolicy.inputs as PackagePolicyInput[] + updatePackagePolicy.inputs as PackagePolicyInput[], + assetsMap ); updatePackagePolicy.elasticsearch = packageInfo.elasticsearch; @@ -1422,6 +1520,11 @@ class PackagePolicyClientImpl implements PackagePolicyClient { ({ packagePolicy, packageInfo, experimentalDataStreamFeatures } = await this.getUpgradePackagePolicyInfo(soClient, id, packagePolicy, pkgVersion)); + const assetsMap = await getPackageAssetsMap({ + logger: appContextService.getLogger(), + packageInfo, + savedObjectsClient: soClient, + }); // Ensure the experimental features from the Installation saved object come through on the package policy // during an upgrade dry run @@ -1429,7 +1532,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { packagePolicy.package.experimental_data_stream_features = experimentalDataStreamFeatures; } - return this.calculateDiff(soClient, packagePolicy, packageInfo); + return this.calculateDiff(soClient, packagePolicy, packageInfo, assetsMap); } catch (error) { return { hasErrors: true, @@ -1441,7 +1544,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { private async calculateDiff( soClient: SavedObjectsClientContract, packagePolicy: PackagePolicy, - packageInfo: PackageInfo + packageInfo: PackageInfo, + assetsMap: AssetsMap ): Promise { const updatedPackagePolicy = updatePackageInputs( { @@ -1461,7 +1565,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { updatedPackagePolicy.inputs = await _compilePackagePolicyInputs( packageInfo, updatedPackagePolicy.vars || {}, - updatedPackagePolicy.inputs as PackagePolicyInput[] + updatedPackagePolicy.inputs as PackagePolicyInput[], + assetsMap ); updatedPackagePolicy.elasticsearch = packageInfo.elasticsearch; @@ -1899,11 +2004,12 @@ export function getInputsWithStreamIds( export async function _compilePackagePolicyInputs( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - inputs: PackagePolicyInput[] + inputs: PackagePolicyInput[], + assetsMap: AssetsMap ): Promise { const inputsPromises = inputs.map(async (input) => { - const compiledInput = await _compilePackagePolicyInput(pkgInfo, vars, input); - const compiledStreams = await _compilePackageStreams(pkgInfo, vars, input); + const compiledInput = await _compilePackagePolicyInput(pkgInfo, vars, input, assetsMap); + const compiledStreams = await _compilePackageStreams(pkgInfo, vars, input, assetsMap); return { ...input, compiled_input: compiledInput, @@ -1917,7 +2023,8 @@ export async function _compilePackagePolicyInputs( async function _compilePackagePolicyInput( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - input: PackagePolicyInput + input: PackagePolicyInput, + assetsMap: AssetsMap ) { const packagePolicyTemplate = input.policy_template ? pkgInfo.policy_templates?.find( @@ -1945,7 +2052,7 @@ async function _compilePackagePolicyInput( return undefined; } - const [pkgInputTemplate] = await getAssetsData(pkgInfo, (path: string) => + const [pkgInputTemplate] = await getAssetsDataFromAssetsMap(pkgInfo, assetsMap, (path: string) => path.endsWith(`/agent/input/${packageInput.template_path!}`) ); @@ -1965,10 +2072,11 @@ async function _compilePackagePolicyInput( async function _compilePackageStreams( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], - input: PackagePolicyInput + input: PackagePolicyInput, + assetsMap: AssetsMap ) { const streamsPromises = input.streams.map((stream) => - _compilePackageStream(pkgInfo, vars, input, stream) + _compilePackageStream(pkgInfo, vars, input, stream, assetsMap) ); return await Promise.all(streamsPromises); @@ -2026,7 +2134,8 @@ async function _compilePackageStream( pkgInfo: PackageInfo, vars: PackagePolicy['vars'], input: PackagePolicyInput, - streamIn: PackagePolicyInputStream + streamIn: PackagePolicyInputStream, + assetsMap: AssetsMap ) { let stream = streamIn; @@ -2068,8 +2177,9 @@ async function _compilePackageStream( const datasetPath = packageDataStream.path; - const [pkgStreamTemplate] = await getAssetsData( + const [pkgStreamTemplate] = await getAssetsDataFromAssetsMap( pkgInfo, + assetsMap, (path: string) => path.endsWith(streamFromPkg.template_path), datasetPath ); diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index d56c92eb7aa8b..bec381d311937 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -96,6 +96,7 @@ export type { InstallationInfo, ActionStatusOptions, PackageSpecTags, + AssetsMap, } from '../../common/types'; export { ElasticsearchAssetType, KibanaAssetType, KibanaSavedObjectType } from '../../common/types'; export { dataTypes } from '../../common/constants'; diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx index 8f29597326198..5e34f0ca5027e 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx @@ -18,6 +18,7 @@ import { useProfilingStatusData } from '../../hooks/use_profiling_status_data'; import { useTabSwitcherContext } from '../../hooks/use_tab_switcher'; import { ContentTabIds } from '../../types'; import { ErrorPrompt } from './error_prompt'; +import { Threads } from './threads'; export function Profiling() { const { activeTabId } = useTabSwitcherContext(); @@ -50,6 +51,18 @@ export function Profiling() { ), }, + { + id: 'threads', + name: i18n.translate('xpack.infra.tabs.profiling.threadsTabName', { + defaultMessage: 'Threads', + }), + content: ( + <> + + + + ), + }, ]; if (loading) { diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx index e0240ed58086e..4922ce0eafea4 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling_links.tsx @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; import { FlamegraphLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/flamegraph_locator'; import { TopNFunctionsLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/topn_functions_locator'; +import { StacktracesLocator } from '@kbn/observability-shared-plugin/public/locators/profiling/stacktraces_locator'; import { HOST_FIELD } from '../../../../../common/constants'; const PROFILING_FEEDBACK_URL = 'https://ela.st/profiling-feedback'; @@ -18,7 +19,7 @@ interface Props { hostname: string; from: string; to: string; - profilingLinkLocator: FlamegraphLocator | TopNFunctionsLocator; + profilingLinkLocator: FlamegraphLocator | TopNFunctionsLocator | StacktracesLocator; profilingLinkLabel: string; } @@ -43,7 +44,12 @@ export function ProfilingLinks({ - + {i18n.translate('xpack.infra.flamegraph.profilingFeedbackLink', { defaultMessage: 'Give feedback about profiling', })} diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx new file mode 100644 index 0000000000000..120fe3ca7fd99 --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/threads.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EmbeddableStackTraces } from '@kbn/observability-shared-plugin/public'; +import React from 'react'; +import { TopNType } from '@kbn/profiling-utils'; +import { EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { HOST_FIELD } from '../../../../../common/constants'; +import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; +import { useDatePickerContext } from '../../hooks/use_date_picker'; +import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; +import { ProfilingLinks } from './profiling_links'; + +export function Threads() { + const { services } = useKibanaContextForPlugin(); + const { getDateRangeInTimestamp, dateRange, setDateRange } = useDatePickerContext(); + const { from, to } = getDateRangeInTimestamp(); + const { asset } = useAssetDetailsRenderPropsContext(); + const stacktracesProfilingLinkLocator = + services.observabilityShared.locators.profiling.stacktracesLocator; + + return ( + <> + + + { + stacktracesProfilingLinkLocator.navigate({ + type: TopNType.Traces, + rangeFrom: dateRange.from, + rangeTo: dateRange.to, + kuery: `(${HOST_FIELD}:"${asset.name}" ) AND process.thread.name:"${category}"`, + }); + }} + onChartBrushEnd={(range) => { + setDateRange({ from: range.rangeFrom, to: range.rangeTo }); + }} + /> + + ); +} diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx index a35669c01ca33..93ab93de22f66 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/counter_rate.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { COUNTER_RATE_ID, COUNTER_RATE_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -35,18 +36,16 @@ const ofName = buildLabelFunction((name?: string) => { export type CounterRateIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'counter_rate'; + operationType: typeof COUNTER_RATE_ID; }; export const counterRateOperation: OperationDefinition< CounterRateIndexPatternColumn, 'fullReference' > = { - type: 'counter_rate', + type: COUNTER_RATE_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.counterRate', { - defaultMessage: 'Counter rate', - }), + displayName: COUNTER_RATE_NAME, input: 'fullReference', selectionStyle: 'field', requiredReferences: [ @@ -134,24 +133,6 @@ export const counterRateOperation: OperationDefinition< }, timeScalingMode: 'mandatory', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.counterRate.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.counterRate.documentation.markdown', { - defaultMessage: ` -Calculates the rate of an ever increasing counter. This function will only yield helpful results on counter metric fields which contain a measurement of some kind monotonically growing over time. -If the value does get smaller, it will interpret this as a counter reset. To get most precise results, \`counter_rate\` should be calculated on the \`max\` of a field. - -This calculation will be done separately for separate series defined by filters or top values dimensions. -It uses the current interval when used in Formula. - -Example: Visualize the rate of bytes received over time by a memcached server: -\`counter_rate(max(memcached.stats.read.bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.counterRate.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx index 916ecd6f965e6..d7c13d43ba163 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/cumulative_sum.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { CUMULATIVE_SUM_ID, CUMULATIVE_SUM_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -35,18 +36,16 @@ const ofName = buildLabelFunction((name?: string) => { export type CumulativeSumIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'cumulative_sum'; + operationType: typeof CUMULATIVE_SUM_ID; }; export const cumulativeSumOperation: OperationDefinition< CumulativeSumIndexPatternColumn, 'fullReference' > = { - type: 'cumulative_sum', + type: CUMULATIVE_SUM_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.cumulativeSum', { - defaultMessage: 'Cumulative sum', - }), + displayName: CUMULATIVE_SUM_NAME, input: 'fullReference', selectionStyle: 'field', requiredReferences: [ @@ -127,22 +126,6 @@ export const cumulativeSumOperation: OperationDefinition< return checkForDateHistogram(layer, opName)?.join(', '); }, filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.cumulative_sum.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.cumulativeSum.documentation.markdown', { - defaultMessage: ` -Calculates the cumulative sum of a metric over time, adding all previous values of a series to each value. To use this function, you need to configure a date histogram dimension as well. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Example: Visualize the received bytes accumulated over time: -\`cumulative_sum(sum(bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.cumulativeSum.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx index 9f592be860d77..59943a23ece5e 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/differences.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { DIFFERENCES_ID, DIFFERENCES_NAME } from '@kbn/lens-formula-docs'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; import { @@ -19,8 +20,6 @@ import { import { OperationDefinition } from '..'; import { getFormatFromPreviousColumn, getFilter } from '../helpers'; -const OPERATION_NAME = 'differences'; - const ofName = buildLabelFunction((name?: string) => { return i18n.translate('xpack.lens.indexPattern.derivativeOf', { defaultMessage: 'Differences of {name}', @@ -36,18 +35,16 @@ const ofName = buildLabelFunction((name?: string) => { export type DerivativeIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: typeof OPERATION_NAME; + operationType: typeof DIFFERENCES_ID; }; export const derivativeOperation: OperationDefinition< DerivativeIndexPatternColumn, 'fullReference' > = { - type: OPERATION_NAME, + type: DIFFERENCES_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.derivative', { - defaultMessage: 'Differences', - }), + displayName: DIFFERENCES_NAME, input: 'fullReference', selectionStyle: 'full', requiredReferences: [ @@ -78,7 +75,7 @@ export const derivativeOperation: OperationDefinition< return { label: ofName(ref?.label, previousColumn?.timeScale, previousColumn?.timeShift), dataType: 'number', - operationType: OPERATION_NAME, + operationType: DIFFERENCES_ID, isBucketed: false, scale: 'ratio', references: referenceIds, @@ -114,23 +111,6 @@ export const derivativeOperation: OperationDefinition< }, timeScalingMode: 'optional', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.differences.signature', { - defaultMessage: 'metric: number', - }), - description: i18n.translate('xpack.lens.indexPattern.differences.documentation.markdown', { - defaultMessage: ` -Calculates the difference to the last value of a metric over time. To use this function, you need to configure a date histogram dimension as well. -Differences requires the data to be sequential. If your data is empty when using differences, try increasing the date histogram interval. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Example: Visualize the change in bytes received over time: -\`differences(sum(bytes))\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.differences.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx index 2594cc558f026..a2689e7d2209c 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/moving_average.tsx @@ -9,6 +9,11 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React, { useState } from 'react'; import { EuiFieldNumber, EuiFormRow } from '@elastic/eui'; +import { + MOVING_AVERAGE_NAME, + MOVING_AVERAGE_ID, + MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, +} from '@kbn/lens-formula-docs'; import { useDebounceWithOptions } from '../../../../../shared_components'; import { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn } from '../column_types'; import { FormBasedLayer } from '../../../types'; @@ -37,11 +42,9 @@ const ofName = buildLabelFunction((name?: string) => { }); }); -const WINDOW_DEFAULT_VALUE = 5; - export type MovingAverageIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'moving_average'; + operationType: typeof MOVING_AVERAGE_ID; params: { window: number; }; @@ -51,11 +54,9 @@ export const movingAverageOperation: OperationDefinition< MovingAverageIndexPatternColumn, 'fullReference' > = { - type: 'moving_average', + type: MOVING_AVERAGE_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.movingAverage', { - defaultMessage: 'Moving average', - }), + displayName: MOVING_AVERAGE_NAME, input: 'fullReference', selectionStyle: 'full', requiredReferences: [ @@ -65,7 +66,12 @@ export const movingAverageOperation: OperationDefinition< }, ], operationParams: [ - { name: 'window', type: 'number', required: false, defaultValue: WINDOW_DEFAULT_VALUE }, + { + name: 'window', + type: 'number', + required: false, + defaultValue: MOVING_AVERAGE_WINDOW_DEFAULT_VALUE, + }, ], getPossibleOperation: (indexPattern) => { if (hasDateField(indexPattern)) { @@ -86,7 +92,7 @@ export const movingAverageOperation: OperationDefinition< }, buildColumn: ({ referenceIds, previousColumn, layer }, columnParams) => { const metric = layer.columns[referenceIds[0]]; - const window = columnParams?.window ?? WINDOW_DEFAULT_VALUE; + const window = columnParams?.window ?? MOVING_AVERAGE_WINDOW_DEFAULT_VALUE; return { label: ofName(metric?.label, previousColumn?.timeScale, previousColumn?.timeShift), @@ -135,28 +141,6 @@ export const movingAverageOperation: OperationDefinition< }, timeScalingMode: 'optional', filterable: true, - documentation: { - section: 'calculation', - signature: i18n.translate('xpack.lens.indexPattern.moving_average.signature', { - defaultMessage: 'metric: number, [window]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.movingAverage.documentation.markdown', { - defaultMessage: ` -Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. -The default window value is {defaultValue}. - -This calculation will be done separately for separate series defined by filters or top values dimensions. - -Takes a named parameter \`window\` which specifies how many last values to include in the average calculation for the current value. - -Example: Smooth a line of measurements: -\`moving_average(sum(bytes), window=5)\` - `, - values: { - defaultValue: WINDOW_DEFAULT_VALUE, - }, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.movingAverage.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx index f2314dbdc3d58..68c7f18483d12 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/overall_metric.tsx @@ -6,6 +6,20 @@ */ import { i18n } from '@kbn/i18n'; +import { + AVG_ID, + MAX_ID, + MIN_ID, + OVERALL_AVERAGE_ID, + OVERALL_AVERAGE_NAME, + OVERALL_MAX_ID, + OVERALL_MAX_NAME, + OVERALL_MIN_ID, + OVERALL_MIN_NAME, + OVERALL_SUM_ID, + OVERALL_SUM_NAME, + SUM_ID, +} from '@kbn/lens-formula-docs'; import type { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn, @@ -19,22 +33,22 @@ type OverallMetricIndexPatternColumn = FormattedIndexPatternCo operationType: T; }; -export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_sum'>; -export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_min'>; -export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_max'>; -export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_average'>; +export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn; +export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn< + typeof OVERALL_AVERAGE_ID +>; function buildOverallMetricOperation>({ type, displayName, ofName, - description, metric, }: { type: T['operationType']; displayName: string; ofName: (name?: string) => string; - description: string; metric: string; }): OperationDefinition { return { @@ -90,21 +104,12 @@ function buildOverallMetricOperation({ - type: 'overall_sum', - displayName: i18n.translate('xpack.lens.indexPattern.overallSum', { - defaultMessage: 'Overall sum', - }), + type: OVERALL_SUM_ID, + displayName: OVERALL_SUM_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallSumOf', { defaultMessage: 'Overall sum of {name}', @@ -117,25 +122,12 @@ export const overallSumOperation = buildOverallMetricOperation({ - type: 'overall_min', - displayName: i18n.translate('xpack.lens.indexPattern.overallMin', { - defaultMessage: 'Overall min', - }), + type: OVERALL_MIN_ID, + displayName: OVERALL_MIN_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallMinOf', { defaultMessage: 'Overall min of {name}', @@ -148,25 +140,12 @@ export const overallMinOperation = buildOverallMetricOperation({ - type: 'overall_max', - displayName: i18n.translate('xpack.lens.indexPattern.overallMax', { - defaultMessage: 'Overall max', - }), + type: OVERALL_MAX_ID, + displayName: OVERALL_MAX_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallMaxOf', { defaultMessage: 'Overall max of {name}', @@ -179,26 +158,13 @@ export const overallMaxOperation = buildOverallMetricOperation({ - type: 'overall_average', - displayName: i18n.translate('xpack.lens.indexPattern.overallMax', { - defaultMessage: 'Overall max', - }), + type: OVERALL_AVERAGE_ID, + displayName: OVERALL_AVERAGE_NAME, ofName: (name?: string) => { return i18n.translate('xpack.lens.indexPattern.overallAverageOf', { defaultMessage: 'Overall average of {name}', @@ -211,16 +177,5 @@ export const overallAverageOperation = }, }); }, - metric: 'average', - description: i18n.translate('xpack.lens.indexPattern.overall_average.documentation.markdown', { - defaultMessage: ` -Calculates the average of a metric for all data points of a series in the current chart. A series is defined by a dimension using a date histogram or interval function. -Other dimensions breaking down the data like top values or filter are treated as separate series. - -If no date histograms or interval functions are used in the current chart, \`overall_average\` is calculating the average over all dimensions no matter the used function - -Example: Divergence from the mean: -\`sum(bytes) - overall_average(sum(bytes))\` - `, - }), + metric: AVG_ID, }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx index 5915941938737..3ccb3e0808129 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/calculations/time_scale.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { NORMALIZE_BY_UNIT_ID, NORMALIZE_BY_UNIT_NAME } from '@kbn/lens-formula-docs'; import type { FormattedIndexPatternColumn, ReferenceBasedIndexPatternColumn, @@ -15,19 +16,9 @@ import type { OperationDefinition } from '..'; import { combineErrorMessages, getFormatFromPreviousColumn } from '../helpers'; import { FormBasedLayer } from '../../../types'; -type OverallMetricIndexPatternColumn = FormattedIndexPatternColumn & - ReferenceBasedIndexPatternColumn & { - operationType: T; - }; - -export type OverallSumIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_sum'>; -export type OverallMinIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_min'>; -export type OverallMaxIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_max'>; -export type OverallAverageIndexPatternColumn = OverallMetricIndexPatternColumn<'overall_average'>; - export type TimeScaleIndexPatternColumn = FormattedIndexPatternColumn & ReferenceBasedIndexPatternColumn & { - operationType: 'normalize_by_unit'; + operationType: typeof NORMALIZE_BY_UNIT_ID; params: { unit?: string; }; @@ -35,11 +26,9 @@ export type TimeScaleIndexPatternColumn = FormattedIndexPatternColumn & export const timeScaleOperation: OperationDefinition = { - type: 'normalize_by_unit', + type: NORMALIZE_BY_UNIT_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.timeScale', { - defaultMessage: 'Normalize by unit', - }), + displayName: NORMALIZE_BY_UNIT_NAME, input: 'fullReference', selectionStyle: 'hidden', requiredReferences: [ @@ -57,7 +46,7 @@ export const timeScaleOperation: OperationDefinition { - return 'normalize_by_unit'; + return NORMALIZE_BY_UNIT_ID; }, toExpression: (layer, columnId) => { const currentColumn = layer.columns[columnId] as unknown as TimeScaleIndexPatternColumn; @@ -85,9 +74,9 @@ export const timeScaleOperation: OperationDefinition { return { - label: 'Normalize by unit', + label: NORMALIZE_BY_UNIT_NAME, dataType: 'number', - operationType: 'normalize_by_unit', + operationType: NORMALIZE_BY_UNIT_ID, isBucketed: false, scale: 'ratio', references: referenceIds, @@ -102,13 +91,7 @@ export const timeScaleOperation: OperationDefinition { return combineErrorMessages([ - getErrorsForDateReference( - layer, - columnId, - i18n.translate('xpack.lens.indexPattern.timeScale', { - defaultMessage: 'Normalize by unit', - }) - ), + getErrorsForDateReference(layer, columnId, NORMALIZE_BY_UNIT_NAME), !(layer.columns[columnId] as TimeScaleIndexPatternColumn).params.unit ? [ i18n.translate('xpack.lens.indexPattern.timeScale.missingUnit', { @@ -129,21 +112,4 @@ export const timeScaleOperation: OperationDefinition = { - type: OPERATION_TYPE, - displayName: i18n.translate('xpack.lens.indexPattern.cardinality', { - defaultMessage: 'Unique count', - }), + type: CARDINALITY_ID, + displayName: CARDINALITY_NAME, allowAsReference: true, input: 'field', getPossibleOperationForField: ({ @@ -123,7 +121,7 @@ export const cardinalityOperation: OperationDefinition< return { label: ofName(field.displayName, previousColumn?.timeShift, previousColumn?.reducedTimeRange), dataType: 'number', - operationType: OPERATION_TYPE, + operationType: CARDINALITY_ID, scale: SCALE, sourceField: field.name, isBucketed: IS_BUCKETED, @@ -205,23 +203,6 @@ export const cardinalityOperation: OperationDefinition< sourceField: field.name, }; }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.cardinality.signature', { - defaultMessage: 'field: string', - }), - description: i18n.translate('xpack.lens.indexPattern.cardinality.documentation.markdown', { - defaultMessage: ` -Calculates the number of unique values of a specified field. Works for number, string, date and boolean values. - -Example: Calculate the number of different products: -\`unique_count(product.name)\` - -Example: Calculate the number of different products from the "clothes" group: -\`unique_count(product.name, kql='product.group=clothes')\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.cardinality.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx index 142e38a144dbb..94b1b36193aed 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/count.tsx @@ -11,6 +11,7 @@ import { euiThemeVars } from '@kbn/ui-theme'; import { EuiSwitch, EuiText } from '@elastic/eui'; import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { COUNT_ID, COUNT_NAME } from '@kbn/lens-formula-docs'; import { TimeScaleUnit } from '../../../../../common/expressions'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn, ValueFormatConfig } from './column_types'; @@ -72,7 +73,7 @@ function ofName( } export type CountIndexPatternColumn = FieldBasedIndexPatternColumn & { - operationType: 'count'; + operationType: typeof COUNT_ID; params?: { emptyAsNull?: boolean; format?: ValueFormatConfig; @@ -83,10 +84,8 @@ const SCALE = 'ratio'; const IS_BUCKETED = false; export const countOperation: OperationDefinition = { - type: 'count', - displayName: i18n.translate('xpack.lens.indexPattern.count', { - defaultMessage: 'Count', - }), + type: COUNT_ID, + displayName: COUNT_NAME, input: 'field', getErrorMessage: (layer, columnId, indexPattern) => combineErrorMessages([ @@ -130,7 +129,7 @@ export const countOperation: OperationDefinition('count', previousColumn) + previousColumn && isColumnOfType(COUNT_ID, previousColumn) ? previousColumn.params?.emptyAsNull : !columnParams?.usedInMath, }, @@ -232,25 +231,6 @@ export const countOperation: OperationDefinition { - const fnDescription = getFunctionDescriptionAndExamples(key, operationDefinitionMap); + const fnDescription = getFunctionDescriptionAndExamples(key); return { label: key, description: ( @@ -47,15 +51,12 @@ function createNewSection( }; } -function getFunctionDescriptionAndExamples( - label: string, - operationDefinitionMap: Record -) { +function getFunctionDescriptionAndExamples(label: string) { if (tinymathFunctions[label]) { const [description, examples] = tinymathFunctions[label].help.split(`\`\`\``); return `${description.replace(/\n/g, '\n\n')}${examples ? `\`\`\`${examples}\`\`\`` : ''}`; } - return operationDefinitionMap[label].documentation?.description; + return documentationMap[label].documentation?.description; } export function getDocumentationSections({ @@ -79,120 +80,14 @@ export function getDocumentationSections({ }); helpGroups.push({ - label: i18n.translate('xpack.lens.formulaFrequentlyUsedHeading', { - defaultMessage: 'Common formulas', - }), - description: i18n.translate('xpack.lens.formulaCommonFormulaDocumentation', { - defaultMessage: `The most common formulas are dividing two values to produce a percent. To display accurately, set "value format" to "percent".`, - }), - - items: [ - { - label: i18n.translate('xpack.lens.formulaDocumentation.filterRatio', { - defaultMessage: 'Filter ratio', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.weekOverWeek', { - defaultMessage: 'Week over week', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.percentOfTotal', { - defaultMessage: 'Percent of total', - }), - description: ( - - ), - }, - { - label: i18n.translate('xpack.lens.formulaDocumentation.recentChange', { - defaultMessage: 'Recent change', - }), - description: ( - - ), - }, - ], + label: formulasSections.common.label, + description: formulasSections.common.description, + items: formulasSections.common.items.map( + ({ label, description }: { label: string; description: string }) => ({ + label, + description: , + }) + ), }); const { @@ -203,7 +98,7 @@ max(system.network.in.bytes, reducedTimeRange="30m") constants: constantsOperations, } = groupBy(getPossibleFunctions(indexPattern), (key) => { if (key in operationDefinitionMap) { - return operationDefinitionMap[key].documentation?.section; + return documentationMap[key].documentation?.section; } if (key in tinymathFunctions) { return tinymathFunctions[key].section; @@ -213,14 +108,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") // Es aggs helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.elasticsearchSection', { - defaultMessage: 'Elasticsearch', - }), - i18n.translate('xpack.lens.formulaDocumentation.elasticsearchSectionDescription', { - defaultMessage: - 'These functions will be executed on the raw documents for each row of the resulting table, aggregating all documents matching the break down dimensions into a single value.', - }), - + formulasSections.elasticsearch.label, + formulasSections.elasticsearch.description, esFunctions, operationDefinitionMap ) @@ -229,14 +118,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") // Calculations aggs helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.columnCalculationSection', { - defaultMessage: 'Column calculations', - }), - i18n.translate('xpack.lens.formulaDocumentation.columnCalculationSectionDescription', { - defaultMessage: - 'These functions are executed for each row, but are provided with the whole column as context. This is also known as a window function.', - }), - + formulasSections.calculations.label, + formulasSections.calculations.description, calculationFunctions, operationDefinitionMap ) @@ -244,14 +127,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.mathSection', { - defaultMessage: 'Math', - }), - i18n.translate('xpack.lens.formulaDocumentation.mathSectionDescription', { - defaultMessage: - 'These functions will be executed for reach row of the resulting table using single values from the same row calculated using other functions.', - }), - + formulasSections.math.label, + formulasSections.math.description, mathOperations, operationDefinitionMap ) @@ -259,13 +136,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.comparisonSection', { - defaultMessage: 'Comparison', - }), - i18n.translate('xpack.lens.formulaDocumentation.comparisonSectionDescription', { - defaultMessage: 'These functions are used to perform value comparison.', - }), - + formulasSections.comparison.label, + formulasSections.comparison.description, comparisonOperations, operationDefinitionMap ) @@ -273,13 +145,8 @@ max(system.network.in.bytes, reducedTimeRange="30m") helpGroups.push( createNewSection( - i18n.translate('xpack.lens.formulaDocumentation.constantsSection', { - defaultMessage: 'Kibana context', - }), - i18n.translate('xpack.lens.formulaDocumentation.constantsSectionDescription', { - defaultMessage: - 'These functions are used to retrieve Kibana context variables, which are the date histogram `interval`, the current `now` and the selected `time_range` and help you to compute date math operations.', - }), + formulasSections.context.label, + formulasSections.context.description, constantsOperations, operationDefinitionMap ) @@ -287,46 +154,7 @@ max(system.network.in.bytes, reducedTimeRange="30m") const sections = { groups: helpGroups, - initialSection: ( - - ), + initialSection: , }; return sections; @@ -369,7 +197,9 @@ export function getFunctionSignatureLabel( } } const extraComma = extraArgs.length ? ', ' : ''; - return `${name}(${def.documentation?.signature}${extraComma}${extraArgs.join(', ')})`; + return `${name}(${documentationMap[name].documentation?.signature}${extraComma}${extraArgs.join( + ', ' + )})`; } return ''; } @@ -396,7 +226,7 @@ export function getHelpTextContent( operationDefinitionMap: ParamEditorProps['operationDefinitionMap'] ): { description: string; examples: string[] } { const definition = operationDefinitionMap[type]; - const description = definition.documentation?.description ?? ''; + const description = documentationMap[type].documentation?.description ?? ''; // as for the time being just add examples text. // Later will enrich with more information taken from the operation definitions. diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts index 419208ec48d80..270aa5f2c1bb7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.test.ts @@ -9,10 +9,10 @@ import { parse } from '@kbn/tinymath'; import { monaco } from '@kbn/monaco'; import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { createMockedIndexPattern } from '../../../../mocks'; import { GenericOperationDefinition } from '../..'; import type { OperationMetadata, IndexPatternField } from '../../../../../../types'; -import { tinymathFunctions } from '../util'; import { getSignatureHelp, getHover, @@ -48,11 +48,6 @@ const operationDefinitionMap: Record = { getPossibleOperationForField: jest.fn((field: IndexPatternField) => field.type === 'number' ? numericOperation() : undefined ), - documentation: { - section: 'elasticsearch', - signature: 'field: string', - description: 'description', - }, }), count: createOperationDefinitionMock('count', { getPossibleOperationForField: (field: IndexPatternField) => @@ -93,7 +88,7 @@ const operationDefinitionMap: Record = { ), }; -describe('math completion', () => { +describe('[Lens formula] math completion', () => { describe('signature help', () => { function unwrapSignatures(signatureResult: monaco.languages.SignatureHelpResult) { return signatureResult.value.signatures[0]; @@ -106,15 +101,21 @@ describe('math completion', () => { it('should return a signature for a field-based ES function', () => { expect(unwrapSignatures(getSignatureHelp('sum()', 4, operationDefinitionMap))).toEqual({ label: 'sum(field: string)', - documentation: { value: 'description' }, + documentation: { + value: ` +Returns the sum of a field. This function only works for number fields.`, + }, parameters: [{ label: 'field' }], }); }); it('should return a signature for count', () => { expect(unwrapSignatures(getSignatureHelp('count()', 6, operationDefinitionMap))).toEqual({ - label: 'count(undefined)', - documentation: { value: '' }, + label: 'count([field: string])', + documentation: { + value: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted.`, + }, parameters: [], }); }); @@ -126,7 +127,11 @@ describe('math completion', () => { ) ).toEqual({ label: expect.stringContaining('moving_average('), - documentation: { value: '' }, + documentation: { + value: ` +Calculates the moving average of a metric over time, averaging the last n-th values to calculate the current value. To use this function, you need to configure a date histogram dimension as well. +The default window value is 5.`, + }, parameters: [ { label: 'function' }, { @@ -145,7 +150,10 @@ describe('math completion', () => { ).toEqual({ label: expect.stringContaining('count('), parameters: [], - documentation: { value: '' }, + documentation: { + value: ` +The total number of documents. When you provide a field, the total number of field values is counted. When you use the Count function for fields that have multiple values in a single document, all values are counted.`, + }, }); }); diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts index 2213391235847..eac9f66c77107 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/editor/math_completion.ts @@ -22,12 +22,13 @@ import type { } from '@kbn/unified-search-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { parseTimeShift } from '@kbn/data-plugin/common'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import moment from 'moment'; import { nonNullable } from '../../../../../../utils'; import { DateRange } from '../../../../../../../common/types'; import type { IndexPattern } from '../../../../../../types'; import { memoizedGetAvailableOperationsByMetadata } from '../../../operations'; -import { tinymathFunctions, groupArgsByType, unquotedStringRegex } from '../util'; +import { groupArgsByType, unquotedStringRegex } from '../util'; import type { GenericOperationDefinition } from '../..'; import { getFunctionSignatureLabel, getHelpTextContent } from './formula_help'; import { hasFunctionFieldArgument } from '../validation'; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx index ea77bc3e429ab..382fd2fa6a9ca 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/formula.test.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { createMockedIndexPattern } from '../../../mocks'; import { formulaOperation, @@ -15,7 +16,6 @@ import type { FormulaIndexPatternColumn } from './formula'; import { insertOrReplaceFormulaColumn } from './parse'; import type { FormBasedLayer } from '../../../types'; import { IndexPattern } from '../../../../../types'; -import { tinymathFunctions } from './util'; import { TermsIndexPatternColumn } from '../terms'; import { MovingAverageIndexPatternColumn } from '../calculations'; import { StaticValueIndexPatternColumn } from '../static_value'; @@ -82,7 +82,7 @@ const operationDefinitionMap: Record = { }), }; -describe('formula', () => { +describe('[Lens] formula', () => { let layer: FormBasedLayer; beforeEach(() => { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts index 6dcc727ec0e70..87cdde46843e2 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/util.ts @@ -6,7 +6,6 @@ */ import { groupBy, isObject } from 'lodash'; -import { i18n } from '@kbn/i18n'; import type { TinymathAST, TinymathFunction, @@ -14,6 +13,7 @@ import type { TinymathVariable, } from '@kbn/tinymath'; import type { Query } from '@kbn/es-query'; +import { tinymathFunctions } from '@kbn/lens-formula-docs'; import { nonNullable } from '../../../../../utils'; import type { OperationDefinition, @@ -108,635 +108,6 @@ export function getOperationParams( }, {}); } -export function getTypeI18n(type: string) { - if (type === 'number') { - return i18n.translate('xpack.lens.formula.number', { defaultMessage: 'number' }); - } - if (type === 'string') { - return i18n.translate('xpack.lens.formula.string', { defaultMessage: 'string' }); - } - if (type === 'boolean') { - return i18n.translate('xpack.lens.formula.boolean', { defaultMessage: 'boolean' }); - } - return ''; -} - -export const tinymathFunctions: Record< - string, - { - section: 'math' | 'comparison'; - positionalArguments: Array<{ - name: string; - optional?: boolean; - defaultValue?: string | number; - type?: string; - alternativeWhenMissing?: string; - }>; - // Help is in Markdown format - help: string; - // When omitted defaults to "number". - // Used for comparison functions return type - outputType?: string; - } -> = { - add: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.addFunction.markdown', { - defaultMessage: ` -Adds up two numbers. -Also works with \`+\` symbol. - -Example: Calculate the sum of two fields - -\`sum(price) + sum(tax)\` - -Example: Offset count by a static value - -\`add(count(), 5)\` - `, - }), - }, - subtract: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.subtractFunction.markdown', { - defaultMessage: ` -Subtracts the first number from the second number. -Also works with \`-\` symbol. - -Example: Calculate the range of a field -\`subtract(max(bytes), min(bytes))\` - `, - }), - }, - multiply: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.multiplyFunction.markdown', { - defaultMessage: ` -Multiplies two numbers. -Also works with \`*\` symbol. - -Example: Calculate price after current tax rate -\`sum(bytes) * last_value(tax_rate)\` - -Example: Calculate price after constant tax rate -\`multiply(sum(price), 1.2)\` - `, - }), - }, - divide: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.divideFunction.markdown', { - defaultMessage: ` -Divides the first number by the second number. -Also works with \`/\` symbol - -Example: Calculate profit margin -\`sum(profit) / sum(revenue)\` - -Example: \`divide(sum(bytes), 2)\` - `, - }), - }, - abs: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.absFunction.markdown', { - defaultMessage: ` -Calculates absolute value. A negative value is multiplied by -1, a positive value stays the same. - -Example: Calculate average distance to sea level \`abs(average(altitude))\` - `, - }), - }, - cbrt: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.cbrtFunction.markdown', { - defaultMessage: ` -Cube root of value. - -Example: Calculate side length from volume -\`cbrt(last_value(volume))\` - `, - }), - }, - ceil: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.ceilFunction.markdown', { - defaultMessage: ` -Ceiling of value, rounds up. - -Example: Round up price to the next dollar -\`ceil(sum(price))\` - `, - }), - }, - clamp: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.min', { defaultMessage: 'min' }), - type: getTypeI18n('number'), - alternativeWhenMissing: 'pick_max', - }, - { - name: i18n.translate('xpack.lens.formula.max', { defaultMessage: 'max' }), - type: getTypeI18n('number'), - alternativeWhenMissing: 'pick_min', - }, - ], - help: i18n.translate('xpack.lens.formula.clampFunction.markdown', { - defaultMessage: ` -Limits the value from a minimum to maximum. - -Example: Make sure to catch outliers -\`\`\` -clamp( - average(bytes), - percentile(bytes, percentile=5), - percentile(bytes, percentile=95) -) -\`\`\` -`, - }), - }, - cube: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.cubeFunction.markdown', { - defaultMessage: ` -Calculates the cube of a number. - -Example: Calculate volume from side length -\`cube(last_value(length))\` - `, - }), - }, - exp: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.expFunction.markdown', { - defaultMessage: ` -Raises *e* to the nth power. - -Example: Calculate the natural exponential function - -\`exp(last_value(duration))\` - `, - }), - }, - fix: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.fixFunction.markdown', { - defaultMessage: ` -For positive values, takes the floor. For negative values, takes the ceiling. - -Example: Rounding towards zero -\`fix(sum(profit))\` - `, - }), - }, - floor: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.floorFunction.markdown', { - defaultMessage: ` -Round down to nearest integer value - -Example: Round down a price -\`floor(sum(price))\` - `, - }), - }, - log: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - optional: true, - defaultValue: 'e', - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.logFunction.markdown', { - defaultMessage: ` -Logarithm with optional base. The natural base *e* is used as default. - -Example: Calculate number of bits required to store values -\`\`\` -log(sum(bytes)) -log(sum(bytes), 2) -\`\`\` - `, - }), - }, - mod: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.modFunction.markdown', { - defaultMessage: ` -Remainder after dividing the function by a number - -Example: Calculate last three digits of a value -\`mod(sum(price), 1000)\` - `, - }), - }, - pow: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.base', { defaultMessage: 'base' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.powFunction.markdown', { - defaultMessage: ` -Raises the value to a certain power. The second argument is required - -Example: Calculate volume based on side length -\`pow(last_value(length), 3)\` - `, - }), - }, - round: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.decimals', { defaultMessage: 'decimals' }), - optional: true, - defaultValue: 0, - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.roundFunction.markdown', { - defaultMessage: ` -Rounds to a specific number of decimal places, default of 0 - -Examples: Round to the cent -\`\`\` -round(sum(bytes)) -round(sum(bytes), 2) -\`\`\` - `, - }), - }, - sqrt: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.sqrtFunction.markdown', { - defaultMessage: ` -Square root of a positive value only - -Example: Calculate side length based on area -\`sqrt(last_value(area))\` - `, - }), - }, - square: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.squareFunction.markdown', { - defaultMessage: ` -Raise the value to the 2nd power - -Example: Calculate area based on side length -\`square(last_value(length))\` - `, - }), - }, - pick_max: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.maxFunction.markdown', { - defaultMessage: ` -Finds the maximum value between two numbers. - -Example: Find the maximum between two fields averages -\`pick_max(average(bytes), average(memory))\` - `, - }), - }, - pick_min: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.minFunction.markdown', { - defaultMessage: ` -Finds the minimum value between two numbers. - -Example: Find the minimum between two fields averages -\`pick_min(average(bytes), average(memory))\` - `, - }), - }, - defaults: { - section: 'math', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.value', { defaultMessage: 'value' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.defaultValue', { defaultMessage: 'default' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.defaultFunction.markdown', { - defaultMessage: ` -Returns a default numeric value when value is null. - -Example: Return -1 when a field has no data -\`defaults(average(bytes), -1)\` -`, - }), - }, - lt: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.ltFunction.markdown', { - defaultMessage: ` -Performs a lower than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`<\` symbol. - -Example: Returns true if the average of bytes is lower than the average amount of memory -\`average(bytes) <= average(memory)\` - -Example: \`lt(average(bytes), 1000)\` - `, - }), - }, - gt: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.gtFunction.markdown', { - defaultMessage: ` -Performs a greater than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`>\` symbol. - -Example: Returns true if the average of bytes is greater than the average amount of memory -\`average(bytes) > average(memory)\` - -Example: \`gt(average(bytes), 1000)\` - `, - }), - }, - eq: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.eqFunction.markdown', { - defaultMessage: ` -Performs an equality comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`==\` symbol. - -Example: Returns true if the average of bytes is exactly the same amount of average memory -\`average(bytes) == average(memory)\` - -Example: \`eq(sum(bytes), 1000000)\` - `, - }), - }, - lte: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.lteFunction.markdown', { - defaultMessage: ` -Performs a lower than or equal comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`<=\` symbol. - -Example: Returns true if the average of bytes is lower than or equal to the average amount of memory -\`average(bytes) <= average(memory)\` - -Example: \`lte(average(bytes), 1000)\` - `, - }), - }, - gte: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - outputType: getTypeI18n('boolean'), - help: i18n.translate('xpack.lens.formula.gteFunction.markdown', { - defaultMessage: ` -Performs a greater than comparison between two values. -To be used as condition for \`ifelse\` comparison function. -Also works with \`>=\` symbol. - -Example: Returns true if the average of bytes is greater than or equal to the average amount of memory -\`average(bytes) >= average(memory)\` - -Example: \`gte(average(bytes), 1000)\` - `, - }), - }, - ifelse: { - section: 'comparison', - positionalArguments: [ - { - name: i18n.translate('xpack.lens.formula.condition', { defaultMessage: 'condition' }), - type: getTypeI18n('boolean'), - }, - { - name: i18n.translate('xpack.lens.formula.left', { defaultMessage: 'left' }), - type: getTypeI18n('number'), - }, - { - name: i18n.translate('xpack.lens.formula.right', { defaultMessage: 'right' }), - type: getTypeI18n('number'), - }, - ], - help: i18n.translate('xpack.lens.formula.ifElseFunction.markdown', { - defaultMessage: ` -Returns a value depending on whether the element of condition is true or false. - -Example: Average revenue per customer but in some cases customer id is not provided which counts as additional customer -\`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))\` - `, - }), - }, -}; - export function isMathNode(node: TinymathAST | string) { return isObject(node) && node.type === 'function' && tinymathFunctions[node.name]; } diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts index 95eb8a84e6849..5d6085c377829 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/formula/validation.ts @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { parse, TinymathLocation, TinymathVariable } from '@kbn/tinymath'; import type { TinymathAST, TinymathFunction, TinymathNamedArgument } from '@kbn/tinymath'; import { luceneStringToDsl, toElasticsearchQuery, fromKueryExpression } from '@kbn/es-query'; +import { tinymathFunctions, getTypeI18n } from '@kbn/lens-formula-docs'; import type { Query } from '@kbn/es-query'; import { isAbsoluteTimeShift, @@ -24,11 +25,9 @@ import { findMathNodes, findVariables, getOperationParams, - getTypeI18n, getValueOrName, groupArgsByType, isMathNode, - tinymathFunctions, } from './util'; import type { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts index 3c62f34cbc1f2..fd6b68c2bf65d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/index.ts @@ -350,11 +350,6 @@ interface BaseOperationDefinitionProps< * Operations can be used as middleware for other operations, hence not shown in the panel UI */ hidden?: boolean; - documentation?: { - signature: string; - description: string; - section: 'elasticsearch' | 'calculation' | 'constants'; - }; quickFunctionDocumentation?: string; /** * React component for operation field specific behaviour diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx index 6432577173af2..0861148aacc3d 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.tsx @@ -18,6 +18,7 @@ import { import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; +import { LAST_VALUE_ID, LAST_VALUE_NAME } from '@kbn/lens-formula-docs'; import type { FieldBasedOperationErrorMessage, OperationDefinition } from '.'; import { FieldBasedIndexPatternColumn, ValueFormatConfig } from './column_types'; import type { IndexPatternField, IndexPattern } from '../../../../types'; @@ -136,7 +137,7 @@ function setDefaultShowArrayValues( } export interface LastValueIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'last_value'; + operationType: typeof LAST_VALUE_ID; params: { sortField: string; showArrayValues: boolean; @@ -161,10 +162,8 @@ export const lastValueOperation: OperationDefinition< Partial, true > = { - type: 'last_value', - displayName: i18n.translate('xpack.lens.indexPattern.lastValue', { - defaultMessage: 'Last value', - }), + type: LAST_VALUE_ID, + displayName: LAST_VALUE_NAME, getDefaultLabel: (column, columns, indexPattern) => ofName( getSafeName(column.sourceField, indexPattern), @@ -250,7 +249,7 @@ export const lastValueOperation: OperationDefinition< return { label: ofName(field.displayName, previousColumn?.timeShift, previousColumn?.reducedTimeRange), dataType: field.type as DataType, - operationType: 'last_value', + operationType: LAST_VALUE_ID, isBucketed: false, scale: getScale(field.type), sourceField: field.name, @@ -450,22 +449,6 @@ export const lastValueOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.lastValue.signature', { - defaultMessage: 'field: string', - }), - description: i18n.translate('xpack.lens.indexPattern.lastValue.documentation.markdown', { - defaultMessage: ` -Returns the value of a field from the last document, ordered by the default time field of the data view. - -This function is usefull the retrieve the latest state of an entity. - -Example: Get the current status of server A: -\`last_value(server.status, kql=\'server.name="A"\')\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.lastValue.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx index 589b840c29f22..87e3432d54e2f 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/metrics.tsx @@ -10,6 +10,20 @@ import React from 'react'; import { EuiSwitch, EuiText } from '@elastic/eui'; import { euiThemeVars } from '@kbn/ui-theme'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { + AVG_ID, + AVG_NAME, + MAX_ID, + MAX_NAME, + MEDIAN_ID, + MEDIAN_NAME, + MIN_ID, + MIN_NAME, + STD_DEVIATION_ID, + STD_DEVIATION_NAME, + SUM_ID, + SUM_NAME, +} from '@kbn/lens-formula-docs'; import { LayerSettingsFeatures, OperationDefinition, ParamEditorProps } from '.'; import { getFormatFromPreviousColumn, @@ -62,7 +76,6 @@ function buildMetricOperation>({ supportsDate, hideZeroOption, aggConfigParams, - documentationDescription, quickFunctionDocumentation, unsupportedSettings, }: { @@ -228,28 +241,6 @@ function buildMetricOperation>({ ]), filterable: true, canReduceTimeRange: true, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.metric.signature', { - defaultMessage: 'field: string', - }), - description: - documentationDescription || - i18n.translate('xpack.lens.indexPattern.metric.documentation.markdown', { - defaultMessage: ` -Returns the {metric} of a field. This function only works for number fields. - -Example: Get the {metric} of price: -\`{metric}(price)\` - -Example: Get the {metric} of price for orders from the UK: -\`{metric}(price, kql='location:UK')\` - `, - values: { - metric: type, - }, - }), - }, quickFunctionDocumentation, shiftable: true, } as OperationDefinition; @@ -263,10 +254,8 @@ export type MaxIndexPatternColumn = MetricColumn<'max'>; export type MedianIndexPatternColumn = MetricColumn<'median'>; export const minOperation = buildMetricOperation({ - type: 'min', - displayName: i18n.translate('xpack.lens.indexPattern.min', { - defaultMessage: 'Minimum', - }), + type: MIN_ID, + displayName: MIN_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.minOf', { defaultMessage: 'Minimum of {name}', @@ -287,10 +276,8 @@ export const minOperation = buildMetricOperation({ }); export const maxOperation = buildMetricOperation({ - type: 'max', - displayName: i18n.translate('xpack.lens.indexPattern.max', { - defaultMessage: 'Maximum', - }), + type: MAX_ID, + displayName: MAX_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.maxOf', { defaultMessage: 'Maximum of {name}', @@ -311,11 +298,9 @@ export const maxOperation = buildMetricOperation({ }); export const averageOperation = buildMetricOperation({ - type: 'average', + type: AVG_ID, priority: 2, - displayName: i18n.translate('xpack.lens.indexPattern.avg', { - defaultMessage: 'Average', - }), + displayName: AVG_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.avgOf', { defaultMessage: 'Average of {name}', @@ -335,10 +320,8 @@ export const averageOperation = buildMetricOperation({ export const standardDeviationOperation = buildMetricOperation( { - type: 'standard_deviation', - displayName: i18n.translate('xpack.lens.indexPattern.standardDeviation', { - defaultMessage: 'Standard deviation', - }), + type: STD_DEVIATION_ID, + displayName: STD_DEVIATION_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.standardDeviationOf', { defaultMessage: 'Standard deviation of {name}', @@ -351,20 +334,6 @@ export const standardDeviationOperation = buildMetricOperation({ - type: 'sum', + type: SUM_ID, priority: 1, - displayName: i18n.translate('xpack.lens.indexPattern.sum', { - defaultMessage: 'Sum', - }), + displayName: SUM_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.sumOf', { defaultMessage: 'Sum of {name}', @@ -401,11 +368,9 @@ export const sumOperation = buildMetricOperation({ }); export const medianOperation = buildMetricOperation({ - type: 'median', + type: MEDIAN_ID, priority: 3, - displayName: i18n.translate('xpack.lens.indexPattern.median', { - defaultMessage: 'Median', - }), + displayName: MEDIAN_NAME, ofName: (name) => i18n.translate('xpack.lens.indexPattern.medianOf', { defaultMessage: 'Median of {name}', diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx index 3b9ecf0417313..be40f31c770aa 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile.tsx @@ -16,6 +16,7 @@ import { ExpressionAstFunctionBuilder, } from '@kbn/expressions-plugin/public'; import { useDebouncedValue } from '@kbn/visualization-ui-components'; +import { PERCENTILE_ID, PERCENTILE_NAME } from '@kbn/lens-formula-docs'; import { OperationDefinition } from '.'; import { getFormatFromPreviousColumn, @@ -33,7 +34,7 @@ import { getColumnReducedTimeRangeError } from '../../reduced_time_range_utils'; import { getGroupByKey, groupByKey } from './get_group_by_key'; export interface PercentileIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'percentile'; + operationType: typeof PERCENTILE_ID; params: { percentile: number; format?: { @@ -110,11 +111,9 @@ export const percentileOperation: OperationDefinition< { percentile: number }, true > = { - type: 'percentile', + type: PERCENTILE_ID, allowAsReference: true, - displayName: i18n.translate('xpack.lens.indexPattern.percentile', { - defaultMessage: 'Percentile', - }), + displayName: PERCENTILE_NAME, input: 'field', operationParams: [ { name: 'percentile', type: 'number', required: false, defaultValue: DEFAULT_PERCENTILE_VALUE }, @@ -161,7 +160,7 @@ export const percentileOperation: OperationDefinition< buildColumn: ({ field, previousColumn, indexPattern }, columnParams) => { const existingPercentileParam = previousColumn && - isColumnOfType('percentile', previousColumn) && + isColumnOfType(PERCENTILE_ID, previousColumn) && previousColumn.params.percentile; const newPercentileParam = columnParams?.percentile ?? (existingPercentileParam || DEFAULT_PERCENTILE_VALUE); @@ -173,7 +172,7 @@ export const percentileOperation: OperationDefinition< previousColumn?.reducedTimeRange ), dataType: 'number', - operationType: 'percentile', + operationType: PERCENTILE_ID, sourceField: field.name, isBucketed: false, scale: 'ratio', @@ -431,20 +430,6 @@ export const percentileOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.percentile.signature', { - defaultMessage: 'field: string, [percentile]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.percentile.documentation.markdown', { - defaultMessage: ` -Returns the specified percentile of the values of a field. This is the value n percent of the values occuring in documents are smaller. - -Example: Get the number of bytes larger than 95 % of values: -\`percentile(bytes, percentile=95)\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.percentile.documentation.quick', { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx index 54d6f379d9e5f..3eb867442ef17 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/percentile_ranks.tsx @@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n'; import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; import { useDebouncedValue } from '@kbn/visualization-ui-components'; +import { PERCENTILE_RANK_ID, PERCENTILE_RANK_NAME } from '@kbn/lens-formula-docs'; import { OperationDefinition } from '.'; import { getFormatFromPreviousColumn, @@ -27,7 +28,7 @@ import { FormRow } from './shared_components'; import { getColumnReducedTimeRangeError } from '../../reduced_time_range_utils'; export interface PercentileRanksIndexPatternColumn extends FieldBasedIndexPatternColumn { - operationType: 'percentile_rank'; + operationType: typeof PERCENTILE_RANK_ID; params: { value: number; }; @@ -63,11 +64,9 @@ export const percentileRanksOperation: OperationDefinition< { value: number }, true > = { - type: 'percentile_rank', + type: PERCENTILE_RANK_ID, allowAsReference: true, - displayName: i18n.translate('xpack.lens.indexPattern.percentileRank', { - defaultMessage: 'Percentile rank', - }), + displayName: PERCENTILE_RANK_NAME, input: 'field', operationParams: [ { @@ -256,20 +255,6 @@ export const percentileRanksOperation: OperationDefinition< ); }, - documentation: { - section: 'elasticsearch', - signature: i18n.translate('xpack.lens.indexPattern.percentileRanks.signature', { - defaultMessage: 'field: string, [value]: number', - }), - description: i18n.translate('xpack.lens.indexPattern.percentileRanks.documentation.markdown', { - defaultMessage: ` -Returns the percentage of values which are below a certain value. For example, if a value is greater than or equal to 95% of the observed values it is said to be at the 95th percentile rank - -Example: Get the percentage of values which are below of 100: -\`percentile_rank(bytes, value=100)\` - `, - }), - }, quickFunctionDocumentation: i18n.translate( 'xpack.lens.indexPattern.percentileRanks.documentation.quick', { diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx index a3f4f6f797ee1..dda07ef2c41c8 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx @@ -759,6 +759,47 @@ describe('Datatable Visualization', () => { }).headerRowHeightLines ).toEqual([2]); }); + + it('sets alignment correctly', () => { + datasource.publicAPIMock.getOperationForColumnId.mockReturnValue({ + dataType: 'string', + isBucketed: false, // <= make them metrics + label: 'label', + isStaticValue: false, + hasTimeShift: false, + hasReducedTimeRange: false, + }); + const expression = datatableVisualization.toExpression( + { + ...defaultExpressionTableState, + columns: [ + { columnId: 'b', alignment: 'center' }, + { columnId: 'c', alignment: 'left' }, + { columnId: 'a' }, + ], + }, + frame.datasourceLayers, + {}, + { '1': { type: 'expression', chain: [] } } + ) as Ast; + + const columnArgs = buildExpression(expression).findFunction('lens_datatable_column'); + expect(columnArgs[0].arguments).toEqual( + expect.objectContaining({ + alignment: ['left'], + }) + ); + expect(columnArgs[1].arguments).toEqual( + expect.objectContaining({ + alignment: ['center'], + }) + ); + expect(columnArgs[2].arguments).toEqual( + expect.not.objectContaining({ + alignment: [], + }) + ); + }); }); describe('#onEditAction', () => { diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx index 505b20bdc3e58..f22d17afad762 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx @@ -496,6 +496,7 @@ export const getDatatableVisualization = ({ width: column.width, isTransposed: column.isTransposed, transposable: isTransposable, + alignment: column.alignment, colorMode: canColor && column.colorMode ? column.colorMode : 'none', palette: paletteService.get(CUSTOM_PALETTE).toExpression(paletteParams), summaryRow: hasNoSummaryRow ? undefined : column.summaryRow!, diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 6052ae05d37cf..8fc8eafc53f11 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -98,6 +98,7 @@ "@kbn/cell-actions", "@kbn/calculate-width-from-char-count", "@kbn/discover-utils", + "@kbn/lens-formula-docs", "@kbn/visualization-utils" ], "exclude": [ diff --git a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx index 38bb078cd98d0..9520184d48753 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx +++ b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx @@ -8,9 +8,10 @@ import React, { useEffect, useState } from 'react'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { i18n } from '@kbn/i18n'; -import { EuiButton, EuiButtonEmpty, EuiCodeBlock, EuiContextMenu, EuiPopover } from '@elastic/eui'; +import { EuiButtonEmpty, EuiContextMenu, EuiPopover } from '@elastic/eui'; +import { createEsError } from '@kbn/search-errors'; import type { TileError } from '../../../common/descriptor_types'; -import { getInspector } from '../../kibana_services'; +import { getApplication, getDocLinks, getInspector } from '../../kibana_services'; import { RESPONSE_VIEW_ID } from '../../inspector/vector_tile_adapter/components/vector_tile_inspector'; interface Props { @@ -57,6 +58,41 @@ export function TileErrorsList(props: Props) { }, ]; + function renderError(tileError: TileError) { + if (!props.isESSource || !tileError.error) { + return tileError.message; + } + + const esError = createEsError( + { + statusCode: 400, + message: tileError.message, + attributes: { + error: tileError.error, + }, + }, + () => { + getInspector().open(props.inspectorAdapters, { + options: { + initialLayerId: props.layerId, + initialTileKey: tileError.tileKey, + initialTab: [RESPONSE_VIEW_ID], + }, + }); + }, + { + application: getApplication(), + docLinks: getDocLinks(), + } + ); + return ( + <> + {esError.getErrorMessage()} + {esError.getActions()} + + ); + } + return ( <> - - {getDescription(selectedTileError)} - - {props.isESSource && ( - { - getInspector().open(props.inspectorAdapters, { - options: { - initialLayerId: props.layerId, - initialTileKey: selectedTileError?.tileKey, - initialTab: [RESPONSE_VIEW_ID], - }, - }); - }} - size="s" - > - {i18n.translate('xpack.maps.tileError.viewDetailsButtonLabel', { - defaultMessage: 'View details', - })} - - )} + {renderError(selectedTileError)} ); } @@ -113,15 +128,3 @@ function getTitle(tileKey: string) { values: { tileKey }, }); } - -function getDescription(tileError: TileError) { - if (tileError.error?.root_cause?.[0]?.reason) { - return tileError.error.root_cause[0].reason; - } - - if (tileError.error?.reason) { - return tileError.error.reason; - } - - return tileError.message; -} diff --git a/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_data_views.ts b/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_data_views.ts index 5affe18c75d03..238d03c2a650f 100644 --- a/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_data_views.ts +++ b/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_data_views.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { DataView } from '@kbn/data-views-plugin/public'; import { UseFetchDataViewsResponse } from '../use_fetch_data_views'; export const useFetchDataViews = (): UseFetchDataViewsResponse => { @@ -16,10 +15,9 @@ export const useFetchDataViews = (): UseFetchDataViewsResponse => { data: Array(20) .fill(0) .map((_, i) => ({ + id: `dataview-${i}`, title: `dataview-${i}`, type: 'foo', - getName: () => `dataview-${i}`, - getIndexPattern: () => `.index-pattern-dataview-${i}`, - })) as DataView[], + })), }; }; diff --git a/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_indices.ts b/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_indices.ts deleted file mode 100644 index a709dea0600f8..0000000000000 --- a/x-pack/plugins/observability/public/hooks/__storybook_mocks__/use_fetch_indices.ts +++ /dev/null @@ -1,24 +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 { Index, UseFetchIndicesResponse } from '../use_fetch_indices'; - -export const useFetchIndices = (): UseFetchIndicesResponse => { - return { - isLoading: false, - isError: false, - isSuccess: true, - data: [ - ...Array(10) - .fill(0) - .map((_, i) => `.index-${i}`), - ...Array(10) - .fill(0) - .map((_, i) => `.some-other-index-${i}`), - ] as Index[], - }; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_create_data_view.ts b/x-pack/plugins/observability/public/hooks/use_create_data_view.ts index e2257ef71ab06..128f012094793 100644 --- a/x-pack/plugins/observability/public/hooks/use_create_data_view.ts +++ b/x-pack/plugins/observability/public/hooks/use_create_data_view.ts @@ -22,6 +22,7 @@ export function useCreateDataView({ indexPatternString }: UseCreateDataViewProps useEffect(() => { const createDataView = () => dataViews.create({ + id: `${indexPatternString}-id`, title: indexPatternString, allowNoIndex: true, }); diff --git a/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts b/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts index bff276181e95f..2d7602431266f 100644 --- a/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts +++ b/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts @@ -6,29 +6,23 @@ */ import { useQuery } from '@tanstack/react-query'; -import { DataView } from '@kbn/data-views-plugin/public'; +import { DataViewListItem } from '@kbn/data-views-plugin/public'; import { useKibana } from '../utils/kibana_react'; export interface UseFetchDataViewsResponse { isLoading: boolean; isSuccess: boolean; isError: boolean; - data: DataView[] | undefined; + data: DataViewListItem[] | undefined; } -interface Params { - name?: string; - size?: number; -} - -export function useFetchDataViews({ name = '', size = 10 }: Params): UseFetchDataViewsResponse { +export function useFetchDataViews(): UseFetchDataViewsResponse { const { dataViews } = useKibana().services; - const search = name.endsWith('*') ? name : `${name}*`; const { isLoading, isError, isSuccess, data } = useQuery({ - queryKey: ['fetchDataViews', search], + queryKey: ['fetchDataViewsList'], queryFn: async () => { - return dataViews.find(search, size); + return dataViews.getIdsWithTitle(); }, retry: false, keepPreviousData: true, diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/common/index_field_selector.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/index_field_selector.tsx index 0a07515a8915f..46d4af15de628 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/common/index_field_selector.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/common/index_field_selector.tsx @@ -6,16 +6,16 @@ */ import { EuiComboBox, EuiComboBoxOptionOption, EuiFlexItem, EuiFormRow } from '@elastic/eui'; -import { FieldSpec } from '@kbn/data-views-plugin/common'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, ReactNode } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; import { createOptionsFromFields, Option } from '../../helpers/create_options'; import { CreateSLOForm } from '../../types'; interface Props { indexFields: FieldSpec[]; name: 'groupBy' | 'indicator.params.timestampField'; - label: React.ReactNode | string; + label: ReactNode | string; placeholder: string; isDisabled: boolean; isLoading: boolean; diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/common/query_builder.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/query_builder.tsx index 954b89991f528..ab60a66daa2fd 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/common/query_builder.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/common/query_builder.tsx @@ -32,11 +32,14 @@ export function QueryBuilder({ required, tooltip, }: Props) { - const { data, dataViews, docLinks, http, notifications, storage, uiSettings, unifiedSearch } = + const { data, docLinks, dataViews, http, notifications, storage, uiSettings, unifiedSearch } = useKibana().services; const { control, getFieldState } = useFormContext(); - const { dataView } = useCreateDataView({ indexPatternString }); + + const { dataView } = useCreateDataView({ + indexPatternString, + }); return ( ; -} - export function IndexSelection() { - const { control, getFieldState } = useFormContext(); - const [searchValue, setSearchValue] = useState(''); + const { control, getFieldState, setValue, watch } = useFormContext(); + const { dataViews: dataViewsService } = useKibana().services; - const { isLoading: isIndicesLoading, data: indices = [] } = useFetchIndices({ - search: searchValue, - }); - const { isLoading: isDataViewsLoading, data: dataViews = [] } = useFetchDataViews({ - name: searchValue, - }); + const { isLoading: isDataViewsLoading, data: dataViews = [] } = useFetchDataViews(); - const options: Option[] = []; - if (!isDataViewsLoading && dataViews.length > 0) { - options.push(createDataViewsOption(dataViews)); - } - if (!isIndicesLoading && !!searchValue) { - options.push(createIndexPatternOption(searchValue, indices)); - } + const { dataViewEditor } = useKibana().services; + + const [adHocDataViews, setAdHocDataViews] = useState([]); + + const currentIndexPattern = watch('indicator.params.index'); - const onSearchChange = debounce((value: string) => setSearchValue(value), 300); + useEffect(() => { + if (!isDataViewsLoading) { + const missingAdHocDataView = + dataViews.find((dataView) => dataView.title === currentIndexPattern) || + adHocDataViews.find((dataView) => dataView.getIndexPattern() === currentIndexPattern); - const placeholder = i18n.translate('xpack.observability.slo.sloEdit.indexSelection.placeholder', { - defaultMessage: 'Select an index pattern', - }); + if (!missingAdHocDataView && currentIndexPattern) { + async function loadMissingDataView() { + const dataView = await dataViewsService.create( + { + title: currentIndexPattern, + allowNoIndex: true, + }, + true + ); + if (dataView.getIndexPattern() === currentIndexPattern) { + setAdHocDataViews((prev) => [...prev, dataView]); + } + } + + loadMissingDataView(); + } + } + }, [adHocDataViews, currentIndexPattern, dataViews, dataViewsService, isDataViewsLoading]); + + const getDataViewPatternById = (id?: string) => { + return ( + dataViews.find((dataView) => dataView.id === id)?.title || + adHocDataViews.find((dataView) => dataView.id === id)?.getIndexPattern() + ); + }; + + const getDataViewIdByIndexPattern = (indexPattern: string) => { + return ( + dataViews.find((dataView) => dataView.title === indexPattern) || + adHocDataViews.find((dataView) => dataView.getIndexPattern() === indexPattern) + ); + }; return ( - + ( - { - if (selected.length) { - return field.onChange(selected[0].value); - } - - field.onChange(''); + { + field.onChange(getDataViewPatternById(newId)); + dataViewsService.get(newId).then((dataView) => { + if (dataView.timeFieldName) { + setValue('indicator.params.timestampField', dataView.timeFieldName); + } + }); + }} + currentDataViewId={getDataViewIdByIndexPattern(field.value)?.id} + onDataViewCreated={() => { + dataViewEditor.openEditor({ + allowAdHocDataView: true, + onSave: (dataView: DataView) => { + if (!dataView.isPersisted()) { + setAdHocDataViews([...adHocDataViews, dataView]); + field.onChange(dataView.getIndexPattern()); + } else { + field.onChange(getDataViewPatternById(dataView.id)); + } + if (dataView.timeFieldName) { + setValue('indicator.params.timestampField', dataView.timeFieldName); + } + }, + }); }} - options={options} - onSearchChange={onSearchChange} - selectedOptions={ - !!field.value - ? [ - { - value: field.value, - label: field.value, - 'data-test-subj': 'indexSelectionSelectedValue', - }, - ] - : [] - } - singleSelection /> )} /> @@ -99,50 +116,16 @@ export function IndexSelection() { ); } -function createDataViewLabel(dataView: DataView) { - return `${dataView.getName()} (${dataView.getIndexPattern()})`; -} - -function createDataViewsOption(dataViews: DataView[]): Option { - return { - label: i18n.translate('xpack.observability.slo.sloEdit.indexSelection.dataViewOptionsLabel', { - defaultMessage: 'Select an index pattern from an existing Data View', - }), - options: dataViews - .map((view) => ({ - label: createDataViewLabel(view), - value: view.getIndexPattern(), - })) - .sort((a, b) => String(a.label).localeCompare(b.label)), - }; -} - -function createIndexPatternOption(searchValue: string, indices: string[]): Option { - const indexPattern = searchValue.endsWith('*') ? searchValue : `${searchValue}*`; - const hasMatchingIndices = indices.length > 0; +const SELECT_DATA_VIEW = i18n.translate( + 'xpack.observability.slo.sloEdit.customKql.dataViewSelection.label', + { + defaultMessage: 'Select a Data view', + } +); - return { - label: i18n.translate( - 'xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternLabel', - { defaultMessage: 'Use the index pattern' } - ), - options: [ - { - value: indexPattern, - label: hasMatchingIndices - ? i18n.translate( - 'xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternFoundLabel', - { - defaultMessage: - '{searchPattern} (match {num, plural, one {# index} other {# indices}})', - values: { searchPattern: indexPattern, num: indices.length }, - } - ) - : i18n.translate( - 'xpack.observability.slo.sloEdit.indexSelection.indexPatternNoMatchLabel', - { defaultMessage: '{searchPattern}', values: { searchPattern: indexPattern } } - ), - }, - ], - }; -} +const INDEX_LABEL = i18n.translate( + 'xpack.observability.slo.sloEdit.customKql.indexSelection.label', + { + defaultMessage: 'Index', + } +); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx index 42130cf204df6..5f528d117bbb4 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx @@ -10,8 +10,8 @@ import { i18n } from '@kbn/i18n'; import { ALL_VALUE } from '@kbn/slo-schema/src/schema/common'; import React from 'react'; import { useFormContext } from 'react-hook-form'; +import { useCreateDataView } from '../../../../hooks/use_create_data_view'; import { useFetchGroupByCardinality } from '../../../../hooks/slo/use_fetch_group_by_cardinality'; -import { useFetchIndexPatternFields } from '../../../../hooks/slo/use_fetch_index_pattern_fields'; import { CreateSLOForm } from '../../types'; import { DataPreviewChart } from '../common/data_preview_chart'; import { IndexFieldSelector } from '../common/index_field_selector'; @@ -24,10 +24,11 @@ export function CustomKqlIndicatorTypeForm() { const timestampField = watch('indicator.params.timestampField'); const groupByField = watch('groupBy'); - const { isLoading: isIndexFieldsLoading, data: indexFields = [] } = - useFetchIndexPatternFields(index); - const timestampFields = indexFields.filter((field) => field.type === 'date'); - const groupByFields = indexFields.filter((field) => field.aggregatable); + const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ + indexPatternString: index, + }); + const timestampFields = dataView?.fields?.filter((field) => field.type === 'date') ?? []; + const groupByFields = dataView?.fields?.filter((field) => field.aggregatable) ?? []; const { isLoading: isGroupByCardinalityLoading, data: groupByCardinality } = useFetchGroupByCardinality(index, timestampField, groupByField); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index 553969637129d..3eca039382b35 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -82,10 +82,13 @@ const mockKibana = () => { dataViews: { find: jest.fn().mockReturnValue([]), get: jest.fn().mockReturnValue([]), + getDefault: jest.fn(), }, }, dataViews: { - create: jest.fn().mockResolvedValue(42), + create: jest.fn().mockResolvedValue({ + getIndexPattern: jest.fn().mockReturnValue('some-index'), + }), }, docLinks: { links: { @@ -110,7 +113,6 @@ const mockKibana = () => { triggersActionsUi: { getAddRuleFlyout: jest .fn() - .mockReturnValue(
Add Rule Flyout
), }, uiSettings: { diff --git a/x-pack/plugins/observability_ai_assistant/common/types.ts b/x-pack/plugins/observability_ai_assistant/common/types.ts index 2584a1c7083fd..b7ef771378403 100644 --- a/x-pack/plugins/observability_ai_assistant/common/types.ts +++ b/x-pack/plugins/observability_ai_assistant/common/types.ts @@ -6,15 +6,12 @@ */ import type { JSONSchema } from 'json-schema-to-ts'; -import type { - CreateChatCompletionResponse, - CreateChatCompletionResponseChoicesInner, -} from 'openai'; +import type OpenAI from 'openai'; import type { Observable } from 'rxjs'; -export type CreateChatCompletionResponseChunk = Omit & { +export type CreateChatCompletionResponseChunk = Omit & { choices: Array< - Omit & { + Omit & { delta: { content?: string; function_call?: { name?: string; arguments?: string } }; } >; diff --git a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts index dcc26adc52e43..bbadaa82a8fb3 100644 --- a/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/functions/esql/index.ts @@ -288,6 +288,8 @@ export function registerEsqlFunction({ delta: { content: cachedContent, }, + index: 0, + finish_reason: null, }, ], }); diff --git a/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts b/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts index 163b41135b518..87b473e9a320b 100644 --- a/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts +++ b/x-pack/plugins/observability_ai_assistant/server/routes/chat/route.ts @@ -7,7 +7,7 @@ import { notImplemented } from '@hapi/boom'; import * as t from 'io-ts'; import { toBooleanRt } from '@kbn/io-ts-utils'; -import type { CreateChatCompletionResponse } from 'openai'; +import type OpenAI from 'openai'; import { Readable } from 'stream'; import { createObservabilityAIAssistantServerRoute } from '../create_observability_ai_assistant_server_route'; import { messageRt } from '../runtime_types'; @@ -38,7 +38,7 @@ const chatRoute = createObservabilityAIAssistantServerRoute({ }), t.partial({ query: t.type({ stream: toBooleanRt }) }), ]), - handler: async (resources): Promise => { + handler: async (resources): Promise => { const { request, params, service } = resources; const client = await service.getClient({ request }); @@ -93,7 +93,7 @@ const chatCompleteRoute = createObservabilityAIAssistantServerRoute({ }), ]), }), - handler: async (resources): Promise => { + handler: async (resources): Promise => { const { request, params, service } = resources; const client = await service.getClient({ request }); diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts index 7cffaa64d16d3..3e7660c427be7 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.test.ts @@ -7,9 +7,11 @@ import type { ActionsClient } from '@kbn/actions-plugin/server/actions_client'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; -import { merge } from 'lodash'; +import { waitFor } from '@testing-library/react'; +import { last, merge, repeat } from 'lodash'; +import type OpenAI from 'openai'; import { Subject } from 'rxjs'; -import { PassThrough, type Readable } from 'stream'; +import { EventEmitter, PassThrough, type Readable } from 'stream'; import { finished } from 'stream/promises'; import { ObservabilityAIAssistantClient } from '.'; import { createResourceNamesMap } from '..'; @@ -49,6 +51,8 @@ function createLlmSimulator() { choices: [ { delta: msg, + index: 0, + finish_reason: null, }, ], }; @@ -70,7 +74,7 @@ function createLlmSimulator() { }; } -describe('Observability AI Assistant service', () => { +describe('Observability AI Assistant client', () => { let client: ObservabilityAIAssistantClient; const actionsClientMock: DeeplyMockedKeys = { @@ -84,14 +88,8 @@ describe('Observability AI Assistant service', () => { } as any; const currentUserEsClientMock: DeeplyMockedKeys = { - search: jest.fn().mockResolvedValue({ - hits: { - hits: [], - }, - }), - fieldCaps: jest.fn().mockResolvedValue({ - fields: [], - }), + search: jest.fn(), + fieldCaps: jest.fn(), } as any; const knowledgeBaseServiceMock: DeeplyMockedKeys = { @@ -107,16 +105,29 @@ describe('Observability AI Assistant service', () => { const functionClientMock: DeeplyMockedKeys = { executeFunction: jest.fn(), - getFunctions: jest.fn().mockReturnValue([]), - hasFunction: jest.fn().mockImplementation((name) => { - return name !== 'recall'; - }), + getFunctions: jest.fn(), + hasFunction: jest.fn(), } as any; let llmSimulator: LlmSimulator; function createClient() { - jest.clearAllMocks(); + jest.resetAllMocks(); + + functionClientMock.getFunctions.mockReturnValue([]); + functionClientMock.hasFunction.mockImplementation((name) => { + return name !== 'recall'; + }); + + currentUserEsClientMock.search.mockResolvedValue({ + hits: { + hits: [], + }, + } as any); + + currentUserEsClientMock.fieldCaps.mockResolvedValue({ + fields: [], + } as any); return new ObservabilityAIAssistantClient({ actionsClient: actionsClientMock, @@ -158,6 +169,10 @@ describe('Observability AI Assistant service', () => { ); } + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('when completing a conversation without an initial conversation id', () => { let stream: Readable; @@ -961,6 +976,7 @@ describe('Observability AI Assistant service', () => { model: 'gpt-4', object: 'chat.completion.chunk', choices: [ + // @ts-expect-error { delta: { content: 'Hello', @@ -1011,6 +1027,7 @@ describe('Observability AI Assistant service', () => { model: 'gpt-4', object: 'chat.completion.chunk', choices: [ + // @ts-expect-error { delta: { content: 'Hello', @@ -1148,4 +1165,197 @@ describe('Observability AI Assistant service', () => { }); }); }); + + describe('when the LLM keeps on calling a function and the limit has been exceeded', () => { + let stream: Readable; + + let dataHandler: jest.Mock; + + beforeEach(async () => { + client = createClient(); + + const onLlmCall = new EventEmitter(); + + function waitForNextLlmCall() { + return new Promise((resolve) => onLlmCall.addListener('next', resolve)); + } + + actionsClientMock.execute.mockImplementation(async () => { + llmSimulator = createLlmSimulator(); + onLlmCall.emit('next'); + return { + actionId: '', + status: 'ok', + data: llmSimulator.stream, + }; + }); + + functionClientMock.getFunctions.mockImplementation(() => [ + { + definition: { + name: 'get_top_alerts', + contexts: ['core'], + description: '', + parameters: {}, + }, + respond: async () => { + return { content: 'Call this function again' }; + }, + }, + ]); + + functionClientMock.hasFunction.mockImplementation((name) => name === 'get_top_alerts'); + functionClientMock.executeFunction.mockImplementation(async () => ({ + content: 'Call this function again', + })); + + stream = await client.complete({ + connectorId: 'foo', + messages: [system('This is a system message'), user('How many alerts do I have?')], + functionClient: functionClientMock, + signal: new AbortController().signal, + title: 'My predefined title', + persist: true, + }); + + dataHandler = jest.fn(); + + stream.on('data', dataHandler); + + async function requestAlertsFunctionCall() { + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ); + + let nextLlmCallPromise: Promise; + + if (body.functions?.length) { + nextLlmCallPromise = waitForNextLlmCall(); + await llmSimulator.next({ function_call: { name: 'get_top_alerts' } }); + } else { + nextLlmCallPromise = Promise.resolve(); + await llmSimulator.next({ content: 'Looks like we are done here' }); + } + + await llmSimulator.complete(); + + await nextLlmCallPromise; + } + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await requestAlertsFunctionCall(); + + await finished(stream); + }); + + it('executed the function no more than three times', () => { + expect(functionClientMock.executeFunction).toHaveBeenCalledTimes(3); + }); + + it('does not give the LLM the choice to call a function anymore', () => { + const firstBody = JSON.parse( + (actionsClientMock.execute.mock.calls[0][0].params as any).subActionParams.body + ); + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ); + + expect(firstBody.functions.length).toBe(1); + + expect(body.functions).toBeUndefined(); + }); + }); + + describe('when the function response exceeds the max no of tokens for one', () => { + let stream: Readable; + + let dataHandler: jest.Mock; + + beforeEach(async () => { + client = createClient(); + + let functionResponsePromiseResolve: Function | undefined; + + actionsClientMock.execute.mockImplementation(async () => { + llmSimulator = createLlmSimulator(); + return { + actionId: '', + status: 'ok', + data: llmSimulator.stream, + }; + }); + + functionClientMock.getFunctions.mockImplementation(() => [ + { + definition: { + name: 'get_top_alerts', + contexts: ['core'], + description: '', + parameters: {}, + }, + respond: async () => { + return { content: '' }; + }, + }, + ]); + + functionClientMock.hasFunction.mockImplementation((name) => name === 'get_top_alerts'); + + functionClientMock.executeFunction.mockImplementation(() => { + return new Promise((resolve) => { + functionResponsePromiseResolve = resolve; + }); + }); + + stream = await client.complete({ + connectorId: 'foo', + messages: [system('This is a system message'), user('How many alerts do I have?')], + functionClient: functionClientMock, + signal: new AbortController().signal, + title: 'My predefined title', + persist: true, + }); + + dataHandler = jest.fn(); + + stream.on('data', dataHandler); + + await llmSimulator.next({ function_call: { name: 'get_top_alerts' } }); + + await llmSimulator.complete(); + + await waitFor(() => functionResponsePromiseResolve !== undefined); + + functionResponsePromiseResolve!({ + content: repeat('word ', 10000), + }); + + await waitFor(() => actionsClientMock.execute.mock.calls.length > 1); + + await llmSimulator.next({ content: 'Looks like this was truncated' }); + + await llmSimulator.complete(); + + await finished(stream); + }); + it('truncates the message', () => { + const body = JSON.parse( + (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body + ) as OpenAI.Chat.ChatCompletionCreateParams; + + const parsed = JSON.parse(last(body.messages)!.content! as string); + + expect(parsed).toEqual({ + message: 'Function response exceeded the maximum length allowed and was truncated', + truncated: expect.any(String), + }); + + expect(parsed.truncated.includes('word ')).toBe(true); + }); + }); }); diff --git a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts index fafb7606a2769..0e3927f82370d 100644 --- a/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_ai_assistant/server/service/client/index.ts @@ -10,12 +10,9 @@ import type { ActionsClient } from '@kbn/actions-plugin/server'; import type { ElasticsearchClient } from '@kbn/core/server'; import type { Logger } from '@kbn/logging'; import type { PublicMethodsOf } from '@kbn/utility-types'; -import { compact, isEmpty, last, merge, omit, pick } from 'lodash'; -import type { - ChatCompletionRequestMessage, - CreateChatCompletionRequest, - CreateChatCompletionResponse, -} from 'openai'; +import type OpenAI from 'openai'; +import { decode, encode } from 'gpt-tokenizer'; +import { compact, isEmpty, last, merge, omit, pick, take } from 'lodash'; import { isObservable, lastValueFrom } from 'rxjs'; import { PassThrough, Readable } from 'stream'; import { v4 } from 'uuid'; @@ -176,6 +173,11 @@ export class ObservabilityAIAssistantClient { }); } + let numFunctionsCalled: number = 0; + + const MAX_FUNCTION_CALLS = 3; + const MAX_FUNCTION_RESPONSE_TOKEN_COUNT = 4000; + const next = async (nextMessages: Message[]): Promise => { const lastMessage = last(nextMessages); @@ -222,9 +224,12 @@ export class ObservabilityAIAssistantClient { connectorId, stream: true, signal, - functions: functionClient - .getFunctions() - .map((fn) => pick(fn.definition, 'name', 'description', 'parameters')), + functions: + numFunctionsCalled >= MAX_FUNCTION_CALLS + ? [] + : functionClient + .getFunctions() + .map((fn) => pick(fn.definition, 'name', 'description', 'parameters')), }) ).pipe(processOpenAiStream()), }); @@ -232,22 +237,52 @@ export class ObservabilityAIAssistantClient { } if (isAssistantMessageWithFunctionRequest) { - const functionResponse = await functionClient - .executeFunction({ - connectorId, - name: lastMessage.message.function_call!.name, - messages: nextMessages, - args: lastMessage.message.function_call!.arguments, - signal, - }) - .catch((error): FunctionResponse => { - return { - content: { - message: error.toString(), - error, - }, - }; - }); + const functionResponse = + numFunctionsCalled >= MAX_FUNCTION_CALLS + ? { + content: { + error: {}, + message: 'Function limit exceeded, ask the user what to do next', + }, + } + : await functionClient + .executeFunction({ + connectorId, + name: lastMessage.message.function_call!.name, + messages: nextMessages, + args: lastMessage.message.function_call!.arguments, + signal, + }) + .then((response) => { + if (isObservable(response)) { + return response; + } + + const encoded = encode(JSON.stringify(response.content || {})); + + if (encoded.length <= MAX_FUNCTION_RESPONSE_TOKEN_COUNT) { + return response; + } + + return { + data: response.data, + content: { + message: + 'Function response exceeded the maximum length allowed and was truncated', + truncated: decode(take(encoded, MAX_FUNCTION_RESPONSE_TOKEN_COUNT)), + }, + }; + }) + .catch((error): FunctionResponse => { + return { + content: { + message: error.toString(), + error, + }, + }; + }); + + numFunctionsCalled++; if (signal.aborted) { return; @@ -380,8 +415,12 @@ export class ObservabilityAIAssistantClient { functionCall?: string; stream?: TStream; signal: AbortSignal; - }): Promise => { - const messagesForOpenAI: ChatCompletionRequestMessage[] = compact( + }): Promise => { + const messagesForOpenAI: Array< + Omit & { + role: MessageRole; + } + > = compact( messages .filter((message) => message.message.content || message.message.function_call?.name) .map((message) => { @@ -401,8 +440,8 @@ export class ObservabilityAIAssistantClient { const functionsForOpenAI = functions; - const request: Omit & { model?: string } = { - messages: messagesForOpenAI, + const request: Omit & { model?: string } = { + messages: messagesForOpenAI as OpenAI.ChatCompletionCreateParams['messages'], ...(stream ? { stream: true } : {}), ...(!!functions?.length ? { functions: functionsForOpenAI } : {}), temperature: 0, @@ -429,7 +468,7 @@ export class ObservabilityAIAssistantClient { const response = stream ? (executeResult.data as Readable) - : (executeResult.data as CreateChatCompletionResponse); + : (executeResult.data as OpenAI.ChatCompletion); if (response instanceof Readable) { signal.addEventListener('abort', () => response.destroy()); diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_flamegraph.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_flamegraph.tsx index 70bc9b4b7df48..276bfa3e0ee29 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_flamegraph.tsx +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_flamegraph.tsx @@ -7,10 +7,14 @@ import type { BaseFlameGraph } from '@kbn/profiling-utils'; import React from 'react'; -import { ProfilingEmbeddable, ProfilingEmbeddableProps } from './profiling_embeddable'; +import { ProfilingEmbeddable } from './profiling_embeddable'; import { EMBEDDABLE_FLAMEGRAPH } from '.'; -type Props = Omit, 'embeddableFactoryId'>; +interface Props { + data?: BaseFlameGraph; + isLoading: boolean; + height?: string; +} export function EmbeddableFlamegraph(props: Props) { return ; diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_functions.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_functions.tsx index 4869eab74d508..064d2ce7859bb 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_functions.tsx +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_functions.tsx @@ -7,13 +7,15 @@ import type { TopNFunctions } from '@kbn/profiling-utils'; import React from 'react'; -import { ProfilingEmbeddable, ProfilingEmbeddableProps } from './profiling_embeddable'; import { EMBEDDABLE_FUNCTIONS } from '.'; +import { ProfilingEmbeddable } from './profiling_embeddable'; -type Props = Omit, 'embeddableFactoryId'> & { +interface Props { + data?: TopNFunctions; + isLoading: boolean; rangeFrom: number; rangeTo: number; -}; +} export function EmbeddableFunctions(props: Props) { return ; diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_stack_traces.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_stack_traces.tsx new file mode 100644 index 0000000000000..c07f08b517d90 --- /dev/null +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_stack_traces.tsx @@ -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 React from 'react'; +import { TopNType } from '@kbn/profiling-utils'; +import { EMBEDDABLE_STACK_TRACES } from '.'; +import { ProfilingEmbeddable } from './profiling_embeddable'; + +interface Props { + type: TopNType; + kuery: string; + rangeFrom: number; + rangeTo: number; + onClick: (category: string) => void; + onChartBrushEnd: (range: { rangeFrom: string; rangeTo: string }) => void; +} + +export function EmbeddableStackTraces(props: Props) { + return ; +} diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts index 05556b839cff4..8a13b23fd3de3 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts @@ -15,6 +15,10 @@ export const EMBEDDABLE_FUNCTIONS = 'EMBEDDABLE_FUNCTIONS'; /** Profiling functions embeddable */ export { EmbeddableFunctions } from './embeddable_functions'; +/** Profiling threads embeddable key */ +export const EMBEDDABLE_STACK_TRACES = 'EMBEDDABLE_STACK_TRACES'; +export { EmbeddableStackTraces } from './embeddable_stack_traces'; + /** Profiling search bar embeddable key */ export const EMBEDDABLE_PROFILING_SEARCH_BAR = 'EMBEDDABLE_PROFILING_SEARCH_BAR'; /** Profiling search bar embeddable */ diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx index 00f29c10c1593..989b446ca3b21 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx @@ -10,20 +10,11 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import React, { useEffect, useRef, useState } from 'react'; import { ObservabilitySharedStart } from '../../../plugin'; -export interface ProfilingEmbeddableProps { - data?: T; - embeddableFactoryId: string; - isLoading: boolean; - height?: string; -} - export function ProfilingEmbeddable({ embeddableFactoryId, - data, - isLoading, height, ...props -}: ProfilingEmbeddableProps) { +}: T & { embeddableFactoryId: string; height?: string }) { const { embeddable: embeddablePlugin } = useKibana().services; const [embeddable, setEmbeddable] = useState(); const embeddableRoot: React.RefObject = useRef(null); @@ -31,11 +22,7 @@ export function ProfilingEmbeddable({ useEffect(() => { async function createEmbeddable() { const factory = embeddablePlugin?.getEmbeddableFactory(embeddableFactoryId); - const input = { - id: 'embeddable_profiling', - data, - isLoading, - }; + const input = { ...props, id: 'embeddable_profiling' }; const embeddableObject = await factory?.create(input); setEmbeddable(embeddableObject); } @@ -51,14 +38,10 @@ export function ProfilingEmbeddable({ useEffect(() => { if (embeddable) { - embeddable.updateInput({ - data, - isLoading, - ...props, - }); + embeddable.updateInput(props); embeddable.reload(); } - }, [data, embeddable, isLoading, props]); + }, [embeddable, props]); return (
; @@ -19,11 +21,16 @@ export type StacktracesLocator = LocatorPublic; export class StacktracesLocatorDefinition implements LocatorDefinition { public readonly id = 'stacktracesLocator'; - public readonly getLocation = async ({ rangeFrom, rangeTo, kuery }: StacktracesLocatorParams) => { + public readonly getLocation = async ({ + rangeFrom, + rangeTo, + kuery, + type = TopNType.Threads, + }: StacktracesLocatorParams) => { const params = { rangeFrom, rangeTo, kuery }; return { app: 'profiling', - path: `/stacktraces/threads?${qs.stringify(params)}`, + path: `/stacktraces/${type}?${qs.stringify(params)}`, state: {}, }; }; diff --git a/x-pack/plugins/profiling/common/topn.ts b/x-pack/plugins/profiling/common/topn.ts index bbf04c8a39226..acd7c87ad7b5f 100644 --- a/x-pack/plugins/profiling/common/topn.ts +++ b/x-pack/plugins/profiling/common/topn.ts @@ -245,17 +245,14 @@ export function getCategoryColor({ return colors[stringhash(category)]; } -export function groupSamplesByCategory({ - samples, - totalCount, - metadata, - labels, -}: { - samples: TopNSample[]; - totalCount: number; - metadata: Record; - labels: Record; -}): TopNSubchart[] { +export function groupSamplesByCategory(topNResponse: TopNResponse): { charts: TopNSubchart[] } { + const { + TotalCount: totalCount, + TopN: samples, + Metadata: metadata, + Labels: labels, + } = topNResponse; + const seriesByCategory = new Map(); for (let i = 0; i < samples.length; i++) { @@ -289,17 +286,23 @@ export function groupSamplesByCategory({ rotations: Math.ceil(subcharts.length / 10), }); - return orderBy(subcharts, ['Percentage', 'Category'], ['desc', 'asc']).map((chart, index) => { - return { - ...chart, - Color: getCategoryColor({ category: chart.Category, colors, subChartSize: subcharts.length }), - Index: index + 1, - Series: chart.Series.map((value) => { - return { - ...value, - Category: chart.Category, - }; - }), - }; - }); + return { + charts: orderBy(subcharts, ['Percentage', 'Category'], ['desc', 'asc']).map((chart, index) => { + return { + ...chart, + Color: getCategoryColor({ + category: chart.Category, + colors, + subChartSize: subcharts.length, + }), + Index: index + 1, + Series: chart.Series.map((value) => { + return { + ...value, + Category: chart.Category, + }; + }), + }; + }), + }; } diff --git a/x-pack/plugins/profiling/public/components/chart_grid.tsx b/x-pack/plugins/profiling/public/components/chart_grid.tsx index bea1b7f90c1cd..717fc178028ec 100644 --- a/x-pack/plugins/profiling/public/components/chart_grid.tsx +++ b/x-pack/plugins/profiling/public/components/chart_grid.tsx @@ -5,10 +5,9 @@ * 2.0. */ -import { EuiFlexGrid, EuiFlexItem, EuiFlyout, EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { EuiFlexGrid, EuiFlexItem, EuiPanel, EuiSpacer } from '@elastic/eui'; import { take } from 'lodash'; -import React, { useMemo, useState } from 'react'; -import { i18n } from '@kbn/i18n'; +import React, { useMemo } from 'react'; import { TopNSubchart } from '../../common/topn'; import { SubChart } from './subchart'; @@ -16,16 +15,15 @@ export interface ChartGridProps { limit: number; charts: TopNSubchart[]; showFrames: boolean; + onChartClick?: (selectedChart: TopNSubchart) => void; } -export function ChartGrid({ limit, charts, showFrames }: ChartGridProps) { +export function ChartGrid({ limit, charts, showFrames, onChartClick }: ChartGridProps) { const maximum = Math.min(limit, charts.length ?? 0); const ncharts = Math.min(maximum, charts.length); - const [selectedSubchart, setSelectedSubchart] = useState(undefined); - const subCharts = useMemo(() => { - return take(charts, ncharts).map((subchart, i) => ( + return take(charts, ncharts).map((subchart) => ( { - setSelectedSubchart(subchart); - }} + onClick={onChartClick ? () => onChartClick(subchart) : undefined} showFrames={showFrames} padTitle /> )); - }, [charts, ncharts, showFrames]); + }, [charts, ncharts, onChartClick, showFrames]); return ( <> - - -

- {i18n.translate('xpack.profiling.chartGrid.h1.topLabel', { - defaultMessage: 'Top {size}', - values: { size: charts.length }, - })} -

-
{subCharts} - {selectedSubchart && ( - { - setSelectedSubchart(undefined); - }} - > - - - )} ); } diff --git a/x-pack/plugins/profiling/public/components/stack_traces/index.tsx b/x-pack/plugins/profiling/public/components/stack_traces/index.tsx new file mode 100644 index 0000000000000..ec2e5f28ccc24 --- /dev/null +++ b/x-pack/plugins/profiling/public/components/stack_traces/index.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { + EuiButton, + EuiButtonGroup, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiPanel, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useState } from 'react'; +import { StackTracesDisplayOption, TopNType } from '@kbn/profiling-utils'; +import { StackedBarChart, StackedBarChartProps } from '../stacked_bar_chart'; +import { TopNSubchart } from '../../../common/topn'; +import { ChartGrid } from '../chart_grid'; +import { AsyncState } from '../../hooks/use_async'; +import { AsyncComponent } from '../async_component'; +import { SubChart } from '../subchart'; + +interface Props { + type: TopNType; + state: AsyncState<{ charts: TopNSubchart[] }>; + displayOption: StackTracesDisplayOption; + onChangeDisplayOption: (nextOption: StackTracesDisplayOption) => void; + onStackedBarChartBrushEnd: StackedBarChartProps['onBrushEnd']; + onChartClick: (category: string) => void; + limit: number; + onShowMoreClick?: (newLimit: number) => void; +} + +const displayOptions = [ + { + id: StackTracesDisplayOption.StackTraces, + iconType: 'visLine', + label: i18n.translate('xpack.profiling.stackTracesView.stackTracesCountButton', { + defaultMessage: 'Stack traces', + }), + }, + { + id: StackTracesDisplayOption.Percentage, + iconType: 'percent', + label: i18n.translate('xpack.profiling.stackTracesView.percentagesButton', { + defaultMessage: 'Percentages', + }), + }, +]; + +export function StackTraces({ + type, + state, + displayOption, + onChangeDisplayOption, + onStackedBarChartBrushEnd, + limit, + onShowMoreClick, + onChartClick, +}: Props) { + const charts = state.data?.charts ?? []; + const isTracesType = type === TopNType.Traces; + const [selectedSubchart, setSelectedSubchart] = useState(undefined); + + function handleChartClick(selectedChart: TopNSubchart) { + // When clicking on the charts on the Traces view, the flyout must open + if (type === TopNType.Traces) { + setSelectedSubchart(selectedChart); + } else { + onChartClick(selectedChart.Category); + } + } + + return ( + <> + + + + + + { + onChangeDisplayOption(nextValue as StackTracesDisplayOption); + }} + options={displayOptions} + legend={i18n.translate('xpack.profiling.stackTracesView.displayOptionLegend', { + defaultMessage: 'Display option', + })} + /> + + + + + + + + + + + + <> + + +

+ {i18n.translate('xpack.profiling.chartGrid.h1.topLabel', { + defaultMessage: 'Top {size}', + values: { + size: onShowMoreClick ? charts.length : Math.min(limit, charts.length), + }, + })} +

+
+ + +
+
+ {onShowMoreClick && charts.length > limit ? ( + + onShowMoreClick(limit + 10)} + > + {i18n.translate('xpack.profiling.stackTracesView.showMoreButton', { + defaultMessage: 'Show more', + })} + + + ) : null} +
+ {selectedSubchart && ( + { + setSelectedSubchart(undefined); + }} + > + + + )} + + ); +} diff --git a/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx b/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx index 2d73d795c09ca..7be81869a49a5 100644 --- a/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx +++ b/x-pack/plugins/profiling/public/components/stacked_bar_chart/index.tsx @@ -37,7 +37,7 @@ export interface StackedBarChartProps { onBrushEnd: (range: { rangeFrom: string; rangeTo: string }) => void; charts: TopNSubchart[]; showFrames: boolean; - onClick?: (category: string) => void; + onClick?: (selectedChart: TopNSubchart) => void; } export function StackedBarChart({ @@ -79,12 +79,11 @@ export function StackedBarChart({ percentage={highlightedSubchart.Percentage} sample={highlightedSample} showFrames={showFrames} - /* we don't show metadata in tooltips */ - metadata={[]} height={128} width={MAX_TOOLTIP_WIDTH} showAxes={false} padTitle={false} + onClick={onClick ? () => onClick(highlightedSubchart) : undefined} /> @@ -113,7 +112,7 @@ export function StackedBarChart({ ? (elements) => { const [value] = elements[0] as XYChartElementEvent; const sample = value.datum as TopNSample; - onClick(sample.Category); + onClick(chartsbyCategoryMap[sample.Category]); } : undefined } diff --git a/x-pack/plugins/profiling/public/components/subchart.tsx b/x-pack/plugins/profiling/public/components/subchart.tsx index 4ae0056f63b24..3ada21f11c0ef 100644 --- a/x-pack/plugins/profiling/public/components/subchart.tsx +++ b/x-pack/plugins/profiling/public/components/subchart.tsx @@ -34,19 +34,16 @@ import { EuiToolTip, useEuiTheme, } from '@elastic/eui'; +import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import type { StackFrameMetadata } from '@kbn/profiling-utils'; import { groupBy } from 'lodash'; import React, { Fragment, useMemo, useState } from 'react'; -import { css } from '@emotion/react'; import { CountPerTime, OTHER_BUCKET_LABEL, TopNSample } from '../../common/topn'; import { useKibanaTimeZoneSetting } from '../hooks/use_kibana_timezone_setting'; import { useProfilingChartsTheme } from '../hooks/use_profiling_charts_theme'; -import { useProfilingParams } from '../hooks/use_profiling_params'; -import { useProfilingRouter } from '../hooks/use_profiling_router'; import { asNumber } from '../utils/formatters/as_number'; import { asPercentage } from '../utils/formatters/as_percentage'; -import { getTracesViewRouteParams } from '../views/stack_traces_view/utils'; import { StackFrameSummary } from './stack_frame_summary'; export interface SubChartProps { @@ -59,8 +56,8 @@ export interface SubChartProps { percentage: number; data: CountPerTime[]; showAxes: boolean; - metadata: StackFrameMetadata[]; - onShowMoreClick?: () => void; + metadata?: StackFrameMetadata[]; + onClick?: () => void; style?: EuiFlexGroupProps['style']; showFrames: boolean; padTitle: boolean; @@ -92,8 +89,8 @@ export function SubChart({ data, width, showAxes, - metadata, - onShowMoreClick, + metadata = [], + onClick, style, showFrames, padTitle, @@ -104,20 +101,11 @@ export function SubChart({ Record >({}); - const profilingRouter = useProfilingRouter(); - - const { path, query } = useProfilingParams('/stacktraces/{topNType}'); - - const href = profilingRouter.link( - '/stacktraces/{topNType}', - getTracesViewRouteParams({ query, topNType: path.topNType, category }) - ); - const timeZone = useKibanaTimeZoneSetting(); const { chartsTheme, chartsBaseTheme } = useProfilingChartsTheme(); - const compact = !!onShowMoreClick; + const compact = !!onClick; const parentsMetadata = metadata.filter((item) => item.Inline === false); const displayedFrames = compact @@ -225,8 +213,8 @@ export function SubChart({ })} - {hasMoreFrames && !!onShowMoreClick && ( - + {hasMoreFrames && !!onClick && ( + {i18n.translate('xpack.profiling.stackTracesView.showMoreTracesButton', { defaultMessage: 'Show more', })} @@ -275,14 +263,10 @@ export function SubChart({ - {showFrames ? ( - onShowMoreClick?.()}> - {label} - - ) : category === OTHER_BUCKET_LABEL ? ( + {category === OTHER_BUCKET_LABEL || onClick === undefined ? ( {label} ) : ( - + {label} )} diff --git a/x-pack/plugins/profiling/public/embeddables/empty_data_prompt.tsx b/x-pack/plugins/profiling/public/embeddables/empty_data_prompt.tsx new file mode 100644 index 0000000000000..6c92efca3f797 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/empty_data_prompt.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 from 'react'; +import { EuiEmptyPrompt, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +export function EmptyDataPrompt() { + return ( + <> + + + {i18n.translate('xpack.profiling.embeddables.emptyDataPromptTitle', { + defaultMessage: 'No data found', + })} + + } + body={ +

+ {i18n.translate('xpack.profiling.embeddables.emptyDataPromptBody', { + defaultMessage: + 'Make sure this host is sending profiling data or try selecting a different date range.', + })} +

+ } + /> + + ); +} diff --git a/x-pack/plugins/profiling/public/embeddables/error_prompt.tsx b/x-pack/plugins/profiling/public/embeddables/error_prompt.tsx new file mode 100644 index 0000000000000..4427a2ba62ea9 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/error_prompt.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiEmptyPrompt } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +export function ErrorPrompt() { + return ( + + {i18n.translate('xpack.profiling.embeddables.loadErrorTitle', { + defaultMessage: 'Unable to load the Profiling data', + })} + + } + body={ +

+ {i18n.translate('xpack.profiling.embeddables.loadErrorBody', { + defaultMessage: + 'There was an error while trying to load profiling data. Try refreshing the page', + })} +

+ } + /> + ); +} diff --git a/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts b/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts index 2c229414960a6..850ab8998e893 100644 --- a/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts +++ b/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts @@ -10,11 +10,13 @@ import { EMBEDDABLE_FLAMEGRAPH, EMBEDDABLE_FUNCTIONS, EMBEDDABLE_PROFILING_SEARCH_BAR, + EMBEDDABLE_STACK_TRACES, } from '@kbn/observability-shared-plugin/public'; import { EmbeddableFlamegraphFactory } from './flamegraph/embeddable_flamegraph_factory'; import { EmbeddableFunctionsFactory } from './functions/embeddable_functions_factory'; import { GetProfilingEmbeddableDependencies } from './profiling_embeddable_provider'; import { EmbeddableSearchBarFactory } from './search_bar/embeddable_search_bar_factory'; +import { EmbeddableStackTracesFactory } from './stack_traces/embeddable_stack_traces_factory'; export function registerEmbeddables( embeddable: EmbeddableSetup, @@ -32,4 +34,8 @@ export function registerEmbeddables( EMBEDDABLE_PROFILING_SEARCH_BAR, new EmbeddableSearchBarFactory(getProfilingEmbeddableDependencies) ); + embeddable.registerEmbeddableFactory( + EMBEDDABLE_STACK_TRACES, + new EmbeddableStackTracesFactory(getProfilingEmbeddableDependencies) + ); } diff --git a/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces.tsx b/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces.tsx new file mode 100644 index 0000000000000..938a2c85810f4 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { Embeddable, EmbeddableOutput, IContainer } from '@kbn/embeddable-plugin/public'; +import { EMBEDDABLE_STACK_TRACES } from '@kbn/observability-shared-plugin/public'; +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { + ProfilingEmbeddableProvider, + ProfilingEmbeddablesDependencies, +} from '../profiling_embeddable_provider'; +import { EmbeddableStackTracesEmbeddableInput } from './embeddable_stack_traces_factory'; +import { StackTraces } from './stack_traces'; + +export class EmbeddableStackTraces extends Embeddable< + EmbeddableStackTracesEmbeddableInput, + EmbeddableOutput +> { + readonly type = EMBEDDABLE_STACK_TRACES; + private _domNode?: HTMLElement; + + constructor( + private deps: ProfilingEmbeddablesDependencies, + initialInput: EmbeddableStackTracesEmbeddableInput, + parent?: IContainer + ) { + super(initialInput, {}, parent); + } + + render(domNode: HTMLElement) { + this._domNode = domNode; + const props = this.input; + render( + +
+ +
+
, + domNode + ); + } + + public destroy() { + if (this._domNode) { + unmountComponentAtNode(this._domNode); + } + } + + reload() { + if (this._domNode) { + this.render(this._domNode); + } + } +} diff --git a/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces_factory.ts b/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces_factory.ts new file mode 100644 index 0000000000000..e079f1a7c4754 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/stack_traces/embeddable_stack_traces_factory.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + EmbeddableFactoryDefinition, + EmbeddableInput, + IContainer, +} from '@kbn/embeddable-plugin/public'; +import { EMBEDDABLE_STACK_TRACES } from '@kbn/observability-shared-plugin/public'; +import { TopNType } from '@kbn/profiling-utils'; +import { GetProfilingEmbeddableDependencies } from '../profiling_embeddable_provider'; + +interface EmbeddableStackTracesInput { + type: TopNType; + kuery: string; + rangeFrom: number; + rangeTo: number; + onClick: (category: string) => void; + onChartBrushEnd: (range: { rangeFrom: string; rangeTo: string }) => void; +} + +export type EmbeddableStackTracesEmbeddableInput = EmbeddableStackTracesInput & EmbeddableInput; + +export class EmbeddableStackTracesFactory + implements EmbeddableFactoryDefinition +{ + readonly type = EMBEDDABLE_STACK_TRACES; + + constructor(private getProfilingEmbeddableDependencies: GetProfilingEmbeddableDependencies) {} + + async isEditable() { + return false; + } + + async create(input: EmbeddableStackTracesEmbeddableInput, parent?: IContainer) { + const { EmbeddableStackTraces } = await import('./embeddable_stack_traces'); + const deps = await this.getProfilingEmbeddableDependencies(); + return new EmbeddableStackTraces(deps, input, parent); + } + + getDisplayName() { + return 'Universal Profiling Threads'; + } +} diff --git a/x-pack/plugins/profiling/public/embeddables/stack_traces/stack_traces.tsx b/x-pack/plugins/profiling/public/embeddables/stack_traces/stack_traces.tsx new file mode 100644 index 0000000000000..3205f04120012 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/stack_traces/stack_traces.tsx @@ -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 { StackTracesDisplayOption, TopNType } from '@kbn/profiling-utils'; +import React, { useState } from 'react'; +import { groupSamplesByCategory } from '../../../common/topn'; +import { useProfilingDependencies } from '../../components/contexts/profiling_dependencies/use_profiling_dependencies'; +import { StackTraces as StatelessStackTraces } from '../../components/stack_traces'; +import { AsyncStatus, useAsync } from '../../hooks/use_async'; +import { EmptyDataPrompt } from '../empty_data_prompt'; +import { ErrorPrompt } from '../error_prompt'; + +interface Props { + type: TopNType; + kuery: string; + rangeFrom: number; + rangeTo: number; + onClick: (category: string) => void; + onChartBrushEnd: (range: { rangeFrom: string; rangeTo: string }) => void; +} + +export function StackTraces({ type, kuery, rangeFrom, rangeTo, onClick, onChartBrushEnd }: Props) { + const { + services: { fetchTopN }, + } = useProfilingDependencies(); + const [displayOption, setDisplayOption] = useState(StackTracesDisplayOption.StackTraces); + + const rangeFromSec = rangeFrom / 1000; + const rangeToSec = rangeTo / 1000; + + const state = useAsync( + ({ http }) => { + return fetchTopN({ + http, + type, + timeFrom: rangeFromSec, + timeTo: rangeToSec, + kuery, + }).then(groupSamplesByCategory); + }, + [fetchTopN, type, rangeFromSec, rangeToSec, kuery] + ); + + if (state.error) { + return ; + } + + if (state.status === AsyncStatus.Settled && state.data?.charts.length === 0) { + return ; + } + + return ( + + ); +} diff --git a/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx b/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx index ece12c6527cb7..4353305a88c39 100644 --- a/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx +++ b/x-pack/plugins/profiling/public/views/stack_traces_view/index.tsx @@ -4,24 +4,19 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiButton, EuiButtonGroup, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import React from 'react'; -import { StackTracesDisplayOption, TopNType } from '@kbn/profiling-utils'; -import { groupSamplesByCategory, TopNResponse } from '../../../common/topn'; +import { groupSamplesByCategory } from '../../../common/topn'; +import { useProfilingDependencies } from '../../components/contexts/profiling_dependencies/use_profiling_dependencies'; +import { ProfilingAppPageTemplate } from '../../components/profiling_app_page_template'; +import { StackTraces } from '../../components/stack_traces'; import { useProfilingParams } from '../../hooks/use_profiling_params'; import { useProfilingRouter } from '../../hooks/use_profiling_router'; import { useProfilingRoutePath } from '../../hooks/use_profiling_route_path'; import { useTimeRange } from '../../hooks/use_time_range'; import { useTimeRangeAsync } from '../../hooks/use_time_range_async'; -import { AsyncComponent } from '../../components/async_component'; -import { ChartGrid } from '../../components/chart_grid'; -import { useProfilingDependencies } from '../../components/contexts/profiling_dependencies/use_profiling_dependencies'; -import { ProfilingAppPageTemplate } from '../../components/profiling_app_page_template'; -import { StackedBarChart } from '../../components/stacked_bar_chart'; +import { RouteBreadcrumb } from '../../routing/route_breadcrumb'; import { getStackTracesTabs } from './get_stack_traces_tabs'; import { getTracesViewRouteParams } from './utils'; -import { RouteBreadcrumb } from '../../routing/route_breadcrumb'; export function StackTracesView() { const routePath = useProfilingRoutePath(); @@ -64,26 +59,12 @@ export function StackTracesView() { timeFrom: timeRange.inSeconds.start, timeTo: timeRange.inSeconds.end, kuery, - }).then((response: TopNResponse) => { - const totalCount = response.TotalCount; - const samples = response.TopN; - const charts = groupSamplesByCategory({ - samples, - totalCount, - metadata: response.Metadata, - labels: response.Labels, - }); - return { - charts, - }; - }); + }).then(groupSamplesByCategory); }, [topNType, timeRange.inSeconds.start, timeRange.inSeconds.end, fetchTopN, kuery] ); - const { data } = state; - - function onStackedBarClick(category: string) { + function onChartClick(category: string) { profilingRouter.push( '/stacktraces/{topNType}', getTracesViewRouteParams({ query, topNType: path.topNType, category }) @@ -93,101 +74,41 @@ export function StackTracesView() { return ( - - - - - - { - profilingRouter.push(routePath, { - path, - query: { - ...query, - displayAs: nextValue, - }, - }); - }} - options={[ - { - id: StackTracesDisplayOption.StackTraces, - iconType: 'visLine', - label: i18n.translate( - 'xpack.profiling.stackTracesView.stackTracesCountButton', - { - defaultMessage: 'Stack traces', - } - ), - }, - { - id: StackTracesDisplayOption.Percentage, - iconType: 'percent', - label: i18n.translate('xpack.profiling.stackTracesView.percentagesButton', { - defaultMessage: 'Percentages', - }), - }, - ]} - legend={i18n.translate('xpack.profiling.stackTracesView.displayOptionLegend', { - defaultMessage: 'Display option', - })} - /> - - - - { - profilingRouter.push(routePath, { - path, - query: { - ...query, - rangeFrom: nextRange.rangeFrom, - rangeTo: nextRange.rangeTo, - }, - }); - }} - showFrames={topNType === TopNType.Traces} - onClick={topNType === TopNType.Threads ? onStackedBarClick : undefined} - /> - - - - - - - - - - - {(data?.charts.length ?? 0) > limit && ( - - { - profilingRouter.push(routePath, { - path, - query: { - ...query, - limit: limit + 10, - }, - }); - }} - > - {i18n.translate('xpack.profiling.stackTracesView.showMoreButton', { - defaultMessage: 'Show more', - })} - - - )} - + { + profilingRouter.push(routePath, { + path, + query: { + ...query, + displayAs: nextValue, + }, + }); + }} + onStackedBarChartBrushEnd={(nextRange) => { + profilingRouter.push(routePath, { + path, + query: { + ...query, + rangeFrom: nextRange.rangeFrom, + rangeTo: nextRange.rangeTo, + }, + }); + }} + onShowMoreClick={() => { + profilingRouter.push(routePath, { + path, + query: { + ...query, + limit: limit + 10, + }, + }); + }} + /> ); diff --git a/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js b/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js index eed0f041ca8d2..fa13749a65801 100644 --- a/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js +++ b/x-pack/plugins/remote_clusters/__jest__/client_integration/list/remote_clusters_list.test.js @@ -208,6 +208,7 @@ describe('', () => { hasDeprecatedProxySetting: true, seeds: null, connectedNodesCount: null, + securityModel: 'api_keys', }); const remoteClusters = [remoteCluster1, remoteCluster2, remoteCluster3]; @@ -246,6 +247,7 @@ describe('', () => { 'Connected', 'default', remoteCluster1.seeds.join(', '), + 'CertificateInfo', remoteCluster1.connectedNodesCount.toString(), '', // Empty because the last column is for the "actions" on the resource ], @@ -255,6 +257,7 @@ describe('', () => { 'Not connected', PROXY_MODE, remoteCluster2.proxyAddress, + 'CertificateInfo', remoteCluster2.connectedSocketsCount.toString(), '', ], @@ -264,6 +267,7 @@ describe('', () => { 'Not connected', PROXY_MODE, remoteCluster2.proxyAddress, + 'api_keysInfo', remoteCluster2.connectedSocketsCount.toString(), '', ], @@ -278,13 +282,18 @@ describe('', () => { }); test('should have a tooltip to indicate that the cluster has a deprecated setting', () => { - const secondRow = rows[2].reactWrapper; // The third cluster has been defined with deprecated setting + const thirdRow = rows[2].reactWrapper; // The third cluster has been defined with deprecated setting expect( - findTestSubject(secondRow, 'remoteClustersTableListClusterWithDeprecatedSettingTooltip') + findTestSubject(thirdRow, 'remoteClustersTableListClusterWithDeprecatedSettingTooltip') .length ).toBe(1); }); + test('should have a tooltip to indicate that the cluster is using an old security model', () => { + const secondRow = rows[1].reactWrapper; + expect(findTestSubject(secondRow, 'authenticationTypeWarning').length).toBe(1); + }); + describe('bulk delete button', () => { test('should be visible when a remote cluster is selected', () => { expect(exists('remoteClusterBulkDeleteButton')).toBe(false); @@ -442,6 +451,11 @@ describe('', () => { actions.clickRemoteClusterAt(1); // the remoteCluster2 has been configured by node expect(exists('remoteClusterConfiguredByNodeWarning')).toBe(true); }); + + test('Should display authentication type', () => { + actions.clickRemoteClusterAt(2); + expect(exists('remoteClusterDetailAuthType')).toBe(true); + }); }); }); }); diff --git a/x-pack/plugins/remote_clusters/common/constants.ts b/x-pack/plugins/remote_clusters/common/constants.ts index 09cd79104d140..1357de2cd4640 100644 --- a/x-pack/plugins/remote_clusters/common/constants.ts +++ b/x-pack/plugins/remote_clusters/common/constants.ts @@ -26,3 +26,19 @@ export const API_BASE_PATH = '/api/remote_clusters'; export const SNIFF_MODE = 'sniff'; export const PROXY_MODE = 'proxy'; + +export const getSecurityModel = (type: string) => { + if (type === 'certificate') { + return i18n.translate('xpack.remoteClusters.securityModelCert', { + defaultMessage: 'Certificate', + }); + } + + if (type === 'api_key') { + return i18n.translate('xpack.remoteClusters.securityModelApiKey', { + defaultMessage: 'API key', + }); + } + + return type; +}; diff --git a/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js b/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js index d750636b76234..89f14b53c980c 100644 --- a/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js +++ b/x-pack/plugins/remote_clusters/fixtures/remote_cluster.js @@ -19,6 +19,7 @@ export const getRemoteClusterMock = ({ mode = SNIFF_MODE, proxyAddress, hasDeprecatedProxySetting = false, + securityModel = 'certificate', } = {}) => ({ name, seeds, @@ -32,4 +33,5 @@ export const getRemoteClusterMock = ({ connectedSocketsCount, proxyAddress, hasDeprecatedProxySetting, + securityModel, }); diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js index 7bbc9ede4c4df..3776e66a073ff 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/index.js @@ -7,3 +7,4 @@ export { ConnectionStatus } from './connection_status'; export { RemoveClusterButtonProvider } from './remove_cluster_button_provider'; +export { SecurityModel } from './security_model'; diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts similarity index 83% rename from x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts rename to x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts index e08d973f8df0e..831de5cf899c8 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ml_model/common.ts +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { getAsset } from '../../archive'; +export { SecurityModel } from './security_model'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx new file mode 100644 index 0000000000000..c368493dbfd6c --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/components/security_model/security_model.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiText, EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; + +import { getSecurityModel } from '../../../../../../common/constants'; +import { Cluster } from '../../../../../../common/lib/cluster_serialization'; + +export function SecurityModel({ securityModel }: { securityModel: Cluster['securityModel'] }) { + return ( + + + + {getSecurityModel(securityModel)} + + + + {securityModel !== 'api_key' && ( + + + } + /> + + )} + + ); +} diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js index 83e59f0f28d66..0caf89a6dea38 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js @@ -34,7 +34,7 @@ import { import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { PROXY_MODE } from '../../../../../common/constants'; import { ConfiguredByNodeWarning } from '../../components'; -import { ConnectionStatus, RemoveClusterButtonProvider } from '../components'; +import { ConnectionStatus, RemoveClusterButtonProvider, SecurityModel } from '../components'; import { getRouter } from '../../../services'; import { proxyModeUrl } from '../../../services/documentation'; @@ -181,6 +181,7 @@ export class DetailPanel extends Component { maxConnectionsPerCluster, initialConnectTimeout, mode, + securityModel, }) { return ( @@ -198,6 +199,18 @@ export class DetailPanel extends Component { + + + + + + + + + @@ -297,6 +311,18 @@ export class DetailPanel extends Component { + + + + + + + + + { if (queryText) { @@ -249,6 +249,16 @@ export class RemoteClusterTable extends Component { return connectionMode; }, }, + { + field: 'securityModel', + name: i18n.translate('xpack.remoteClusters.remoteClusterList.table.authTypeColumnTitle', { + defaultMessage: 'Authentication type', + }), + sortable: true, + render: (securityModel) => { + return ; + }, + }, { field: 'mode', name: i18n.translate( diff --git a/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts b/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts index a88abae999be0..ca25b13990dc8 100644 --- a/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts +++ b/x-pack/plugins/reporting/server/routes/common/jobs/get_job_routes.ts @@ -81,17 +81,43 @@ export const commonJobsRouteHandlerFactory = (reporting: ReportingCore) => { return jobManagementPreRouting(reporting, res, docId, user, counters, async (doc) => { const docIndex = doc.index; const stream = await getContentStream(reporting, { id: docId, index: docIndex }); - /** @note Overwriting existing content with an empty buffer to remove all the chunks. */ - await new Promise((resolve) => { - stream.end('', 'utf8', () => { - resolve(); - }); + const reportingSetup = reporting.getPluginSetupDeps(); + const logger = reportingSetup.logger.get('delete-report'); + + // An "error" event is emitted if an error is + // passed to the `stream.end` callback from + // the _final method of the ContentStream. + // This event must be handled. + stream.on('error', (err) => { + logger.error(err); }); - await jobsQuery.delete(docIndex, docId); - return res.ok({ - body: { deleted: true }, - }); + try { + // Overwriting existing content with an + // empty buffer to remove all the chunks. + await new Promise((resolve, reject) => { + stream.end('', 'utf8', (error?: Error) => { + if (error) { + // handle error that could be thrown + // from the _write method of the ContentStream + reject(error); + } else { + resolve(); + } + }); + }); + + await jobsQuery.delete(docIndex, docId); + + return res.ok({ + body: { deleted: true }, + }); + } catch (error) { + logger.error(error); + return res.customError({ + statusCode: 500, + }); + } }); }; diff --git a/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts b/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts index decc2300026e3..6fe086f33faa5 100644 --- a/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/internal/management/integration_tests/jobs.test.ts @@ -36,7 +36,7 @@ import { registerJobInfoRoutesInternal as registerJobInfoRoutes } from '../jobs' type SetupServerReturn = Awaited>; -describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { +describe(`Reporting Job Management Routes: Internal`, () => { const reportingSymbol = Symbol('reporting'); let server: SetupServerReturn['server']; let usageCounter: IUsageCounter; @@ -144,148 +144,148 @@ describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { await server.stop(); }); - it('fails on malformed download IDs', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutes(core); + describe('download report', () => { + it('fails on malformed download IDs', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) - .expect(400) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot( - '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' - ) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) + .expect(400) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot( + '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' + ) + ); + }); - it('fails on unauthenticated users', async () => { - mockStartDeps = await createMockPluginStart( - { - licensing: { - ...licensingMock.createStart(), - license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + it('fails on unauthenticated users', async () => { + mockStartDeps = await createMockPluginStart( + { + licensing: { + ...licensingMock.createStart(), + license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + }, + security: { authc: { getCurrentUser: () => undefined } }, }, - security: { authc: { getCurrentUser: () => undefined } }, - }, - mockConfigSchema - ); - core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); - registerJobInfoRoutes(core); + mockConfigSchema + ); + core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) - .expect(401) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) + .expect(401) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) + ); + }); - it('returns 404 if job not found', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutes(core); + it('returns 404 if job not found', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(404); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(404); + }); - it('returns a 403 if not a valid job type', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'invalidJobType', - payload: { title: 'invalid!' }, - }) - ); - registerJobInfoRoutes(core); + it('returns a 403 if not a valid job type', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'invalidJobType', + payload: { title: 'invalid!' }, + }) + ); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(403); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(403); + }); - it(`returns job's info`, async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: mockJobTypeBase64Encoded, - payload: {}, // payload is irrelevant - }) - ); + it(`returns job's info`, async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: mockJobTypeBase64Encoded, + payload: {}, // payload is irrelevant + }) + ); - registerJobInfoRoutes(core); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) - .expect(200); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) + .expect(200); + }); - it(`returns 403 if a user cannot view a job's info`, async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'customForbiddenJobType', - payload: {}, // payload is irrelevant - }) - ); + it(`returns 403 if a user cannot view a job's info`, async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'customForbiddenJobType', + payload: {}, // payload is irrelevant + }) + ); - registerJobInfoRoutes(core); + registerJobInfoRoutes(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) - .expect(403); - }); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.INFO_PREFIX}/test`) + .expect(403); + }); - it('when a job is incomplete', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: mockJobTypeUnencoded, - status: 'pending', - payload: { title: 'incomplete!' }, - }) - ); - registerJobInfoRoutes(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(503) - .expect('Content-Type', 'text/plain; charset=utf-8') - .expect('Retry-After', '30') - .then(({ text }) => expect(text).toEqual('pending')); - }); + it('when a job is incomplete', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: mockJobTypeUnencoded, + status: 'pending', + payload: { title: 'incomplete!' }, + }) + ); + registerJobInfoRoutes(core); - it('when a job fails', async () => { - mockEsClient.search.mockResponse( - getHits({ - jobtype: mockJobTypeUnencoded, - status: 'failed', - output: { content: 'job failure message' }, - payload: { title: 'failing job!' }, - }) - ); - registerJobInfoRoutes(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(500) - .expect('Content-Type', 'application/json; charset=utf-8') - .then(({ body }) => - expect(body.message).toEqual('Reporting generation failed: job failure message') + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(503) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Retry-After', '30') + .then(({ text }) => expect(text).toEqual('pending')); + }); + + it('when a job fails', async () => { + mockEsClient.search.mockResponse( + getHits({ + jobtype: mockJobTypeUnencoded, + status: 'failed', + output: { content: 'job failure message' }, + payload: { title: 'failing job!' }, + }) ); - }); + registerJobInfoRoutes(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8') + .then(({ body }) => + expect(body.message).toEqual('Reporting generation failed: job failure message') + ); + }); - describe('successful downloads', () => { it('when a known job-type is complete', async () => { mockEsClient.search.mockResponseOnce(getCompleteHits()); registerJobInfoRoutes(core); @@ -483,4 +483,28 @@ describe(`GET ${INTERNAL_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { }); }); }); + + describe('delete report', () => { + it('handles content stream errors', async () => { + stream = new Readable({ + read() { + this.push('test'); + this.push(null); + }, + }) as typeof stream; + stream.end = jest.fn().mockImplementation((_name, _encoding, callback) => { + callback(new Error('An error occurred in ending the content stream')); + }); + + (getContentStream as jest.MockedFunction).mockResolvedValue(stream); + mockEsClient.search.mockResponseOnce(getCompleteHits()); + registerJobInfoRoutes(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .delete(`${INTERNAL_ROUTES.JOBS.DELETE_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8'); + }); + }); }); diff --git a/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts b/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts index b301b1546dabf..1d2ef78cf60e3 100644 --- a/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/public/integration_tests/jobs.test.ts @@ -36,7 +36,7 @@ import { registerJobInfoRoutesPublic } from '../jobs'; type SetupServerReturn = Awaited>; -describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { +describe(`Reporting Job Management Routes: Public`, () => { const reportingSymbol = Symbol('reporting'); let server: SetupServerReturn['server']; let usageCounter: IUsageCounter; @@ -135,114 +135,114 @@ describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { await server.stop(); }); - it('fails on malformed download IDs', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutesPublic(core); + describe('download report', () => { + it('fails on malformed download IDs', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutesPublic(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) - .expect(400) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot( - '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' - ) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/1`) + .expect(400) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot( + '"[request params.docId]: value has length [1] but it must have a minimum length of [3]."' + ) + ); + }); - it('fails on unauthenticated users', async () => { - mockStartDeps = await createMockPluginStart( - { - licensing: { - ...licensingMock.createStart(), - license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + it('fails on unauthenticated users', async () => { + mockStartDeps = await createMockPluginStart( + { + licensing: { + ...licensingMock.createStart(), + license$: new BehaviorSubject({ isActive: true, isAvailable: true, type: 'gold' }), + }, + security: { authc: { getCurrentUser: () => undefined } }, }, - security: { authc: { getCurrentUser: () => undefined } }, - }, - mockConfigSchema - ); - core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); - registerJobInfoRoutesPublic(core); + mockConfigSchema + ); + core = await createMockReportingCore(mockConfigSchema, mockSetupDeps, mockStartDeps); + registerJobInfoRoutesPublic(core); - await server.start(); + await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) - .expect(401) - .then(({ body }) => - expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) - ); - }); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dope`) + .expect(401) + .then(({ body }) => + expect(body.message).toMatchInlineSnapshot(`"Sorry, you aren't authenticated"`) + ); + }); + + it('returns 404 if job not found', async () => { + mockEsClient.search.mockResponseOnce(getHits()); + registerJobInfoRoutesPublic(core); - it('returns 404 if job not found', async () => { - mockEsClient.search.mockResponseOnce(getHits()); - registerJobInfoRoutesPublic(core); + await server.start(); - await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(404); + }); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(404); - }); + it('returns a 403 if not a valid job type', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'invalidJobType', + payload: { title: 'invalid!' }, + }) + ); + registerJobInfoRoutesPublic(core); - it('returns a 403 if not a valid job type', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'invalidJobType', - payload: { title: 'invalid!' }, - }) - ); - registerJobInfoRoutesPublic(core); + await server.start(); - await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) + .expect(403); + }); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/poo`) - .expect(403); - }); + it('when a job is incomplete', async () => { + mockEsClient.search.mockResponseOnce( + getHits({ + jobtype: 'unencodedJobType', + status: 'pending', + payload: { title: 'incomplete!' }, + }) + ); + registerJobInfoRoutesPublic(core); - it('when a job is incomplete', async () => { - mockEsClient.search.mockResponseOnce( - getHits({ - jobtype: 'unencodedJobType', - status: 'pending', - payload: { title: 'incomplete!' }, - }) - ); - registerJobInfoRoutesPublic(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(503) - .expect('Content-Type', 'text/plain; charset=utf-8') - .expect('Retry-After', '30') - .then(({ text }) => expect(text).toEqual('pending')); - }); + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(503) + .expect('Content-Type', 'text/plain; charset=utf-8') + .expect('Retry-After', '30') + .then(({ text }) => expect(text).toEqual('pending')); + }); - it('when a job fails', async () => { - mockEsClient.search.mockResponse( - getHits({ - jobtype: 'unencodedJobType', - status: 'failed', - output: { content: 'job failure message' }, - payload: { title: 'failing job!' }, - }) - ); - registerJobInfoRoutesPublic(core); - - await server.start(); - await supertest(httpSetup.server.listener) - .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) - .expect(500) - .expect('Content-Type', 'application/json; charset=utf-8') - .then(({ body }) => - expect(body.message).toEqual('Reporting generation failed: job failure message') + it('when a job fails', async () => { + mockEsClient.search.mockResponse( + getHits({ + jobtype: 'unencodedJobType', + status: 'failed', + output: { content: 'job failure message' }, + payload: { title: 'failing job!' }, + }) ); - }); + registerJobInfoRoutesPublic(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .get(`${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}/dank`) + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8') + .then(({ body }) => + expect(body.message).toEqual('Reporting generation failed: job failure message') + ); + }); - describe('successful downloads', () => { it('when a known job-type is complete', async () => { mockEsClient.search.mockResponseOnce(getCompleteHits()); registerJobInfoRoutesPublic(core); @@ -292,4 +292,28 @@ describe(`GET ${PUBLIC_ROUTES.JOBS.DOWNLOAD_PREFIX}`, () => { }); }); }); + + describe('delete report', () => { + it('handles content stream errors', async () => { + stream = new Readable({ + read() { + this.push('test'); + this.push(null); + }, + }) as typeof stream; + stream.end = jest.fn().mockImplementation((_name, _encoding, callback) => { + callback(new Error('An error occurred in ending the content stream')); + }); + + (getContentStream as jest.MockedFunction).mockResolvedValue(stream); + mockEsClient.search.mockResponseOnce(getCompleteHits()); + registerJobInfoRoutesPublic(core); + + await server.start(); + await supertest(httpSetup.server.listener) + .delete('/api/reporting/jobs/delete/denk') + .expect(500) + .expect('Content-Type', 'application/json; charset=utf-8'); + }); + }); }); diff --git a/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts b/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts index 1fc87b7e8b3ea..5e1b5fc771d6d 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/fetch.test.ts @@ -8,7 +8,7 @@ import mockFs from 'mock-fs'; import axios from 'axios'; import { createHash } from 'crypto'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { resolve as resolvePath } from 'path'; import { Readable } from 'stream'; import { fetch } from './fetch'; @@ -38,7 +38,7 @@ describe('fetch', () => { test('downloads the url to the path', async () => { await fetch('url', TEMP_FILE); - expect(readFileSync(TEMP_FILE, 'utf8')).toEqual('foobar'); + await expect(readFile(TEMP_FILE, 'utf8')).resolves.toBe('foobar'); }); test('returns the sha1 hex hash of the http body', async () => { diff --git a/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts b/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts index 871eee46c2180..6b05337147c0a 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/fetch.ts @@ -7,7 +7,8 @@ import Axios from 'axios'; import { createHash } from 'crypto'; -import { closeSync, mkdirSync, openSync, writeSync } from 'fs'; +import { mkdir, open } from 'fs/promises'; +import { writeSync } from 'fs'; import { dirname } from 'path'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; @@ -21,9 +22,8 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise const hash = createHash('sha256'); - mkdirSync(dirname(path), { recursive: true }); - const handle = openSync(path, 'w'); - + await mkdir(dirname(path), { recursive: true }); + const handle = await open(path, 'w'); try { const response = await Axios.request({ url, @@ -32,7 +32,7 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise }); response.data.on('data', (chunk: Buffer) => { - writeSync(handle, chunk); + writeSync(handle.fd, chunk); hash.update(chunk); }); @@ -43,7 +43,7 @@ export async function fetch(url: string, path: string, logger?: Logger): Promise throw new Error(`Unable to download ${url}: ${error}`); } finally { - closeSync(handle); + await handle.close(); } return hash.digest('hex'); diff --git a/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts b/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts index 303462fc533db..96d9bd0299327 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/index.test.ts @@ -7,7 +7,7 @@ import path from 'path'; import mockFs from 'mock-fs'; -import { existsSync, readdirSync } from 'fs'; +import { access, readdir } from 'fs/promises'; import { ChromiumArchivePaths, PackageInfo } from '../chromium'; import { fetch } from './fetch'; import { sha256 } from './checksum'; @@ -55,8 +55,8 @@ describe('ensureDownloaded', () => { await download(paths, pkg); - expect(existsSync(unexpectedPath1)).toBe(false); - expect(existsSync(unexpectedPath2)).toBe(false); + await expect(access(unexpectedPath1)).rejects.toThrow(); + await expect(access(unexpectedPath2)).rejects.toThrow(); }); it('should reject when download fails', async () => { @@ -84,14 +84,14 @@ describe('ensureDownloaded', () => { await download(paths, pkg); expect(fetch).not.toHaveBeenCalled(); - expect(readdirSync(path.resolve(`${paths.archivesPath}/x64`))).toEqual( + await expect(readdir(path.resolve(`${paths.archivesPath}/x64`))).resolves.toEqual( expect.arrayContaining([ 'chrome-mac.zip', 'chrome-win.zip', expect.stringMatching(/^chromium-[0-9a-f]{7}-locales-linux_x64\.zip$/), ]) ); - expect(readdirSync(path.resolve(`${paths.archivesPath}/arm64`))).toEqual( + await expect(readdir(path.resolve(`${paths.archivesPath}/arm64`))).resolves.toEqual( expect.arrayContaining([ 'chrome-mac.zip', expect.stringMatching(/^chromium-[0-9a-f]{7}-locales-linux_arm64\.zip$/), diff --git a/x-pack/plugins/screenshotting/server/browsers/download/index.ts b/x-pack/plugins/screenshotting/server/browsers/download/index.ts index fe6e8c632ebdb..bef22c7c2196a 100644 --- a/x-pack/plugins/screenshotting/server/browsers/download/index.ts +++ b/x-pack/plugins/screenshotting/server/browsers/download/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { existsSync } from 'fs'; +import { access } from 'fs/promises'; import del from 'del'; import type { Logger } from '@kbn/core/server'; import type { ChromiumArchivePaths, PackageInfo } from '../chromium'; @@ -42,7 +42,13 @@ export async function download( const resolvedPath = paths.resolvePath(pkg); const foundChecksum = await sha256(resolvedPath).catch(() => 'MISSING'); - const pathExists = existsSync(resolvedPath); + let pathExists = null; + try { + await access(resolvedPath); + pathExists = true; + } catch (e) { + pathExists = false; + } if (pathExists && foundChecksum === archiveChecksum) { logger?.debug( `Browser archive for ${pkg.platform}/${pkg.architecture} already found in ${resolvedPath} with matching checksum.` diff --git a/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts b/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts index 4af457a0c3a6e..08eac21450f26 100644 --- a/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts +++ b/x-pack/plugins/screenshotting/server/browsers/extract/unzip.test.ts @@ -6,7 +6,7 @@ */ import mockFs from 'mock-fs'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { ExtractError } from './extract_error'; import { unzip } from './unzip'; @@ -28,7 +28,7 @@ describe('unzip', () => { it('should extract zipped contents', async () => { await unzip('/test.zip', '/output'); - expect(readFileSync('/output/test.txt').toString()).toEqual('test'); + await expect(readFile('/output/test.txt', 'utf8')).resolves.toBe('test'); }); it('should reject on invalid archive', async () => { diff --git a/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts b/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts index ccd8761c031b2..606b302fc8559 100644 --- a/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts +++ b/x-pack/plugins/searchprofiler/public/application/lib/check_for_json_errors.test.ts @@ -12,7 +12,7 @@ describe('checkForParseErrors', function () { it('returns error from bad JSON', function () { const json = '{"foo": {"bar": {"baz": "buzz}}}'; const result = checkForParseErrors(json); - expect(result.error.message).to.be(`Unexpected end of JSON input`); + expect(result.error.message).to.be(`Unterminated string in JSON at position 32`); }); it('returns parsed value from good JSON', function () { diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 805192aed8a9f..2b34532e4e848 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -158,6 +158,11 @@ export const allowedExperimentalValues = Object.freeze({ * version and the latest available version. */ jsonPrebuiltRulesDiffingEnabled: true, + /* + * Disables discover esql tab within timeline + * + */ + timelineEsqlTabDisabled: false, }); type ExperimentalConfigKeys = Array; diff --git a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx index fe2c23b8f60b1..94ff2b7b39e85 100644 --- a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx @@ -36,6 +36,7 @@ import { } from '../../timelines/store/actions'; import { useDiscoverInTimelineContext } from '../../common/components/discover_in_timeline/use_discover_in_timeline_context'; import { useShowTimeline } from '../../common/utils/timeline/use_show_timeline'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; export interface SendToTimelineButtonProps { asEmptyButton: boolean; @@ -60,6 +61,8 @@ export const SendToTimelineButton: React.FunctionComponent sourcererSelectors.getSourcererDataViewsSelector(), [] @@ -226,6 +229,13 @@ export const SendToTimelineButton: React.FunctionComponent { const dispatch = useDispatch(); + const isEsqlTabDisabled = useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); + const onInitialize = useCallback( (initialState: TimelineUrl | null) => { if (initialState != null) { queryTimelineById({ - activeTimelineTab: initialState.activeTab, + activeTimelineTab: + initialState.activeTab === TimelineTabs.esql && isEsqlTabDisabled + ? TimelineTabs.query + : initialState.activeTab, duplicate: false, graphEventId: initialState.graphEventId, timelineId: initialState.id, @@ -38,7 +45,7 @@ export const useInitTimelineFromUrlParam = () => { }); } }, - [dispatch] + [dispatch, isEsqlTabDisabled] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index 2b195eb11fe3c..2d4d493c5f8ca 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -24,6 +24,7 @@ import styled from 'styled-components'; import { ALERT_WORKFLOW_ASSIGNEE_IDS } from '@kbn/rule-data-utils'; import { TableId } from '@kbn/securitysolution-data-table'; +import { URL_PARAM_KEY } from '../../../../common/hooks/use_url_state'; import type { GetFieldsData } from '../../../../common/hooks/use_get_fields_data'; import { Assignees } from '../../../../flyout/document_details/right/components/assignees'; import { useAssistantAvailability } from '../../../../assistant/use_assistant_availability'; @@ -107,6 +108,9 @@ export const ExpandableEventTitle = React.memo( _index: eventIndex, timestamp, }); + const urlModifier = (value: string) => { + return `${value}&${URL_PARAM_KEY.eventFlyout}=(preview:!(),rightPanel:(id:document-details-right,params:(id:${eventId},indexName:${eventIndex},scopeId:${scopeId})))`; + }; const { refetch } = useRefetchByScope({ scopeId }); const alertAssignees = useMemo( @@ -160,7 +164,7 @@ export const ExpandableEventTitle = React.memo( )} {isAlert && alertDetailsLink && ( - + {(copy) => ( = ({ sessionViewConfig, timelineDescription, }) => { + const isEsqlTabInTimelineDisabled = useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); const isEsqlSettingEnabled = useKibana().services.configSettings.ESQLEnabled; const { hasAssistantPrivilege } = useAssistantAvailability(); const dispatch = useDispatch(); @@ -404,7 +406,7 @@ const TabsContentComponent: React.FC = ({ {i18n.QUERY_TAB} {showTimeline && } - {isEsqlSettingEnabled && ( + {!isEsqlTabInTimelineDisabled && isEsqlSettingEnabled && ( => { const ruleName = 'Promote SentinelOne alerts'; - const sentinelOneAlertsIndexPattern = 'logs-sentinel_one.alert'; + const sentinelOneAlertsIndexPattern = 'logs-sentinel_one.alert*'; const ruleQueryValue = 'observer.serial_number:*'; const { data } = await findRules(kbnClient, { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts index f383a9d11cc00..da4f9e67d7b8f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/import_rules/route.test.ts @@ -167,7 +167,7 @@ describe('Import rules route', () => { errors: [ { error: { - message: 'Unexpected token h in JSON at position 1', + message: `Unexpected token 'h', "this is not"... is not valid JSON`, status_code: 400, }, rule_id: '(unknown id)', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts index b6cffd47a494e..5e37f161c3dde 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/create_rules_stream_from_ndjson.test.ts @@ -234,7 +234,9 @@ describe('create_rules_stream_from_ndjson', () => { type: 'query', immutable: false, }); - expect(resultOrError[1].message).toEqual('Unexpected token , in JSON at position 1'); + expect(resultOrError[1].message).toEqual( + `Expected property name or '}' in JSON at position 1` + ); expect(resultOrError[2]).toEqual({ rule_id: 'rule-2', output_index: '.siem-signals', diff --git a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx index 2cca4b3ea7892..5be456cfd5f3c 100644 --- a/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx +++ b/x-pack/plugins/serverless_observability/public/components/side_navigation/index.tsx @@ -32,13 +32,20 @@ const navigationTree: NavigationTreeDefinition = { title: i18n.translate('xpack.serverlessObservability.nav.discover', { defaultMessage: 'Discover', }), - link: 'discover', + link: 'observability-log-explorer', + // prevent this entry from ever becoming active, effectively falling through to the obs-log-explorer child + getIsActive: () => false, + // avoid duplicate "Discover" breadcrumbs + breadcrumbStatus: 'hidden', renderAs: 'item', children: [ { - // This is to show "observability-log-explorer" breadcrumbs when navigating from "discover" to "log explorer" - link: 'observability-log-explorer', - sideNavStatus: 'hidden', + link: 'discover', + children: [ + { + link: 'observability-log-explorer', + }, + ], }, ], }, diff --git a/x-pack/plugins/serverless_search/common/doc_links.ts b/x-pack/plugins/serverless_search/common/doc_links.ts index 7168f089c41e1..b222165f22359 100644 --- a/x-pack/plugins/serverless_search/common/doc_links.ts +++ b/x-pack/plugins/serverless_search/common/doc_links.ts @@ -10,7 +10,6 @@ import { DocLinks } from '@kbn/doc-links'; class ESDocLinks { public apiIntro: string = ''; public beats: string = ''; - public connectors: string = ''; public integrations: string = ''; public kibanaFeedback: string = ''; public kibanaRunApiInConsole: string = ''; @@ -20,6 +19,10 @@ class ESDocLinks { public securityApis: string = ''; public ingestionPipelines: string = ''; public dataStreams: string = ''; + // Connectors links + public connectors: string = ''; + public connectorsRunFromSource: string = ''; + public connectorsRunWithDocker: string = ''; // Client links public elasticsearchClients: string = ''; // go @@ -55,7 +58,6 @@ class ESDocLinks { this.integrations = newDocLinks.serverlessSearch.integrations; this.logstash = newDocLinks.serverlessSearch.integrationsLogstash; this.beats = newDocLinks.serverlessSearch.integrationsBeats; - this.connectors = newDocLinks.serverlessSearch.integrationsConnectorClient; this.kibanaFeedback = newDocLinks.kibana.feedback; this.kibanaRunApiInConsole = newDocLinks.console.serverlessGuide; this.metadata = newDocLinks.security.mappingRoles; @@ -64,6 +66,12 @@ class ESDocLinks { this.ingestionPipelines = newDocLinks.ingest.pipelines; this.dataStreams = newDocLinks.elasticsearch.dataStreams; + // Connectors links + this.connectors = newDocLinks.serverlessSearch.integrationsConnectorClient; + this.connectorsRunFromSource = + newDocLinks.serverlessSearch.integrationsConnectorClientRunFromSource; + this.connectorsRunWithDocker = + newDocLinks.serverlessSearch.integrationsConnectorClientRunWithDocker; // Client links this.elasticsearchClients = newDocLinks.serverlessClients.clientLib; // Go diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx index 45f43a2b72b35..f6c039e2359aa 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_link.tsx @@ -67,7 +67,8 @@ export const ConnectorLinkElasticsearch: React.FC {i18n.translate('xpack.serverlessSearch.connectors.runWithDockerLink', { @@ -81,7 +82,8 @@ export const ConnectorLinkElasticsearch: React.FC {i18n.translate('xpack.serverlessSearch.connectors.runFromSourceLink', { diff --git a/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts b/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts index 081918673d82a..794a9c466906f 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/migrations.test.ts @@ -282,7 +282,7 @@ describe('handles errors during migrations', () => { migration800(taskInstance, migrationContext); }).toThrowError(); expect(migrationContext.log.error).toHaveBeenCalledWith( - `savedObject 8.0.0 migration failed for task instance ${taskInstance.id} with error: Unexpected token s in JSON at position 2`, + `savedObject 8.0.0 migration failed for task instance ${taskInstance.id} with error: Expected property name or '}' in JSON at position 2`, { migrations: { taskInstanceDocument: { diff --git a/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts b/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts deleted file mode 100644 index 6d06d3215a895..0000000000000 --- a/x-pack/plugins/transform/public/app/common/constants/validation_messages.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const numberRangeMinus1To100NotValidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage', - { - defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', - } -); - -export const numberRange10To10000NotValidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage', - { - defaultMessage: 'Value needs to be an integer between 10 and 10000.', - } -); - -export const pageSearchSizeInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage', - { - defaultMessage: 'Maximum page search size needs to be an integer between 10 and 65536.', - } -); - -// Retention policy max age validator -export const retentionPolicyMaxAgeInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage', - { - defaultMessage: 'Invalid max age format. Minimum of 60s required.', - } -); - -// xpack.transform.transformList.numberOfRetriesInvalidErrorMessage -export const numberOfRetriesInvalidErrorMessage = i18n.translate( - 'xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage', - { - defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', - } -); diff --git a/x-pack/plugins/transform/public/app/common/validators.test.ts b/x-pack/plugins/transform/public/app/common/validators.test.ts deleted file mode 100644 index 324ce7f8255e1..0000000000000 --- a/x-pack/plugins/transform/public/app/common/validators.test.ts +++ /dev/null @@ -1,165 +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 { - continuousModeDelayValidator, - jsonStringValidator, - parseDuration, - retentionPolicyMaxAgeValidator, - transformFrequencyValidator, -} from './validators'; - -describe('continuousModeDelayValidator', () => { - it('should allow 0 input without unit', () => { - expect(continuousModeDelayValidator('0')).toBe(true); - }); - - it('should allow 0 input with unit provided', () => { - expect(continuousModeDelayValidator('0s')).toBe(true); - }); - - it('should allow integer input with unit provided', () => { - expect(continuousModeDelayValidator('234nanos')).toBe(true); - }); - - it('should not allow integer input without unit provided', () => { - expect(continuousModeDelayValidator('90000')).toBe(false); - }); - - it('should not allow float input', () => { - expect(continuousModeDelayValidator('122.5d')).toBe(false); - }); -}); - -describe('parseDuration', () => { - it('should return undefined when the input is not an integer and valid time unit.', () => { - expect(parseDuration('0')).toBe(undefined); - expect(parseDuration('0.1s')).toBe(undefined); - expect(parseDuration('1.1m')).toBe(undefined); - expect(parseDuration('10.1asdf')).toBe(undefined); - }); - - it('should return parsed data for valid time units nanos|micros|ms|s|m|h|d.', () => { - expect(parseDuration('1a')).toEqual(undefined); - expect(parseDuration('1nanos')).toEqual({ - number: 1, - timeUnit: 'nanos', - }); - expect(parseDuration('1micros')).toEqual({ - number: 1, - timeUnit: 'micros', - }); - expect(parseDuration('1ms')).toEqual({ number: 1, timeUnit: 'ms' }); - expect(parseDuration('1s')).toEqual({ number: 1, timeUnit: 's' }); - expect(parseDuration('1m')).toEqual({ number: 1, timeUnit: 'm' }); - expect(parseDuration('1h')).toEqual({ number: 1, timeUnit: 'h' }); - expect(parseDuration('1d')).toEqual({ number: 1, timeUnit: 'd' }); - }); -}); - -describe('retentionPolicyMaxAgeValidator', () => { - it('should fail when the input is not an integer and valid time unit.', () => { - expect(retentionPolicyMaxAgeValidator('0')).toBe(false); - expect(retentionPolicyMaxAgeValidator('0.1s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1.1m')).toBe(false); - expect(retentionPolicyMaxAgeValidator('10.1asdf')).toBe(false); - }); - - it('should only allow values equal or above 60s.', () => { - expect(retentionPolicyMaxAgeValidator('0nanos')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999999999nanos')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000000000nanos')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60000000001nanos')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0micros')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999999micros')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000000micros')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60000001micros')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0ms')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59999ms')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60000ms')).toBe(true); - expect(retentionPolicyMaxAgeValidator('60001ms')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('59s')).toBe(false); - expect(retentionPolicyMaxAgeValidator('60s')).toBe(true); - expect(retentionPolicyMaxAgeValidator('61s')).toBe(true); - expect(retentionPolicyMaxAgeValidator('10000s')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0m')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1m')).toBe(true); - expect(retentionPolicyMaxAgeValidator('100m')).toBe(true); - - expect(retentionPolicyMaxAgeValidator('0h')).toBe(false); - expect(retentionPolicyMaxAgeValidator('1h')).toBe(true); - expect(retentionPolicyMaxAgeValidator('2h')).toBe(true); - }); -}); - -describe('transformFrequencyValidator', () => { - it('should fail when the input is not an integer and valid time unit.', () => { - expect(transformFrequencyValidator('0')).toBe(false); - expect(transformFrequencyValidator('0.1s')).toBe(false); - expect(transformFrequencyValidator('1.1m')).toBe(false); - expect(transformFrequencyValidator('10.1asdf')).toBe(false); - }); - - it('should only allow s/m/h as time unit.', () => { - expect(transformFrequencyValidator('1ms')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('1d')).toBe(false); - }); - - it('should only allow values above 0 and up to 1 hour.', () => { - expect(transformFrequencyValidator('0s')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('3599s')).toBe(true); - expect(transformFrequencyValidator('3600s')).toBe(true); - expect(transformFrequencyValidator('3601s')).toBe(false); - expect(transformFrequencyValidator('10000s')).toBe(false); - - expect(transformFrequencyValidator('0m')).toBe(false); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('59m')).toBe(true); - expect(transformFrequencyValidator('60m')).toBe(true); - expect(transformFrequencyValidator('61m')).toBe(false); - expect(transformFrequencyValidator('100m')).toBe(false); - - expect(transformFrequencyValidator('0h')).toBe(false); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('2h')).toBe(false); - }); -}); - -describe('jsonStringValidator', () => { - it('should return false for non-string input', () => { - expect(jsonStringValidator(false)).toBe(false); - expect(jsonStringValidator(undefined)).toBe(false); - expect(jsonStringValidator(null)).toBe(false); - expect(jsonStringValidator(0)).toBe(false); - expect(jsonStringValidator({})).toBe(false); - }); - - it('should return whether string is parsable as valid json', () => { - expect( - jsonStringValidator(`{ - "must": [], - "must_not": [], - "should": [] - }`) - ).toBe(true); - expect( - jsonStringValidator(`{ - "must":, - }`) - ).toBe(false); - }); -}); diff --git a/x-pack/plugins/transform/public/app/common/validators.ts b/x-pack/plugins/transform/public/app/common/validators.ts deleted file mode 100644 index cde8940f6f18e..0000000000000 --- a/x-pack/plugins/transform/public/app/common/validators.ts +++ /dev/null @@ -1,178 +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 { numberValidator } from '@kbn/ml-agg-utils'; -import { - numberOfRetriesInvalidErrorMessage, - numberRange10To10000NotValidErrorMessage, - numberRangeMinus1To100NotValidErrorMessage, - pageSearchSizeInvalidErrorMessage, -} from './constants/validation_messages'; - -const RETENTION_POLICY_MIN_AGE_SECONDS = 60; -const TIME_UNITS = ['nanos', 'micros', 'ms', 's', 'm', 'h', 'd']; - -/** - * Validates continuous mode time delay input. - * Doesn't allow floating intervals. - * @param value User input value. - */ -export function continuousModeDelayValidator(value: string): boolean { - return value.match(/^(0|\d*(nanos|micros|ms|s|m|h|d))$/) !== null; -} - -/** - * Parses a duration uses a string format like `60s`. - * @param value User input value. - */ -export interface ParsedDuration { - number: number; - timeUnit: string; -} -export function parseDuration(value: string): ParsedDuration | undefined { - if (typeof value !== 'string' || value === null) { - return; - } - - // split string by groups of numbers and letters - const regexStr = value.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer - if (isNaN(number) || !Number.isInteger(number)) { - return; - } - - if (!TIME_UNITS.includes(timeUnit)) { - return; - } - - return { number, timeUnit }; -} - -export function isValidRetentionPolicyMaxAge({ number, timeUnit }: ParsedDuration): boolean { - // only valid if value is equal or more than 60s - // supported time units: https://www.elastic.co/guide/en/elasticsearch/reference/master/common-options.html#time-units - return ( - (timeUnit === 'nanos' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000000) || - (timeUnit === 'micros' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000) || - (timeUnit === 'ms' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000) || - (timeUnit === 's' && number >= RETENTION_POLICY_MIN_AGE_SECONDS) || - ((timeUnit === 'm' || timeUnit === 'h' || timeUnit === 'd') && number >= 1) - ); -} - -/** - * Validates retention policy max age input. - * Doesn't allow floating intervals. - * @param value User input value. Minimum of 60s. - */ -export function retentionPolicyMaxAgeValidator(value: string): boolean { - const parsedValue = parseDuration(value); - - if (parsedValue === undefined) { - return false; - } - - return isValidRetentionPolicyMaxAge(parsedValue); -} - -// only valid if value is up to 1 hour -export function isValidFrequency({ number, timeUnit }: ParsedDuration): boolean { - return ( - (timeUnit === 's' && number <= 3600) || - (timeUnit === 'm' && number <= 60) || - (timeUnit === 'h' && number === 1) - ); -} - -/** - * Validates transform frequency input. - * Allows time units of s/m/h only. - * Must be above 0 and only up to 1h. - * @param value User input value. - */ -export const transformFrequencyValidator = (value: string): boolean => { - if (typeof value !== 'string' || value === null) { - return false; - } - - // split string by groups of numbers and letters - const regexStr = value.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return false; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer above 0 - if (isNaN(number) || !Number.isInteger(number) || number === 0) { - return false; - } - - return isValidFrequency({ number, timeUnit }); -}; - -// A Validator function takes in a value to check and returns an array of error messages. -// If no messages (empty array) get returned, the value is valid. -export type Validator = (value: any, isOptional?: boolean) => string[]; - -/** - * Validates transform max_page_search_size input. - * Must be a number between 10 and 65536. - * @param value User input value. - */ -export const transformSettingsPageSearchSizeValidator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: 10, max: 65536, integerOnly: true })(+value) === null - ? [] - : [pageSearchSizeInvalidErrorMessage]; - -export const transformSettingsNumberOfRetriesValidator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: -1, max: 100, integerOnly: true })(+value) === null - ? [] - : [numberOfRetriesInvalidErrorMessage]; - -/** - * Validates whether string input can be parsed as a valid JSON - * @param value User input value. - */ -export function jsonStringValidator(value: unknown): boolean { - if (typeof value !== 'string') return false; - - try { - return !!JSON.parse(value); - } catch (e) { - // eslint-disable-next-line no-console - console.error(`JSON is invalid.\n${e}`); - return false; - } - return true; -} - -export const integerRangeMinus1To100Validator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: -1, max: 100, integerOnly: true })(+value) === null - ? [] - : [numberRangeMinus1To100NotValidErrorMessage]; - -export const integerRange10To10000Validator: Validator = (value) => - !(value + '').includes('.') && - numberValidator({ min: 10, max: 100001, integerOnly: true })(+value) === null - ? [] - : [numberRange10To10000NotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts new file mode 100644 index 0000000000000..1ebdd3d41cd57 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { frequencyValidator } from './frequency_validator'; + +describe('Transform: frequencyValidator()', () => { + // frequencyValidator() returns an array of error messages so + // an array with a length of 0 means a successful validation. + + it('should fail when the input is not an integer and valid time unit.', () => { + expect(frequencyValidator('0')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('0.1s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1.1m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('10.1asdf')).toEqual(['The frequency value is not valid.']); + }); + + it('should only allow s/m/h as time unit.', () => { + expect(frequencyValidator('1ms')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1s')).toEqual([]); + expect(frequencyValidator('1m')).toEqual([]); + expect(frequencyValidator('1h')).toEqual([]); + expect(frequencyValidator('1d')).toEqual(['The frequency value is not valid.']); + }); + + it('should only allow values above 0 and up to 1 hour.', () => { + expect(frequencyValidator('0s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1s')).toEqual([]); + expect(frequencyValidator('3599s')).toEqual([]); + expect(frequencyValidator('3600s')).toEqual([]); + expect(frequencyValidator('3601s')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('10000s')).toEqual(['The frequency value is not valid.']); + + expect(frequencyValidator('0m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1m')).toEqual([]); + expect(frequencyValidator('59m')).toEqual([]); + expect(frequencyValidator('60m')).toEqual([]); + expect(frequencyValidator('61m')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('100m')).toEqual(['The frequency value is not valid.']); + + expect(frequencyValidator('0h')).toEqual(['The frequency value is not valid.']); + expect(frequencyValidator('1h')).toEqual([]); + expect(frequencyValidator('2h')).toEqual(['The frequency value is not valid.']); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/frequency_validator.ts b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.ts new file mode 100644 index 0000000000000..2c007b091462a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/frequency_validator.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 { frequencyNotValidErrorMessage } from './messages'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; +import { isValidFrequency } from './is_valid_frequency'; +import type { Validator } from './types'; + +// Only allow frequencies in the form of 1s/1h etc. +export const frequencyValidator: Validator = (arg) => { + const parsedArg = parseDurationAboveZero(arg); + + if (Array.isArray(parsedArg)) { + return parsedArg; + } + + return isValidFrequency(parsedArg) ? [] : [frequencyNotValidErrorMessage]; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/index.ts b/x-pack/plugins/transform/public/app/common/validators/index.ts new file mode 100644 index 0000000000000..8cf312b828dd3 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { frequencyValidator } from './frequency_validator'; +export { integerRangeMinus1To100Validator } from './integer_range_minus_1_to_100_validator'; +export { integerAboveZeroValidator } from './integer_above_zero_validator'; +export { isJsonString } from './is_json_string'; +export { isContinuousModeDelay } from './is_continuous_mode_delay'; +export { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; +export { isTransformWizardFrequency } from './is_transform_wizard_frequency'; +export { parseDurationAboveZero } from './parse_duration_above_zero'; +export { retentionPolicyMaxAgeValidator } from './retention_policy_max_age_validator'; +export { stringValidator } from './string_validator'; +export { transformSettingsNumberOfRetriesValidator } from './transform_settings_number_of_retries_validator'; +export { transformSettingsPageSearchSizeValidator } from './transform_settings_page_search_size_validator'; +export type { Validator } from './types'; diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.ts new file mode 100644 index 0000000000000..1031e23565933 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.test.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 { integerAboveZeroValidator } from './integer_above_zero_validator'; + +describe('Transform: integerAboveZeroValidator()', () => { + it('should only allow integers above zero', () => { + // invalid + expect(integerAboveZeroValidator('a-string')).toEqual([ + 'Value needs to be an integer above zero.', + ]); + expect(integerAboveZeroValidator('0s')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator('1m')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator('1..')).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(-1)).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(0)).toEqual(['Value needs to be an integer above zero.']); + expect(integerAboveZeroValidator(0.1)).toEqual(['Value needs to be an integer above zero.']); + + // valid + expect(integerAboveZeroValidator(1)).toEqual([]); + expect(integerAboveZeroValidator('1')).toEqual([]); + expect(integerAboveZeroValidator('1.')).toEqual([]); + expect(integerAboveZeroValidator('1.0')).toEqual([]); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.ts b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.ts new file mode 100644 index 0000000000000..c7903dcbc7f9e --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_above_zero_validator.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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const numberAboveZeroNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormNumberAboveZeroNotValidErrorMessage', + { + defaultMessage: 'Value needs to be an integer above zero.', + } +); + +// memoize validator +const validator = numberValidator({ min: 1, integerOnly: true }); + +export const integerAboveZeroValidator: Validator = (value) => + validator(+value) === null ? [] : [numberAboveZeroNotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.ts b/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.ts new file mode 100644 index 0000000000000..290ca7e556dda --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/integer_range_minus_1_to_100_validator.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 { numberValidator } from '@kbn/ml-agg-utils'; +import { i18n } from '@kbn/i18n'; + +import type { Validator } from './types'; + +const numberRangeMinus1To100NotValidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage', + { + defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', + } +); + +// memoize validator +const validator = numberValidator({ min: -1, max: 100, integerOnly: true }); + +export const integerRangeMinus1To100Validator: Validator = (value) => + validator(+value) === null ? [] : [numberRangeMinus1To100NotValidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts new file mode 100644 index 0000000000000..934dd39d00683 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { isContinuousModeDelay } from './is_continuous_mode_delay'; + +describe('isContinuousModeDelay', () => { + it('should allow 0 input without unit', () => { + expect(isContinuousModeDelay('0')).toBe(true); + }); + + it('should allow 0 input with unit provided', () => { + expect(isContinuousModeDelay('0s')).toBe(true); + }); + + it('should allow integer input with unit provided', () => { + expect(isContinuousModeDelay('234nanos')).toBe(true); + }); + + it('should not allow integer input without unit provided', () => { + expect(isContinuousModeDelay('90000')).toBe(false); + }); + + it('should not allow float input', () => { + expect(isContinuousModeDelay('122.5d')).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts new file mode 100644 index 0000000000000..af3d837db4c92 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_continuous_mode_delay.ts @@ -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. + */ + +/** + * Validates continuous mode time delay input. + * Doesn't allow floating intervals. + * @param value User input value. + */ +export function isContinuousModeDelay(value: string): boolean { + return value.match(/^(0|\d*(nanos|micros|ms|s|m|h|d))$/) !== null; +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.ts new file mode 100644 index 0000000000000..89e1bb9a14563 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_json_string.test.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 { isJsonString } from './is_json_string'; + +describe('isJsonString', () => { + it('should return false for non-string input', () => { + expect(isJsonString(true)).toBe(false); + expect(isJsonString(false)).toBe(false); + expect(isJsonString(undefined)).toBe(false); + expect(isJsonString(null)).toBe(false); + expect(isJsonString(0)).toBe(false); + expect(isJsonString({})).toBe(false); + }); + + it('should return whether string is parsable as valid json', () => { + expect( + isJsonString(`{ + "must": [], + "must_not": [], + "should": [] + }`) + ).toBe(true); + expect( + isJsonString(`{ + "must":, + }`) + ).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_json_string.ts b/x-pack/plugins/transform/public/app/common/validators/is_json_string.ts new file mode 100644 index 0000000000000..985374fe1fa80 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_json_string.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Validates whether string input can be parsed as a valid JSON + * @param value User input value. + */ +export function isJsonString(value: unknown): boolean { + if (typeof value !== 'string') return false; + + try { + return !!JSON.parse(value); + } catch (e) { + return false; + } +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts new file mode 100644 index 0000000000000..bc28b01202705 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; + +describe('isRetentionPolicyMaxAge', () => { + it('should fail when the input is not an integer and valid time unit.', () => { + expect(isRetentionPolicyMaxAge('0')).toBe(false); + expect(isRetentionPolicyMaxAge('0.1s')).toBe(false); + expect(isRetentionPolicyMaxAge('1.1m')).toBe(false); + expect(isRetentionPolicyMaxAge('10.1asdf')).toBe(false); + }); + + it('should only allow values equal or above 60s.', () => { + expect(isRetentionPolicyMaxAge('0nanos')).toBe(false); + expect(isRetentionPolicyMaxAge('59999999999nanos')).toBe(false); + expect(isRetentionPolicyMaxAge('60000000000nanos')).toBe(true); + expect(isRetentionPolicyMaxAge('60000000001nanos')).toBe(true); + + expect(isRetentionPolicyMaxAge('0micros')).toBe(false); + expect(isRetentionPolicyMaxAge('59999999micros')).toBe(false); + expect(isRetentionPolicyMaxAge('60000000micros')).toBe(true); + expect(isRetentionPolicyMaxAge('60000001micros')).toBe(true); + + expect(isRetentionPolicyMaxAge('0ms')).toBe(false); + expect(isRetentionPolicyMaxAge('59999ms')).toBe(false); + expect(isRetentionPolicyMaxAge('60000ms')).toBe(true); + expect(isRetentionPolicyMaxAge('60001ms')).toBe(true); + + expect(isRetentionPolicyMaxAge('0s')).toBe(false); + expect(isRetentionPolicyMaxAge('1s')).toBe(false); + expect(isRetentionPolicyMaxAge('59s')).toBe(false); + expect(isRetentionPolicyMaxAge('60s')).toBe(true); + expect(isRetentionPolicyMaxAge('61s')).toBe(true); + expect(isRetentionPolicyMaxAge('10000s')).toBe(true); + + expect(isRetentionPolicyMaxAge('0m')).toBe(false); + expect(isRetentionPolicyMaxAge('1m')).toBe(true); + expect(isRetentionPolicyMaxAge('100m')).toBe(true); + + expect(isRetentionPolicyMaxAge('0h')).toBe(false); + expect(isRetentionPolicyMaxAge('1h')).toBe(true); + expect(isRetentionPolicyMaxAge('2h')).toBe(true); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.ts b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.ts new file mode 100644 index 0000000000000..fdd8a4b9e7b72 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_retention_policy_max_age.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; + +const RETENTION_POLICY_MIN_AGE_SECONDS = 60; + +export function isRetentionPolicyMaxAge(arg: unknown): boolean { + const parsedArg = parseDurationAboveZero(arg); + + if (!isPopulatedObject(parsedArg, ['number', 'timeUnit'])) { + return false; + } + + const { number, timeUnit } = parsedArg; + + if (typeof number !== 'number' || typeof timeUnit !== 'string') { + return false; + } + + // only valid if value is equal or more than 60s + // supported time units: https://www.elastic.co/guide/en/elasticsearch/reference/master/common-options.html#time-units + return ( + (timeUnit === 'nanos' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000000) || + (timeUnit === 'micros' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000000) || + (timeUnit === 'ms' && number >= RETENTION_POLICY_MIN_AGE_SECONDS * 1000) || + (timeUnit === 's' && number >= RETENTION_POLICY_MIN_AGE_SECONDS) || + ((timeUnit === 'm' || timeUnit === 'h' || timeUnit === 'd') && number >= 1) + ); +} diff --git a/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts new file mode 100644 index 0000000000000..8c6d1b79a2eae --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isTransformWizardFrequency } from './is_transform_wizard_frequency'; + +describe('isTransformWizardFrequency', () => { + it('should fail when the input is not an integer and valid time unit.', () => { + expect(isTransformWizardFrequency('0')).toBe(false); + expect(isTransformWizardFrequency('0.1s')).toBe(false); + expect(isTransformWizardFrequency('1.1m')).toBe(false); + expect(isTransformWizardFrequency('10.1asdf')).toBe(false); + }); + + it('should only allow s/m/h as time unit.', () => { + expect(isTransformWizardFrequency('1ms')).toBe(false); + expect(isTransformWizardFrequency('1s')).toBe(true); + expect(isTransformWizardFrequency('1m')).toBe(true); + expect(isTransformWizardFrequency('1h')).toBe(true); + expect(isTransformWizardFrequency('1d')).toBe(false); + }); + + it('should only allow values above 0 and up to 1 hour.', () => { + expect(isTransformWizardFrequency('0s')).toBe(false); + expect(isTransformWizardFrequency('1s')).toBe(true); + expect(isTransformWizardFrequency('3599s')).toBe(true); + expect(isTransformWizardFrequency('3600s')).toBe(true); + expect(isTransformWizardFrequency('3601s')).toBe(false); + expect(isTransformWizardFrequency('10000s')).toBe(false); + + expect(isTransformWizardFrequency('0m')).toBe(false); + expect(isTransformWizardFrequency('1m')).toBe(true); + expect(isTransformWizardFrequency('59m')).toBe(true); + expect(isTransformWizardFrequency('60m')).toBe(true); + expect(isTransformWizardFrequency('61m')).toBe(false); + expect(isTransformWizardFrequency('100m')).toBe(false); + + expect(isTransformWizardFrequency('0h')).toBe(false); + expect(isTransformWizardFrequency('1h')).toBe(true); + expect(isTransformWizardFrequency('2h')).toBe(false); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.ts b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.ts new file mode 100644 index 0000000000000..4063bac69f02a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_transform_wizard_frequency.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 { isValidFrequency } from './is_valid_frequency'; + +/** + * Validates transform frequency input. + * Allows time units of s/m/h only. + * Must be above 0 and only up to 1h. + * @param value User input value. + */ +export const isTransformWizardFrequency = (value: string): boolean => { + if (typeof value !== 'string' || value === null) { + return false; + } + + // split string by groups of numbers and letters + const regexStr = value.match(/[a-z]+|[^a-z]+/gi); + + // only valid if one group of numbers and one group of letters + if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { + return false; + } + + const number = +regexStr[0]; + const timeUnit = regexStr[1]; + + // only valid if number is an integer above 0 + if (isNaN(number) || !Number.isInteger(number) || number === 0) { + return false; + } + + return isValidFrequency({ number, timeUnit }); +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.ts b/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.ts new file mode 100644 index 0000000000000..6fe7781a5d6f4 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/is_valid_frequency.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 { isPopulatedObject } from '@kbn/ml-is-populated-object'; + +import type { ParsedDuration } from './types'; + +// only valid if value is up to 1 hour +export function isValidFrequency(arg: unknown): arg is ParsedDuration { + if (!isPopulatedObject(arg, ['number', 'timeUnit'])) { + return false; + } + + const { number, timeUnit } = arg; + + if (typeof number !== 'number' || typeof timeUnit !== 'string') { + return false; + } + + return ( + (timeUnit === 's' && number <= 3600) || + (timeUnit === 'm' && number <= 60) || + (timeUnit === 'h' && number === 1) + ); +} diff --git a/x-pack/plugins/transform/public/app/common/validators/messages.ts b/x-pack/plugins/transform/public/app/common/validators/messages.ts new file mode 100644 index 0000000000000..7355fb2d7022b --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/messages.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +// Retention policy max age validator +export const retentionPolicyMaxAgeInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage', + { + defaultMessage: 'Invalid max age format. Minimum of 60s required.', + } +); + +export const requiredErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormRequiredErrorMessage', + { + defaultMessage: 'Required field.', + } +); + +export const stringNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormStringNotValidErrorMessage', + { + defaultMessage: 'Value needs to be of type string.', + } +); + +export const frequencyNotValidErrorMessage = i18n.translate( + 'xpack.transform.transformList.editFlyoutFormFrequencyNotValidErrorMessage', + { + defaultMessage: 'The frequency value is not valid.', + } +); diff --git a/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.ts b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.ts new file mode 100644 index 0000000000000..6f48aab3e8ff3 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.test.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 { parseDurationAboveZero } from './parse_duration_above_zero'; + +describe('parseDurationAboveZero', () => { + it('should return error when the input is not an integer and valid time unit.', () => { + expect(parseDurationAboveZero('0')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('0.1s')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('1.1m')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('10.1asdf')).toEqual(['The frequency value is not valid.']); + }); + + it('should return parsed data for valid time units nanos|micros|ms|s|m|h|d.', () => { + expect(parseDurationAboveZero('1a')).toEqual(['The frequency value is not valid.']); + expect(parseDurationAboveZero('1nanos')).toEqual({ + number: 1, + timeUnit: 'nanos', + }); + expect(parseDurationAboveZero('1micros')).toEqual({ + number: 1, + timeUnit: 'micros', + }); + expect(parseDurationAboveZero('1ms')).toEqual({ number: 1, timeUnit: 'ms' }); + expect(parseDurationAboveZero('1s')).toEqual({ number: 1, timeUnit: 's' }); + expect(parseDurationAboveZero('1m')).toEqual({ number: 1, timeUnit: 'm' }); + expect(parseDurationAboveZero('1h')).toEqual({ number: 1, timeUnit: 'h' }); + expect(parseDurationAboveZero('1d')).toEqual({ number: 1, timeUnit: 'd' }); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.ts b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.ts new file mode 100644 index 0000000000000..2eb468b9b8aea --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/parse_duration_above_zero.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. + */ + +import { frequencyNotValidErrorMessage, stringNotValidErrorMessage } from './messages'; + +import type { ParsedDuration } from './types'; + +const TIME_UNITS = ['nanos', 'micros', 'ms', 's', 'm', 'h', 'd']; + +export function parseDurationAboveZero(arg: unknown): ParsedDuration | string[] { + if (typeof arg !== 'string' || arg === null) { + return [stringNotValidErrorMessage]; + } + + // split string by groups of numbers and letters + const regexStr = arg.match(/[a-z]+|[^a-z]+/gi); + + // only valid if one group of numbers and one group of letters + if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { + return [frequencyNotValidErrorMessage]; + } + + const number = +regexStr[0]; + const timeUnit = regexStr[1]; + + // only valid if number is an integer above 0 + if (isNaN(number) || !Number.isInteger(number) || number === 0) { + return [frequencyNotValidErrorMessage]; + } + + if (!TIME_UNITS.includes(timeUnit)) { + return [frequencyNotValidErrorMessage]; + } + + return { number, timeUnit }; +} diff --git a/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts new file mode 100644 index 0000000000000..7e1f8a6614b65 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { retentionPolicyMaxAgeValidator } from './retention_policy_max_age_validator'; + +describe('Transform: retentionPolicyMaxAgeValidator()', () => { + it('should only allow values equal or above 60s.', () => { + expect(retentionPolicyMaxAgeValidator('0nanos')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('59999999999nanos')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000000000nanos')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60000000001nanos')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0micros')).toEqual([ + 'The frequency value is not valid.', + ]); + expect(retentionPolicyMaxAgeValidator('59999999micros')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000000micros')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60000001micros')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0ms')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('59999ms')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60000ms')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('60001ms')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0s')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1s')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('59s')).toEqual([ + 'Invalid max age format. Minimum of 60s required.', + ]); + expect(retentionPolicyMaxAgeValidator('60s')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('61s')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('10000s')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0m')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1m')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('100m')).toEqual([]); + + expect(retentionPolicyMaxAgeValidator('0h')).toEqual(['The frequency value is not valid.']); + expect(retentionPolicyMaxAgeValidator('1h')).toEqual([]); + expect(retentionPolicyMaxAgeValidator('2h')).toEqual([]); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.ts b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.ts new file mode 100644 index 0000000000000..f92e242f0dc89 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/retention_policy_max_age_validator.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { retentionPolicyMaxAgeInvalidErrorMessage } from './messages'; + +import { parseDurationAboveZero } from './parse_duration_above_zero'; +import { isRetentionPolicyMaxAge } from './is_retention_policy_max_age'; +import type { Validator } from './types'; + +/** + * Validates retention policy max age input. + * Doesn't allow floating intervals. + * @param value User input value. Minimum of 60s. + */ +export const retentionPolicyMaxAgeValidator: Validator = (arg) => { + const parsedArg = parseDurationAboveZero(arg); + + if (Array.isArray(parsedArg)) { + return parsedArg; + } + + // We pass in again the original `arg`, not `parsedArg` since it will parse it again. + return isRetentionPolicyMaxAge(arg) ? [] : [retentionPolicyMaxAgeInvalidErrorMessage]; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/string_validator.test.ts b/x-pack/plugins/transform/public/app/common/validators/string_validator.test.ts new file mode 100644 index 0000000000000..6956ef305a66a --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/string_validator.test.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { stringValidator } from './string_validator'; + +describe('Transform: stringValidator()', () => { + it('should allow an empty string for optional fields', () => { + expect(stringValidator('')).toEqual([]); + }); + + it('should not allow an empty string for required fields', () => { + expect(stringValidator('', false)).toEqual(['Required field.']); + }); +}); diff --git a/x-pack/plugins/transform/public/app/common/validators/string_validator.ts b/x-pack/plugins/transform/public/app/common/validators/string_validator.ts new file mode 100644 index 0000000000000..e0c417036daec --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/string_validator.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { requiredErrorMessage, stringNotValidErrorMessage } from './messages'; + +import type { Validator } from './types'; + +export const stringValidator: Validator = (value, isOptional = true) => { + if (typeof value !== 'string') { + return [stringNotValidErrorMessage]; + } + + if (value.length === 0 && !isOptional) { + return [requiredErrorMessage]; + } + + return []; +}; diff --git a/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.ts b/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.ts new file mode 100644 index 0000000000000..c2eb421c56dfd --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/transform_settings_number_of_retries_validator.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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const numberOfRetriesInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage', + { + defaultMessage: 'Number of retries needs to be between 0 and 100, or -1 for infinite retries.', + } +); + +// memoize validator +const validator = numberValidator({ min: -1, max: 100, integerOnly: true }); + +export const transformSettingsNumberOfRetriesValidator: Validator = (value) => + validator(+value) === null ? [] : [numberOfRetriesInvalidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.ts b/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.ts new file mode 100644 index 0000000000000..b177a3680d948 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/transform_settings_page_search_size_validator.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 { i18n } from '@kbn/i18n'; +import { numberValidator } from '@kbn/ml-agg-utils'; + +import type { Validator } from './types'; + +const pageSearchSizeInvalidErrorMessage = i18n.translate( + 'xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage', + { + defaultMessage: 'Maximum page search size needs to be an integer between 10 and 65536.', + } +); + +// memoize validator +const validator = numberValidator({ min: 10, max: 65536, integerOnly: true }); + +/** + * Validates transform max_page_search_size input. + * Must be a number between 10 and 65536. + * @param value User input value. + */ +export const transformSettingsPageSearchSizeValidator: Validator = (value) => + validator(+value) === null ? [] : [pageSearchSizeInvalidErrorMessage]; diff --git a/x-pack/plugins/transform/public/app/common/validators/types.ts b/x-pack/plugins/transform/public/app/common/validators/types.ts new file mode 100644 index 0000000000000..de1f51aa518c5 --- /dev/null +++ b/x-pack/plugins/transform/public/app/common/validators/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * A Validator function takes in a value to check and returns an array of error messages. + * If no messages (empty array) get returned, the value is valid. + * + * Informal naming convention: + * `is*()` is a plain check that returns a `boolean` + * `*Validator()` implements this type and returns error messages. + * + * @param value The value to be validated + * @param isOptional Optional boolean flag if the provided value is optional + */ +export type Validator = (value: T, isOptional?: boolean) => string[]; + +/** + * Interface for the parsed result of a duration string. + */ +export interface ParsedDuration { + number: number; + timeUnit: string; +} diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts index 4003f9f88d40d..0b1d4f1caa521 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/config.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { jsonStringValidator } from '../../../../../../common/validators'; +import { isJsonString } from '../../../../../../common/validators'; import { isPivotAggsConfigWithUiBase, PivotAggsConfigBase, @@ -209,7 +209,7 @@ export function getFilterAggTypeConfig( 2 ), isValid() { - return jsonStringValidator(this.filterAggConfig); + return isJsonString(this.filterAggConfig); }, getEsAggConfig() { return JSON.parse(this.filterAggConfig!); @@ -224,7 +224,7 @@ export function getFilterAggTypeConfig( return this.filterAggConfig !== undefined ? JSON.parse(this.filterAggConfig!) : {}; }, isValid() { - return jsonStringValidator(this.filterAggConfig); + return isJsonString(this.filterAggConfig); }, }; } diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx index 424d6dd820df6..57f9388311210 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx @@ -29,7 +29,7 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import { CreateDataViewForm } from '@kbn/ml-data-view-utils/components/create_data_view_form_row'; import { DestinationIndexForm } from '@kbn/ml-creation-wizard-utils/components/destination_index_form'; -import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/constants/validation_messages'; +import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/validators/messages'; import { DEFAULT_TRANSFORM_FREQUENCY } from '../../../../../../common/constants'; import { TransformId } from '../../../../../../common/types/transform'; import { isValidIndexName } from '../../../../../../common/utils/es_utils'; @@ -54,10 +54,10 @@ import { } from '../../../../common'; import { EsIndexName } from './common'; import { - continuousModeDelayValidator, + isContinuousModeDelay, + isRetentionPolicyMaxAge, + isTransformWizardFrequency, integerRangeMinus1To100Validator, - retentionPolicyMaxAgeValidator, - transformFrequencyValidator, transformSettingsPageSearchSizeValidator, } from '../../../../common/validators'; import { StepDefineExposedState } from '../step_define/common'; @@ -260,7 +260,7 @@ export const StepDetailsForm: FC = React.memo( isContinuousModeAvailable ? sourceIndexDateFieldNames[0] : '' ); const [continuousModeDelay, setContinuousModeDelay] = useState(defaults.continuousModeDelay); - const isContinuousModeDelayValid = continuousModeDelayValidator(continuousModeDelay); + const isContinuousModeDelayValid = isContinuousModeDelay(continuousModeDelay); // Retention Policy const isRetentionPolicyAvailable = destIndexAvailableTimeFields.length > 0; @@ -274,7 +274,7 @@ export const StepDetailsForm: FC = React.memo( defaults.retentionPolicyMaxAge ); const retentionPolicyMaxAgeEmpty = retentionPolicyMaxAge === ''; - const isRetentionPolicyMaxAgeValid = retentionPolicyMaxAgeValidator(retentionPolicyMaxAge); + const isRetentionPolicyMaxAgeValid = isRetentionPolicyMaxAge(retentionPolicyMaxAge); useEffect(() => { // Reset retention policy settings when the user disables the whole option @@ -308,7 +308,7 @@ export const StepDetailsForm: FC = React.memo( const dataViewTitleExists = dataViewTitles?.some((name) => destinationIndex === name) ?? false; const [transformFrequency, setTransformFrequency] = useState(defaults.transformFrequency); - const isTransformFrequencyValid = transformFrequencyValidator(transformFrequency); + const isTransformFrequencyValid = isTransformWizardFrequency(transformFrequency); const [transformSettingsMaxPageSearchSize, setTransformSettingsMaxPageSearchSize] = useState< number | undefined diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts index 1aeb7a425331f..ebea339c44300 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.test.ts @@ -10,11 +10,7 @@ import { TransformPivotConfig } from '../../../../../../common/types/transform'; import { applyFormStateToTransformConfig, formReducerFactory, - frequencyValidator, getDefaultState, - integerAboveZeroValidator, - retentionPolicyMaxAgeValidator, - stringValidator, } from './use_edit_transform_flyout'; const getTransformConfigMock = (): TransformPivotConfig => ({ @@ -232,111 +228,3 @@ describe('Transform: formReducerFactory()', () => { ]); }); }); - -describe('Transform: stringValidator()', () => { - it('should allow an empty string for optional fields', () => { - expect(stringValidator('')).toHaveLength(0); - }); - - it('should not allow an empty string for required fields', () => { - expect(stringValidator('', false)).toHaveLength(1); - }); -}); - -describe('Transform: frequencyValidator()', () => { - const transformFrequencyValidator = (arg: string) => frequencyValidator(arg).length === 0; - - it('should fail when the input is not an integer and valid time unit.', () => { - expect(transformFrequencyValidator('0')).toBe(false); - expect(transformFrequencyValidator('0.1s')).toBe(false); - expect(transformFrequencyValidator('1.1m')).toBe(false); - expect(transformFrequencyValidator('10.1asdf')).toBe(false); - }); - - it('should only allow s/m/h as time unit.', () => { - expect(transformFrequencyValidator('1ms')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('1d')).toBe(false); - }); - - it('should only allow values above 0 and up to 1 hour.', () => { - expect(transformFrequencyValidator('0s')).toBe(false); - expect(transformFrequencyValidator('1s')).toBe(true); - expect(transformFrequencyValidator('3599s')).toBe(true); - expect(transformFrequencyValidator('3600s')).toBe(true); - expect(transformFrequencyValidator('3601s')).toBe(false); - expect(transformFrequencyValidator('10000s')).toBe(false); - - expect(transformFrequencyValidator('0m')).toBe(false); - expect(transformFrequencyValidator('1m')).toBe(true); - expect(transformFrequencyValidator('59m')).toBe(true); - expect(transformFrequencyValidator('60m')).toBe(true); - expect(transformFrequencyValidator('61m')).toBe(false); - expect(transformFrequencyValidator('100m')).toBe(false); - - expect(transformFrequencyValidator('0h')).toBe(false); - expect(transformFrequencyValidator('1h')).toBe(true); - expect(transformFrequencyValidator('2h')).toBe(false); - }); -}); - -describe('Transform: retentionPolicyMaxAgeValidator()', () => { - const transformRetentionPolicyMaxAgeValidator = (arg: string) => - retentionPolicyMaxAgeValidator(arg).length === 0; - - it('should only allow values equal or above 60s.', () => { - expect(transformRetentionPolicyMaxAgeValidator('0nanos')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999999999nanos')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000000000nanos')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60000000001nanos')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0micros')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999999micros')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000000micros')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60000001micros')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0ms')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59999ms')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60000ms')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('60001ms')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('59s')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('60s')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('61s')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('10000s')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0m')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1m')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('100m')).toBe(true); - - expect(transformRetentionPolicyMaxAgeValidator('0h')).toBe(false); - expect(transformRetentionPolicyMaxAgeValidator('1h')).toBe(true); - expect(transformRetentionPolicyMaxAgeValidator('2h')).toBe(true); - }); -}); - -describe('Transform: integerAboveZeroValidator()', () => { - it('should only allow integers above zero', () => { - // integerAboveZeroValidator() returns an array of error messages so - // an array with a length of 0 means a successful validation. - - // invalid - expect(integerAboveZeroValidator('a-string')).toHaveLength(1); - expect(integerAboveZeroValidator('0s')).toHaveLength(1); - expect(integerAboveZeroValidator('1m')).toHaveLength(1); - expect(integerAboveZeroValidator('1.')).toHaveLength(1); - expect(integerAboveZeroValidator('1..')).toHaveLength(1); - expect(integerAboveZeroValidator('1.0')).toHaveLength(1); - expect(integerAboveZeroValidator(-1)).toHaveLength(1); - expect(integerAboveZeroValidator(0)).toHaveLength(1); - expect(integerAboveZeroValidator(0.1)).toHaveLength(1); - - // valid - expect(integerAboveZeroValidator(1)).toHaveLength(0); - expect(integerAboveZeroValidator('1')).toHaveLength(0); - }); -}); diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx index b1aac5e54d259..2e82edb54b6fd 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/use_edit_transform_flyout.tsx @@ -9,11 +9,8 @@ import constate from 'constate'; import { isEqual, merge } from 'lodash'; import { useMemo, useReducer } from 'react'; -import { i18n } from '@kbn/i18n'; -import { numberValidator } from '@kbn/ml-agg-utils'; import { getNestedProperty, setNestedProperty } from '@kbn/ml-nested-property'; -import { retentionPolicyMaxAgeInvalidErrorMessage } from '../../../../common/constants/validation_messages'; import { PostTransformsUpdateRequestSchema } from '../../../../../../common/api_schemas/update_transforms'; import { DEFAULT_TRANSFORM_FREQUENCY, @@ -21,13 +18,20 @@ import { } from '../../../../../../common/constants'; import { TransformConfigUnion } from '../../../../../../common/types/transform'; +// Note on the form validation and input components used: +// All inputs use `EuiFieldText` which means all form values will be treated as strings. +// This means we cast other formats like numbers coming from the transform config to strings, +// then revalidate them and cast them again to number before submitting a transform update. +// We do this so we have fine grained control over field validation and the option to +// cast to special values like `null` for disabling `docs_per_second`. import { - isValidFrequency, - isValidRetentionPolicyMaxAge, - ParsedDuration, + frequencyValidator, + integerAboveZeroValidator, transformSettingsNumberOfRetriesValidator, transformSettingsPageSearchSizeValidator, - Validator, + retentionPolicyMaxAgeValidator, + stringValidator, + type Validator, } from '../../../../common/validators'; // This custom hook uses nested reducers to provide a generic framework to manage form state @@ -61,7 +65,7 @@ export interface FormField { isNullable: boolean; isOptional: boolean; section?: EditTransformFormSections; - validator: keyof typeof validate; + validator: Validator; value: string; valueParser: (value: string) => any; } @@ -100,108 +104,6 @@ type EditTransformFlyoutSectionsState = Record - !(value + '').includes('.') && numberValidator({ min: 1, integerOnly: true })(+value) === null - ? [] - : [numberAboveZeroNotValidErrorMessage]; - -const requiredErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormRequiredErrorMessage', - { - defaultMessage: 'Required field.', - } -); -const stringNotValidErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormStringNotValidErrorMessage', - { - defaultMessage: 'Value needs to be of type string.', - } -); -export const stringValidator: Validator = (value, isOptional = true) => { - if (typeof value !== 'string') { - return [stringNotValidErrorMessage]; - } - - if (value.length === 0 && !isOptional) { - return [requiredErrorMessage]; - } - - return []; -}; - -function parseDurationAboveZero(arg: unknown, errorMessage: string): ParsedDuration | string[] { - if (typeof arg !== 'string' || arg === null) { - return [stringNotValidErrorMessage]; - } - - // split string by groups of numbers and letters - const regexStr = arg.match(/[a-z]+|[^a-z]+/gi); - - // only valid if one group of numbers and one group of letters - if (regexStr === null || (Array.isArray(regexStr) && regexStr.length !== 2)) { - return [frequencyNotValidErrorMessage]; - } - - const number = +regexStr[0]; - const timeUnit = regexStr[1]; - - // only valid if number is an integer above 0 - if (isNaN(number) || !Number.isInteger(number) || number === 0) { - return [frequencyNotValidErrorMessage]; - } - - return { number, timeUnit }; -} - -// Only allow frequencies in the form of 1s/1h etc. -const frequencyNotValidErrorMessage = i18n.translate( - 'xpack.transform.transformList.editFlyoutFormFrequencyNotValidErrorMessage', - { - defaultMessage: 'The frequency value is not valid.', - } -); -export const frequencyValidator: Validator = (arg) => { - const parsedArg = parseDurationAboveZero(arg, frequencyNotValidErrorMessage); - - if (Array.isArray(parsedArg)) { - return parsedArg; - } - - return isValidFrequency(parsedArg) ? [] : [frequencyNotValidErrorMessage]; -}; - -export const retentionPolicyMaxAgeValidator: Validator = (arg) => { - const parsedArg = parseDurationAboveZero(arg, retentionPolicyMaxAgeInvalidErrorMessage); - - if (Array.isArray(parsedArg)) { - return parsedArg; - } - - return isValidRetentionPolicyMaxAge(parsedArg) ? [] : [retentionPolicyMaxAgeInvalidErrorMessage]; -}; - -const validate = { - string: stringValidator, - frequency: frequencyValidator, - integerAboveZero: integerAboveZeroValidator, - transformSettingsNumberOfRetriesValidator, - transformSettingsPageSearchSizeValidator, - retentionPolicyMaxAgeValidator, -} as const; - export const initializeField = ( formFieldName: EditTransformFormFields, configFieldName: string, @@ -220,7 +122,7 @@ export const initializeField = ( errorMessages: [], isNullable: false, isOptional: true, - validator: 'string', + validator: stringValidator, value, valueParser: (v) => v, ...(overloads !== undefined ? { ...overloads } : {}), @@ -359,7 +261,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo description: initializeField('description', 'description', config), frequency: initializeField('frequency', 'frequency', config, { defaultValue: DEFAULT_TRANSFORM_FREQUENCY, - validator: 'frequency', + validator: frequencyValidator, }), // dest.* @@ -381,7 +283,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo docsPerSecond: initializeField('docsPerSecond', 'settings.docs_per_second', config, { isNullable: true, isOptional: true, - validator: 'integerAboveZero', + validator: integerAboveZeroValidator, valueParser: (v) => (v === '' ? null : +v), }), maxPageSearchSize: initializeField( @@ -392,7 +294,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo defaultValue: `${DEFAULT_TRANSFORM_SETTINGS_MAX_PAGE_SEARCH_SIZE}`, isNullable: true, isOptional: true, - validator: 'transformSettingsPageSearchSizeValidator', + validator: transformSettingsPageSearchSizeValidator, valueParser: (v) => +v, } ), @@ -404,7 +306,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo defaultValue: undefined, isNullable: true, isOptional: true, - validator: 'transformSettingsNumberOfRetriesValidator', + validator: transformSettingsNumberOfRetriesValidator, valueParser: (v) => +v, } ), @@ -430,7 +332,7 @@ export const getDefaultState = (config: TransformConfigUnion): EditTransformFlyo isNullable: false, isOptional: true, section: 'retentionPolicy', - validator: 'retentionPolicyMaxAgeValidator', + validator: retentionPolicyMaxAgeValidator, } ), }, @@ -458,7 +360,7 @@ const formFieldReducer = (state: FormField, value: string): FormField => { errorMessages: state.isOptional && typeof value === 'string' && value.length === 0 ? [] - : validate[state.validator](value, state.isOptional), + : state.validator(value, state.isOptional), value, }; }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 7c828eaee3afa..1996568bbbb47 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -21925,53 +21925,53 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "Type de données incorrect pour {axis}.", "xpack.lens.xyVisualization.dataTypeFailureYLong": "La dimension {label} fournie pour {axis} possède un type de données incorrect. Un nombre est attendu, mais {dataType} trouvé", "xpack.lens.xyVisualization.dataTypeFailureYShort": "Type de données incorrect pour {axis}.", - "xpack.lens.formula.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer \"abs(average(altitude))\"\n ", - "xpack.lens.formula.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole \"+\".\n\nExemple : calculer la somme de deux champs\n\n\"sum(price) + sum(tax)\"\n\nExemple : compenser le compte par une valeur statique\n\n\"add(count(), 5)\"\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\nRetourne une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Retourne -1 lorsqu'un champ ne contient aucune donnée.\n\"defaults(average(bytes), -1)\"\n", - "xpack.lens.formula.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole \"/\".\n\nExemple : calculer la marge bénéficiaire\n\"sum(profit) / sum(revenue)\"\n\nExemple : \"divide(sum(bytes), 2)\"\n ", - "xpack.lens.formula.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"==\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n\"average(bytes) == average(memory)\"\n\nExemple : \"eq(sum(bytes), 1000000)\"\n ", - "xpack.lens.formula.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n\"fix(sum(profit))\"\n ", - "xpack.lens.formula.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n\"floor(sum(price))\"\n ", - "xpack.lens.formula.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) >= average(memory)\"\n\nExemple : \"gte(average(bytes), 1000)\"\n ", - "xpack.lens.formula.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n\"average(bytes) > average(memory)\"\n\nExemple : \"gt(average(bytes), 1000)\"\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\nRetourne une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lte(average(bytes), 1000)\"\n ", - "xpack.lens.formula.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lt(average(bytes), 1000)\"\n ", - "xpack.lens.formula.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n\"pick_max(average(bytes), average(memory))\"\n ", - "xpack.lens.formula.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n\"mod(sum(price), 1000)\"\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole \"*\".\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n\"multiply(sum(price), 1.2)\"\n ", - "xpack.lens.formula.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n\"pow(last_value(length), 3)\"\n ", - "xpack.lens.formula.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole \"-\".\n\nExemple : calculer la plage d'un champ\n\"subtract(max(bytes), min(bytes))\"\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez \"kql=''\" pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer \"overall_sum\" pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez \"reducedTimeRange='30m'\" pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez \"shift='1w'\" pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents :\n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" :\n\"unique_count(product.name, kql='product.group=clothes')\"\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, \"counter_rate\" doit être calculé d’après la valeur \"max\" du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached :\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps :\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps :\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A :\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix :\n\"{metric}(price)\"\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni :\n\"{metric}(price, kql='location:UK')\"\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé \"window\" qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures :\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_average\" calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne :\n\"sum(bytes) - overall_average(sum(bytes))\"\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_max\" calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_min\" calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_sum\" calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de total\n\"sum(bytes) / overall_sum(sum(bytes))\"\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs :\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\nRetourne le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 :\n\"percentile_rank(bytes, value=100)\"\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\nRetourne la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart type d'un prix, utilisez standard_deviation(price).\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé.\n\"normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\"\n ", + "lensFormulaDocs.tinymath.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer \"abs(average(altitude))\"\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole \"+\".\n\nExemple : calculer la somme de deux champs\n\n\"sum(price) + sum(tax)\"\n\nExemple : compenser le compte par une valeur statique\n\n\"add(count(), 5)\"\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\nRetourne une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Retourne -1 lorsqu'un champ ne contient aucune donnée.\n\"defaults(average(bytes), -1)\"\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole \"/\".\n\nExemple : calculer la marge bénéficiaire\n\"sum(profit) / sum(revenue)\"\n\nExemple : \"divide(sum(bytes), 2)\"\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"==\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n\"average(bytes) == average(memory)\"\n\nExemple : \"eq(sum(bytes), 1000000)\"\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n\"fix(sum(profit))\"\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n\"floor(sum(price))\"\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) >= average(memory)\"\n\nExemple : \"gte(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \">\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n\"average(bytes) > average(memory)\"\n\nExemple : \"gt(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\nRetourne une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<=\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lte(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison \"ifelse\".\nFonctionne également avec le symbole \"<\".\n\nExemple : Retourne \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n\"average(bytes) <= average(memory)\"\n\nExemple : \"lt(average(bytes), 1000)\"\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n\"pick_max(average(bytes), average(memory))\"\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n\"mod(sum(price), 1000)\"\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole \"*\".\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n\"multiply(sum(price), 1.2)\"\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n\"pow(last_value(length), 3)\"\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole \"-\".\n\nExemple : calculer la plage d'un champ\n\"subtract(max(bytes), min(bytes))\"\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez \"kql=''\" pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer \"overall_sum\" pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez \"reducedTimeRange='30m'\" pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez \"shift='1w'\" pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents :\n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" :\n\"unique_count(product.name, kql='product.group=clothes')\"\n ", + "lensFormulaDocs.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, \"counter_rate\" doit être calculé d’après la valeur \"max\" du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached :\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps :\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps :\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A :\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix :\n\"{metric}(price)\"\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni :\n\"{metric}(price, kql='location:UK')\"\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé \"window\" qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures :\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_average\" calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne :\n\"sum(bytes) - overall_average(sum(bytes))\"\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_max\" calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_min\" calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de plage\n\"(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))\"\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, \"overall_sum\" calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : pourcentage de total\n\"sum(bytes) / overall_sum(sum(bytes))\"\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs :\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\nRetourne le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 :\n\"percentile_rank(bytes, value=100)\"\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\nRetourne la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart type d'un prix, utilisez standard_deviation(price).\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé.\n\"normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)\"\n ", "xpack.lens.AggBasedLabel": "visualisation basée sur l'agrégation", "xpack.lens.app.addToLibrary": "Enregistrer dans la bibliothèque", "xpack.lens.app.cancel": "Annuler", @@ -22149,11 +22149,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "Suivant", "xpack.lens.fittingFunctionsTitle.none": "Masquer", "xpack.lens.fittingFunctionsTitle.zero": "Zéro", - "xpack.lens.formula.base": "base", - "xpack.lens.formula.boolean": "booléen", - "xpack.lens.formula.condition": "condition", - "xpack.lens.formula.decimals": "décimales", - "xpack.lens.formula.defaultValue": "par défaut", + "lensFormulaDocs.tinymath.base": "base", + "lensFormulaDocs.boolean": "booléen", + "lensFormulaDocs.tinymath.condition": "condition", + "lensFormulaDocs.tinymath.decimals": "décimales", + "lensFormulaDocs.tinymath.defaultValue": "par défaut", "xpack.lens.formula.disableWordWrapLabel": "Désactiver le renvoi à la ligne des mots", "xpack.lens.formula.editorHelpInlineHideLabel": "Masquer la référence des fonctions", "xpack.lens.formula.editorHelpInlineHideToolTip": "Masquer la référence des fonctions", @@ -22161,35 +22161,35 @@ "xpack.lens.formula.fullScreenEnterLabel": "Développer", "xpack.lens.formula.fullScreenExitLabel": "Réduire", "xpack.lens.formula.kqlExtraArguments": "[kql]?: string, [lucene]?: string", - "xpack.lens.formula.left": "gauche", - "xpack.lens.formula.max": "max", - "xpack.lens.formula.min": "min", - "xpack.lens.formula.number": "numéro", + "lensFormulaDocs.tinymath.left": "gauche", + "lensFormulaDocs.tinymath.max": "max", + "lensFormulaDocs.tinymath.min": "min", + "lensFormulaDocs.number": "numéro", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: string", "xpack.lens.formula.requiredArgument": "Obligatoire", - "xpack.lens.formula.right": "droite", + "lensFormulaDocs.tinymath.right": "droite", "xpack.lens.formula.shiftExtraArguments": "[shift]?: string", - "xpack.lens.formula.string": "chaîne", - "xpack.lens.formula.value": "valeur", - "xpack.lens.formulaCommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", - "xpack.lens.formulaDocumentation.columnCalculationSection": "Calculs de colonnes", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", - "xpack.lens.formulaDocumentation.comparisonSection": "Comparaison", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", - "xpack.lens.formulaDocumentation.constantsSection": "Contexte Kibana", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date \"interval\", le \"now\" actuel et le \"time_range\" sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", - "xpack.lens.formulaDocumentation.filterRatio": "Rapport de filtre", - "xpack.lens.formulaDocumentation.mathSection": "Mathématique", - "xpack.lens.formulaDocumentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", - "xpack.lens.formulaDocumentation.percentOfTotal": "Pourcentage du total", - "xpack.lens.formulaDocumentation.recentChange": "Modification récente", - "xpack.lens.formulaDocumentation.weekOverWeek": "Semaine après semaine", + "lensFormulaDocs.string": "chaîne", + "lensFormulaDocs.tinymath.value": "valeur", + "lensFormulaDocs.CommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", + "lensFormulaDocs.documentation.columnCalculationSection": "Calculs de colonnes", + "lensFormulaDocs.documentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", + "lensFormulaDocs.documentation.comparisonSection": "Comparaison", + "lensFormulaDocs.documentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", + "lensFormulaDocs.documentation.constantsSection": "Contexte Kibana", + "lensFormulaDocs.documentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date \"interval\", le \"now\" actuel et le \"time_range\" sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", + "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", + "lensFormulaDocs.documentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", + "lensFormulaDocs.documentation.filterRatio": "Rapport de filtre", + "lensFormulaDocs.documentation.mathSection": "Mathématique", + "lensFormulaDocs.documentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", + "lensFormulaDocs.documentation.percentOfTotal": "Pourcentage du total", + "lensFormulaDocs.documentation.recentChange": "Modification récente", + "lensFormulaDocs.documentation.weekOverWeek": "Semaine après semaine", "xpack.lens.formulaDocumentationHeading": "Fonctionnement", "xpack.lens.formulaEnableWordWrapLabel": "Activer le renvoi à la ligne des mots", "xpack.lens.formulaExampleMarkdown": "Exemples", - "xpack.lens.formulaFrequentlyUsedHeading": "Formules courantes", + "lensFormulaDocs.frequentlyUsedHeading": "Formules courantes", "xpack.lens.formulaPlaceholderText": "Saisissez une formule en combinant des fonctions avec la fonction mathématique, telle que :", "xpack.lens.fullExtent.niceValues": "Arrondir aux valeurs de \"gentillesse\"", "xpack.lens.functions.collapse.args.byHelpText": "Colonnes selon lesquelles effectuer le regroupement - ces colonnes sont conservées telles quelles", @@ -22248,29 +22248,29 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "Glissez-déposez les champs disponibles dans l’espace de travail et créez des visualisations. Pour modifier les champs disponibles, sélectionnez une vue de données différente, modifiez vos requêtes ou utilisez une plage temporelle différente. Certains types de champ ne peuvent pas être visualisés dans Lens, y compris les champ de texte intégral et champs géographiques.", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "veuillez consulter la documentation", "xpack.lens.indexPattern.availableFieldsLabel": "Champs disponibles", - "xpack.lens.indexPattern.avg": "Moyenne", + "lensFormulaDocs.avg": "Moyenne", "xpack.lens.indexPattern.avg.description": "Agrégation d'indicateurs à valeur unique qui calcule la moyenne des valeurs numériques extraites des documents agrégés", "xpack.lens.indexPattern.avg.quickFunctionDescription": "Valeur moyenne d'un ensemble de champs de nombres.", "xpack.lens.indexPattern.bitsFormatLabel": "Bits (1000)", "xpack.lens.indexPattern.bytesFormatLabel": "Octets (1024)", - "xpack.lens.indexPattern.cardinality": "Compte unique", + "lensFormulaDocs.cardinality": "Compte unique", "xpack.lens.indexPattern.cardinality.documentation.quick": "\nNombre de valeurs uniques pour un champ spécifié de nombre, de chaîne, de date ou booléen.\n ", - "xpack.lens.indexPattern.cardinality.signature": "champ : chaîne", + "lensFormulaDocs.cardinality.signature": "champ : chaîne", "xpack.lens.indexPattern.changeDataViewTitle": "Vue de données", "xpack.lens.indexPattern.chooseField": "Champ", "xpack.lens.indexPattern.chooseFieldLabel": "Pour utiliser cette fonction, sélectionnez un champ.", "xpack.lens.indexPattern.chooseSubFunction": "Choisir une sous-fonction", "xpack.lens.indexPattern.columnFormatLabel": "Format de valeur", "xpack.lens.indexPattern.compactLabel": "Valeurs compactes", - "xpack.lens.indexPattern.count": "Décompte", + "lensFormulaDocs.count": "Décompte", "xpack.lens.indexPattern.count.documentation.quick": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n ", - "xpack.lens.indexPattern.count.signature": "[champ : chaîne]", + "lensFormulaDocs.count.signature": "[champ : chaîne]", "xpack.lens.indexPattern.counterRate": "Taux de compteur", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n Taux de modification sur la durée d'un indicateur de série temporelle qui augmente sans cesse.\n ", - "xpack.lens.indexPattern.counterRate.signature": "indicateur : nombre", + "lensFormulaDocs.counterRate.signature": "indicateur : nombre", "xpack.lens.indexPattern.countOf": "Nombre d'enregistrements", - "xpack.lens.indexPattern.cumulative_sum.signature": "indicateur : nombre", - "xpack.lens.indexPattern.cumulativeSum": "Somme cumulée", + "lensFormulaDocs.cumulative_sum.signature": "indicateur : nombre", + "lensFormulaDocs.cumulativeSum": "Somme cumulée", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n Somme de toutes les valeurs au fur et à mesure de leur croissance.\n ", "xpack.lens.indexPattern.custom.externalDoc": "Syntaxe de format numérique", "xpack.lens.indexPattern.custom.patternLabel": "Format", @@ -22300,9 +22300,9 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "L’intervalle de plage temporelle actuel n’est pas disponible", "xpack.lens.indexPattern.decimalPlacesLabel": "Décimales", "xpack.lens.indexPattern.defaultFormatLabel": "Par défaut", - "xpack.lens.indexPattern.derivative": "Différences", + "lensFormulaDocs.derivative": "Différences", "xpack.lens.indexPattern.differences.documentation.quick": "\n Variation entre les valeurs des intervalles suivants.\n ", - "xpack.lens.indexPattern.differences.signature": "indicateur : nombre", + "lensFormulaDocs.differences.signature": "indicateur : nombre", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "Apparence", "xpack.lens.indexPattern.dimensionEditor.headingData": "Données", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "Formule", @@ -22355,30 +22355,30 @@ "xpack.lens.indexPattern.invalidOperationLabel": "Ce champ ne fonctionne pas avec la fonction sélectionnée.", "xpack.lens.indexPattern.invalidReducedTimeRange": "Plage temporelle réduite non valide. Entrez un entier positif suivi par l'une des unités suivantes : s, m, h, d, w, M, y. Par exemple, 3h pour 3 heures", "xpack.lens.indexPattern.invalidTimeShift": "Décalage non valide. Entrez un entier positif suivi par l'une des unités suivantes : s, m, h, d, w, M, y. Par exemple, 3h pour 3 heures", - "xpack.lens.indexPattern.lastValue": "Dernière valeur", + "lensFormulaDocs.lastValue": "Dernière valeur", "xpack.lens.indexPattern.lastValue.disabled": "Cette fonction requiert la présence d'un champ de date dans la vue de données.", "xpack.lens.indexPattern.lastValue.documentation.quick": "\nValeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "Afficher les valeurs de tableau", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "Affiche toutes les valeurs associées à ce champ dans chaque dernier document.", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "Lorsque vous affichez les valeurs de tableau, vous ne pouvez pas utiliser ce champ pour classer les valeurs les plus élevées.", - "xpack.lens.indexPattern.lastValue.signature": "champ : chaîne", + "lensFormulaDocs.lastValue.signature": "champ : chaîne", "xpack.lens.indexPattern.lastValue.sortField": "Trier par le champ de date", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "Champ de tri", - "xpack.lens.indexPattern.max": "Maximum", + "lensFormulaDocs.max": "Maximum", "xpack.lens.indexPattern.max.description": "Agrégation d'indicateurs à valeur unique qui renvoie la valeur maximale des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.max.quickFunctionDescription": "Valeur maximale d'un champ de nombre.", - "xpack.lens.indexPattern.median": "Médiane", + "lensFormulaDocs.median": "Médiane", "xpack.lens.indexPattern.median.description": "Agrégation d'indicateurs à valeur unique qui calcule la valeur médiane des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.median.quickFunctionDescription": "Valeur médiane d'un champ de nombre.", "xpack.lens.indexPattern.metaFieldsLabel": "Champs méta", - "xpack.lens.indexPattern.metric.signature": "champ : chaîne", - "xpack.lens.indexPattern.min": "Minimum", + "lensFormulaDocs.metric.signature": "champ : chaîne", + "lensFormulaDocs.min": "Minimum", "xpack.lens.indexPattern.min.description": "Agrégation d'indicateurs à valeur unique qui renvoie la valeur minimale des valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.min.quickFunctionDescription": "Valeur minimale d'un champ de nombre.", "xpack.lens.indexPattern.missingFieldLabel": "Champ manquant", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "Pour visualiser ce champ, veuillez l'ajouter directement au calque souhaité. L'ajout de ce champ à l'espace de travail n'est pas pris en charge avec votre configuration actuelle.", - "xpack.lens.indexPattern.moving_average.signature": "indicateur : nombre, [window] : nombre", - "xpack.lens.indexPattern.movingAverage": "Moyenne mobile", + "lensFormulaDocs.moving_average.signature": "indicateur : nombre, [window] : nombre", + "lensFormulaDocs.movingAverage": "Moyenne mobile", "xpack.lens.indexPattern.movingAverage.basicExplanation": "La moyenne mobile fait glisser une fenêtre sur les données et affiche la valeur moyenne. La moyenne mobile est prise en charge uniquement par les histogrammes des dates.", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n Moyenne d'une fenêtre mobile de valeurs sur la durée.\n ", "xpack.lens.indexPattern.movingAverage.limitations": "La première valeur de moyenne mobile commence au deuxième élément.", @@ -22394,20 +22394,20 @@ "xpack.lens.indexPattern.noRealMetricError": "Un calque uniquement doté de valeurs statiques n’affichera pas de résultats ; utilisez au moins un indicateur dynamique.", "xpack.lens.indexPattern.notAbsoluteTimeShift": "Décalage non valide.", "xpack.lens.indexPattern.numberFormatLabel": "Nombre", - "xpack.lens.indexPattern.overall_metric": "indicateur : nombre", - "xpack.lens.indexPattern.overallMax": "Max général", - "xpack.lens.indexPattern.overallMin": "Min général", - "xpack.lens.indexPattern.overallSum": "Somme générale", + "lensFormulaDocs.overall_metric": "indicateur : nombre", + "lensFormulaDocs.overallMax": "Max général", + "lensFormulaDocs.overallMin": "Min général", + "lensFormulaDocs.overallSum": "Somme générale", "xpack.lens.indexPattern.percentFormatLabel": "Pourcent", - "xpack.lens.indexPattern.percentile": "Centile", + "lensFormulaDocs.percentile": "Centile", "xpack.lens.indexPattern.percentile.documentation.quick": "\n La plus grande valeur qui est inférieure à n pour cent des valeurs présentes dans tous les documents.\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "Valeur des rangs centiles", "xpack.lens.indexPattern.percentile.percentileValue": "Centile", - "xpack.lens.indexPattern.percentile.signature": "champ : chaîne, [percentile] : nombre", - "xpack.lens.indexPattern.percentileRank": "Rang centile", + "lensFormulaDocs.percentile.signature": "champ : chaîne, [percentile] : nombre", + "lensFormulaDocs.percentileRank": "Rang centile", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\nPourcentage des valeurs inférieures à une valeur spécifique. Par exemple, lorsqu'une valeur est supérieure ou égale à 95 % des valeurs calculées, elle est placée au 95e rang centile.\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "La valeur des rangs centiles doit être un nombre", - "xpack.lens.indexPattern.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", + "lensFormulaDocs.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "Il peut s'agit d'une approximation. Pour obtenir des résultats plus fins, vous pouvez activer le mode de précision, mais ce mode augmente la charge sur le cluster Elasticsearch.", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "Il peut s'agit d'une approximation. Pour obtenir des résultats plus fins, utilisez les filtres ou augmentez le nombre défini pour Valeurs les plus élevées.", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "Il peut s'agir d'une valeur approximative selon la façon dont les données sont indexées. Pour obtenir des résultats plus fins, effectuez un tri par rareté.", @@ -22457,7 +22457,7 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "Calque de données", "xpack.lens.indexPattern.settingsSamplingUnsupported": "La sélection de cette fonction a pour effet de changer l'échantillonnage de ce calque à 100 % afin de garantir un fonctionnement correct.", "xpack.lens.indexPattern.sortField.invalid": "Champ non valide. Vérifiez votre vue de données ou choisissez un autre champ.", - "xpack.lens.indexPattern.standardDeviation": "Écart-type", + "lensFormulaDocs.standardDeviation": "Écart-type", "xpack.lens.indexPattern.standardDeviation.description": "Agrégation d'indicateurs à valeur unique qui calcule l’écart-type des valeurs numériques extraites des documents agrégés", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "Écart-type des valeurs d'un champ de nombre qui représente la quantité d'écart des valeurs des champs.", "xpack.lens.indexPattern.staticValue.label": "Valeur de la ligne de référence", @@ -22467,7 +22467,7 @@ "xpack.lens.indexPattern.staticValueWarningText": "Pour écraser la valeur statique, sélectionnez une fonction rapide.", "xpack.lens.indexPattern.suffixLabel": "Suffixe", "xpack.lens.indexpattern.suggestions.overTimeLabel": "Sur la durée", - "xpack.lens.indexPattern.sum": "Somme", + "lensFormulaDocs.sum": "Somme", "xpack.lens.indexPattern.sum.description": "Agrégation d'indicateurs à valeur unique qui récapitule les valeurs numériques extraites des documents agrégés.", "xpack.lens.indexPattern.sum.quickFunctionDescription": "Total des valeurs d'un champ de nombre.", "xpack.lens.indexPattern.switchToRare": "Classer par rareté", @@ -22505,8 +22505,8 @@ "xpack.lens.indexPattern.terms.size": "Nombre de valeurs", "xpack.lens.indexPattern.termsWithMultipleShifts": "Dans un seul calque, il est impossible de combiner des indicateurs avec des décalages temporels différents et des valeurs dynamiques les plus élevées. Utilisez la même valeur de décalage pour tous les indicateurs, ou utilisez des filtres à la place des valeurs les plus élevées.", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "Utiliser des filtres", - "xpack.lens.indexPattern.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "Normaliser par unité", + "lensFormulaDocs.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", + "lensFormulaDocs.timeScale": "Normaliser par unité", "xpack.lens.indexPattern.timeScale.label": "Normaliser par unité", "xpack.lens.indexPattern.timeScale.missingUnit": "Aucune unité spécifiée pour Normaliser par unité.", "xpack.lens.indexPattern.timeScale.tooltip": "Normalisez les valeurs pour qu'elles soient toujours affichées en tant que taux par unité de temps spécifiée, indépendamment de l'intervalle de dates sous-jacent.", @@ -28787,7 +28787,6 @@ "xpack.observability.slo.sloDetails.overview.rollingTimeWindow": "{duration} en cours", "xpack.observability.slo.sloDetails.overview.timeslicesBudgetingMethodDetails": "{duration} sections, {target} cible", "xpack.observability.slo.sloDetails.sliHistoryChartPanel.duration": "{duration}", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternFoundLabel": "{searchPattern} (correspond à {num, plural, one {# index} many {# index} other {# index}})", "xpack.observability.slo.sloEdit.rollingTimeWindow.days": "{number} jours", "xpack.observability.slo.update.errorNotification": "Un problème est survenu lors de la mise à jour de {name}", "xpack.observability.slo.update.successNotification": "Mise à jour réussie de {name}", @@ -29250,8 +29249,6 @@ "xpack.observability.slo.sloEdit.createAlert.ruleName": "Règle d'alerte de taux d'avancement du SLO", "xpack.observability.slo.sloEdit.createAlert.title": "Créer", "xpack.observability.slo.sloEdit.createSloButton": "Créer un SLO", - "xpack.observability.slo.sloEdit.customKql.indexSelection.helpText": "Utilisez le caractère * pour élargir votre recherche.", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternLabel": "Utiliser le modèle d'indexation", "xpack.observability.slo.sloEdit.customKql.indexSelection.label": "Index", "xpack.observability.slo.sloEdit.dataPreviewChart.errorMessage": "Les paramètres d'indicateur actuels ne sont pas valides", "xpack.observability.slo.sloEdit.dataPreviewChart.explanationMessage": "Remplir les champs d'indicateur pour visualiser les indicateurs actuels", @@ -40376,7 +40373,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "Le nombre de tentatives doit être compris entre 0 et 100, ou égal à -1 pour des tentatives infinies.", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "La taille maximum de la recherche de pages doit être un nombre entier compris entre 10 et 65 536.", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "Le nombre de tentatives doit être compris entre 0 et 100, ou égal à -1 pour des tentatives infinies.", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "La valeur doit être un entier compris entre 10 et 10 000.", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "Format d'âge maximal non valide. Le minimum requis est de 60 s.", "xpack.transform.transformsTitle": "Transformations", "xpack.transform.transformsWizard.cloneTransformTitle": "Cloner la transformation", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index af1f51321cb60..376f095421c63 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -21939,54 +21939,54 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "{axis}のデータ型が正しくありません。", "xpack.lens.xyVisualization.dataTypeFailureYLong": "{axis}のディメンション{label}のデータ型が正しくありません。数値が想定されていますが、{dataType}です", "xpack.lens.xyVisualization.dataTypeFailureYShort": "{axis}のデータ型が正しくありません。", - "xpack.lens.formula.absFunction.markdown": "\n絶対値を計算します。負の値は-1で乗算されます。正の値は同じままです。\n\n例:海水位までの平均距離を計算します `abs(average(altitude))`\n ", - "xpack.lens.formula.addFunction.markdown": "\n2つの数値を加算します。\n+記号も使用できます。\n\n例:2つのフィールドの合計を計算します\n\n`sum(price) + sum(tax)`\n\n例:固定値でカウントをオフセットします\n\n`add(count(), 5)`\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\n値の立方根。\n\n例:体積から側面の長さを計算します\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\n値の上限(切り上げ)。\n\n例:価格を次のドル単位まで切り上げます\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\n最小値から最大値までの値を制限します。\n\n例:確実に異常値を特定します\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\n数値の三乗を計算します。\n\n例:側面の長さから体積を計算します\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\n値がヌルのときにデフォルトの数値を返します。\n\n例:フィールドにデータがない場合は、-1を返します\n`defaults(average(bytes), -1)`\n", - "xpack.lens.formula.divideFunction.markdown": "\n1番目の数値を2番目の数値で除算します。\n/記号も使用できます\n\n例:利益率を計算します\n`sum(profit) / sum(revenue)`\n\n例:`divide(sum(bytes), 2)`\n ", - "xpack.lens.formula.eqFunction.markdown": "\n2つの値で等価性の比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n==記号も使用できます。\n\n例:バイトの平均が平均メモリーと同じ量の場合は、trueを返します。\n`average(bytes) == average(memory)`\n\n例: `eq(sum(bytes), 1000000)`\n ", - "xpack.lens.formula.expFunction.markdown": "\n*e*をn乗します。\n\n例:自然指数関数を計算します\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\n正の値の場合は、下限を取ります。負の値の場合は、上限を取ります。\n\n例:ゼロに向かって端数処理します\n`fix(sum(profit))`\n ", - "xpack.lens.formula.floorFunction.markdown": "\n最も近い整数値まで切り捨てます\n\n例:価格を切り捨てます\n`floor(sum(price))`\n ", - "xpack.lens.formula.gteFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以上である場合は、trueを返します\n`average(bytes) >= average(memory)`\n\n例: `gte(average(bytes), 1000)`\n ", - "xpack.lens.formula.gtFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より大きい場合は、trueを返します\n`average(bytes) > average(memory)`\n\n例: `gt(average(bytes), 1000)`\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\n条件の要素がtrueかfalseかに応じて、値を返します。\n\n例:顧客ごとの平均収益。ただし、場合によっては、顧客IDが提供されないことがあり、その場合は別の顧客としてカウントされます\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\nオプションで底をとる対数。デフォルトでは自然対数の底*e*を使用します。\n\n例:値を格納するために必要なビット数を計算します\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\n2つの値で小なりイコールの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以下である場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lte(average(bytes), 1000)`\n ", - "xpack.lens.formula.ltFunction.markdown": "\n2つの値で小なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より少ない場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lt(average(bytes), 1000)`\n ", - "xpack.lens.formula.maxFunction.markdown": "\n2つの数値の間の最大値が検出されます。\n\n例:2つのフィールドの平均の最大値が検出されます。\n`pick_max(average(bytes), average(memory))`\n ", - "xpack.lens.formula.minFunction.markdown": "\n2つの数値の間の最小値が検出されます。\n\n例:2つのフィールドの平均の最小値が検索されます。\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\n関数を数値で除算した後の余り\n\n例:値の最後の3ビットを計算します\n`mod(sum(price), 1000)`\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\n2つの数値を乗算します。\n*記号も使用できます。\n\n例:現在の税率を入れた価格を計算します\n`sum(bytes) * last_value(tax_rate)`\n\n例:一定の税率を入れた価格を計算します\n`multiply(sum(price), 1.2)`\n ", - "xpack.lens.formula.powFunction.markdown": "\n値を特定の乗数で累乗します。2番目の引数は必須です\n\n例:側面の長さに基づいて体積を計算します\n`pow(last_value(length), 3)`\n ", - "xpack.lens.formula.roundFunction.markdown": "\n特定の小数位に四捨五入します。デフォルトは0です。\n\n例:セントに四捨五入します\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\n正の値のみの平方根\n\n例:面積に基づいて側面の長さを計算します\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\n値を2乗します\n\n例:側面の長さに基づいて面積を計算します\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\n2番目の数値から1番目の数値を減算します。\n-記号も使用できます。\n\n例:フィールドの範囲を計算します\n`subtract(max(bytes), min(bytes))`\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### フィルター比率:\n\n`kql=''`を使用すると、1つのセットのドキュメントをフィルターして、同じグループの他のドキュメントと比較します。\n例:経時的なエラー率の変化を表示する\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.markdown": "## 仕組み\n\nLens式では、Elasticsearchの集計および数学関数を使用して演算を実行できます\n。主に次の3種類の関数があります。\n\n* `sum(bytes)`などのElasticsearchメトリック\n* 時系列関数は`cumulative_sum()`などのElasticsearchメトリックを入力として使用します\n* `round()`などの数学関数\n\nこれらのすべての関数を使用する式の例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearchの関数はフィールド名を取り、フィールドは引用符で囲むこともできます。`sum(bytes)`は\nas `sum('bytes')`.\n\n一部の関数は、`moving_average(count(), window=5)`のような名前付き引数を取ります。\n\nElasticsearchメトリックはKQLまたはLucene構文を使用してフィルターできます。フィルターを追加するには、名前付き\nparameter `kql='field: value'` or `lucene=''`.KQLまたはLuceneクエリを作成するときには、必ず引用符を使用してください\n。検索が引用符で囲まれている場合は、`kql='Women's''のようにバックスラッシュでエスケープします。\n\n数学関数は位置引数を取ることができます。たとえば、pow(count(), 3)はcount() * count() * count()と同じです。\n\n+、-、/、*記号を使用して、基本演算を実行できます。\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### 合計の割合\n\nすべてのグループで式は`overall_sum`を計算できます。\nこれは各グループを合計の割合に変換できます。\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### 最近の変更\n\n「reducedTimeRange='30m'」を使用して、グローバル時間範囲の最後と一致するメトリックの時間範囲で、フィルターを追加しました。これにより、どのくらいの値が最近変更されたのかを計算できます。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### 週単位:\n\n`shift='1w'`を使用すると、前の週から各グループの値を取得します\n。時間シフトは*Top values*関数と使用しないでください。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\n指定されたフィールドの一意の値の数を計算します。数値、文字列、日付、ブール値で機能します。\n\n例:異なる製品の数を計算します。\n`unique_count(product.name)`\n\n例:「clothes」グループから異なる製品の数を計算します。\n`unique_count(product.name, kql='product.group=clothes')`\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n\n#### 例\n\nドキュメントの合計数を計算するには、count()を使用します。\n\nすべての注文書の製品数を計算するには、count(products.id)を使用します。\n\n特定のフィルターと一致するドキュメントの数を計算するには、count(kql='price > 500')を使用します。\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\n増加し続けるカウンターのレートを計算します。この関数は、経時的に単調に増加する種類の測定を含むカウンターメトリックフィールドでのみ結果を生成します。\n値が小さくなる場合は、カウンターリセットであると解釈されます。最も正確な結果を得るには、フィールドの「max`」で「counter_rate」を計算してください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n式で使用されるときには、現在の間隔を使用します。\n\n例:Memcachedサーバーで経時的に受信されたバイトの比率を可視化します。\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\n経時的なメトリックの累計値を計算し、系列のすべての前の値を各値に追加します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に累積された受信バイト数を可視化します。\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\n経時的にメトリックの最後の値に対する差異を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n差異ではデータが連続する必要があります。差異を使用するときにデータが空の場合は、データヒストグラム間隔を大きくしてみてください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に受信したバイト数の変化を可視化します。\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\n最後のドキュメントからフィールドの値を返し、データビューのデフォルト時刻フィールドで並べ替えます。\n\nこの関数はエンティティの最新の状態を取得する際に役立ちます。\n\n例:サーバーAの現在のステータスを取得:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\nフィールドの{metric}を返します。この関数は数値フィールドでのみ動作します。\n\n例:価格の{metric}を取得:\n`{metric}(price)`\n\n例:英国からの注文の価格の{metric}を取得:\n`{metric}(price, kql='location:UK')`\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\n経時的なメトリックの移動平均を計算します。最後のn番目の値を平均化し、現在の値を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\nデフォルトウィンドウ値は{defaultValue}です\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n指名パラメーター「window」を取ります。これは現在値の平均計算に含める最後の値の数を指定します。\n\n例:測定の線を平滑化:\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの平均を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_average」はすべてのディメンションで平均値を計算します。\n\n例:平均からの収束:\n`sum(bytes) - overall_average(sum(bytes))`\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最大値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_max」はすべてのディメンションで最大値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最小値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_min」はすべてのディメンションで最小値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの合計を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_sum」はすべてのディメンションで合計値を計算します。\n\n例:合計の割合\n`sum(bytes) / overall_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\nフィールドの値の指定された百分位数を返します。これはドキュメントに出現する値のnパーセントが小さい値です。\n\n例:値の95 %より大きいバイト数を取得:\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\n特定の値未満の値の割合が返されます。たとえば、値が観察された値の95%以上の場合、95パーセンタイルランクであるとされます。\n\n例:100未満の値のパーセンタイルを取得します。\n`percentile_rank(bytes, value=100)`\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\nフィールドの分散または散布度が返されます。この関数は数値フィールドでのみ動作します。\n\n#### 例\n\n価格の標準偏差を取得するには、standard_deviation(price)を使用します。\n\n英国からの注文書の価格の分散を取得するには、square(standard_deviation(price, kql='location:UK'))を使用します。\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\nこの高度な機能は、特定の期間に対してカウントと合計を正規化する際に役立ちます。すでに特定の期間に対して正規化され、保存されたメトリックとの統合が可能です。\n\nこの機能は、現在のグラフで日付ヒストグラム関数が使用されている場合にのみ使用できます。\n\n例:すでに正規化されているメトリックを、正規化が必要な別のメトリックと比較した比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", + "lensFormulaDocs.tinymath.absFunction.markdown": "\n絶対値を計算します。負の値は-1で乗算されます。正の値は同じままです。\n\n例:海水位までの平均距離を計算します `abs(average(altitude))`\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\n2つの数値を加算します。\n+記号も使用できます。\n\n例:2つのフィールドの合計を計算します\n\n`sum(price) + sum(tax)`\n\n例:固定値でカウントをオフセットします\n\n`add(count(), 5)`\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\n値の立方根。\n\n例:体積から側面の長さを計算します\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\n値の上限(切り上げ)。\n\n例:価格を次のドル単位まで切り上げます\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\n最小値から最大値までの値を制限します。\n\n例:確実に異常値を特定します\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\n数値の三乗を計算します。\n\n例:側面の長さから体積を計算します\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\n値がヌルのときにデフォルトの数値を返します。\n\n例:フィールドにデータがない場合は、-1を返します\n`defaults(average(bytes), -1)`\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\n1番目の数値を2番目の数値で除算します。\n/記号も使用できます\n\n例:利益率を計算します\n`sum(profit) / sum(revenue)`\n\n例:`divide(sum(bytes), 2)`\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\n2つの値で等価性の比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n==記号も使用できます。\n\n例:バイトの平均が平均メモリーと同じ量の場合は、trueを返します。\n`average(bytes) == average(memory)`\n\n例: `eq(sum(bytes), 1000000)`\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\n*e*をn乗します。\n\n例:自然指数関数を計算します\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\n正の値の場合は、下限を取ります。負の値の場合は、上限を取ります。\n\n例:ゼロに向かって端数処理します\n`fix(sum(profit))`\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\n最も近い整数値まで切り捨てます\n\n例:価格を切り捨てます\n`floor(sum(price))`\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以上である場合は、trueを返します\n`average(bytes) >= average(memory)`\n\n例: `gte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\n2つの値で大なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n>記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より大きい場合は、trueを返します\n`average(bytes) > average(memory)`\n\n例: `gt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\n条件の要素がtrueかfalseかに応じて、値を返します。\n\n例:顧客ごとの平均収益。ただし、場合によっては、顧客IDが提供されないことがあり、その場合は別の顧客としてカウントされます\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\nオプションで底をとる対数。デフォルトでは自然対数の底*e*を使用します。\n\n例:値を格納するために必要なビット数を計算します\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\n2つの値で小なりイコールの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<=記号も使用できます。\n\n例:バイトの平均がメモリーの平均量以下である場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\n2つの値で小なりの比較を実行します。\n「ifelse」比較関数の条件として使用されます。\n<記号も使用できます。\n\n例:バイトの平均がメモリーの平均量より少ない場合は、trueを返します\n`average(bytes) <= average(memory)`\n\n例: `lt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\n2つの数値の間の最大値が検出されます。\n\n例:2つのフィールドの平均の最大値が検出されます。\n`pick_max(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\n2つの数値の間の最小値が検出されます。\n\n例:2つのフィールドの平均の最小値が検索されます。\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\n関数を数値で除算した後の余り\n\n例:値の最後の3ビットを計算します\n`mod(sum(price), 1000)`\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\n2つの数値を乗算します。\n*記号も使用できます。\n\n例:現在の税率を入れた価格を計算します\n`sum(bytes) * last_value(tax_rate)`\n\n例:一定の税率を入れた価格を計算します\n`multiply(sum(price), 1.2)`\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\n値を特定の乗数で累乗します。2番目の引数は必須です\n\n例:側面の長さに基づいて体積を計算します\n`pow(last_value(length), 3)`\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\n特定の小数位に四捨五入します。デフォルトは0です。\n\n例:セントに四捨五入します\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\n正の値のみの平方根\n\n例:面積に基づいて側面の長さを計算します\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\n値を2乗します\n\n例:側面の長さに基づいて面積を計算します\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\n2番目の数値から1番目の数値を減算します。\n-記号も使用できます。\n\n例:フィールドの範囲を計算します\n`subtract(max(bytes), min(bytes))`\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### フィルター比率:\n\n`kql=''`を使用すると、1つのセットのドキュメントをフィルターして、同じグループの他のドキュメントと比較します。\n例:経時的なエラー率の変化を表示する\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.markdown": "## 仕組み\n\nLens式では、Elasticsearchの集計および数学関数を使用して演算を実行できます\n。主に次の3種類の関数があります。\n\n* `sum(bytes)`などのElasticsearchメトリック\n* 時系列関数は`cumulative_sum()`などのElasticsearchメトリックを入力として使用します\n* `round()`などの数学関数\n\nこれらのすべての関数を使用する式の例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearchの関数はフィールド名を取り、フィールドは引用符で囲むこともできます。`sum(bytes)`は\nas `sum('bytes')`.\n\n一部の関数は、`moving_average(count(), window=5)`のような名前付き引数を取ります。\n\nElasticsearchメトリックはKQLまたはLucene構文を使用してフィルターできます。フィルターを追加するには、名前付き\nparameter `kql='field: value'` or `lucene=''`.KQLまたはLuceneクエリを作成するときには、必ず引用符を使用してください\n。検索が引用符で囲まれている場合は、`kql='Women's''のようにバックスラッシュでエスケープします。\n\n数学関数は位置引数を取ることができます。たとえば、pow(count(), 3)はcount() * count() * count()と同じです。\n\n+、-、/、*記号を使用して、基本演算を実行できます。\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### 合計の割合\n\nすべてのグループで式は`overall_sum`を計算できます。\nこれは各グループを合計の割合に変換できます。\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### 最近の変更\n\n「reducedTimeRange='30m'」を使用して、グローバル時間範囲の最後と一致するメトリックの時間範囲で、フィルターを追加しました。これにより、どのくらいの値が最近変更されたのかを計算できます。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### 週単位:\n\n`shift='1w'`を使用すると、前の週から各グループの値を取得します\n。時間シフトは*Top values*関数と使用しないでください。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\n指定されたフィールドの一意の値の数を計算します。数値、文字列、日付、ブール値で機能します。\n\n例:異なる製品の数を計算します。\n`unique_count(product.name)`\n\n例:「clothes」グループから異なる製品の数を計算します。\n`unique_count(product.name, kql='product.group=clothes')`\n ", + "lensFormulaDocs.count.documentation.markdown": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n\n#### 例\n\nドキュメントの合計数を計算するには、count()を使用します。\n\nすべての注文書の製品数を計算するには、count(products.id)を使用します。\n\n特定のフィルターと一致するドキュメントの数を計算するには、count(kql='price > 500')を使用します。\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\n増加し続けるカウンターのレートを計算します。この関数は、経時的に単調に増加する種類の測定を含むカウンターメトリックフィールドでのみ結果を生成します。\n値が小さくなる場合は、カウンターリセットであると解釈されます。最も正確な結果を得るには、フィールドの「max`」で「counter_rate」を計算してください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n式で使用されるときには、現在の間隔を使用します。\n\n例:Memcachedサーバーで経時的に受信されたバイトの比率を可視化します。\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\n経時的なメトリックの累計値を計算し、系列のすべての前の値を各値に追加します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に累積された受信バイト数を可視化します。\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\n経時的にメトリックの最後の値に対する差異を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\n差異ではデータが連続する必要があります。差異を使用するときにデータが空の場合は、データヒストグラム間隔を大きくしてみてください。\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n例:経時的に受信したバイト数の変化を可視化します。\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\n最後のドキュメントからフィールドの値を返し、データビューのデフォルト時刻フィールドで並べ替えます。\n\nこの関数はエンティティの最新の状態を取得する際に役立ちます。\n\n例:サーバーAの現在のステータスを取得:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\nフィールドの{metric}を返します。この関数は数値フィールドでのみ動作します。\n\n例:価格の{metric}を取得:\n`{metric}(price)`\n\n例:英国からの注文の価格の{metric}を取得:\n`{metric}(price, kql='location:UK')`\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\n経時的なメトリックの移動平均を計算します。最後のn番目の値を平均化し、現在の値を計算します。この関数を使用するには、日付ヒストグラムディメンションも構成する必要があります。\nデフォルトウィンドウ値は{defaultValue}です\n\nこの計算はフィルターで定義された別の系列または上位値のディメンションに対して個別に実行されます。\n\n指名パラメーター「window」を取ります。これは現在値の平均計算に含める最後の値の数を指定します。\n\n例:測定の線を平滑化:\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの平均を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_average」はすべてのディメンションで平均値を計算します。\n\n例:平均からの収束:\n`sum(bytes) - overall_average(sum(bytes))`\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最大値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_max」はすべてのディメンションで最大値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの最小値を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_min」はすべてのディメンションで最小値を計算します。\n\n例:範囲の割合\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\n現在のグラフの系列のすべてのデータポイントのメトリックの合計を計算します。系列は日付ヒストグラムまたは間隔関数を使用してディメンションによって定義されます。\n上位の値やフィルターなどのデータを分解する他のディメンションは別の系列として処理されます。\n\n日付ヒストグラムまたは間隔関数が現在のグラフで使用されている場合、使用されている関数に関係なく、「overall_sum」はすべてのディメンションで合計値を計算します。\n\n例:合計の割合\n`sum(bytes) / overall_sum(sum(bytes))`\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\nフィールドの値の指定された百分位数を返します。これはドキュメントに出現する値のnパーセントが小さい値です。\n\n例:値の95 %より大きいバイト数を取得:\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\n特定の値未満の値の割合が返されます。たとえば、値が観察された値の95%以上の場合、95パーセンタイルランクであるとされます。\n\n例:100未満の値のパーセンタイルを取得します。\n`percentile_rank(bytes, value=100)`\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\nフィールドの分散または散布度が返されます。この関数は数値フィールドでのみ動作します。\n\n#### 例\n\n価格の標準偏差を取得するには、standard_deviation(price)を使用します。\n\n英国からの注文書の価格の分散を取得するには、square(standard_deviation(price, kql='location:UK'))を使用します。\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\nこの高度な機能は、特定の期間に対してカウントと合計を正規化する際に役立ちます。すでに特定の期間に対して正規化され、保存されたメトリックとの統合が可能です。\n\nこの機能は、現在のグラフで日付ヒストグラム関数が使用されている場合にのみ使用できます。\n\n例:すでに正規化されているメトリックを、正規化が必要な別のメトリックと比較した比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "xpack.lens.AggBasedLabel": "集約に基づく可視化", "xpack.lens.app.addToLibrary": "ライブラリに保存", "xpack.lens.app.cancel": "キャンセル", @@ -22164,11 +22164,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "次へ", "xpack.lens.fittingFunctionsTitle.none": "非表示", "xpack.lens.fittingFunctionsTitle.zero": "ゼロ", - "xpack.lens.formula.base": "基数", - "xpack.lens.formula.boolean": "ブール", - "xpack.lens.formula.condition": "条件", - "xpack.lens.formula.decimals": "小数点以下", - "xpack.lens.formula.defaultValue": "デフォルト", + "lensFormulaDocs.tinymath.base": "基数", + "lensFormulaDocs.boolean": "ブール", + "lensFormulaDocs.tinymath.condition": "条件", + "lensFormulaDocs.tinymath.decimals": "小数点以下", + "lensFormulaDocs.tinymath.defaultValue": "デフォルト", "xpack.lens.formula.disableWordWrapLabel": "単語の折り返しを無効にする", "xpack.lens.formula.editorHelpInlineHideLabel": "関数リファレンスを非表示", "xpack.lens.formula.editorHelpInlineHideToolTip": "関数リファレンスを非表示", @@ -22176,35 +22176,35 @@ "xpack.lens.formula.fullScreenEnterLabel": "拡張", "xpack.lens.formula.fullScreenExitLabel": "縮小", "xpack.lens.formula.kqlExtraArguments": "[kql]?:文字列、[lucene]?:文字列", - "xpack.lens.formula.left": "左", - "xpack.lens.formula.max": "最高", - "xpack.lens.formula.min": "分", - "xpack.lens.formula.number": "数字", + "lensFormulaDocs.tinymath.left": "左", + "lensFormulaDocs.tinymath.max": "最高", + "lensFormulaDocs.tinymath.min": "分", + "lensFormulaDocs.number": "数字", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: string", "xpack.lens.formula.requiredArgument": "必須", - "xpack.lens.formula.right": "右", + "lensFormulaDocs.tinymath.right": "右", "xpack.lens.formula.shiftExtraArguments": "[shift]?:文字列", - "xpack.lens.formula.string": "文字列", - "xpack.lens.formula.value": "値", - "xpack.lens.formulaCommonFormulaDocumentation": "最も一般的な式は2つの値を分割して割合を生成します。正確に表示するには、[値形式]を[割合]に設定します。", - "xpack.lens.formulaDocumentation.columnCalculationSection": "列計算", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "各行でこれらの関数が実行されますが、コンテキストとして列全体が提供されます。これはウィンドウ関数とも呼ばれます。", - "xpack.lens.formulaDocumentation.comparisonSection": "比較", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "これらの関数は値を比較するために使用されます。", - "xpack.lens.formulaDocumentation.constantsSection": "Kibanaコンテキスト", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "これらの関数は、Kibanaのコンテキスト変数(日付ヒストグラムの「interval」、現在の「now」、選択した「time_range」)を取得するために使用され、日付の計算処理を行うのに役立ちます。", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "これらの関数は結果テーブルの各行の未加工ドキュメントで実行され、内訳ディメンションと一致するすべてのドキュメントを単一の値に集約します。", - "xpack.lens.formulaDocumentation.filterRatio": "フィルター比率", - "xpack.lens.formulaDocumentation.mathSection": "数学処理", - "xpack.lens.formulaDocumentation.mathSectionDescription": "これらの関数は、他の関数で計算された同じ行の単一の値を使用して、結果テーブルの各行で実行されます。", - "xpack.lens.formulaDocumentation.percentOfTotal": "合計の割合", - "xpack.lens.formulaDocumentation.recentChange": "最近の変更", - "xpack.lens.formulaDocumentation.weekOverWeek": "週単位", + "lensFormulaDocs.string": "文字列", + "lensFormulaDocs.tinymath.value": "値", + "lensFormulaDocs.CommonFormulaDocumentation": "最も一般的な式は2つの値を分割して割合を生成します。正確に表示するには、[値形式]を[割合]に設定します。", + "lensFormulaDocs.documentation.columnCalculationSection": "列計算", + "lensFormulaDocs.documentation.columnCalculationSectionDescription": "各行でこれらの関数が実行されますが、コンテキストとして列全体が提供されます。これはウィンドウ関数とも呼ばれます。", + "lensFormulaDocs.documentation.comparisonSection": "比較", + "lensFormulaDocs.documentation.comparisonSectionDescription": "これらの関数は値を比較するために使用されます。", + "lensFormulaDocs.documentation.constantsSection": "Kibanaコンテキスト", + "lensFormulaDocs.documentation.constantsSectionDescription": "これらの関数は、Kibanaのコンテキスト変数(日付ヒストグラムの「interval」、現在の「now」、選択した「time_range」)を取得するために使用され、日付の計算処理を行うのに役立ちます。", + "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", + "lensFormulaDocs.documentation.elasticsearchSectionDescription": "これらの関数は結果テーブルの各行の未加工ドキュメントで実行され、内訳ディメンションと一致するすべてのドキュメントを単一の値に集約します。", + "lensFormulaDocs.documentation.filterRatio": "フィルター比率", + "lensFormulaDocs.documentation.mathSection": "数学処理", + "lensFormulaDocs.documentation.mathSectionDescription": "これらの関数は、他の関数で計算された同じ行の単一の値を使用して、結果テーブルの各行で実行されます。", + "lensFormulaDocs.documentation.percentOfTotal": "合計の割合", + "lensFormulaDocs.documentation.recentChange": "最近の変更", + "lensFormulaDocs.documentation.weekOverWeek": "週単位", "xpack.lens.formulaDocumentationHeading": "仕組み", "xpack.lens.formulaEnableWordWrapLabel": "単語の折り返しを有効にする", "xpack.lens.formulaExampleMarkdown": "例", - "xpack.lens.formulaFrequentlyUsedHeading": "一般的な式", + "lensFormulaDocs.frequentlyUsedHeading": "一般的な式", "xpack.lens.formulaPlaceholderText": "関数を演算と組み合わせて式を入力します。例:", "xpack.lens.fullExtent.niceValues": "切りの良い値に端数処理", "xpack.lens.functions.collapse.args.byHelpText": "グループ化の基準となる列。この列はそのまま保持されます", @@ -22263,29 +22263,29 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "使用可能なフィールドをワークスペースまでドラッグし、ビジュアライゼーションを作成します。使用可能なフィールドを変更するには、別のデータビューを選択するか、クエリを編集するか、別の時間範囲を使用します。一部のフィールドタイプは、完全なテキストおよびグラフィックフィールドを含む Lens では、ビジュアライゼーションできません。", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "ドキュメントをご覧ください", "xpack.lens.indexPattern.availableFieldsLabel": "利用可能なフィールド", - "xpack.lens.indexPattern.avg": "平均", + "lensFormulaDocs.avg": "平均", "xpack.lens.indexPattern.avg.description": "集約されたドキュメントから抽出された数値の平均値を計算する単一値メトリック集約", "xpack.lens.indexPattern.avg.quickFunctionDescription": "数値フィールドの集合の平均値。", "xpack.lens.indexPattern.bitsFormatLabel": "ビット(1000)", "xpack.lens.indexPattern.bytesFormatLabel": "バイト(1024)", - "xpack.lens.indexPattern.cardinality": "ユニークカウント", + "lensFormulaDocs.cardinality": "ユニークカウント", "xpack.lens.indexPattern.cardinality.documentation.quick": "\n指定した数値、文字列、日付、ブール値フィールドの一意の値の数。\n ", - "xpack.lens.indexPattern.cardinality.signature": "フィールド:文字列", + "lensFormulaDocs.cardinality.signature": "フィールド:文字列", "xpack.lens.indexPattern.changeDataViewTitle": "データビュー", "xpack.lens.indexPattern.chooseField": "フィールド", "xpack.lens.indexPattern.chooseFieldLabel": "この関数を使用するには、フィールドを選択してください。", "xpack.lens.indexPattern.chooseSubFunction": "サブ関数を選択", "xpack.lens.indexPattern.columnFormatLabel": "値の形式", "xpack.lens.indexPattern.compactLabel": "値の圧縮", - "xpack.lens.indexPattern.count": "カウント", + "lensFormulaDocs.count": "カウント", "xpack.lens.indexPattern.count.documentation.quick": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n ", - "xpack.lens.indexPattern.count.signature": "[field: string]", - "xpack.lens.indexPattern.counterRate": "カウンターレート", + "lensFormulaDocs.count.signature": "[field: string]", + "lensFormulaDocs.counterRate": "カウンターレート", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n 増加を続ける時系列メトリックの経時的な変化率。\n ", - "xpack.lens.indexPattern.counterRate.signature": "メトリック:数値", + "lensFormulaDocs.counterRate.signature": "メトリック:数値", "xpack.lens.indexPattern.countOf": "レコード数", - "xpack.lens.indexPattern.cumulative_sum.signature": "メトリック:数値", - "xpack.lens.indexPattern.cumulativeSum": "累積和", + "lensFormulaDocs.cumulative_sum.signature": "メトリック:数値", + "lensFormulaDocs.cumulativeSum": "累積和", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n 経時的に増加するすべての値の合計。\n ", "xpack.lens.indexPattern.custom.externalDoc": "数値書式構文", "xpack.lens.indexPattern.custom.patternLabel": "フォーマット", @@ -22315,9 +22315,9 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "現在の時間範囲がありません", "xpack.lens.indexPattern.decimalPlacesLabel": "小数点以下", "xpack.lens.indexPattern.defaultFormatLabel": "デフォルト", - "xpack.lens.indexPattern.derivative": "差異", + "lensFormulaDocs.derivative": "差異", "xpack.lens.indexPattern.differences.documentation.quick": "\n 後続の間隔の値の変化。\n ", - "xpack.lens.indexPattern.differences.signature": "メトリック:数値", + "lensFormulaDocs.differences.signature": "メトリック:数値", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "見た目", "xpack.lens.indexPattern.dimensionEditor.headingData": "データ", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "式", @@ -22370,30 +22370,30 @@ "xpack.lens.indexPattern.invalidOperationLabel": "選択した関数はこのフィールドで動作しません。", "xpack.lens.indexPattern.invalidReducedTimeRange": "縮小された時間範囲が無効です。正の整数の後に単位s、m、h、d、w、M、yのいずれかを入力します。例:3時間は3hです", "xpack.lens.indexPattern.invalidTimeShift": "無効な時間シフトです。正の整数の後に単位s、m、h、d、w、M、yのいずれかを入力します。例:3時間は3hです", - "xpack.lens.indexPattern.lastValue": "最終値", + "lensFormulaDocs.lastValue": "最終値", "xpack.lens.indexPattern.lastValue.disabled": "この関数には、データビューの日付フィールドが必要です", "xpack.lens.indexPattern.lastValue.documentation.quick": "\n最後のドキュメントのフィールドの値。データビューのデフォルト時刻フィールドで並べ替えられます。\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "ゼロ値を表示", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "各最後のドキュメントのこのフィールドに関連付けられたすべての値を表示します。", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "配列値を表示するときには、このフィールドを使用して上位の値をランク付けできません。", - "xpack.lens.indexPattern.lastValue.signature": "フィールド:文字列", + "lensFormulaDocs.lastValue.signature": "フィールド:文字列", "xpack.lens.indexPattern.lastValue.sortField": "日付フィールドで並べ替え", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "並べ替えフィールド", - "xpack.lens.indexPattern.max": "最高", + "lensFormulaDocs.max": "最高", "xpack.lens.indexPattern.max.description": "集約されたドキュメントから抽出された数値の最大値を返す単一値メトリック集約。", "xpack.lens.indexPattern.max.quickFunctionDescription": "数値フィールドの最大値。", - "xpack.lens.indexPattern.median": "中央", + "lensFormulaDocs.median": "中央", "xpack.lens.indexPattern.median.description": "集約されたドキュメントから抽出された中央値を計算する単一値メトリック集約。", "xpack.lens.indexPattern.median.quickFunctionDescription": "数値フィールドの中央値。", "xpack.lens.indexPattern.metaFieldsLabel": "メタフィールド", - "xpack.lens.indexPattern.metric.signature": "フィールド:文字列", - "xpack.lens.indexPattern.min": "最低", + "lensFormulaDocs.metric.signature": "フィールド:文字列", + "lensFormulaDocs.min": "最低", "xpack.lens.indexPattern.min.description": "集約されたドキュメントから抽出された数値の最小値を返す単一値メトリック集約。", "xpack.lens.indexPattern.min.quickFunctionDescription": "数値フィールドの最小値。", "xpack.lens.indexPattern.missingFieldLabel": "見つからないフィールド", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "このフィールドを可視化するには、直接任意のレイヤーに追加してください。現在の設定では、このフィールドをワークスペースに追加することはサポートされていません。", - "xpack.lens.indexPattern.moving_average.signature": "メトリック:数値、[window]:数値", - "xpack.lens.indexPattern.movingAverage": "移動平均", + "lensFormulaDocs.moving_average.signature": "メトリック:数値、[window]:数値", + "lensFormulaDocs.movingAverage": "移動平均", "xpack.lens.indexPattern.movingAverage.basicExplanation": "移動平均はデータ全体でウィンドウをスライドし、平均値を表示します。移動平均は日付ヒストグラムでのみサポートされています。", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n 経時的な値の移動範囲の平均。\n ", "xpack.lens.indexPattern.movingAverage.limitations": "最初の移動平均値は2番目の項目から開始します。", @@ -22409,20 +22409,20 @@ "xpack.lens.indexPattern.noRealMetricError": "静的値のみのレイヤーには結果が表示されません。1つ以上の動的メトリックを使用してください", "xpack.lens.indexPattern.notAbsoluteTimeShift": "無効な時間シフトです。", "xpack.lens.indexPattern.numberFormatLabel": "数字", - "xpack.lens.indexPattern.overall_metric": "メトリック:数値", - "xpack.lens.indexPattern.overallMax": "全体最高", - "xpack.lens.indexPattern.overallMin": "全体最低", - "xpack.lens.indexPattern.overallSum": "全体合計", + "lensFormulaDocs.overall_metric": "メトリック:数値", + "lensFormulaDocs.overallMax": "全体最高", + "lensFormulaDocs.overallMin": "全体最低", + "lensFormulaDocs.overallSum": "全体合計", "xpack.lens.indexPattern.percentFormatLabel": "割合(%)", - "xpack.lens.indexPattern.percentile": "パーセンタイル", + "lensFormulaDocs.percentile": "パーセンタイル", "xpack.lens.indexPattern.percentile.documentation.quick": "\n すべてのドキュメントで発生する値のnパーセントよりも小さい最大値。\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "パーセンタイル順位値", "xpack.lens.indexPattern.percentile.percentileValue": "パーセンタイル", - "xpack.lens.indexPattern.percentile.signature": "フィールド:文字列、[percentile]:数値", - "xpack.lens.indexPattern.percentileRank": "パーセンタイル順位", + "lensFormulaDocs.percentile.signature": "フィールド:文字列、[percentile]:数値", + "lensFormulaDocs.percentileRank": "パーセンタイル順位", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\n特定の値未満の値の割合。たとえば、値が計算された値の95%以上の場合、95パーセンタイル順位です。\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "パーセンタイル順位値は数値でなければなりません", - "xpack.lens.indexPattern.percentileRanks.signature": "フィールド: 文字列, [value]: 数値", + "lensFormulaDocs.percentileRanks.signature": "フィールド: 文字列, [value]: 数値", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "これは近似値の可能性があります。より正確な結果を得るために精度モードを有効にできますが、Elasticsearchクラスターの負荷が大きくなります。", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "これは近似値の可能性があります。より正確な結果を得るには、フィルターを使用するか、上位の値の数を増やしてください。", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "データのインデックスの作成方法により、近似される場合があります。より正確な結果を得るには、希少性でソートしてください。", @@ -22472,7 +22472,7 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "データレイヤー", "xpack.lens.indexPattern.settingsSamplingUnsupported": "この関数を選択すると、関数が正常に機能するように、このレイヤーのサンプリングが100%に変更されます。", "xpack.lens.indexPattern.sortField.invalid": "無効なフィールドです。データビューを確認するか、別のフィールドを選択してください。", - "xpack.lens.indexPattern.standardDeviation": "標準偏差", + "lensFormulaDocs.standardDeviation": "標準偏差", "xpack.lens.indexPattern.standardDeviation.description": "集約されたドキュメントから抽出された数値の標準偏差を計算する単一値メトリック集約", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "フィールド値の変動量である数値フィールドの値の標準偏差。", "xpack.lens.indexPattern.staticValue.label": "基準線値", @@ -22482,7 +22482,7 @@ "xpack.lens.indexPattern.staticValueWarningText": "固定値を上書きするには、クイック関数を選択します", "xpack.lens.indexPattern.suffixLabel": "接尾辞", "xpack.lens.indexpattern.suggestions.overTimeLabel": "一定時間", - "xpack.lens.indexPattern.sum": "合計", + "lensFormulaDocs.sum": "合計", "xpack.lens.indexPattern.sum.description": "集約されたドキュメントから抽出された数値を合計する単一値メトリック集約。", "xpack.lens.indexPattern.sum.quickFunctionDescription": "数値フィールドの値の合計量。", "xpack.lens.indexPattern.switchToRare": "希少性でランク", @@ -22520,8 +22520,8 @@ "xpack.lens.indexPattern.terms.size": "値の数", "xpack.lens.indexPattern.termsWithMultipleShifts": "単一のレイヤーでは、メトリックを異なる時間シフトと動的な上位の値と組み合わせることができません。すべてのメトリックで同じ時間シフト値を使用するか、上位の値ではなくフィルターを使用します。", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "フィルターを使用", - "xpack.lens.indexPattern.time_scale": "メトリック:数値、単位:s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "単位で正規化", + "lensFormulaDocs.time_scale": "メトリック:数値、単位:s|m|h|d|w|M|y", + "lensFormulaDocs.timeScale": "単位で正規化", "xpack.lens.indexPattern.timeScale.label": "単位で正規化", "xpack.lens.indexPattern.timeScale.missingUnit": "単位による正規化の単位が指定されていません。", "xpack.lens.indexPattern.timeScale.tooltip": "基本の日付間隔に関係なく、常に指定された時間単位のレートとして表示されるように値を正規化します。", @@ -28787,7 +28787,6 @@ "xpack.observability.slo.sloDetails.overview.rollingTimeWindow": "{duration}ローリング", "xpack.observability.slo.sloDetails.overview.timeslicesBudgetingMethodDetails": "{duration}スライス、{target}ターゲット", "xpack.observability.slo.sloDetails.sliHistoryChartPanel.duration": "過去{duration}", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternFoundLabel": "{searchPattern}({num, plural, other {#個のインデックス}}と一致)", "xpack.observability.slo.sloEdit.rollingTimeWindow.days": "{number}日", "xpack.observability.slo.update.errorNotification": "{name}の更新中にエラーが発生しました", "xpack.observability.slo.update.successNotification": "正常に{name}を更新しました", @@ -29250,8 +29249,6 @@ "xpack.observability.slo.sloEdit.createAlert.ruleName": "SLOバーンレートアラートルール", "xpack.observability.slo.sloEdit.createAlert.title": "作成", "xpack.observability.slo.sloEdit.createSloButton": "SLOの作成", - "xpack.observability.slo.sloEdit.customKql.indexSelection.helpText": "* で検索クエリの範囲を広げます。", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternLabel": "インデックスパターンを使用", "xpack.observability.slo.sloEdit.customKql.indexSelection.label": "インデックス", "xpack.observability.slo.sloEdit.dataPreviewChart.errorMessage": "現在のインジケーター設定は無効です", "xpack.observability.slo.sloEdit.dataPreviewChart.explanationMessage": "インジケーターフィールドに入力すると、現在のメトリックが可視化されます。", @@ -40375,7 +40372,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "再試行回数は0~100の範囲でなければなりません。-1を指定すると、再試行回数が無制限に設定されます。", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "最大ページ検索サイズは10~65536の範囲の整数でなければなりません。", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "再試行回数は0~100の範囲でなければなりません。-1を指定すると、再試行回数が無制限に設定されます。", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "値は10~10000の範囲の整数でなければなりません。", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "無効な最大年齢形式です。60秒以上が必要です。", "xpack.transform.transformsTitle": "トランスフォーム", "xpack.transform.transformsWizard.cloneTransformTitle": "クローントランスフォーム", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 53b6da3e5fd08..485ca11b4fbfc 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4833,6 +4833,73 @@ "languageDocumentationPopover.header": "{language} 参考", "languageDocumentationPopover.tooltip": "{lang} 参考", "languageDocumentationPopover.searchPlaceholder": "搜索", + "lensFormulaDocs.avg": "平均值", + "lensFormulaDocs.cardinality": "唯一计数", + "lensFormulaDocs.count": "计数", + "lensFormulaDocs.counterRate": "计数率", + "lensFormulaDocs.cumulativeSum": "累计和", + "lensFormulaDocs.derivative": "差异", + "lensFormulaDocs.lastValue": "最后值", + "lensFormulaDocs.max": "最大值", + "lensFormulaDocs.median": "中值", + "lensFormulaDocs.min": "最小值", + "lensFormulaDocs.movingAverage": "移动平均值", + "lensFormulaDocs.overallMax": "总体最大值", + "lensFormulaDocs.overallMin": "总体最小值", + "lensFormulaDocs.overallSum": "总和", + "lensFormulaDocs.percentile": "百分位数", + "lensFormulaDocs.percentileRank": "百分位等级", + "lensFormulaDocs.standardDeviation": "标准偏差", + "lensFormulaDocs.sum": "求和", + "lensFormulaDocs.timeScale": "按单位标准化", + "lensFormulaDocs.tinymath.absFunction.markdown": "\n计算绝对值。负值乘以 -1,正值保持不变。\n\n例如:计算平均海拔高度 `abs(average(altitude))`\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\n将两个数值相加。\n还可以使用 `+` 符号。\n\n例如:计算两个字段的和\n\n`sum(price) + sum(tax)`\n\n例如:使计数偏移静态值\n\n`add(count(), 5)`\n ", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\n值的立方根。\n\n例如:从体积计算边长\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\n值的上限,向上舍入。\n\n例如:向上舍入价格\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\n将值限制在最小值到最大值之间。\n\n例如:确保捕获离群值\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\n计算数值的立方。\n\n例如:从边长计算体积\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\n值为 Null 时返回默认数值。\n\n例如:字段不包含数据时返回 -1\n`defaults(average(bytes), -1)`\n", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\n将第一个数字除以第二个数字。\n还可以使用 `/` 符号\n\n例如:计算利润率\n`sum(profit) / sum(revenue)`\n\n例如:`divide(sum(bytes), 2)`\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\n在两个值之间执行相等比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `==` 符号。\n\n例如:如果平均字节数与平均内存容量完全相同,则返回 true\n`average(bytes) == average(memory)`\n\n示例:`eq(sum(bytes), 1000000)`\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\n计算 *e* 的 n 次幂。\n\n例如:计算自然指数函数\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\n对于正值,取下限。对于负值,取上限。\n\n例如:正在向零舍入\n`fix(sum(profit))`\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\n向下舍入到最近整数值\n\n例如:向下舍入价格\n`floor(sum(price))`\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>=` 符号。\n\n例如:如果平均字节数大于或等于平均内存容量,则返回 true\n`average(bytes) >= average(memory)`\n\n示例:`gte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>` 符号。\n\n例如:如果平均字节数大于平均内存容量,则返回 true\n`average(bytes) > average(memory)`\n\n示例:`gt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\n返回某个值,取决于条件的元素是 true 还是 false。\n\n例如:每名客户的平均收入,但在某些情况下不提供客户 ID,这会计数为其他客户\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.logFunction.markdown": "\n底数可选的对数。自然底数 *e* 用作默认值。\n\n例如:计算存储值所需的位数\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\n在两个值之间执行小于或等于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<=` 符号。\n\n例如:如果平均字节数小于或等于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\n在两个值之间执行小于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<` 符号。\n\n例如:如果平均字节数小于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\n查找两个数字间的最大值。\n\n例如:查找两个字段平均值间的最大值\n`pick_max(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.minFunction.markdown": "\n查找两个数字间的最小值。\n\n例如:查找两个字段平均值间的最小值\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\n将函数除以数值后的余数\n\n例如:计算值的后三位数\n`mod(sum(price), 1000)`\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\n将两个数值相乘。\n还可以使用 `*` 符号。\n\n例如:计算现行税率后的价格\n`sum(bytes) * last_value(tax_rate)`\n\n例如:计算固定税率后的价格\n`multiply(sum(price), 1.2)`\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\n计算该值的特定次幂。第二个参数必填\n\n例如:基于边长计算体积\n`pow(last_value(length), 3)`\n ", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\n舍入到特定数目的小数位,默认为 0\n\n示例:舍入到百分\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\n仅正值的平方根\n\n例如:基于面积计算边长\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\n计算该值的 2 次幂\n\n例如:基于边长计算面积\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\n从第二个数值减去第一个数值。\n还可以使用 `-` 符号。\n\n例如:计算字段的范围\n`subtract(max(bytes), min(bytes))`\n ", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### 筛选比:\n\n使用 `kql=''` 筛选一个文档集,然后将其与相同分组中的其他文档进行比较。\n例如,要查看错误率随时间的推移如何变化:\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", + "lensFormulaDocs.documentation.markdown": "## 工作原理\n\nLens 公式允许您使用 Elasticsearch 聚合和\n数学函数的组合进行数学计算。主要有三种类型的函数:\n\n* Elasticsearch 指标,如 `sum(bytes)`\n* 时间序列函数使用 Elasticsearch 指标作为输入,如 `cumulative_sum()`\n* 数学函数,如 `round()`\n\n使用所有这些函数的公式示例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearch 函数取可以用引号引起的字段名称。`sum(bytes)` 同于\nas `sum('bytes')`.\n\n一些函数取已命名参数,如 `moving_average(count(), window=5)`。\n\nElasticsearch 指标可以使用 KQL 或 Lucene 语法筛选。要添加筛选,请使用已命名\n参数 `kql='field: value'` 或 `lucene=''`。编写 KQL 或 Lucene 查询时,应始终使用\n单引号。如果您的搜索包含单引号,请使用反斜杠转义,如:`kql='Women's''\n\n数学函数可以取位置参数,如 pow(count(), 3) 与 count() * count() * count() 相同\n\n使用符号 +、-、/ 和 * 执行基本数学运算。\n ", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### 总计的百分比\n\n公式可以计算所有分组的 `overall_sum`,\n其允许您将每个分组转成总计的百分比:\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### 最近更改\n\n使用 `reducedTimeRange='30m'` 在与全局时间范围末尾相一致的指标时间范围上添加其他筛选。这可用于计算某个值在最近更改的幅度。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### 周环比:\n\n使用 `shift='1w'` 以获取上一周每个分组\n的值。时间偏移不应与*排名最前值*函数一起使用。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", + "lensFormulaDocs.cardinality.documentation.markdown": "\n计算指定字段的唯一值数目。适用于数字、字符串、日期和布尔值。\n\n例如:计算不同产品的数目:\n`unique_count(product.name)`\n\n例如:计算“clothes”组中不同产品的数目:\n`unique_count(product.name, kql='product.group=clothes')`\n ", + "lensFormulaDocs.count.documentation.markdown": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n\n#### 示例\n\n要计算文档总数,请使用 `count()`。\n\n要计算所有订单中产品的数量,请使用 `count(products.id)`。\n\n要计算与特定筛选匹配的文档数量,请使用 `count(kql='price > 500')`。\n ", + "lensFormulaDocs.counterRate.documentation.markdown": "\n计算不断增大的计数器的速率。此函数将仅基于计数器指标字段生成有帮助的结果,包括随着时间的推移度量某种单调递增。\n如果值确实变小,则其将此解析为计数器重置。要获取很精确的结果,应基于字段的 `max`计算 `counter_rate`。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n用于公式中时,其使用当前时间间隔。\n\n例如:可视化随着时间的推移 Memcached 服务器接收的字节速率:\n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\n计算随着时间的推移指标的累计和,即序列的所有以前值相加得出每个值。要使用此函数,您还需要配置 Date Histogram 维度。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移累计接收的字节:\n`cumulative_sum(sum(bytes))`\n ", + "lensFormulaDocs.differences.documentation.markdown": "\n计算随着时间的推移与指标最后一个值的差异。要使用此函数,您还需要配置 Date Histogram 维度。\n差异需要数据是顺序的。如果使用差异时数据为空,请尝试增加 Date Histogram 时间间隔。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移接收的字节的变化:\n`differences(sum(bytes))`\n ", + "lensFormulaDocs.lastValue.documentation.markdown": "\n返回最后一个文档的字段值,按数据视图的默认时间字段排序。\n\n此函数用于检索实体的最新状态。\n\n例如:获取服务器 A 的当前状态:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", + "lensFormulaDocs.metric.documentation.markdown": "\n返回字段的 {metric}。此函数仅适用于数字字段。\n\n例如:获取价格的 {metric}:\n`{metric}(price)`\n\n例如:获取英国订单价格的 {metric}:\n`{metric}(price, kql='location:UK')`\n ", + "lensFormulaDocs.movingAverage.documentation.markdown": "\n计算随着时间的推移指标的移动平均值,即计算最后 n 个值的平均值以得出当前值。要使用此函数,您还需要配置 Date Histogram 维度。\n默认窗口值为 {defaultValue}。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n取已命名参数 `window`,其指定当前值的平均计算中要包括过去多少个值。\n\n例如:平滑度量线:\n`moving_average(sum(bytes), window=5)`\n ", + "lensFormulaDocs.overall_average.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的平均值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_average` 都将计算所有维度的平均值\n\n例如:与平均值的偏离:\n`sum(bytes) - overall_average(sum(bytes))`\n ", + "lensFormulaDocs.overall_max.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最大值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或内部函数,则无论使用什么函数,`overall_max` 都将计算所有维度的最大值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_min.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最小值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_min` 都将计算所有维度的最小值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", + "lensFormulaDocs.overall_sum.documentation.markdown": "\n计算当前图表中序列所有数据点的指标的和。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_sum` 都将计算所有维度的和。\n\n例如:总计的百分比\n`sum(bytes) / overall_sum(sum(bytes))`\n ", + "lensFormulaDocs.percentile.documentation.markdown": "\n返回字段的值的指定百分位数。文档中百分之 n 的值比此值小。\n\n例如:获取大于 95 % 的值的字节数:\n`percentile(bytes, percentile=95)`\n ", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\n返回小于某个值的值的百分比。例如,如果某个值大于或等于 95% 的观察值,则称它处于第 95 个百分位等级\n\n例如:获取小于 100 的值的百分比:\n`percentile_rank(bytes, value=100)`\n ", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\n返回字段的变量或差量数量。此函数仅适用于数字字段。\n\n#### 示例\n\n要获取价格的标准偏差,请使用 `standard_deviation(price)`。\n\n要获取来自英国的订单的价格方差,请使用 `square(standard_deviation(price, kql='location:UK'))`。\n ", + "lensFormulaDocs.time_scale.documentation.markdown": "\n\n此高级函数用于将计数和总和标准化为特定时间间隔。它允许集成所存储的已标准化为特定时间间隔的指标。\n\n此函数只能在当前图表中使用了日期直方图函数时使用。\n\n例如:将已标准化指标与其他需要标准化的指标进行比较的比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "links.contentManagement.saveModalTitle": "将 {contentId} 面板保存到库", "links.externalLink.editor.urlFormatError": "格式无效。示例:{exampleUrl}", "links.dashboardLink.description": "前往仪表板", @@ -21938,54 +22005,6 @@ "xpack.lens.xyVisualization.dataTypeFailureXShort": "{axis} 的数据类型错误。", "xpack.lens.xyVisualization.dataTypeFailureYLong": "为 {axis} 提供的维度 {label} 具有错误的数据类型。应为数字,但却为 {dataType}", "xpack.lens.xyVisualization.dataTypeFailureYShort": "{axis} 的数据类型错误。", - "xpack.lens.formula.absFunction.markdown": "\n计算绝对值。负值乘以 -1,正值保持不变。\n\n例如:计算平均海拔高度 `abs(average(altitude))`\n ", - "xpack.lens.formula.addFunction.markdown": "\n将两个数值相加。\n还可以使用 `+` 符号。\n\n例如:计算两个字段的和\n\n`sum(price) + sum(tax)`\n\n例如:使计数偏移静态值\n\n`add(count(), 5)`\n ", - "xpack.lens.formula.cbrtFunction.markdown": "\n值的立方根。\n\n例如:从体积计算边长\n`cbrt(last_value(volume))`\n ", - "xpack.lens.formula.ceilFunction.markdown": "\n值的上限,向上舍入。\n\n例如:向上舍入价格\n`ceil(sum(price))`\n ", - "xpack.lens.formula.clampFunction.markdown": "\n将值限制在最小值到最大值之间。\n\n例如:确保捕获离群值\n```\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n```\n", - "xpack.lens.formula.cubeFunction.markdown": "\n计算数值的立方。\n\n例如:从边长计算体积\n`cube(last_value(length))`\n ", - "xpack.lens.formula.defaultFunction.markdown": "\n值为 Null 时返回默认数值。\n\n例如:字段不包含数据时返回 -1\n`defaults(average(bytes), -1)`\n", - "xpack.lens.formula.divideFunction.markdown": "\n将第一个数字除以第二个数字。\n还可以使用 `/` 符号\n\n例如:计算利润率\n`sum(profit) / sum(revenue)`\n\n例如:`divide(sum(bytes), 2)`\n ", - "xpack.lens.formula.eqFunction.markdown": "\n在两个值之间执行相等比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `==` 符号。\n\n例如:如果平均字节数与平均内存容量完全相同,则返回 true\n`average(bytes) == average(memory)`\n\n示例:`eq(sum(bytes), 1000000)`\n ", - "xpack.lens.formula.expFunction.markdown": "\n计算 *e* 的 n 次幂。\n\n例如:计算自然指数函数\n\n`exp(last_value(duration))`\n ", - "xpack.lens.formula.fixFunction.markdown": "\n对于正值,取下限。对于负值,取上限。\n\n例如:正在向零舍入\n`fix(sum(profit))`\n ", - "xpack.lens.formula.floorFunction.markdown": "\n向下舍入到最近整数值\n\n例如:向下舍入价格\n`floor(sum(price))`\n ", - "xpack.lens.formula.gteFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>=` 符号。\n\n例如:如果平均字节数大于或等于平均内存容量,则返回 true\n`average(bytes) >= average(memory)`\n\n示例:`gte(average(bytes), 1000)`\n ", - "xpack.lens.formula.gtFunction.markdown": "\n在两个值之间执行大于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `>` 符号。\n\n例如:如果平均字节数大于平均内存容量,则返回 true\n`average(bytes) > average(memory)`\n\n示例:`gt(average(bytes), 1000)`\n ", - "xpack.lens.formula.ifElseFunction.markdown": "\n返回某个值,取决于条件的元素是 true 还是 false。\n\n例如:每名客户的平均收入,但在某些情况下不提供客户 ID,这会计数为其他客户\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "xpack.lens.formula.logFunction.markdown": "\n底数可选的对数。自然底数 *e* 用作默认值。\n\n例如:计算存储值所需的位数\n```\nlog(sum(bytes))\nlog(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.lteFunction.markdown": "\n在两个值之间执行小于或等于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<=` 符号。\n\n例如:如果平均字节数小于或等于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lte(average(bytes), 1000)`\n ", - "xpack.lens.formula.ltFunction.markdown": "\n在两个值之间执行小于比较。\n将用作 `ifelse` 比较函数的条件。\n还可以使用 `<` 符号。\n\n例如:如果平均字节数小于平均内存容量,则返回 true\n`average(bytes) <= average(memory)`\n\n示例:`lt(average(bytes), 1000)`\n ", - "xpack.lens.formula.maxFunction.markdown": "\n查找两个数字间的最大值。\n\n例如:查找两个字段平均值间的最大值\n`pick_max(average(bytes), average(memory))`\n ", - "xpack.lens.formula.minFunction.markdown": "\n查找两个数字间的最小值。\n\n例如:查找两个字段平均值间的最小值\n`pick_min(average(bytes), average(memory))`\n ", - "xpack.lens.formula.modFunction.markdown": "\n将函数除以数值后的余数\n\n例如:计算值的后三位数\n`mod(sum(price), 1000)`\n ", - "xpack.lens.formula.multiplyFunction.markdown": "\n将两个数值相乘。\n还可以使用 `*` 符号。\n\n例如:计算现行税率后的价格\n`sum(bytes) * last_value(tax_rate)`\n\n例如:计算固定税率后的价格\n`multiply(sum(price), 1.2)`\n ", - "xpack.lens.formula.powFunction.markdown": "\n计算该值的特定次幂。第二个参数必填\n\n例如:基于边长计算体积\n`pow(last_value(length), 3)`\n ", - "xpack.lens.formula.roundFunction.markdown": "\n舍入到特定数目的小数位,默认为 0\n\n示例:舍入到百分\n```\nround(sum(bytes))\nround(sum(bytes), 2)\n```\n ", - "xpack.lens.formula.sqrtFunction.markdown": "\n仅正值的平方根\n\n例如:基于面积计算边长\n`sqrt(last_value(area))`\n ", - "xpack.lens.formula.squareFunction.markdown": "\n计算该值的 2 次幂\n\n例如:基于边长计算面积\n`square(last_value(length))`\n ", - "xpack.lens.formula.subtractFunction.markdown": "\n从第二个数值减去第一个数值。\n还可以使用 `-` 符号。\n\n例如:计算字段的范围\n`subtract(max(bytes), min(bytes))`\n ", - "xpack.lens.formulaDocumentation.filterRatioDescription.markdown": "### 筛选比:\n\n使用 `kql=''` 筛选一个文档集,然后将其与相同分组中的其他文档进行比较。\n例如,要查看错误率随时间的推移如何变化:\n\n```\ncount(kql='response.status_code > 400') / count()\n```\n ", - "xpack.lens.formulaDocumentation.markdown": "## 工作原理\n\nLens 公式允许您使用 Elasticsearch 聚合和\n数学函数的组合进行数学计算。主要有三种类型的函数:\n\n* Elasticsearch 指标,如 `sum(bytes)`\n* 时间序列函数使用 Elasticsearch 指标作为输入,如 `cumulative_sum()`\n* 数学函数,如 `round()`\n\n使用所有这些函数的公式示例:\n\n```\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n```\n\nElasticsearch 函数取可以用引号引起的字段名称。`sum(bytes)` 同于\nas `sum('bytes')`.\n\n一些函数取已命名参数,如 `moving_average(count(), window=5)`。\n\nElasticsearch 指标可以使用 KQL 或 Lucene 语法筛选。要添加筛选,请使用已命名\n参数 `kql='field: value'` 或 `lucene=''`。编写 KQL 或 Lucene 查询时,应始终使用\n单引号。如果您的搜索包含单引号,请使用反斜杠转义,如:`kql='Women's''\n\n数学函数可以取位置参数,如 pow(count(), 3) 与 count() * count() * count() 相同\n\n使用符号 +、-、/ 和 * 执行基本数学运算。\n ", - "xpack.lens.formulaDocumentation.percentOfTotalDescription.markdown": "### 总计的百分比\n\n公式可以计算所有分组的 `overall_sum`,\n其允许您将每个分组转成总计的百分比:\n\n```\nsum(products.base_price) / overall_sum(sum(products.base_price))\n```\n ", - "xpack.lens.formulaDocumentation.recentChangeDescription.markdown": "### 最近更改\n\n使用 `reducedTimeRange='30m'` 在与全局时间范围末尾相一致的指标时间范围上添加其他筛选。这可用于计算某个值在最近更改的幅度。\n\n```\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n - min(system.network.in.bytes, reducedTimeRange=\"30m\")\n```\n ", - "xpack.lens.formulaDocumentation.weekOverWeekDescription.markdown": "### 周环比:\n\n使用 `shift='1w'` 以获取上一周每个分组\n的值。时间偏移不应与*排名最前值*函数一起使用。\n\n```\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n```\n ", - "xpack.lens.indexPattern.cardinality.documentation.markdown": "\n计算指定字段的唯一值数目。适用于数字、字符串、日期和布尔值。\n\n例如:计算不同产品的数目:\n`unique_count(product.name)`\n\n例如:计算“clothes”组中不同产品的数目:\n`unique_count(product.name, kql='product.group=clothes')`\n ", - "xpack.lens.indexPattern.count.documentation.markdown": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n\n#### 示例\n\n要计算文档总数,请使用 `count()`。\n\n要计算所有订单中产品的数量,请使用 `count(products.id)`。\n\n要计算与特定筛选匹配的文档数量,请使用 `count(kql='price > 500')`。\n ", - "xpack.lens.indexPattern.counterRate.documentation.markdown": "\n计算不断增大的计数器的速率。此函数将仅基于计数器指标字段生成有帮助的结果,包括随着时间的推移度量某种单调递增。\n如果值确实变小,则其将此解析为计数器重置。要获取很精确的结果,应基于字段的 `max`计算 `counter_rate`。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n用于公式中时,其使用当前时间间隔。\n\n例如:可视化随着时间的推移 Memcached 服务器接收的字节速率:\n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "xpack.lens.indexPattern.cumulativeSum.documentation.markdown": "\n计算随着时间的推移指标的累计和,即序列的所有以前值相加得出每个值。要使用此函数,您还需要配置 Date Histogram 维度。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移累计接收的字节:\n`cumulative_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.differences.documentation.markdown": "\n计算随着时间的推移与指标最后一个值的差异。要使用此函数,您还需要配置 Date Histogram 维度。\n差异需要数据是顺序的。如果使用差异时数据为空,请尝试增加 Date Histogram 时间间隔。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n例如:可视化随着时间的推移接收的字节的变化:\n`differences(sum(bytes))`\n ", - "xpack.lens.indexPattern.lastValue.documentation.markdown": "\n返回最后一个文档的字段值,按数据视图的默认时间字段排序。\n\n此函数用于检索实体的最新状态。\n\n例如:获取服务器 A 的当前状态:\n`last_value(server.status, kql='server.name=\"A\"')`\n ", - "xpack.lens.indexPattern.metric.documentation.markdown": "\n返回字段的 {metric}。此函数仅适用于数字字段。\n\n例如:获取价格的 {metric}:\n`{metric}(price)`\n\n例如:获取英国订单价格的 {metric}:\n`{metric}(price, kql='location:UK')`\n ", - "xpack.lens.indexPattern.movingAverage.documentation.markdown": "\n计算随着时间的推移指标的移动平均值,即计算最后 n 个值的平均值以得出当前值。要使用此函数,您还需要配置 Date Histogram 维度。\n默认窗口值为 {defaultValue}。\n\n筛选或排名最前值维度定义的不同序列将分别执行此计算。\n\n取已命名参数 `window`,其指定当前值的平均计算中要包括过去多少个值。\n\n例如:平滑度量线:\n`moving_average(sum(bytes), window=5)`\n ", - "xpack.lens.indexPattern.overall_average.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的平均值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_average` 都将计算所有维度的平均值\n\n例如:与平均值的偏离:\n`sum(bytes) - overall_average(sum(bytes))`\n ", - "xpack.lens.indexPattern.overall_max.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最大值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或内部函数,则无论使用什么函数,`overall_max` 都将计算所有维度的最大值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_min.documentation.markdown": "\n为当前图表中序列的所有数据点计算指标的最小值。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_min` 都将计算所有维度的最小值\n\n例如:范围的百分比\n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n ", - "xpack.lens.indexPattern.overall_sum.documentation.markdown": "\n计算当前图表中序列所有数据点的指标的和。序列由维度使用 Date Histogram 或时间间隔函数定义。\n分解数据的其他维度,如排名最前值或筛选,将被视为不同的序列。\n\n如果当前图表未使用 Date Histogram 或时间间隔函数,则无论使用什么函数,`overall_sum` 都将计算所有维度的和。\n\n例如:总计的百分比\n`sum(bytes) / overall_sum(sum(bytes))`\n ", - "xpack.lens.indexPattern.percentile.documentation.markdown": "\n返回字段的值的指定百分位数。文档中百分之 n 的值比此值小。\n\n例如:获取大于 95 % 的值的字节数:\n`percentile(bytes, percentile=95)`\n ", - "xpack.lens.indexPattern.percentileRanks.documentation.markdown": "\n返回小于某个值的值的百分比。例如,如果某个值大于或等于 95% 的观察值,则称它处于第 95 个百分位等级\n\n例如:获取小于 100 的值的百分比:\n`percentile_rank(bytes, value=100)`\n ", - "xpack.lens.indexPattern.standardDeviation.documentation.markdown": "\n返回字段的变量或差量数量。此函数仅适用于数字字段。\n\n#### 示例\n\n要获取价格的标准偏差,请使用 `standard_deviation(price)`。\n\n要获取来自英国的订单的价格方差,请使用 `square(standard_deviation(price, kql='location:UK'))`。\n ", - "xpack.lens.indexPattern.time_scale.documentation.markdown": "\n\n此高级函数用于将计数和总和标准化为特定时间间隔。它允许集成所存储的已标准化为特定时间间隔的指标。\n\n此函数只能在当前图表中使用了日期直方图函数时使用。\n\n例如:将已标准化指标与其他需要标准化的指标进行比较的比率。\n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n ", "xpack.lens.AggBasedLabel": "基于聚合的可视化", "xpack.lens.app.addToLibrary": "保存到库", "xpack.lens.app.cancel": "取消", @@ -22163,11 +22182,11 @@ "xpack.lens.fittingFunctionsTitle.lookahead": "下一个", "xpack.lens.fittingFunctionsTitle.none": "隐藏", "xpack.lens.fittingFunctionsTitle.zero": "零", - "xpack.lens.formula.base": "底数", - "xpack.lens.formula.boolean": "布尔值", - "xpack.lens.formula.condition": "条件", - "xpack.lens.formula.decimals": "小数", - "xpack.lens.formula.defaultValue": "默认值", + "lensFormulaDocs.tinymath.base": "底数", + "lensFormulaDocs.boolean": "布尔值", + "lensFormulaDocs.tinymath.condition": "条件", + "lensFormulaDocs.tinymath.decimals": "小数", + "lensFormulaDocs.tinymath.defaultValue": "默认值", "xpack.lens.formula.disableWordWrapLabel": "禁用自动换行", "xpack.lens.formula.editorHelpInlineHideLabel": "隐藏函数引用", "xpack.lens.formula.editorHelpInlineHideToolTip": "隐藏函数引用", @@ -22175,35 +22194,22 @@ "xpack.lens.formula.fullScreenEnterLabel": "展开", "xpack.lens.formula.fullScreenExitLabel": "折叠", "xpack.lens.formula.kqlExtraArguments": "[kql]?: string, [lucene]?: string", - "xpack.lens.formula.left": "左", - "xpack.lens.formula.max": "最大值", - "xpack.lens.formula.min": "最小值", - "xpack.lens.formula.number": "数字", + "lensFormulaDocs.tinymath.left": "左", "xpack.lens.formula.reducedTimeRangeExtraArguments": "[reducedTimeRange]?: 字符串", "xpack.lens.formula.requiredArgument": "必需", - "xpack.lens.formula.right": "右", + "lensFormulaDocs.tinymath.right": "右", "xpack.lens.formula.shiftExtraArguments": "[shift]?: string", - "xpack.lens.formula.string": "字符串", - "xpack.lens.formula.value": "值", - "xpack.lens.formulaCommonFormulaDocumentation": "最常见的公式是将两个值相除以得到百分比。要精确显示,请将“value format”设置为“percent”。", - "xpack.lens.formulaDocumentation.columnCalculationSection": "列计算", - "xpack.lens.formulaDocumentation.columnCalculationSectionDescription": "每行都执行这些函数,但系统会为这些函数提供整列作为上下文。这也称作窗口函数。", - "xpack.lens.formulaDocumentation.comparisonSection": "对比", - "xpack.lens.formulaDocumentation.comparisonSectionDescription": "这些函数用于执行值比较。", - "xpack.lens.formulaDocumentation.constantsSection": "Kibana 上下文", - "xpack.lens.formulaDocumentation.constantsSectionDescription": "这些函数用于检索 Kibana 上下文变量,它们包括日期直方图 `interval`、当前 `now` 和选定 `time_range`,并帮助您计算日期数学运算。", - "xpack.lens.formulaDocumentation.elasticsearchSection": "Elasticsearch", - "xpack.lens.formulaDocumentation.elasticsearchSectionDescription": "在原始文档上结果列表的每行都将执行这些函数,从而将匹配分解维度的所有文档聚合成单值。", - "xpack.lens.formulaDocumentation.filterRatio": "筛选比", - "xpack.lens.formulaDocumentation.mathSection": "数学", - "xpack.lens.formulaDocumentation.mathSectionDescription": "结果表的每行使用相同行中使用其他函数计算的单值执行这些函数。", - "xpack.lens.formulaDocumentation.percentOfTotal": "总计的百分比", - "xpack.lens.formulaDocumentation.recentChange": "最近更改", - "xpack.lens.formulaDocumentation.weekOverWeek": "周环比", + "lensFormulaDocs.tinymath.value": "值", + "lensFormulaDocs.documentation.filterRatio": "筛选比", + "lensFormulaDocs.documentation.mathSection": "数学", + "lensFormulaDocs.documentation.mathSectionDescription": "结果表的每行使用相同行中使用其他函数计算的单值执行这些函数。", + "lensFormulaDocs.documentation.percentOfTotal": "总计的百分比", + "lensFormulaDocs.documentation.recentChange": "最近更改", + "lensFormulaDocs.documentation.weekOverWeek": "周环比", "xpack.lens.formulaDocumentationHeading": "运作方式", "xpack.lens.formulaEnableWordWrapLabel": "启用自动换行", "xpack.lens.formulaExampleMarkdown": "示例", - "xpack.lens.formulaFrequentlyUsedHeading": "常用公式", + "lensFormulaDocs.frequentlyUsedHeading": "常用公式", "xpack.lens.formulaPlaceholderText": "通过将函数与数学表达式组合来键入公式,如:", "xpack.lens.fullExtent.niceValues": "舍入到优先值", "xpack.lens.functions.collapse.args.byHelpText": "要作为分组依据的列 - 这些列将保持原样", @@ -22262,29 +22268,24 @@ "xpack.lens.indexPattern.allFieldsLabelHelp": "将可用字段拖放到工作区并创建可视化。要更改可用字段,请选择不同数据视图,编辑您的查询或使用不同时间范围。一些字段类型无法在 Lens 中可视化,包括全文本字段和地理字段。", "xpack.lens.indexPattern.ascendingCountPrecisionErrorWarning.link": "访问文档", "xpack.lens.indexPattern.availableFieldsLabel": "可用字段", - "xpack.lens.indexPattern.avg": "平均值", "xpack.lens.indexPattern.avg.description": "单值指标聚合,计算从聚合文档提取的数值的平均值", "xpack.lens.indexPattern.avg.quickFunctionDescription": "一组数字字段的平均值。", "xpack.lens.indexPattern.bitsFormatLabel": "位 (1000)", "xpack.lens.indexPattern.bytesFormatLabel": "字节 (1024)", - "xpack.lens.indexPattern.cardinality": "唯一计数", "xpack.lens.indexPattern.cardinality.documentation.quick": "\n指定数字、字符串、日期或布尔值字段的唯一值的数目。\n ", - "xpack.lens.indexPattern.cardinality.signature": "field: string", + "lensFormulaDocs.cardinality.signature": "field: string", "xpack.lens.indexPattern.changeDataViewTitle": "数据视图", "xpack.lens.indexPattern.chooseField": "字段", "xpack.lens.indexPattern.chooseFieldLabel": "要使用此函数,请选择字段。", "xpack.lens.indexPattern.chooseSubFunction": "选择子函数", "xpack.lens.indexPattern.columnFormatLabel": "值格式", "xpack.lens.indexPattern.compactLabel": "紧凑值", - "xpack.lens.indexPattern.count": "计数", "xpack.lens.indexPattern.count.documentation.quick": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n ", - "xpack.lens.indexPattern.count.signature": "[字段:字符串]", - "xpack.lens.indexPattern.counterRate": "计数率", + "lensFormulaDocs.count.signature": "[字段:字符串]", "xpack.lens.indexPattern.counterRate.documentation.quick": "\n 不断增长的时间序列指标一段时间的更改速率。\n ", - "xpack.lens.indexPattern.counterRate.signature": "指标:数字", + "lensFormulaDocs.counterRate.signature": "指标:数字", "xpack.lens.indexPattern.countOf": "记录计数", - "xpack.lens.indexPattern.cumulative_sum.signature": "指标:数字", - "xpack.lens.indexPattern.cumulativeSum": "累计和", + "lensFormulaDocs.cumulative_sum.signature": "指标:数字", "xpack.lens.indexPattern.cumulativeSum.documentation.quick": "\n 随时间增长的所有值的总和。\n ", "xpack.lens.indexPattern.custom.externalDoc": "数字格式语法", "xpack.lens.indexPattern.custom.patternLabel": "格式", @@ -22314,9 +22315,8 @@ "xpack.lens.indexPattern.dateRange.noTimeRange": "当前时间范围时间间隔不可用", "xpack.lens.indexPattern.decimalPlacesLabel": "小数", "xpack.lens.indexPattern.defaultFormatLabel": "默认", - "xpack.lens.indexPattern.derivative": "差异", "xpack.lens.indexPattern.differences.documentation.quick": "\n 后续时间间隔中的值之间的更改情况。\n ", - "xpack.lens.indexPattern.differences.signature": "指标:数字", + "lensFormulaDocs.differences.signature": "指标:数字", "xpack.lens.indexPattern.dimensionEditor.headingAppearance": "外观", "xpack.lens.indexPattern.dimensionEditor.headingData": "数据", "xpack.lens.indexPattern.dimensionEditor.headingFormula": "公式", @@ -22369,30 +22369,25 @@ "xpack.lens.indexPattern.invalidOperationLabel": "此字段不适用于选定函数。", "xpack.lens.indexPattern.invalidReducedTimeRange": "缩小的时间范围无效。输入正整数数量,后跟以下单位之一:s、m、h、d、w、M、y。例如,3h 表示 3 小时", "xpack.lens.indexPattern.invalidTimeShift": "时间偏移无效。输入正整数数量,后跟以下单位之一:s、m、h、d、w、M、y。例如,3h 表示 3 小时", - "xpack.lens.indexPattern.lastValue": "最后值", "xpack.lens.indexPattern.lastValue.disabled": "此功能要求数据视图中存在日期字段", "xpack.lens.indexPattern.lastValue.documentation.quick": "\n最后一个文档的字段值,按数据视图的默认时间字段排序。\n ", "xpack.lens.indexPattern.lastValue.showArrayValues": "显示数组值", "xpack.lens.indexPattern.lastValue.showArrayValuesExplanation": "显示与最后每个文档中的此字段关联的所有值。", "xpack.lens.indexPattern.lastValue.showArrayValuesWithTopValuesWarning": "显示数组值时,无法使用此字段对排名最前值排名。", - "xpack.lens.indexPattern.lastValue.signature": "field: string", + "lensFormulaDocs.lastValue.signature": "field: string", "xpack.lens.indexPattern.lastValue.sortField": "按日期字段排序", "xpack.lens.indexPattern.lastValue.sortFieldPlaceholder": "排序字段", - "xpack.lens.indexPattern.max": "最大值", "xpack.lens.indexPattern.max.description": "单值指标聚合,返回从聚合文档提取的数值中的最大值。", "xpack.lens.indexPattern.max.quickFunctionDescription": "数字字段的最大值。", - "xpack.lens.indexPattern.median": "中值", "xpack.lens.indexPattern.median.description": "单值指标聚合,计算从聚合文档提取的中值。", "xpack.lens.indexPattern.median.quickFunctionDescription": "数字字段的中值。", "xpack.lens.indexPattern.metaFieldsLabel": "元字段", - "xpack.lens.indexPattern.metric.signature": "field: string", - "xpack.lens.indexPattern.min": "最小值", + "lensFormulaDocs.metric.signature": "field: string", "xpack.lens.indexPattern.min.description": "单值指标聚合,返回从聚合文档提取的数值中的最小值。", "xpack.lens.indexPattern.min.quickFunctionDescription": "数字字段的最小值。", "xpack.lens.indexPattern.missingFieldLabel": "缺失字段", "xpack.lens.indexPattern.moveToWorkspaceNotAvailable": "要可视化此字段,请直接将其添加到所需图层。根据您当前的配置,不支持将此字段添加到工作区。", - "xpack.lens.indexPattern.moving_average.signature": "指标:数字,[window]:数字", - "xpack.lens.indexPattern.movingAverage": "移动平均值", + "lensFormulaDocs.moving_average.signature": "指标:数字,[window]:数字", "xpack.lens.indexPattern.movingAverage.basicExplanation": "移动平均值在数据上滑动时间窗并显示平均值。仅日期直方图支持移动平均值。", "xpack.lens.indexPattern.movingAverage.documentation.quick": "\n 一段时间中移动窗口值的平均值。\n ", "xpack.lens.indexPattern.movingAverage.limitations": "第一个移动平均值开始于第二项。", @@ -22408,20 +22403,15 @@ "xpack.lens.indexPattern.noRealMetricError": "仅包含静态值的图层将不显示结果,请至少使用一个动态指标", "xpack.lens.indexPattern.notAbsoluteTimeShift": "时间偏移无效。", "xpack.lens.indexPattern.numberFormatLabel": "数字", - "xpack.lens.indexPattern.overall_metric": "指标:数字", - "xpack.lens.indexPattern.overallMax": "总体最大值", - "xpack.lens.indexPattern.overallMin": "总体最小值", - "xpack.lens.indexPattern.overallSum": "总和", + "lensFormulaDocs.overall_metric": "指标:数字", "xpack.lens.indexPattern.percentFormatLabel": "百分比", - "xpack.lens.indexPattern.percentile": "百分位数", "xpack.lens.indexPattern.percentile.documentation.quick": "\n 小于所有文档中出现值的 n% 的最大值。\n ", "xpack.lens.indexPattern.percentile.percentileRanksValue": "百分位等级值", "xpack.lens.indexPattern.percentile.percentileValue": "百分位数", - "xpack.lens.indexPattern.percentile.signature": "field: string, [percentile]: number", - "xpack.lens.indexPattern.percentileRank": "百分位等级", + "lensFormulaDocs.percentile.signature": "field: string, [percentile]: number", "xpack.lens.indexPattern.percentileRanks.documentation.quick": "\n小于特定值的值的百分比。例如,如果某个值大于或等于 95% 的计算值,则该值处于第 95 个百分位等级。\n ", "xpack.lens.indexPattern.percentileRanks.errorMessage": "百分位等级值必须为数字", - "xpack.lens.indexPattern.percentileRanks.signature": "字段:字符串,[值]:数字", + "lensFormulaDocs.percentileRanks.signature": "字段:字符串,[值]:数字", "xpack.lens.indexPattern.precisionErrorWarning.accuracyDisabled.shortMessage": "这可能为近似值。要获得更精确的结果,可以启用准确性模式,但这会增加 Elasticsearch 集群的负载。", "xpack.lens.indexPattern.precisionErrorWarning.accuracyEnabled.shortMessage": "这可能为近似值。要获得更精确的结果,请使用筛选或增加排名最前值的数量。", "xpack.lens.indexPattern.precisionErrorWarning.ascendingCountPrecisionErrorWarning.shortMessage": "这可能为近似值,具体取决于如何索引数据。要获得更精确的结果,请按稀有度排序。", @@ -22471,7 +22461,6 @@ "xpack.lens.indexPattern.samplingPerLayer.fallbackLayerName": "数据图层", "xpack.lens.indexPattern.settingsSamplingUnsupported": "选择此函数会将该图层的采样更改为 100% 以便正常运行。", "xpack.lens.indexPattern.sortField.invalid": "字段无效。检查数据视图或选取其他字段。", - "xpack.lens.indexPattern.standardDeviation": "标准偏差", "xpack.lens.indexPattern.standardDeviation.description": "单值指标聚合,计算从聚合文档提取的数值的标准偏差", "xpack.lens.indexPattern.standardDeviation.quickFunctionDescription": "数字字段值的标准偏差,即字段值的变动幅度。", "xpack.lens.indexPattern.staticValue.label": "参考线值", @@ -22481,7 +22470,6 @@ "xpack.lens.indexPattern.staticValueWarningText": "要覆盖静态值,请选择快速函数", "xpack.lens.indexPattern.suffixLabel": "后缀", "xpack.lens.indexpattern.suggestions.overTimeLabel": "时移", - "xpack.lens.indexPattern.sum": "求和", "xpack.lens.indexPattern.sum.description": "单值指标聚合,对从聚合文档提取的数值求和。", "xpack.lens.indexPattern.sum.quickFunctionDescription": "数字字段值的总数。", "xpack.lens.indexPattern.switchToRare": "按稀有度排名", @@ -22519,8 +22507,7 @@ "xpack.lens.indexPattern.terms.size": "值数目", "xpack.lens.indexPattern.termsWithMultipleShifts": "在单个图层中,无法将指标与不同时间偏移和动态排名最前值组合。将相同的时间偏移值用于所有指标或使用筛选,而非排名最前值。", "xpack.lens.indexPattern.termsWithMultipleShiftsFixActionLabel": "使用筛选", - "xpack.lens.indexPattern.time_scale": "指标:数字,单位:s|m|h|d|w|M|y", - "xpack.lens.indexPattern.timeScale": "按单位标准化", + "lensFormulaDocs.time_scale": "指标:数字,单位:s|m|h|d|w|M|y", "xpack.lens.indexPattern.timeScale.label": "按单位标准化", "xpack.lens.indexPattern.timeScale.missingUnit": "没有为按单位标准化指定单位。", "xpack.lens.indexPattern.timeScale.tooltip": "将值标准化为始终显示为每指定时间单位速率,无论基础日期时间间隔是多少。", @@ -28784,7 +28771,6 @@ "xpack.observability.slo.sloDetails.overview.rollingTimeWindow": "{duration} 滚动", "xpack.observability.slo.sloDetails.overview.timeslicesBudgetingMethodDetails": "{duration} 切片,{target} 目标", "xpack.observability.slo.sloDetails.sliHistoryChartPanel.duration": "过去 {duration}", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternFoundLabel": "{searchPattern}(匹配 {num, plural, other {# 个索引}})", "xpack.observability.slo.sloEdit.rollingTimeWindow.days": "{number} 天", "xpack.observability.slo.update.errorNotification": "更新 {name} 时出现问题", "xpack.observability.slo.update.successNotification": "成功更新 {name}", @@ -29247,8 +29233,6 @@ "xpack.observability.slo.sloEdit.createAlert.ruleName": "SLO 消耗速度告警规则", "xpack.observability.slo.sloEdit.createAlert.title": "创建", "xpack.observability.slo.sloEdit.createSloButton": "创建 SLO", - "xpack.observability.slo.sloEdit.customKql.indexSelection.helpText": "使用 * 可扩大您的查询范围。", - "xpack.observability.slo.sloEdit.customKql.indexSelection.indexPatternLabel": "使用索引模式", "xpack.observability.slo.sloEdit.customKql.indexSelection.label": "索引", "xpack.observability.slo.sloEdit.dataPreviewChart.errorMessage": "当前指标设置无效", "xpack.observability.slo.sloEdit.dataPreviewChart.explanationMessage": "填写指标字段以查看当前指标的可视化", @@ -40368,7 +40352,6 @@ "xpack.transform.transformSettingsValidations.numberOfRetriesInvalidErrorMessage": "重试次数需要介于 0 和 100 之间,或为 -1(表示无限重试)。", "xpack.transform.transformSettingValidations.maxPageSearchSizeInvalidMessage": "最大页面搜索大小需要是介于 10 到 65536 之间的整数。", "xpack.transform.transformSettingValidations.numberGreaterThanOrEqualToNegativeOneNotValidErrorMessage": "重试次数需要介于 0 和 100 之间,或为 -1(表示无限重试)。", - "xpack.transform.transformSettingValidations.numberRange10To10000NotValidErrorMessage": "值必须是介于 10 到 10000 之间的整数。", "xpack.transform.transformSettingValidations.retentionPolicyMaxAgeInvalidMessage": "最大存在时间格式无效。至少需要 60s。", "xpack.transform.transformsTitle": "转换", "xpack.transform.transformsWizard.cloneTransformTitle": "克隆转换", diff --git a/x-pack/test/apm_api_integration/tests/alerts/preview_chart_error_count.spec.ts b/x-pack/test/apm_api_integration/tests/alerts/preview_chart_error_count.spec.ts index acc7a406ebe40..0ba6426045492 100644 --- a/x-pack/test/apm_api_integration/tests/alerts/preview_chart_error_count.spec.ts +++ b/x-pack/test/apm_api_integration/tests/alerts/preview_chart_error_count.spec.ts @@ -68,15 +68,14 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/172769 - registry.when.skip(`with data loaded`, { config: 'basic', archives: [] }, () => { + registry.when(`with data loaded`, { config: 'basic', archives: [] }, () => { describe('error_count', () => { - before(async () => { + beforeEach(async () => { await generateErrorData({ serviceName: 'synth-go', start, end, synthtraceEsClient }); await generateErrorData({ serviceName: 'synth-java', start, end, synthtraceEsClient }); }); - after(() => synthtraceEsClient.clean()); + afterEach(() => synthtraceEsClient.clean()); it('with data', async () => { const options = getOptions(); diff --git a/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts b/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts index 0414faead6c67..8f90e9af5389f 100644 --- a/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts +++ b/x-pack/test/apm_api_integration/tests/alerts/transaction_duration.spec.ts @@ -44,8 +44,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { groupBy: ['service.name', 'service.environment', 'transaction.type', 'transaction.name'], }; - // FLAKY: https://github.com/elastic/kibana/issues/173267 - registry.when.skip('transaction duration alert', { config: 'basic', archives: [] }, () => { + registry.when('transaction duration alert', { config: 'basic', archives: [] }, () => { before(async () => { const opbeansJava = apm .service({ name: 'opbeans-java', environment: 'production', agentName: 'java' }) @@ -192,7 +191,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let ruleId: string; let alerts: ApmAlertFields[]; - before(async () => { + beforeEach(async () => { const createdRule = await createApmRule({ supertest, ruleTypeId: ApmRuleType.TransactionDuration, @@ -213,7 +212,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { alerts = await waitForAlertsForRule({ es, ruleId }); }); - after(async () => { + afterEach(async () => { await cleanupRuleAndAlertState({ es, supertest, logger }); }); @@ -235,8 +234,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(alerts[0]).property('transaction.name', 'tx-node'); }); - // FLAKY: https://github.com/elastic/kibana/issues/173127 - it.skip('shows alert count=1 for opbeans-node on service inventory', async () => { + it('shows alert count=1 for opbeans-node on service inventory', async () => { const serviceInventoryAlertCounts = await fetchServiceInventoryAlertCounts(apmApiClient); expect(serviceInventoryAlertCounts).to.eql({ 'opbeans-node': 1, diff --git a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts index c2e597b2d4873..022ab5e3b32ff 100644 --- a/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts +++ b/x-pack/test/cloud_security_posture_api/routes/csp_benchmark_rules_bulk_update.ts @@ -45,7 +45,7 @@ export default function ({ getService }: FtrProviderContext) { }; const createDetectionRule = async (rule: CspBenchmarkRule) => { - await supertest + const detectionRule = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('version', DETECTION_RULE_RULES_API_CURRENT_VERSION) .set('kbn-xsrf', 'xxxx') @@ -74,7 +74,9 @@ export default function ({ getService }: FtrProviderContext) { name: rule.metadata.name, description: rule.metadata.rationale, tags: generateBenchmarkRuleTags(rule.metadata), - }); + }) + .expect(200); + return detectionRule; }; /** @@ -98,7 +100,7 @@ export default function ({ getService }: FtrProviderContext) { beforeEach(async () => { await kibanaServer.savedObjects.clean({ - types: ['cloud-security-posture-settings'], + types: ['cloud-security-posture-settings', 'alert'], }); }); @@ -152,7 +154,7 @@ export default function ({ getService }: FtrProviderContext) { }, }) ); - expectExpect(body.detection_rules).toEqual('disabled 0 detections rules.'); + expectExpect(body.disabled_detection_rules).toEqual([]); }); it('unmute rules successfully', async () => { @@ -312,7 +314,7 @@ export default function ({ getService }: FtrProviderContext) { it('mute detection rule successfully', async () => { const rule1 = await getRandomCspBenchmarkRule(); - await createDetectionRule(rule1); + const detectionRule = await createDetectionRule(rule1); const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) @@ -332,14 +334,14 @@ export default function ({ getService }: FtrProviderContext) { }) .expect(200); - expectExpect(body.detection_rules).toEqual('disabled 1 detections rules.'); + expectExpect(body.disabled_detection_rules).toEqual([detectionRule.body.id]); }); - it('Expect to two benchmark rules and one detection rule', async () => { + it('Expect to mute two benchmark rules and one detection rule', async () => { const rule1 = await getRandomCspBenchmarkRule(); const rule2 = await getRandomCspBenchmarkRule(); - await createDetectionRule(rule1); + const detectionRule = await createDetectionRule(rule1); const { body } = await supertest .post(`/internal/cloud_security_posture/rules/_bulk_action`) @@ -365,7 +367,7 @@ export default function ({ getService }: FtrProviderContext) { }) .expect(200); - expectExpect(body.detection_rules).toEqual('disabled 1 detections rules.'); + expectExpect(body.disabled_detection_rules).toEqual([detectionRule.body.id]); }); it('set wrong action input', async () => { diff --git a/x-pack/test/cloud_security_posture_api/routes/mocks/benchmark_score_mock.ts b/x-pack/test/cloud_security_posture_api/routes/mocks/benchmark_score_mock.ts index f24c960783e53..58453003b5b6e 100644 --- a/x-pack/test/cloud_security_posture_api/routes/mocks/benchmark_score_mock.ts +++ b/x-pack/test/cloud_security_posture_api/routes/mocks/benchmark_score_mock.ts @@ -9,6 +9,7 @@ export const getBenchmarkScoreMockData = (postureType: string) => [ { total_findings: 1, policy_template: postureType, + is_enabled_rules_score: true, '@timestamp': '2023-11-22T16:10:55.229268215Z', score_by_cluster_id: { 'Another Upper case account id': { diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts index c711c2300e1be..eb7ea67560154 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts @@ -220,6 +220,13 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider const flyoutButton = await table.findAllByTestSubject('docTableExpandToggleColumn'); await flyoutButton[rowIndex].click(); }, + + async toggleEditDataViewFieldsOption(columnId: string) { + const element = await this.getElement(); + const column = await element.findByCssSelector(`[data-gridcell-column-id="${columnId}"]`); + const button = await column.findByCssSelector('.euiDataGridHeaderCell__button'); + return await button.click(); + }, }); const createTableObject = (tableTestSubject: string) => ({ diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings.ts b/x-pack/test/cloud_security_posture_functional/pages/findings.ts index 69d100c1fbf62..5f4520277b2f3 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -95,7 +95,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const ruleName1 = data[0].rule.name; const ruleName2 = data[1].rule.name; - describe('Findings Page', function () { + describe('Findings Page - DataTable', function () { this.tags(['cloud_security_posture_findings']); let findings: typeof pageObjects.findings; let latestFindingsTable: typeof findings.latestFindingsTable; @@ -211,6 +211,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); + describe('DataTable features', () => { + it('Edit data view field option is Enabled', async () => { + await latestFindingsTable.toggleEditDataViewFieldsOption('result.evaluation'); + expect(await testSubjects.find('gridEditFieldButton')).to.be.ok(); + await latestFindingsTable.toggleEditDataViewFieldsOption('result.evaluation'); + }); + }); + describe('Findings - Fields selector', () => { const CSP_FIELDS_SELECTOR_MODAL = 'cloudSecurityFieldsSelectorModal'; const CSP_FIELDS_SELECTOR_OPEN_BUTTON = 'cloudSecurityFieldsSelectorOpenButton'; diff --git a/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts b/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts index 7e39a7d73ce8b..cc83dac4aa1e4 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/common/create_openai_chunk.ts @@ -21,6 +21,8 @@ export function createOpenAiChunk( choices: [ { delta: msg, + index: 0, + finish_reason: null, }, ], }; diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts index 6601dbc213ab4..ae5fc9946674f 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/complete/complete.spec.ts @@ -14,7 +14,7 @@ import { StreamingChatResponseEvent, StreamingChatResponseEventType, } from '@kbn/observability-ai-assistant-plugin/common/conversation_complete'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { createLlmProxy, LlmProxy } from '../../common/create_llm_proxy'; import { createOpenAiChunk } from '../../common/create_openai_chunk'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -145,12 +145,16 @@ export default function ApiTest({ getService }: FtrProviderContext) { before(async () => { const titleInterceptor = proxy.intercept( 'title', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length === 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).messages + .length === 1 ); const conversationInterceptor = proxy.intercept( 'conversation', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length !== 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).messages + .length !== 1 ); const responsePromise = new Promise((resolve, reject) => { diff --git a/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts b/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts index 2d2f4c3fc8c33..ce9fc050b5e09 100644 --- a/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts +++ b/x-pack/test/observability_ai_assistant_functional/tests/conversations/index.spec.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { CreateChatCompletionRequest } from 'openai'; +import type OpenAI from 'openai'; import { createLlmProxy, LlmProxy, @@ -147,12 +147,16 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte before(async () => { const titleInterceptor = proxy.intercept( 'title', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length === 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming) + .messages.length === 1 ); const conversationInterceptor = proxy.intercept( 'conversation', - (body) => (JSON.parse(body) as CreateChatCompletionRequest).messages.length !== 1 + (body) => + (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming) + .messages.length !== 1 ); await testSubjects.setValue(ui.pages.conversations.chatInput, 'hello'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts index ab0fbb0cf445a..089cfc01ce0bb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/esql_rule_ess.cy.ts @@ -20,6 +20,7 @@ import { getDetails, goBackToRulesTable } from '../../../../tasks/rule_details'; import { expectNumberOfRules } from '../../../../tasks/alerts_detection_rules'; import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { + expandEsqlQueryBar, fillAboutRuleAndContinue, fillDefineEsqlRuleAndContinue, fillScheduleRuleAndContinue, @@ -34,12 +35,22 @@ import { visit } from '../../../../tasks/navigation'; import { CREATE_RULE_URL } from '../../../../urls/navigation'; +// https://github.com/cypress-io/cypress/issues/22113 +// issue is inside monaco editor, used in ES|QL query input +// calling it after visiting page in each tests, seems fixes the issue +// the only other alternative is patching ResizeObserver, which is something I would like to avoid +const workaroundForResizeObserver = () => + cy.on('uncaught:exception', (err) => { + if (err.message.includes('ResizeObserver loop limit exceeded')) { + return false; + } + }); + describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { const rule = getEsqlRule(); const expectedNumberOfRules = 1; - // FLAKY: https://github.com/elastic/kibana/issues/172618 - describe.skip('creation', () => { + describe('creation', () => { beforeEach(() => { deleteAlertsAndRules(); login(); @@ -47,8 +58,10 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { it('creates an ES|QL rule', function () { visit(CREATE_RULE_URL); + workaroundForResizeObserver(); selectEsqlRuleType(); + expandEsqlQueryBar(); // ensures ES|QL rule in technical preview on create page cy.get(ESQL_TYPE).contains('Technical Preview'); @@ -73,8 +86,10 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { // this test case is important, since field shown in rule override component are coming from ES|QL query, not data view fields API it('creates an ES|QL rule and overrides its name', function () { visit(CREATE_RULE_URL); + workaroundForResizeObserver(); selectEsqlRuleType(); + expandEsqlQueryBar(); fillDefineEsqlRuleAndContinue(rule); fillAboutSpecificEsqlRuleAndContinue({ ...rule, rule_name_override: 'test_id' }); @@ -86,23 +101,26 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/172881 - describe.skip('ES|QL query validation', () => { + describe('ES|QL query validation', () => { beforeEach(() => { login(); visit(CREATE_RULE_URL); }); it('shows error when ES|QL query is empty', function () { - selectEsqlRuleType(); + workaroundForResizeObserver(); + selectEsqlRuleType(); + expandEsqlQueryBar(); getDefineContinueButton().click(); cy.get(ESQL_QUERY_BAR).contains('ES|QL query is required'); }); it('proceeds further once invalid query is fixed', function () { - selectEsqlRuleType(); + workaroundForResizeObserver(); + selectEsqlRuleType(); + expandEsqlQueryBar(); getDefineContinueButton().click(); cy.get(ESQL_QUERY_BAR).contains('required'); @@ -115,9 +133,11 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when non-aggregating ES|QL query does not [metadata] operator', function () { + workaroundForResizeObserver(); + const invalidNonAggregatingQuery = 'from auditbeat* | limit 5'; selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidNonAggregatingQuery); getDefineContinueButton().click(); @@ -127,11 +147,13 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when non-aggregating ES|QL query does not return _id field', function () { + workaroundForResizeObserver(); + const invalidNonAggregatingQuery = 'from auditbeat* [metadata _id, _version, _index] | keep agent.* | limit 5'; selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidNonAggregatingQuery); getDefineContinueButton().click(); @@ -141,12 +163,13 @@ describe('Detection ES|QL rules, creation', { tags: ['@ess'] }, () => { }); it('shows error when ES|QL query is invalid', function () { + workaroundForResizeObserver(); const invalidEsqlQuery = 'from auditbeat* [metadata _id, _version, _index] | not_existing_operator'; visit(CREATE_RULE_URL); selectEsqlRuleType(); - + expandEsqlQueryBar(); fillEsqlQueryBar(invalidEsqlQuery); getDefineContinueButton().click(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts index 50980e0add4f8..265263ba495c6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/esql_rule.cy.ts @@ -9,7 +9,7 @@ import { getEsqlRule } from '../../../../objects/rule'; import { ESQL_QUERY_DETAILS, RULE_NAME_OVERRIDE_DETAILS } from '../../../../screens/rule_details'; -import { ESQL_QUERY_BAR, ESQL_QUERY_BAR_EXPAND_BTN } from '../../../../screens/create_new_rule'; +import { ESQL_QUERY_BAR } from '../../../../screens/create_new_rule'; import { createRule } from '../../../../tasks/api_calls/rules'; @@ -18,6 +18,7 @@ import { getDetails } from '../../../../tasks/rule_details'; import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { clearEsqlQueryBar, + expandEsqlQueryBar, fillEsqlQueryBar, fillOverrideEsqlRuleName, goToAboutStepTab, @@ -44,8 +45,7 @@ describe('Detection ES|QL rules, edit', { tags: ['@ess'] }, () => { it('edits ES|QL rule and checks details page', () => { visit(RULES_MANAGEMENT_URL); editFirstRule(); - // expands query bar, so query is not obscured on narrow screens - cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); + expandEsqlQueryBar(); // ensure once edit form opened, correct query is displayed in ES|QL input cy.get(ESQL_QUERY_BAR).contains(rule.query); @@ -78,8 +78,7 @@ describe('Detection ES|QL rules, edit', { tags: ['@ess'] }, () => { visit(RULES_MANAGEMENT_URL); editFirstRule(); - // expands query bar, so query is not obscured on narrow screens - cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); + expandEsqlQueryBar(); // ensure once edit form opened, correct query is displayed in ES|QL input cy.get(ESQL_QUERY_BAR).contains(rule.query); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts index a5f411670ad38..1089834384374 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts @@ -55,6 +55,7 @@ import { EQL_TYPE, ESQL_TYPE, ESQL_QUERY_BAR, + ESQL_QUERY_BAR_EXPAND_BTN, ESQL_QUERY_BAR_INPUT_AREA, FALSE_POSITIVES_INPUT, IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK, @@ -537,6 +538,14 @@ export const fillEsqlQueryBar = (query: string) => { cy.get(ESQL_QUERY_BAR_INPUT_AREA).type(query); }; +/** + * expands query bar, so query is not obscured on narrow screens + * and validation message is not covered by input menu tooltip + */ +export const expandEsqlQueryBar = () => { + cy.get(ESQL_QUERY_BAR_EXPAND_BTN).click(); +}; + export const fillDefineEsqlRuleAndContinue = (rule: EsqlRuleCreateProps) => { cy.get(ESQL_QUERY_BAR).contains('ES|QL query'); fillEsqlQueryBar(rule.query); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts index c0dc9c0dd89f1..0f8c9ffd54744 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts @@ -77,6 +77,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('Side nav', function () { + this.tags([ + 'skipSvlOblt', // the "Discover" side nav entry does something different in oblt + ]); + it('should sync Lens global state to Discover sidebar link and carry over the state when navigating to Discover', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.common.navigateToApp('lens'); diff --git a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts index d9721c09ecd3b..6dd1542bbea39 100644 --- a/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts +++ b/x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples/existing_fields.ts @@ -57,8 +57,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { await PageObjects.header.waitUntilLoadingHasFinished(); } - // FLAKY: https://github.com/elastic/kibana/issues/172781 - describe.skip('Fields existence info', () => { + describe('Fields existence info', () => { before(async () => { await esArchiver.load( 'test/api_integration/fixtures/es_archiver/index_patterns/constant_keyword' diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts index 6ef2f01618a6c..b14687ad12003 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts @@ -34,26 +34,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show preview for fields in _source', async function () { await PageObjects.settings.filterField('extension'); await testSubjects.click('editFieldFormat'); - await testSubjects.find('value'); - let previewText = ''; - await retry.waitForWithTimeout('get preview value', 1000, async () => { - previewText = await testSubjects.getVisibleText('value'); - return previewText !== 'Value not set'; + await retry.tryForTime(5000, async () => { + const previewText = await testSubjects.getVisibleText('fieldPreviewItem > value'); + expect(previewText).to.be('css'); }); - expect(previewText).to.be('css'); await PageObjects.settings.closeIndexPatternFieldEditor(); }); it('should show preview for fields not in _source', async function () { await PageObjects.settings.filterField('extension.raw'); await testSubjects.click('editFieldFormat'); - await testSubjects.find('value'); - let previewText = ''; - await retry.waitForWithTimeout('get preview value', 1000, async () => { - previewText = await testSubjects.getVisibleText('value'); - return previewText !== 'Value not set'; + await retry.tryForTime(5000, async () => { + const previewText = await testSubjects.getVisibleText('fieldPreviewItem > value'); + expect(previewText).to.be('css'); }); - expect(previewText).to.be('css'); await PageObjects.settings.closeIndexPatternFieldEditor(); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index 892359f901ffe..f899d6760db02 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -41,11 +41,15 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); await svlCommonNavigation.sidenav.expectSectionClosed('project_settings_project_nav'); - // navigate to discover - await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'discover' }); - await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'discover' }); - await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'discover' }); - expect(await browser.getCurrentUrl()).contain('/app/discover'); + // navigate to the logs explorer tab by default + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-log-explorer' }); + await svlCommonNavigation.sidenav.expectLinkActive({ + deepLinkId: 'observability-log-explorer', + }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ + deepLinkId: 'observability-log-explorer', + }); + expect(await browser.getCurrentUrl()).contain('/app/observability-log-explorer'); // check the aiops subsection await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); // open ai ops subsection diff --git a/yarn.lock b/yarn.lock index 02c8939697ab6..340ae8c920995 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4982,6 +4982,10 @@ version "0.0.0" uid "" +"@kbn/lens-formula-docs@link:packages/kbn-lens-formula-docs": + version "0.0.0" + uid "" + "@kbn/lens-plugin@link:x-pack/plugins/lens": version "0.0.0" uid "" @@ -7618,19 +7622,19 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@slack/types@^1.2.1": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@slack/types/-/types-1.9.0.tgz#aa8f90b2f66ac54a77e42606644366f93cff4871" - integrity sha512-RmwgMWqOtzd2JPXdiaD/tyrDD0vtjjRDFdxN1I3tAxwBbg4aryzDUVqFc8na16A+3Xik/UN8X1hvVTw8J4EB9w== +"@slack/types@^2.9.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.11.0.tgz#948c556081c3db977dfa8433490cc2ff41f47203" + integrity sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ== -"@slack/webhook@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-5.0.4.tgz#5d3e947387c1d0ccb176a153cec68c594edb7060" - integrity sha512-IC1dpVSc2F/pmwCxOb0QzH2xnGKmyT7MofPGhNkeaoiMrLMU+Oc7xV/AxGnz40mURtCtaDchZSM3tDo9c9x6BA== +"@slack/webhook@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@slack/webhook/-/webhook-7.0.1.tgz#91d939af249d50ea978a960a52b9f92bb7d2bdda" + integrity sha512-0Uj/GQ1H8nmeAVEx+7zcWb6/q/zsSOrlIaGi6zFnwgMSxjmV6xGsVwv8w6DaAdkUbtqa43v1cirWjySeZaCOIA== dependencies: - "@slack/types" "^1.2.1" - "@types/node" ">=8.9.0" - axios "^0.21.1" + "@slack/types" "^2.9.0" + "@types/node" ">=18.0.0" + axios "^1.6.0" "@smithy/eventstream-codec@^2.0.12": version "2.0.12" @@ -9790,10 +9794,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@18.18.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=8.9.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.11.18", "@types/node@^18.17.5": - version "18.18.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.5.tgz#afc0fd975df946d6e1add5bbf98264225b212244" - integrity sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A== +"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.11.18", "@types/node@^18.17.5": + version "20.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" + integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + dependencies: + undici-types "~5.26.4" "@types/nodemailer@^6.4.0": version "6.4.0" @@ -11790,20 +11796,6 @@ axe-core@^4.8.2: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axios@^0.26.0: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - axios@^1.3.4, axios@^1.6.0, axios@^1.6.3: version "1.6.3" resolved "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" @@ -17158,7 +17150,7 @@ folktale@2.3.2: resolved "https://registry.yarnpkg.com/folktale/-/folktale-2.3.2.tgz#38231b039e5ef36989920cbf805bf6b227bf4fd4" integrity sha512-+8GbtQBwEqutP0v3uajDDoN64K2ehmHd0cjlghhxh0WpcfPzAIjPA03e1VvHlxL02FVGR0A6lwXsNQKn3H1RNQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -23451,18 +23443,10 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -openai@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-3.3.0.tgz#a6408016ad0945738e1febf43f2fccca83a3f532" - integrity sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ== - dependencies: - axios "^0.26.0" - form-data "^4.0.0" - -openai@^4.17.0: - version "4.17.5" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.17.5.tgz#096655741965656ec969731e97d4bce880112d66" - integrity sha512-SDgA933/QOjISCgWRc/JQhY1HweYZ6FOie3bWrCpj09FA5xIlaomldbyzICHNjtkh7SWEmGYFjRHIDtuwr+eTw== +openai@^4.17.0, openai@^4.24.1: + version "4.24.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.24.1.tgz#3759001eca835228289fcf18c1bd8d35dae538ba" + integrity sha512-ezm/O3eiZMnyBqirUnWm9N6INJU1WhNtz+nK/Zj/2oyKvRz9pgpViDxa5wYOtyGYXPn1sIKBV0I/S4BDhtydqw== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -29503,6 +29487,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.21.2, undici@^5.22.1: version "5.26.3" resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79"